From 91af5eb0c96184cd01582173e52f010f26a04f6f Mon Sep 17 00:00:00 2001 From: elParaguayo Date: Sun, 3 Nov 2024 11:55:41 +0000 Subject: [PATCH] Add `ImageDecoration` Adds a new decoration to render images to widget backgrounds. --- CHANGELOG | 1 + docs/_static/images/image_decoration.png | Bin 0 -> 7629 bytes qtile_extras/widget/decorations.py | 107 ++++++++++++++++- ...ecoration-default-aspectratio-wholebar.png | Bin 0 -> 4859 bytes .../image-decoration-default-aspectratio.png | Bin 0 -> 6909 bytes .../image-decoration-default-wholebar.png | Bin 0 -> 4822 bytes .../test_images/image-decoration-default.png | Bin 0 -> 6314 bytes ...n-nofill-aspectratio-nocenter-wholebar.png | Bin 0 -> 3373 bytes ...decoration-nofill-aspectratio-nocenter.png | Bin 0 -> 4268 bytes ...decoration-nofill-aspectratio-wholebar.png | Bin 0 -> 3216 bytes .../image-decoration-nofill-aspectratio.png | Bin 0 -> 4154 bytes ...ge-decoration-nofill-nocenter-wholebar.png | Bin 0 -> 3373 bytes .../image-decoration-nofill-nocenter.png | Bin 0 -> 4268 bytes .../image-decoration-nofill-wholebar.png | Bin 0 -> 3216 bytes .../test_images/image-decoration-nofill.png | Bin 0 -> 4154 bytes .../decorations/test_decoration_output.py | 109 ++++++++++++++++++ .../decorations/test_widget_decorations.py | 61 ++++++++++ test/widget/resources/image_background.png | Bin 0 -> 630 bytes 18 files changed, 277 insertions(+), 1 deletion(-) create mode 100644 docs/_static/images/image_decoration.png create mode 100644 test/resources/test_images/image-decoration-default-aspectratio-wholebar.png create mode 100644 test/resources/test_images/image-decoration-default-aspectratio.png create mode 100644 test/resources/test_images/image-decoration-default-wholebar.png create mode 100644 test/resources/test_images/image-decoration-default.png create mode 100644 test/resources/test_images/image-decoration-nofill-aspectratio-nocenter-wholebar.png create mode 100644 test/resources/test_images/image-decoration-nofill-aspectratio-nocenter.png create mode 100644 test/resources/test_images/image-decoration-nofill-aspectratio-wholebar.png create mode 100644 test/resources/test_images/image-decoration-nofill-aspectratio.png create mode 100644 test/resources/test_images/image-decoration-nofill-nocenter-wholebar.png create mode 100644 test/resources/test_images/image-decoration-nofill-nocenter.png create mode 100644 test/resources/test_images/image-decoration-nofill-wholebar.png create mode 100644 test/resources/test_images/image-decoration-nofill.png create mode 100644 test/widget/resources/image_background.png diff --git a/CHANGELOG b/CHANGELOG index 2ee8687e..573c1b77 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,4 @@ +2024-11-03: [FEATURE] Add `ImageDecoration` for widgets 2024-10-19: [RELEASE] v0.29.0 release - compatible with qtile 0.29.0 2024-08-23: [FEATURE] Add `GradientDecoration` for widgets 2024-08-13: [RELEASE] v0.28.1 release - compatible with qtile 0.28.1 diff --git a/docs/_static/images/image_decoration.png b/docs/_static/images/image_decoration.png new file mode 100644 index 0000000000000000000000000000000000000000..2af00d079daaf84edaf194c304c304d8e978da37 GIT binary patch literal 7629 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 literal 0 HcmV?d00001 diff --git a/qtile_extras/widget/decorations.py b/qtile_extras/widget/decorations.py index e1879b55..2641113d 100644 --- a/qtile_extras/widget/decorations.py +++ b/qtile_extras/widget/decorations.py @@ -1,4 +1,4 @@ -# Copyright (c) 2021, elParaguayo. All rights reserved. +# Copyright (c) 2021-4, elParaguayo. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -22,6 +22,7 @@ import copy import math from functools import partial +from pathlib import Path from typing import TYPE_CHECKING import cairocffi @@ -33,6 +34,8 @@ from libqtile.utils import rgb from libqtile.widget import Systray, base +from qtile_extras.images import Img + if TYPE_CHECKING: from typing import Any # noqa: F401 @@ -915,6 +918,108 @@ def pos(point): self.ctx.restore() +class ImageDecoration(_Decoration): + """ + Renders an image background to the widget. + + Setting ``whole_bar=True`` will draw the image by reference to the whole bar. Widgets will then + render the part of the image in the area covered by the widget. This allows a single image to be + applied consistently across all widgets. + """ + + _screenshots = [("image_decoration.png", "Image with 'whole_bar=True'.")] + + defaults = [ + ( + "whole_bar", + False, + "When set to ``True`` image is calculated by reference to the bar so " + "you can get a single image applied across multiple widgets.", + ), + ("image", "", "Path to background image"), + ( + "center", + True, + "Whether to center the image in the widget. If ``False`` image will be rendered frop top/left corner", + ), + ("fill", True, "Whether or not image should be resized to fit the widget/bar."), + ( + "preserve_aspect_ratio", + False, + "Whether aspect ratio should be preserved when resizing the image.", + ), + ] + + def __init__(self, **config): + _Decoration.__init__(self, **config) + self.add_defaults(ImageDecoration.defaults) + + if not self.image: + raise ConfigError("ImageDecoration has no image file.") + + self._image = Path(self.image).expanduser().resolve() + if not self._image.is_file(): + raise ConfigError(f"ImageDecoration cannot find {self.image}.") + + self._old_width = 0 + self._old_height = 0 + self._surface = None + + self._xoffset = 0 + self._yoffset = 0 + + def _get_image(self, width, height): + if self._surface and self._old_width == width and self._old_height == height: + return self._surface + + image = Img.from_path(self._image.as_posix()) + + if self.fill: + if self.preserve_aspect_ratio: + if image.width / image.height > width / height: + image.resize(height=height) + elif image.width / image.height < width / height: + image.resize(width=width) + else: + image.resize(width=width, height=height) + else: + image.resize(width=width, height=height) + + self._xoffset = ((width - image.width) // 2) if self.center else 0 + self._yoffset = ((height - image.height) // 2) if self.center else 0 + + self._old_width = width + self._old_height = height + + self._surface = image.pattern + return self._surface + + def draw(self): + width = self.parent.bar.width if self.whole_bar else self.width + height = self.parent.bar.height if self.whole_bar else self.height + + # Nothing to do if widget is hidden + if not (width and height): + return + + image = self._get_image(width, height) + + self.ctx.save() + self.ctx.rectangle(0, 0, self.width, self.height) + self.ctx.clip() + + # If we're using whole_bar then we shift 0, 0 to be top left corner of the bar + if self.whole_bar: + self.ctx.translate(-self.parent.offsetx, -self.parent.offsety) + + # Translate the image to position correctly for resizing/centering + self.ctx.translate(self._xoffset, self._yoffset) + + self.ctx.set_source(image) + self.ctx.paint() + self.ctx.restore() + + def inject_decorations(classdef): """ Method to inject ability for widgets to display decorations. diff --git a/test/resources/test_images/image-decoration-default-aspectratio-wholebar.png b/test/resources/test_images/image-decoration-default-aspectratio-wholebar.png new file mode 100644 index 0000000000000000000000000000000000000000..a75911f742ad981b0ebe01ec69b8808a7980b9f0 GIT binary patch literal 4859 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 V_{Wt?*d5IRs48heD-^6k{|~@`WN`oh literal 0 HcmV?d00001 diff --git a/test/resources/test_images/image-decoration-default-aspectratio.png b/test/resources/test_images/image-decoration-default-aspectratio.png new file mode 100644 index 0000000000000000000000000000000000000000..f928d93cac5eb87c005a61043875fe9b294142f2 GIT binary patch literal 6909 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 DTT|PXWtjdMudcfMRo*)86gA&5yvYk3L`k< zxQsYDcf8j}=jx-6%ec&p%gi{Aqh7bi3yLBt;LfJ(1ds@Xgq>_;?e6rFrK{@x(Uo*} zhy+4_PEp@q=c)SoJMZtDQ>VT9(}SldoT>l0h#3qFdevnx^cG!< zUiOQt7cYX|F9 zm%*TKT|aeDXV!IwrPmJDt1g2<-@3ZtuP5_mSi#V^y(Ol>5IhWe)zu?4>d!iVB%~L1 zaBvP9gCUq>UJML6GwqR32#&_p>!2|h3|;4+L6_Du8CGz1n86Ut40_cSYz#WHGt01g zV}}_G7nVVRkq0*L6(Q#LQQaVmpSK_#l}-?_ph2{=g*@yRWMo42qcrk7JJRv9>)w{foqX z|A{5?Y#ESv;BG9D$P!OIKxpIz*42%IF0G3UYt%JaLW;&z_OzrDfF>0Lb|kD4-#WZfsYn@~@q9eS4GY%&WOR(*q`wVPus zJBx~HoNi=+PuJpXL6M-d(SA0Zc^Mq9#nIFqfoH^^KkH)S==PgHAR>=JkFo7$Q~^~5 z5opUY{QOUB00C9(Je0RkwFv|ey5AYuxA4PDG&#;7Lf$+IU)Cv4$1ZyF95I|_ zp{TSwW6WEaK8Yn?VQ&H0bx0fPw2k(j(lzTc-dT&SwL1d4;jbqF!B!KvYGT4s)tqgqAFUbs8mMZMr;<%jqF~`@okKlN1qWS4QB8hKKp|P zT<|}Xe9O@-h$e1$m0e3I{t{r$-}(AkWe||QPs05Dh@x_cw zBY!?I$uv~)?YmfO020!<;zp9waW=BzHR>ve?ZcGoNlL@*WW!1h`~YzK6Rdoj8S|;B z;FC8Pav5W$5FUxOj#Z0ksA1Y1`eZQYw16cbuIo`0o_LGD+`}WUYjd|Z!|I#B zynK>lscPWeZ>hF*WJrx?{uEMTsI>C-8meuK&F0FH{An4A!pu=*C1H2dFPZyhBP;yz z1O9R||60v$lPRm`Z(lQUATur{I+W^0URzI<9h1l}Conu6lgPnZURaH)8X49pM~2*% zQu&{X%H{iCBZV>UCE~_VyAwbWh@U`sI%^l8LS!cLNjaAyk~og=G`{^csG5)e{m@p% zrblttG4yt_=d$A^->Dt1l01eDk72JskQnz6`#$98TC%TV^u4Tpn6xoOrn2&GRESQ) zBeLyv`ix@jQ`jp2?MXq9nDhYqR&eNP;`%e?0U9bPe4ofvj&0@8Mr~3CDvL?Vg^v~q!x3HMG?`8({Xa7;n z$0V_EHmf$WZ9jRL+;I&Dt5~vz!CCy{6HYW}SA_Q_;VmF>`z$^$WOFf-FXfg3{`_%3 z)q=>KGg-NVjiuxdWnn(ge9Gp-jLBi@2(}+)@(`Z*1gndonf&z&Ds3PTZei9ap8lLh zH?l;TjX!@yy_@-Cxq1YzZeT$vfcD#;%TiNN+9@_0KHv!csU*q z&5hI*5t`A~uM&L&K-C}$|@--CU=;2cH>5xRUAzmJwj|EbygA*$r*$!P+5a4A)ooO z@!2mtj5=*P@EZk}s2$1DCE8k&M1b5*tg9 zCDs*_l}uPfK-HNkND|*4L=joDpG%Sm4@Z`GXEOyu_|0UN@1(xTHv@WqCw#!*E;Jt@O-Tig0lMlk#O)q0G= zrx`e(++VThbxv&SnOm_hnPL=)yPS{$7$ek%g9L`VXb zSZ4oQJ0&+GMN?nKcP}yQdWO$q`+Jn{1W?hgoc0J|@wlwMBTgHZXl=auFBJhNju4%U zDT1_N?EZ$dVI&VCIhXSNKFJ}mIITWTmmO6kG#01T7s_cz5ebVWEQ$rsY6m?nghb$S z`DUwjrIr{RHa|i;ia=;A;ZfZFxbNrYNJ3+1v<37|cpMJ9?}*(_Sdhv|Z)fJFT`O9yg0iz;_4&&Jc+Nl-~p`qjtW7cqhw>RKu zCOVA2&hv8!!`4cjo81+R%HX?0oj3BaMqj5)8_4*6m_)+NIGT|qjx_SZ_uOzPH;v?- zofKA{K|AQrPHW?6`yWdD56VK@5z*J#-VUxQq2^H%hA{qNzPgi^#(?JY&K=dIR6kDQ zU?x7qsztOkYQg)CBKvAqKT4C8v@zt)KIuB3ge8-EUHkg!-H zqXQKX6DGF#w{@s0Xsuy)6BXl&9~DDw zUE3_+mxy`W?QjKeEG8?1g*WotE4Y68&j@Ez=<;lPCwfG`Q7ZUUG&U0z;WvMUY4;5E zqzTJgmL+U0)Hd?RWdRHy?c}4KTFjheY8*VcJdjEvBbFhl>^s3#!}z%9q(%n0t?Ngo zG9!=2zQx+a=yYc1YCiiKcziv1Njx-(MXRv41~8nW9rS0~BViY5xwlyZw|KPstN1Q9 zSt2wQOCqv_wH&zx)e;a2P({s05wTVvw;+W0f``Q6ti@$VF_V6|HjMo7TAV~@A)BZ^ zgdmYU9o38wLTomQNJNTOdwnIIR*A7+Xn9K|qi)upDYxS ziercpLw^n?gb)(5w3czZiBCuI>x;??OeO}7LN<{$kdzEmk+L#GiD45p$w`^W5@qE` zCWcJ_GZC?bL{VOWEHivOiiwmAa`M=_FW`=%h=fLAwPAOmm>4t^+ElyUB=yzW%9~an zuSAv^H5OH(Pdd2+DQeFy+kWNEOk)y=j6o5pYM|AFXhyJb-POb;AXu0)i@10M3)jyg zKK`s855*8}o<@8;VhHov3k4*^b@C|JK1x;57yocQW{EMmC=xko^h?r$JDW*O^xfY4 z)2`AwM2X3RKtc#1Gr1#kX+4t2lsqsYn&_8=EP=#r6Iil~*S3+LL*IC02}cWQ@meFd zcZw_#6;6$dx>i&Z<1@6upA_NVHf$_I6axO|M$9D1kn^+Q<`fEbMXl-KWr#S4W61!G0?j|m~ znWYcY+Keh7! zv+6CT+`#0UII@pDn^8qtRaU;m)Ek*{17!y}R*EXnDzNMgre4RStMSMj+`|`30k*7W z@-LWjEw4XEb1Q(XuzWGouVvaC4(;cMZ72dBc>f))yoSj$kv)_avtk*t%KPszV>Sh| za5`D?E{yM!dEH2`XaXhk`kBeC_k_DryB4D8K(bA*Bj z6p@$+?iodd3AcwO`>AcgVrEz}tB#_$FS-m%SpEwYP;oru#W$$jYJO7|ktY^d}{qipq}bap!@dSH!&F464v^4e|Ul z^la7sG4*7|H{H)6L-wW2x(UgQ!_JD2XmkcV9S3?{XT~?(^~RuAT?Rw?C%jEy6b=7 z8Vu)?A*gie&w762=$ZNlRR;%oOoJhK7({yKAw10C=zvcWeP8SEIJ8MR1cLePh4G3{Ox_AzT3 zde1Exh*Ov>PaOH#eQ<1?EjhCQln@`?H)!`ER}f3eVBiy3MuebaB)kQKrS=YT+}5b> zRt{E@+$OTS$9Nx-CZ1N>@0L1#&YSqv)ZYpnWue!Vf{;pIF}HNs^M=5Mp{Q$BV!gkr zgvg&2jgtghFkp1f$Tk->4I#v@xaZr`M{}y@lzF>8XO7q#pKX@+f8c3(_+6SGPM{-! z$3sb|_cNd7ZR4*sidb7;WNqw=i|s-$e-@r7Q?vy#YYE9mdBoX=R^kA1qD)q58B2Lc z6Z#jGc|A|`jnw;+AToRDzf~1`4i_Iq+M-xV4GHF!aQMIDQKyqU`&txOEb1D3y8yh2 zQ`o9sAWVEGQd#dsitCBH59^kx@9scE&_h%2`LnYowF~UAjd|rZ%p!~PBhV;y)8isL zh@vY;h!g02*~sMj+1R4#a7X;D{DL?u-}qPo8XYUoKT0jy^e?rnX*VPwn&XHK%Q1R- zxYmAtgQc5bgd)vrP3Ww*JM`Lcp4Uq0dwyBKB8yb!>3TkkrKd*|cT>i(K3|V;7kD^RH2JnOKjv zwkq~WfzxuCdJ->bP*da&QcWg*~;4i!33zQ^Ur zpV~p~3ewgg05`ntL{TnoU86}Buu~<_1uwr{$5rR;#WhJ#H{#o>&wA?B;QnLE3d4YT zOi3Z}sHW^3`~A7qI`s>LqYieD=};R|FvLrnXPT7ZmDMK9L5;}>96ul zan5gEQ9Xmak;3>=f zZajqfN6-`kxBsZia>K>l=TI{Q?7*g~Gj}f(j)L1>iZ{}7i;-Bj3B$@g_Zhv#QCYU0 zt!!wY`uw9D6-BglJ}kk825RB>-bMT7X|aU*#Mz-}Ql8DwDAk!j9{WJrWD$8X;wqtI zasRtxB~2wv!WR2qTE8(|m6m6K*YnU8w*QhTD9*P5 zc3!YYP|lG+Rjwm8-nZO2i{0?;iH7ks=*{`HJs|r&YdfyEQ(+tog4Q2sK2P7Eke+V< z%wyKE;ArB0$g|sbukh38K85Sl<#hRoQN-22&n-UL&-i)>-jl34{!#Sr8hKXK6OJPM zVB_3g>!B?i5Y}3f66bLv>pE$Y47hB1@T1@KMxBZr6J5w%1TkGz+_Dy82LCoJ;zey zmej(D5>;8#Ye#5%z%%byQU=h;s~j$3b(*6s?9nNTgo z9}eSAu2i3^#yM%#c@s~3oTp#RQaB2^Cu?tEB{tV*=0d_z*LmBR(~3pnBRXwr*QD_m zy}XmCrXFGKE0lg8;95dMKk1xMx1P5V5@yAIu?HllQ2v?n!#08sh;y-NfQ!xHO1WJ_ z&zYTSph#7OD2ygZZ-to^K<=p+x!9jWz9B{p#uALiXKPOsV0L(pqXr6_mb8&tL_e-< z*h~~|!PS2_qeidp@=BK^NLxo+gB^q^9Fv`PCMnqJkb{$t)6}%`m%gJ)l{P=a{FAT_L@Ia#RmAa)3LW=8)bDor8Vieefc-;u> ziBM8d3taHe%Tz?OZE->c3hWp?qyIs8egvK{WzjfqNM;a2Z_e_xp)uY-cy zG13RG^Tt1joNYS42V^;HF8{~L9G&}KO85T2{_#XE@Emh&m9X$C8(;2CQBm}Nw{`VE zosFR)k@_?u0)=G8s=dh72>fQ1-4G)O5P%G!LRt>&3?(&eIHw$I^%VWMqG-c1GJmmn zMaVvoIyl88=4;TND!^1P$L&XCyGXt)@5R6?KS(7#j-I*_3A$=tzw7~cKk79!e;zTl z+I8vku(Z_pFk(+u`f>6qA*qK~&vy9f!EiR)>=1QtV&mJhv~H^dnye2`vsUs5#Yh6t zsc-Ol)z-yWWljx~)vb?_hO#fH#K6a0n70ayU!jz4@JVGy9px@9-_*<+K%Y51`(b+9sgFiUQg5(xr2lG4Py|Lvtg-S{^AYzSRl*0m(*>qI|Q9{QW_ ze$cGkSY8JcB}1B-kJejUP2!sezn(~swY(oBVRjPcUD?NLgK5I)EuRGKy&d0&X@Mtp z5g+oqCts0+&VGV5IBT9F`?X4|qs!m9>^l0lh3Qe!wMW=H6;;RG@pI9JfA&L||5rYe zCg_X$z$mt^wn+j5lJch3#SfCBfl3aM2{F*>ALZ7TM{`7DD0_xej#=bYHvW(;Jc{|< zx{j0Ru1Z)DmB(i4)>;X--?~h>SGU9DbGCO?Vkmk(%xf)gxQNq{ts8V_E+g)dETUUH zNOLKr8o%$^t^Ey+$KmkeVqu4OrQy*zwMUKl`FPVvYn6SJR@v~=J0CZp^pDPW2yBQb zx3(Kk5J~^2y#2QsdLV%(xHgKCS$bw_g`uamd7(LkG$k`Qy`FYC^8qm(Oh2j^B~GaquDuezepv)sLLVA|bwwf@itO zuvtpy_!`cyITOnK0<5C=qCIGOrHsky#QIRU#Yaeq;c8G`nM~CQ*!)aDbS$0lzJHI# zj^4Z^qHUqj%wOB3%GgVrQs5GZ1E6rsT2piVR;&lf-z6;bbhQRW^XMY-hS;+9gr+eE z*(LExYi?0LWG8zNHRMR*l`%8W8B)=CusK1@7X%~taE@j07CW+!HE7>#Dx*kWF~Xu) zHTAY5gs%qSH%>bWh~7|zfw+9hb5Cg};y6eipv)`{ zKI$@;$BdZmw_9%!m*~6<8nTxsrM33rIFTqR+PN}#j3jZi7Yc%PG6!OqR|?7=Dm5P` zmvX`@Yp;;%Bz%Z;JQzV?2r#}dPJV>{xgd=jSkX*|va|Tfy?nM|x{6B#ps@8MEg%y& zTmL}vUyM}hTU3*Ec}D=nJ0<@)3FH5w26K`ui+oi@odN`lScawW7u^XV8|nm9zd2@# zPO;_pL%F#g4u_PA+6erZXRchpvOVkhT$fu?xqIBfi5=#qb|XUl6a7g zlvXWBV?->~%)%yth70pJO0x}G3FEIl$?@e4s`~djC?&mo zZ)%+p(=8FpnMR5_@494ZCiVN`02$6G1bW}$w&h-kJVBSkip5(1J-f}NivJ&x0r9KO z@>ko$T&`&Ov67MQZTa`*X=MA_3g&1E2bF(*-u^+B=f_~0ojafKF!HA3PW$eNLbNNE zX2cJ6MXMUiNl;h9Qm`HT>S=jiEaDjwW453v02lG}@7@1S7+35}OO%pxlASE)77eIs zC6c8T%-+)tuu=q;F+IX5mbBf4NwQ?zn(@NRvTUzp7BiPLUTbP8DDC|^^KN6HPy8zN z`79uYx-9G9eAG}HP&Nb$iQ{i?D(bYd$bf{Z&@u(5I!)l~{m6f)1Iuw?n`~~*7#A|w zy}Mam>RUn1kEN-4^yKHy9cdo8x<~e$NBGXq7np8}!nSji^BQICzgju3f;C>F;eKlz zx~gwnBmiAE{T>%iSM5x8*VMYdnBaBs^(9H}4&%-c$J*HSf*#TGhPD4XD_XIH`IesL zJ(6h2Y4{HEey?8UQgw=N_IAQ!B_ENcNib5>kYP5^H|&qyZf#BPNY&Ck!qX)Mlk+~h z`{}P?jcnF!Md^tw*dE*Cx*RrJ#@mcf_-v~RE&C&7V{OgqIT$F73$Q(5us;cBI|98o z3F(c-``4$|l&28NCWRfmUq(o6?F(9S;Ae9%o;BKX79WJhF}(J=z48H@;^Yrw3-jcX z+>*MQ%AvaI?^d1@KW;~NeK#gnbNezI0|Q~O%1vcQp`~^(am`D; zaAN2b7A1Y5KMh*)`YMYXemcCzHk~B8s)es118Wyp?Or_!;Ipv_ zR)wzJ9v&|CC;r0G1FjRq!1i>L&aW;xVW$>CvOr&w)SZlqQQC5Y8)(!B_v-IacCjLX zB)A$Byx)`svc0KgGjXK5r{%=VwKeKn-*-r}F3g?-+N384*3NPN^ ziXZlL3R7L`mfZ&II0IoVXQUtKWiP`ye?_41vcme0+BHzMb*@+%DX8B?mxAESt>&y= zj&sR%*CMfdS8{*t0R(j|HfZaC@z&v8qx&U&jgYO%h&7XDg|=8`s2I!%(b zAY`r< zv&?5vdr_lY)n$H_572XZiO_P;rW9J@@NcMR@DuBp%kaUM5v5BOCfPK_^cufa18~8k zte2y1_PAlBu>9<6K&EpkD=^I5!kwPm6_KYKzqdl&%4A9ZEke6#rs~~d0{;Dh%%xT$ z{{5o&<;n-mALF0o1fhRE=X|W-NXI&TH-r|tl)&GxSm+C%&> z>YphZC6!;}AdH-MI?ni|tjGu|Q<(LboW#bj$82 z{3&VAU5@owF+n2wndokMtvgt=e{7ygR(!3O?ziiOYtFBDyPcor)D2Wt?5NBSj)brlY?l({YcCmpJrHqdBJ$jSn&I4|PkdOzVW6Fzj z&b^84o90A1Reowka=|^wOR;$IPyFg?Omi6n;b_;oiARC?MQ-R>*mjq~$g8(Twi!V< z-pAOwquYmz0+zQrm&blcAJ4Yh7Fj#e+n=jl7%N16g{9QD9^l_n*es_R+&u@R>HOzn zj3LU^UU6^FgyRimX&&7u#(#Oto3g0j1a`y*v213-wbsXTM+ByDPV-_=)qO)CvLZhs zirM(6tTw@pInOQ;bA6RedreiqfaXEbTxU3~6RDap!*hLZIUBah%~%5oY;>YO$-JPa zODkno2;9Ia`dLp6G-#AC^hIlSNO{7vhiQjWPd+4&CtPwzb!&q-S@)9O@D_c9u> z6|gfS7Omwe$W?wso`=lr;Ge3L=62wULshty;3>xvkgHTR6j7DqL_imn6w7ZA# z122nTZrY;9O;=dkqI=9pR07=>+N%Pl!UbrW&n>!#DD6@@UyPnw{0^~eD!Xlz1o6=L~&y0JB3%P>VOGBLFX=E+FAMa;hdhBZlwuno!H2W-Ixp(f&ZnT{}C5H?Rdl0weGlk zzT(e~Q0ApYO_g569pd=Gt8LrO^v${zx6Sm|cV_>@5mN6Gzfbhp?(~lj@%N9OIV?Aa zr+2ibZy)7#c!OoIkVQHzVMjkF)(`%!tZTf^9l-VLY1pqLohE5>&_%`Qv!eOm(6K)C zI8GqgY4l=DMqFT%wgnC)>a*O2bw2iw8BzbV*n3u#Gxz3E@$Y1^Q4vt;Pni+crCt`~ z&r^W4gEg!?yNHS3Lp@w-_Id1jd;#vH&25hP7L`44@w)QwI8Mc|LEuraR~x{V<>_df zx5{iI`!p5tqIh;z0%NP~=Xeos<-xrDH{YVH$Ak9EBm0F{X&yc*qL5}!a?l*q;pJNW zGm!cJst+iBuU8i={APylT=mX*_=Q5h5-N`Q%?qkFJG8X}r&vdB<*oV`K}nI-r2l;| zV5Ol;55{frGkWOwz+g<9K&>AbVDK4ePwhC;G>s%q&OO`y4uvwcNVev|T%U9?h2m8U z-QR=texYht-yXk`cI4nm1_*kpV-XQ-(ui+vWW3+%fIof@wH@HDVwMltT=$nD;8A+a zR8@tRPc?q22GX3@%0!PB2u_Vlp@RuT)5hL0%K4|J2l6nKI$DGU5e%n~+{U3k&rg{v z@!|#WFf2jPb=$ID|Kt1nHB>c^!aOk}0fGBT4k_AN%+~=DO2R*n=gR}HTzQe=Vwy&* z>CrDB<9`bTB^}8A+?wK3Sgf)m&J5>DLvNs}>!A%}pUtN{7hlCa+@QA++&s8be=;o7 zey<bO>hp*-$Mgp5)!SvH!0o`)7ZO{Ai=Cn4>vXkX!6VgXn$!Bbl0N zkX9_IxA&R*S#*Nuf;HpT9cM?XEw;=RB7Wm8k}@{X2filMQavP8VY8|)&+ali{5K|? zHFPZ|PWA1PGJbAfaRmA+yEClWKf|Z%00OrusfC`z-P}MQ>js?a?fLbdsH%T{OL2{w dT3DZPGj+EUOTJY(zkEI*DafkIR7;tL{14+aKv)0( literal 0 HcmV?d00001 diff --git a/test/resources/test_images/image-decoration-nofill-aspectratio-nocenter-wholebar.png b/test/resources/test_images/image-decoration-nofill-aspectratio-nocenter-wholebar.png new file mode 100644 index 0000000000000000000000000000000000000000..096817fe5456a9d49840f8da0c501007c90240f5 GIT binary patch literal 3373 zcmZvfcQ72@7RUA834$QXDp@U}cXnA(qO)oiS-tn(BO9F%f~ZkfSt3MlA-W}6w5UrW z5+PQUc>Cu0&3k{mxij~E@0@$jnK^Uk+|NN6=xb3^uudcwKJTR$Z zzQ-B-Z|FeWRm5??Y(i7!TH?1R+Vm841-|9e#>>LDp3w6$Pm@3pmfXXSnVaJE;VABV4@fC~L`<&~R zam$Wo#p}eBxA>@IV*&E<09D3L8@&{LDWdai2%o)#l>8jso;gp(vk#y4Of-t^5Fj3A z<1%CFm`HvGgvH51V=|JB;OZeC18NTmyKQ}Q&Bt!wezz;x$-NB7pnc87a7SKMw)H?J zB;LW*zvk|A1Bi!S$0JRO)%fQ8(V0aY%=AC*bF5Zg%~H)h%;E(iKo44*q$)#dvYBvN zR;EiztL?_Cub-7)a`8>*mBD$AxT>eBJq!pCu-kJ&BK79f=IlI&M)i$ht#y}G@1KB8 zQp2;Atr+ETHBkYH*>4)-9rvlsIv)}1fd-$c3I7t!VeaiFR z9W@O4otl5rS`e`{8CQS>op0r4hO0j*JLM$WJ9tGb&&x9j4>9g{{mdJW*$YVyP0a3x zN%QmnHb@)orrFeKa^+*S*wQQ5s%rivsL& zGuv8~IHnOO-0^wbYzBiZ})WPjlAm31e? zRk)#NauC58_Cr+$+aklN@)`+5nni~kLv;MGn=ODLNR8poebiIol_9nu|0hxR?b6C7 z2;c5|cvT1yVc&os6zTK%0kzEKhK*Axr4ky~h(N#A_uV63A+ZKF0=X={f6h#eipqY< zDrH$;!n=pFbuKYdW+EVCNa%B<&E?gTRE{qjK2-pDe}38c1=}Zoik6PZh26C=zCyM0 zM=uwu+UODX@EPY*F8E&+Xlu&$-S~v`)7x5;P5Y9}o!^o%9e)1FAmcp_@=ARPcUDzh zDgfis(&?wOi)J6*u^f7)!LM^vTr`hSjV_G1E$3v7sp4;@=p|iCwuT;k1G;Yu&4D7l zZ(X)AlELENmyMy&e7)7NIWf|ZA;*fEn+N)cCf4;hJveb zj%qrlMy~xT;D@WlL;vT7F3KWhF3T*`qPu&}MXsB}1O%ne4pM3ie1}%eH-sWP zqbt03>F`Sq`@A*e2Y&Rs@8(B1Q;>FZ{}Nav5EKHmiQMTZ5#DAg6{?aVGB_Ng}QLoBhHERxOc0$r7ze>p@A0HEwMmTlNLrszk zEaBjAnG4b;sUjnz&)g3GWIwKmtJa*b^N1wkJh*^;@AIdw%NSC;zvt$oqq2d?ZVP*J zV}HY-rhk6v%*+H|`ru_D%x&)qBsSfT?h2C&W9H_KJN>S-#`_wHuk+IPw=fv&2xnj% zINI_*9IrBTW`ja)y}C(yMN~<UQBe4Ke6p@2+ zI6CGPPd~;4*#C5`6BaJ+e+qmKJAQPy%-!yIn1V|dqn-_gm~>}ijRG<&TX8dWx_cBiUi zuI4~L_e-YDN$8JW<9%1J$I{31R-I=&#+COy*j76hcEPQH7QU9-o8NGGLp?S1t1wHj z6Ql*gAi`HUK8{LH_z#WM=i)_ji>5FvUgGX|pB1v469GZqgS_>>sntF9!_KO32T)MFy#OT?fSSkxSH;UoJvTDiAB)LE$3sCd*7LBigF>fW_aY}gC9^{b`dWh@wnJpuodD6G;CJ!l=a&@ ztl8&~BTGQxI+`y7;z_=J9C`QEuIR;L$R(O{T*`uh-=<;quFspBSh0uiPhGXl}F;P6J%|7aI8( tHqOrLeU~|{tJdiaKZop literal 0 HcmV?d00001 diff --git a/test/resources/test_images/image-decoration-nofill-aspectratio-nocenter.png b/test/resources/test_images/image-decoration-nofill-aspectratio-nocenter.png new file mode 100644 index 0000000000000000000000000000000000000000..350c3323e9f659780cd4637123ae06b9c20d3349 GIT binary patch literal 4268 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 literal 0 HcmV?d00001 diff --git a/test/resources/test_images/image-decoration-nofill-aspectratio.png b/test/resources/test_images/image-decoration-nofill-aspectratio.png new file mode 100644 index 0000000000000000000000000000000000000000..3b1286ce2e3ce9ad2c212296c79fef508c5f7ff2 GIT binary patch literal 4154 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 cqetOsM5Zh9`s;0fjsXi!0^LsC{r~^~ literal 0 HcmV?d00001 diff --git a/test/resources/test_images/image-decoration-nofill-nocenter-wholebar.png b/test/resources/test_images/image-decoration-nofill-nocenter-wholebar.png new file mode 100644 index 0000000000000000000000000000000000000000..096817fe5456a9d49840f8da0c501007c90240f5 GIT binary patch literal 3373 zcmZvfcQ72@7RUA834$QXDp@U}cXnA(qO)oiS-tn(BO9F%f~ZkfSt3MlA-W}6w5UrW z5+PQUc>Cu0&3k{mxij~E@0@$jnK^Uk+|NN6=xb3^uudcwKJTR$Z zzQ-B-Z|FeWRm5??Y(i7!TH?1R+Vm841-|9e#>>LDp3w6$Pm@3pmfXXSnVaJE;VABV4@fC~L`<&~R zam$Wo#p}eBxA>@IV*&E<09D3L8@&{LDWdai2%o)#l>8jso;gp(vk#y4Of-t^5Fj3A z<1%CFm`HvGgvH51V=|JB;OZeC18NTmyKQ}Q&Bt!wezz;x$-NB7pnc87a7SKMw)H?J zB;LW*zvk|A1Bi!S$0JRO)%fQ8(V0aY%=AC*bF5Zg%~H)h%;E(iKo44*q$)#dvYBvN zR;EiztL?_Cub-7)a`8>*mBD$AxT>eBJq!pCu-kJ&BK79f=IlI&M)i$ht#y}G@1KB8 zQp2;Atr+ETHBkYH*>4)-9rvlsIv)}1fd-$c3I7t!VeaiFR z9W@O4otl5rS`e`{8CQS>op0r4hO0j*JLM$WJ9tGb&&x9j4>9g{{mdJW*$YVyP0a3x zN%QmnHb@)orrFeKa^+*S*wQQ5s%rivsL& zGuv8~IHnOO-0^wbYzBiZ})WPjlAm31e? zRk)#NauC58_Cr+$+aklN@)`+5nni~kLv;MGn=ODLNR8poebiIol_9nu|0hxR?b6C7 z2;c5|cvT1yVc&os6zTK%0kzEKhK*Axr4ky~h(N#A_uV63A+ZKF0=X={f6h#eipqY< zDrH$;!n=pFbuKYdW+EVCNa%B<&E?gTRE{qjK2-pDe}38c1=}Zoik6PZh26C=zCyM0 zM=uwu+UODX@EPY*F8E&+Xlu&$-S~v`)7x5;P5Y9}o!^o%9e)1FAmcp_@=ARPcUDzh zDgfis(&?wOi)J6*u^f7)!LM^vTr`hSjV_G1E$3v7sp4;@=p|iCwuT;k1G;Yu&4D7l zZ(X)AlELENmyMy&e7)7NIWf|ZA;*fEn+N)cCf4;hJveb zj%qrlMy~xT;D@WlL;vT7F3KWhF3T*`qPu&}MXsB}1O%ne4pM3ie1}%eH-sWP zqbt03>F`Sq`@A*e2Y&Rs@8(B1Q;>FZ{}Nav5EKHmiQMTZ5#DAg6{?aVGB_Ng}QLoBhHERxOc0$r7ze>p@A0HEwMmTlNLrszk zEaBjAnG4b;sUjnz&)g3GWIwKmtJa*b^N1wkJh*^;@AIdw%NSC;zvt$oqq2d?ZVP*J zV}HY-rhk6v%*+H|`ru_D%x&)qBsSfT?h2C&W9H_KJN>S-#`_wHuk+IPw=fv&2xnj% zINI_*9IrBTW`ja)y}C(yMN~<UQBe4Ke6p@2+ zI6CGPPd~;4*#C5`6BaJ+e+qmKJAQPy%-!yIn1V|dqn-_gm~>}ijRG<&TX8dWx_cBiUi zuI4~L_e-YDN$8JW<9%1J$I{31R-I=&#+COy*j76hcEPQH7QU9-o8NGGLp?S1t1wHj z6Ql*gAi`HUK8{LH_z#WM=i)_ji>5FvUgGX|pB1v469GZqgS_>>sntF9!_KO32T)MFy#OT?fSSkxSH;UoJvTDiAB)LE$3sCd*7LBigF>fW_aY}gC9^{b`dWh@wnJpuodD6G;CJ!l=a&@ ztl8&~BTGQxI+`y7;z_=J9C`QEuIR;L$R(O{T*`uh-=<;quFspBSh0uiPhGXl}F;P6J%|7aI8( tHqOrLeU~|{tJdiaKZop literal 0 HcmV?d00001 diff --git a/test/resources/test_images/image-decoration-nofill-nocenter.png b/test/resources/test_images/image-decoration-nofill-nocenter.png new file mode 100644 index 0000000000000000000000000000000000000000..350c3323e9f659780cd4637123ae06b9c20d3349 GIT binary patch literal 4268 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 literal 0 HcmV?d00001 diff --git a/test/resources/test_images/image-decoration-nofill.png b/test/resources/test_images/image-decoration-nofill.png new file mode 100644 index 0000000000000000000000000000000000000000..3b1286ce2e3ce9ad2c212296c79fef508c5f7ff2 GIT binary patch literal 4154 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 cqetOsM5Zh9`s;0fjsXi!0^LsC{r~^~ literal 0 HcmV?d00001 diff --git a/test/widget/decorations/test_decoration_output.py b/test/widget/decorations/test_decoration_output.py index 823b90e4..58954102 100644 --- a/test/widget/decorations/test_decoration_output.py +++ b/test/widget/decorations/test_decoration_output.py @@ -17,16 +17,23 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +from pathlib import Path + import pytest from qtile_extras import widget from qtile_extras.widget.decorations import ( BorderDecoration, GradientDecoration, + ImageDecoration, PowerLineDecoration, RectDecoration, ) +BACKGROUND = ( + (Path(__file__).parent / ".." / "resources" / "image_background.png").resolve().as_posix() +) + def widgets(decorations=list()): return [ @@ -251,6 +258,108 @@ def widgets(decorations=list()): } ) +# IMAGEDECORATION +params.append( + { + "name": "image-decoration-default", + "widgets": widgets([ImageDecoration(image=BACKGROUND)]), + } +) +params.append( + { + "name": "image-decoration-default-aspectratio", + "widgets": widgets([ImageDecoration(image=BACKGROUND, preserve_aspect_ratio=True)]), + } +) +params.append( + { + "name": "image-decoration-nofill", + "widgets": widgets([ImageDecoration(image=BACKGROUND, fill=False)]), + } +) +params.append( + { + "name": "image-decoration-nofill-nocenter", + "widgets": widgets([ImageDecoration(image=BACKGROUND, fill=False, center=False)]), + } +) +params.append( + { + "name": "image-decoration-nofill-aspectratio", + "widgets": widgets( + [ImageDecoration(image=BACKGROUND, fill=False, preserve_aspect_ratio=True)] + ), + } +) +params.append( + { + "name": "image-decoration-nofill-aspectratio-nocenter", + "widgets": widgets( + [ + ImageDecoration( + image=BACKGROUND, fill=False, preserve_aspect_ratio=True, center=False + ) + ] + ), + } +) +params.append( + { + "name": "image-decoration-default-wholebar", + "widgets": widgets([ImageDecoration(image=BACKGROUND, whole_bar=True)]), + } +) +params.append( + { + "name": "image-decoration-default-aspectratio-wholebar", + "widgets": widgets( + [ImageDecoration(image=BACKGROUND, preserve_aspect_ratio=True, whole_bar=True)] + ), + } +) +params.append( + { + "name": "image-decoration-nofill-wholebar", + "widgets": widgets([ImageDecoration(image=BACKGROUND, fill=False, whole_bar=True)]), + } +) +params.append( + { + "name": "image-decoration-nofill-nocenter-wholebar", + "widgets": widgets( + [ImageDecoration(image=BACKGROUND, fill=False, center=False, whole_bar=True)] + ), + } +) +params.append( + { + "name": "image-decoration-nofill-aspectratio-wholebar", + "widgets": widgets( + [ + ImageDecoration( + image=BACKGROUND, fill=False, preserve_aspect_ratio=True, whole_bar=True + ) + ] + ), + } +) +params.append( + { + "name": "image-decoration-nofill-aspectratio-nocenter-wholebar", + "widgets": widgets( + [ + ImageDecoration( + image=BACKGROUND, + fill=False, + preserve_aspect_ratio=True, + center=False, + whole_bar=True, + ) + ] + ), + } +) + # COMBOS decorations = [ RectDecoration( diff --git a/test/widget/decorations/test_widget_decorations.py b/test/widget/decorations/test_widget_decorations.py index fbc53a18..5e1c231e 100644 --- a/test/widget/decorations/test_widget_decorations.py +++ b/test/widget/decorations/test_widget_decorations.py @@ -18,21 +18,45 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. import logging +import tempfile +from pathlib import Path +import cairocffi import libqtile.bar import libqtile.config import pytest from libqtile.log_utils import init_log +from libqtile.utils import rgb from qtile_extras import widget from qtile_extras.widget.decorations import ( BorderDecoration, + ImageDecoration, PowerLineDecoration, RectDecoration, _Decoration, ) +@pytest.fixture(scope="function") +def image_background(): + with tempfile.TemporaryDirectory() as img_dir: + output = Path(img_dir) / "image_background.png" + + img = cairocffi.ImageSurface(cairocffi.FORMAT_ARGB32, 100, 100) + + with cairocffi.Context(img) as ctx: + lg = cairocffi.LinearGradient(0, 0, 100, 100) + lg.add_color_stop_rgba(0, *rgb("f0f")) + lg.add_color_stop_rgba(1, *rgb("0ff")) + ctx.set_source(lg) + ctx.paint() + + img.write_to_png(output.as_posix()) + + yield output.as_posix() + + def test_single_or_four(): for value, expected in [ (1, [1, 1, 1, 1]), @@ -272,3 +296,40 @@ def assert_first_last(widget, first, last): # Last widget is not grouped assert_first_last(widget6, True, True) + + +@pytest.mark.parametrize( + "kwargs,xoffset,yoffset", + [ + ({}, 0, 0), + ({"preserve_aspect_ratio": True}, 0, -30), # (40 - 100) // 2 + ({"preserve_aspect_ratio": True, "center": False}, 0, 0), # Overrides offset + ], +) +def test_image_decoration( + manager_nospawn, minimal_conf_noscreen, image_background, kwargs, xoffset, yoffset +): + config = minimal_conf_noscreen + + config.screens = [ + libqtile.config.Screen( + top=libqtile.bar.Bar( + [ + widget.TextBox( + "Text 1", + width=100, + decorations=[ImageDecoration(image=image_background, **kwargs)], + ) + ], + 40, + ) + ) + ] + + manager_nospawn.start(config) + + tb = manager_nospawn.c.widget["textbox"] + _, ox = tb.eval("self.decorations[0]._xoffset") + _, oy = tb.eval("self.decorations[0]._yoffset") + assert int(ox) == xoffset + assert int(oy) == yoffset diff --git a/test/widget/resources/image_background.png b/test/widget/resources/image_background.png new file mode 100644 index 0000000000000000000000000000000000000000..3e11c8e1a767769e7c13075c8ad78ad267a26f59 GIT binary patch literal 630 zcmeAS@N?(olHy`uVBq!ia0vp^DIm7%RO}`-;3M)YHhw(wt4FFLfz>S+_x^y?fbe@^X%;_ zFRxA6d1uP9yi-@dzw~`+=X>+;>`QBBZBjR1y4y7M@qr0dzF!>^JWejtNx2ibMRT_O zyEV5%=G(l}xjV(ON%86IO_`7V8kgmq+Y!8YrCs73&C64I<;t~8Q=N~`P4b;-QK2Hh z&d>7bL8F6=jX*~;J5%8Y2L(Pkjw1(|4^B1Ncz=4JyJHxiU3{<_pWM%`X7+tRrRyy! z9%%E)=>WOij~*OcWKprfTgK*wDxcgNA$I<<&Sv)AM-Dc}em*ea>g-Lr78UmK2tyk! zDily{Y&!k<#guqA+5S@5axe4LM-L`qIt5b~%$;AVKR8U7+U)-l=%63C-S=ASf9jQs b-?^VwiioWLv~?RWAu)Km`njxgN@xNA7C#