From 172c87138be0b01de91f346a62b8dac7a83bf6ea Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Tue, 12 May 2026 00:10:04 -0400 Subject: [PATCH 01/46] Paint Context object for simplifying clip --- .../test_v3_parameter_edit/param_closed.png | Bin 8990 -> 9030 bytes .../test_v3_parameter_edit/param_dialog.png | Bin 6359 -> 6365 bytes .../test_v3_parameter_edit/param_menu.png | Bin 8990 -> 9030 bytes .../test_v3_parameter_edit/param_tweaked.png | Bin 6648 -> 6391 bytes .../test_v3_parameter_midi_change/0.png | Bin 6573 -> 6299 bytes .../test_v3_preset_change_via_lcd/nav_B.png | Bin 8718 -> 8749 bytes .../test_v3_preset_change_via_lcd/nav_C.png | Bin 8768 -> 8772 bytes uilib/container.py | 117 +++++++-------- uilib/dialog.py | 10 +- uilib/footswitch.py | 20 ++- uilib/icon.py | 18 +-- uilib/image.py | 16 +-- uilib/paint.py | 35 +++++ uilib/panel.py | 55 +++---- uilib/text.py | 33 ++--- uilib/widget.py | 134 ++++++++++-------- 16 files changed, 220 insertions(+), 218 deletions(-) create mode 100644 uilib/paint.py diff --git a/tests/snapshots/v3/test_plugins/test_v3_parameter_edit/param_closed.png b/tests/snapshots/v3/test_plugins/test_v3_parameter_edit/param_closed.png index 4ececf65789aefbe2d7bcf83183a8ba52aee1a26..5525c7002a5139baa32cef1995bf366409f37273 100644 GIT binary patch literal 9030 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 Z9o@OPM|DEH88H9= diff --git a/tests/snapshots/v3/test_plugins/test_v3_parameter_edit/param_dialog.png b/tests/snapshots/v3/test_plugins/test_v3_parameter_edit/param_dialog.png index b835e560d242e8a2ad3ecaea5ca9eb96ebc87bfc..dea1ea62ed8b1aa99411610dfa1f92dcd70efddf 100644 GIT binary patch delta 4934 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 delta 4901 zcmZ8_XHZjH)HWR@6ai_{K|m>jQUeAM6p$()MU*a0Kx!zVoFGlmfDnp+fT2rAN~9*D z5CucM^b+YcH0c<4bMH6v&AjjavG?qC&OFcB>shn*I%nqg*zI@MDf3dqgec8ZbZ#-H zeYF&LV6CZ1BiT^=NHXP>J9XfiSqjk@X!h@N5oWcpvNG2@9(+aNRCiF;XHaSB*~nWz zvDwCq^J{81`nl#qI|6R+Ylc<|6{Jg9waDIw-*b{oFK=mSX=)lJp~&m{`iqsaDY}uN zp0)$w`MMk?vpB2jXKTBS&X<_X{3BbZO1!77YKfi3abZA?4+q|6 z3!5F?QKtSayV4;gFF%~|G#T<%2HnKkXgHa*ppv&zQC|KmLuJd-!eT-_`LE2$$x8mw zZW)e>)!|*LX!|W6^UPRSyZQ~vQ5qFBq8TI^`X{(S?OG$5A5v;jhbd>w9_rzckb|JtVt&hv34R(ssk%qhIvAMZ?=-zYk$<-5FK=sC@!|n=E zd}P>-@futN)Ni==PaE!hl%I-`Er7Yyxg>EVbV}GhxqjIH5xZAIme+Rtyv;WrO8JM0`{U)T+!wrvRuJt|NmQ=GEiCBK-u#}5I3x#9G zcn+iP=`046*JIa|pRTNZc;0A3+)jInU8AM=KjQ@ZDQ(EQ-WC5nf!!Mo9M8q036a3l zg2b2v#gxgsXyfAWzq_~qe}BGULd4Mwi0hV~snk2#%%kY&39l_8kss{;Tvr!&PC8=| zxXb;vN>^8x03EY6FEM;*VDN@K5)y9b;Q9Ia5eUS{$cS5iUc29dj$Bj4ZvpFRie925 z1I64C@yEyTEXqMz?maF0&mdnrz)pZQJu_1+V{v8WjkP+QEuElG)BmUG{^Q4wUt4^U z)Pv#$g#J?wh7P=7?H8p~f7D8#R zMMIN-7$SRSHuSCfMO-A{RTz_!rj)_pW{Q634z2;Z&$0HF6&7j6DmxUw`N@h~-v{A> zjj@`kjE`qf%e$F*)>zesI7`)#D5giYhQ=s~?P4&Gf@+2;Z0#`D^xMAN;=^i~l2~~ULq3q%yxw8Q z#X^k-Y<(cs6ZmH{0JUm7`B#cF^3W0X>wG}t;(Mg1VnS@jYkd=QOjlzJ>tNtmRWB+s zTyOP_KcSlCqV9cr_ji?RkXHilpZ!MRDRw zG6mY&U+H(vS6S326pS^Q+p=#U#z-G@x(CXEf^@-<8^E93h)o{{LPFPe-O0Y8I`8f> z{-dqLYLAi9pR_7B)6g)%gPfZ{94VpIB;(f6tOZ$t#4)n&iB|#6O($I_5 zs;Gt)BR9NLa|FrxodOmDfrwZLF}jG?3#7m9Xw|3ha8}kozn9!sx?gw5QDW?1%fnhM zHb~#k1i-f5K0Ykj4sI<0{O>|?aU$6YiDCp{v9FQNIOWa3!MZ>n&MEg<*9`u>x%tOw^M+Cv(|jis)y1XJ z8Cf{EMuOFog5d0Q^F&shsaKjOyz$!PKBEz!w_n@gt&#CM$+9k&csXGoYqA;+G0MVn z!Zxn+PW^o0f=V2!y`dDc78C0=#)~s8Q?DN=)ug!Mu*>6vAH9wv*tu``dr!7(Dl_M~ zE&LM38#b1%2Fmavm7%pKs4)TFhNSdT*`#`KsTYJaHRJU#OgSQAHXv$7{Pd6kj|ZNk zGiSAZwj7o1PC;i!^_lLQ?ix)Sh>5xdL`?$?dnE6}a7D!7>pp#FbMrdW{hhX{8CkXD zs;Jng*PPGm;&r-fQQP~EPmNfs4izRA#-R#XpGuRB9zn7;92+4L69ZOVgQ6PkiV@I? zqa3A_9(!lNQ=mz90*1BQoDbdK1VpaoV-HOibZY_9%q_i3klJHu%gIxYoW^;TAnUFL zhK=CC?aa@nO9m{=*@V;6FqRD~#oBhNIl0Jc(LwKh+k$_ z4Tx<@8;Xk>tOS{BkXCS&F?s6icLsM2>`ajUd?w__Mla7SgW~c+bMTS2%@5m2UQ%OE zC+1d<4u|)GNmI9O{05QKt8JXrielKoMO}VgY+=LlmCgW3{)|TD$GZiuo;fbDKAw?F zwTp=>v$L40_JQ>k8=U9?8*=ZC4!NzAQVN6ZO&d>=c)@ z;NEKw;wY~wfrxyQ^=|!fMd}nnI&l6qXu?*^Wp*|;w(|0F5i@i1h531D&R%?uGHF7D zLXL-r2gE7O4T0?^Yn)q?D?M`HGAFhF;%nsEF|oS(R^edC>Apv!%Ue-XQ{xXd690;cp`}1uOCK6+H#IetKQ1>d)R~C< zqO7RcSW?n`;#GBedU~0iu6m#7Eoki!$j=*eYbMbXO~I%Q02-_lFyQyu# zj69nb4qm^0{a2Q}+t*jL0#@A*h!l&(&CQ`xP2P0Tjz3eyY^s_H3k#c?4ySxDO!ML= zl=r47G`Z)xdO>l(00l!F1@-?I?@@0iI^~xTmVyCPB~O;h5p@vG7qX!9P>Sl@z_{dK z5;apGo)xY2CBbqV0)=BSRe# z3ZZxKxduEu((jg*7MG-?g6iGs1u4-aaH%pJDCqp=zqH@b0dvrW)l|wb*S;SSvAj(4 zr0MPQFBFe_SyRSL#Nm_jno>ni>y?|1rhDjTS&%AaN!B5dS;(ETX1& z-*rlOlUlmev+WVjtwm;+4-mJoV6ySw6>)Jj^Qs&x4L{&GI5O9!jyM)J%2uc>So8rx zkK;ypTv6#SesSNqMla*x>8ysnoEH}_&Q6+RNz3WYJ9uMX%d49_^u;ggs+e1^sAxk0 z?Qyd0nfj`#kc}-?aLb$beqNR0AX(R^Y@4t^h>eaq}0^a_M>seKP}Kh-EB-hA}Sx&6L~~B0w#!W89Dnp zwI=JLtL;mb30KMOlyJkn%R5oC+meO^^j38cvmw!2?V0>KFFa5hq=b(1Y(}~lUW`R$4w~-N;;Y%#W72pxJoK7z zE^oTxgWOKmqv+x}2Li3Ugipe}uZ7Id=`Vh*$kSy$x16-S+|>E=)7rK+-7O5Qd`Mn)zk$r!0K zi>uh3o2xQhl@yt2Y14i<{yz3yT3T8$F)_-@|M0l{e85K@epQxX%fGUEdi0UOtg`Hn z9|xZ7Et!`ZlRIVvznYSU1_s&88o=i7-{d`IX>adyCu@Cuy{D%q52?;}4V=UW9vUD2 z;yzd~Sg5HkAD=VdO+8!Pr`QdvHwY9a$y?vcCF5{N%dWies=7fFZiHoPF zr-?~_il{CbutQjij`Cac0Bh05kG}^{+U@P_T9&t@rKM$LAb#^Pb~XKdeMtxeB>dPH z25TV>5~t7-5)xz|#U&(atm~Y1=lQzGC0C*V9I*V@(lQ7Nb#Zeu$yV^#o^5w=aY5>{ z^Uv8qgo|y-@Z*3{q;nx z8jr`vvk3O}_oE|l2lHKTWHEpDhKdbxYpS_9I2wKDI%isgbMUUXPBO;y^s_p9`X3xH zhh3YY#zOgPh}Iw?+YohWQPIxbiz&kS=*eKR`e_*o^)(0xn{4oC4c=DDGUR+y{Q2|V zE>2LQV0QucC(pXdlE4uSN6{w<(KGY?z~c{YCoBz&j=DD5;1IkkZE|36b93`V&>7hs z7WHEXC#QL8mb;Ja?JveK=VYzM-4$%4Gpy_*(s>PwJB7PnM+vBm$EVmu99U#3GSNk! zITrQw06pZS0FUy>yBfN=tz^hNomMU~`veOM^VTgr+$I3?-!GHD^sKss!uLd48E$6a zKD6z0f;iu}43`)^dGf^6)Re4jP1~M6SwPX`yYp}zxW`C!%W%-oTUMr9}=g?=Gn2a;Dhy%&!0cL^k#(KP5)e0wz@O-joc3t zi9~X+vu``cEuiM-=i9@MloS}p@9-gy0C0+EcTKrxi7Lz%g*t?@3~jP*gIksCw5OP=)N}>C4F_c zblm)#3CGkDiI{d^u(_W^!><-39Y}eYGS$}BMotNM1=SW$21k+A)zHvT5%DaLN=qMa z0AG4HfO4q&A@fbI#(MhOyy%mH+tc%fHh245fffq5ww+yG@^EdO;S(Vm&h_JK*X}U> zR%`F*FWi^v)^bC|Z;s~D_y3TCgH|3L&kkP=xJ2}cPm1Ig`rV-nUrh+-8{Zu?v$IQ@ zQ_!5%4D9XgwWSgv zDB1xkI-XK&vcUKfEzO~RTSWJd>(w3qnsLuFsA?!jHx4?`b7l$HZmjwXuL?~lRPiD5 zf^!BavvgpH6VQt9IP^cBhQ^WUR+qA=H2S`$?%Ykh;$_PW)g%+{M|M!h=7ET*rI zoDu)}u;26W>i|KAq4JsFE8Fv(f2m-xMGmXm)CR_Tt07L{|9l$7(yxWjY|l*s`}slvmvEK{+Q6W>6ZVt{`!;>C!UY)znu9G zou>#6B1xILJN-X?)_f`?iu*dUmYab)6?H*BuaunRJJvM&?>~`;4~*|uYdO67A77Qb AE&u=k diff --git a/tests/snapshots/v3/test_plugins/test_v3_parameter_edit/param_menu.png b/tests/snapshots/v3/test_plugins/test_v3_parameter_edit/param_menu.png index 4ececf65789aefbe2d7bcf83183a8ba52aee1a26..5525c7002a5139baa32cef1995bf366409f37273 100644 GIT binary patch literal 9030 zcmcIpWn7eBlpY#E5NYY|l5UV@DCvelx;vyhq(P+{L_$(pLQ+6dIz^;ghLqUL|G&Fm zc0caUhxa%0&VA2)@43%;&U4OMcS5sc?s{gJ`N9l_*@8CCkl zO`^gO{=9>ZM7>Us=gz#})h`B5K3gWfmw;aVselW0G&&Q<{@Pg!|YtLM?tOw*x3XDkkQ2MDAQ&3r8v(nS-x-WxQHj~W&i7bk;m+~O8d1`%+W z>)LR0B^%({KWJLzcV$Q{Geivbl#!R;^AHZlNm%!lSQ8xG*_0{YdKJ@ha&p{yDhG^iEo9Wi6E;<*ovP$mK zj;Y6yW@u#Of3~aL^8>1+6dN1cV#Gmj-kLif>K_9mp0R(fMA7S-t&ior)Lc9JS(<drXB+TtoC0YN@aPtbvq-garp( z;TgPBc!(`-V5@#ioQIIX7Qq~;n+g`JQf1VFOHTetrvgi)R^hq4jLh+szr9>A3KHMB z{hW?~&Pby{yI{hF!3qf?BC1{_hpHVJ!GNpVx2D+@TR$oqnr^)%xkQR($}^G*_6v;1 zvWKlnO`verG%?WhH(cCr>L!y11uUI*-@3d$W7%0aC*f}Lt84bay8gn3+_{f_ zfyqBW{$DO#fi!Ty@*$w3q$P}GSn_bN2>nt4xzSYii>m6LpX$@@*r!g`zYPKDH zIaM_?qb99I+(&HR3X%Gx)6~>7J2mz8?c3iQ8`?TL*uBfLG!t)`HTx6DAH4q#YHVyg zZRe?}sp;wIsi>&<;>8PX?PuqwQxrRyR9pL4{sFe*Cbvvr9Vt1>e~?y_$5Q zp`p>x)b!q;tM%N|LG9Uc5wx|nJ>48}cXuzM+;VHFb7D}0bZisi40 z4##}lWAb`~05zV8FcySmQgU)Zsfn}<&C{?8&zC>#>Ab#u`zD!yI$!+j^a=q10h5S> zOd?Qpz3JzPPlawZ1&`HZPnj~U!}<@iV_Ti@NhLV#{QSJfnZ{4Sz@J?Rv4~CZi8|gr{XvvH zC75{L{bAdYYL4(b;a@vDLa+b)R!n91WYDnN9f7G6{*08g&Hu`6vKhapRS^mWlMRoK z&iL)TB5w4*`cqs?w;K(X1YiV(E;Kr3T{U52Vj4C%<+Qbl5U{n>S`4Oyhah6GQd(*SMbFCN>;Vn8oJHzxzKva*fe$)$Ub$B9<|`WI%iV_UiGN_0fd4@y>-_HT(Oy|v zLR#AF0A-Lv;iDm+Lt>hDP_VU6i$Ko!;hjO!9oMuwu^TkANJVr#jjF?hpBH#-Yi3r^ z*?I4G)GqL<7yVCjUY@Ci1>Fvwji*2Wc7;O8q~-8?bwUSw`^C?;KR7#Yy0=cP$8vLW zb5$u4v=>(+Vb-y*$BsSM7&qNytZNp_dsklA4s_U zd%=qT=J?nJN{SKjt28f=g^B57S(&Ya12B&l+ea&(U{nJ`Xz*Vcist8QBiSlBrK^YDHT?sO4+xFplU;-bXWZ@gY)-*ve-UgeZezMs>F zu0y_|SRpUX%y{k3J-5@X4&QM{R!gikAJACDh>)t@cwma5AwWKAq9?t;(~4sY@E_YV z^62D(E?vq9_Pm)#9e+pXs*B_kRTUJXqoaL(#V{Hf8~Yijjt&f*9u9j~^88}&3 zSQyC?z>Me?a^FlsQ}IYQlyP-+RZ_y_OTi~5zTB@LJ9nomTPc^1eOK9J3U-C$y2{M( z7f9bzH(9{HQ&UR#fnphQ)Qa>r+N1;+jy+L!)ng84Gf@9{D1Yv+$vT- z+WtTl8wy~g(dN5~s$XwKDeW*{M=vg(EAFruq{T8_W!y%{ZXiRh-{_#Pq7uJmg#EZD zB_(Cbj&Hih`tcqGdqw?v(>ag+o+=!28HJ5K{SE-o%9 zDJwok`)o5M&ZUpuNN2ok%tj*h_DD&y0w zF-Gs@rKP&MI^sC5z`#I2doAqv7$eR*XBj4Vv;2H~8^3>78nvV>5ybYv(PE{FCMpe^ zM(3z%9KVf>0B)<&VzJ~>j+aZ#$hex2r~F5uzGPB9>TiW)Rr-Fe9QEB|3(3mL>b$@6 z`>{nPj2{Be4h-LMhvu6P#k_Z-+8J#JPl{eijk2A)a9$>|K< z*!OnKBQrBo=aYfuE0z++?cH6HXsPB;pBztq^?~%{=Mhx?E)S+M0xnKVO5$?;)vI14r&yxFkyi1N$-uy1cW+M#e4tSH zX3m~RtLNTK4oGk3`}4mC9-p0^fh4x-e;Qv}S{lRg!hPI^msPha8;BE-3qnIfxgOg) zIIwYWfY9}pmJZt~%iJuUMV3#bU}s~aV_emw&b|JY)BH$<=W-l#KhStl70vbgqJytcf&{5^*;#x6=W!2n0dQz?MAR0b8_ z-Lg{ufPnV)_Sd2&^6~>fia0GbpPY_Ka09zt%N-g*GCIDG}K14_) zjJ+MyWmEji%UeHjk9o#K*Znh8g5I9Fbo63(!#Br^E6`}6x%`d>AmP0sU`@)wOds;G z9@;d)+vqL%0aJ1wl|Gwn7;><6U_|6UdmdJA#g)Nf4NbO1HS~3Fjo5ulV1P^<~W9huaGFnGr(T8VN(Ld;H+uTa!-%>a;s;tM9%Nu z7C}KlpL7gOOzv(kR%d5sNFwuca}T$+(sFWC$X}n12#AP?3|8M;0|W!%2QXDqQW8(X zS6*9tVtRkA3qa-L;{%1hX=?JewA>iY5!vBDv*4bOd&UFm1VA}8==&DM=sO#u#Z_moY(&}?U6V;PEya8w;+aA;fMMXso z1_wZufzcrTXlZGm!KGA7M)g!uL>2C4Q=b>ls{auf$iJMfP))rb3@Dvxf&SkB8vB|mGq}})S`V2ATC#b<^-0{uC>#ar}a^0U3!pyRJ-v(=`c_5m`hQy=kz#7O_t@Yd>0&XSl zuhhizC@CqOWyt`eo0*wuYik2ohajPWqQTB?H&@J0A&u(l>gws!r*9K4LE!}$6o81I zmltsVLlLH}P0zq^P7QO%FaeT%$LX&y*kx}n;CThQ`1p7aq=wI*$BnCq+X#EOo;*qH z@0V*mEr0)>kY~C10#BjZee3Ae`oWs}*63>=pYZVTq_*{eL{3&#dq>BO6Q7Wf5Z!8% zlF|L`?PkwCLeCGf+a9f?0!~Sb2L}h_+M7byckO0uc;OD?b`2H`CqAN&d*Czr+7;6t1FH;G8!m!(%TyvrlY6~ahU)4Q zb92Oac$zvon_F8%I5?6V-#Bn%zC{Y(T0}^h-Gw4}01dWdrCz25Pa4$L{nn5VYQ41K z_@jQZ>NwH%ev=?M%)#$JPR&QRPS414F5c)=^ts-gA1o?=dTaT(E^DawTjNzgW0Hx; z_tn1TWi3Dg{ZQj}IqrmY0DhndRs$}Km6hW(%IJu&_V@Rvc07DzRhwH{&UV?g%CvSp zk(=Avvb-{Fm6Lu4oVM0B$YbZImcC^A^5x4%T2YFzo}M1E#9ZN=s*;kv;o;a%o{^Q1 z$vv_wLoF>je2k*P!v1(t@2fwSlZ*WG(9-H)X2MtyK7O86GvnhxPBY`6e*=o0vb`Z; zM80U^ZCaYVoLr_YQ>5{(macB<&hOJJ4h{~05#gLe5S^PwetR=O*5MNpG7!cJktHb5 zkqCQytSt`;%D>LQvZs8Hogw9Wz!gL!v2Q(-6(>tR!J2JvZ(mVfp6hogq^73UDzZ%( zbfeCYI+DR7Pm}E9=hyjXh}GazEkWz?Yi*&-R%`cgq^ zqI2S+YAGKjar|tCISi*aEDrSbQHO8mtfw-nS+R0MU{52*90LQzU+H!YBrd}H_4Qrf z5=gcN)4GM8L+aUJq!mpfBQixq#h8LoanIlHPKvhrR*%$9Os>afc1VqOQ{s-tex5fH zCTsA@ukaqfC&;g8nvWxfDY=kY%l42hR-|<^$C_eC7FTWWaKZa3Yzq1E66(g{O2=c^ zesOLjmtu6OQko|mOz$c8apqJf77Xg!Y%*>S#P)JTg{`Cyd1XVaDb>s_%_Co!+|YzC zw2sdXs88y>@(bt0{gbQ_PpB$gmg=iIZlkU#(yA5HxKSj6C5FahDtVIJ+dpht_{=Uyc-U_8u{D zCpDLMyo**_v4js-%eeOlrHj6adIju8i}qh$b~d%(j1c(D`j+jH*Fz`ov?n?-GWNvOeR( z#^`J6e{F`|`9a6dKN%EW(!XiQi|#z^fYK2b-d|%GaAnxA3`7)BqF>l160b$AT)tr{ zQb<(TG}Y6H=k_it4W0PgN$a)T*BkM746m*8k!%Nr0!8$wE)K!p4d!rkXMz06pn_fB z!k5PP+-{yP?s>>>PwYRtU{0W#4=j45lAz_>7+q6}bQyMKL=)pA6 z8d>HY2SK!ooBb6dfkB?YPq{OHekOUkKHd!b&Hh>|lsY`u=QmbWRCPk3#sX2@rfKsj zzWP@N*4FUOW^DMfEe*Ey@FN5~**vrp2`xGNb@T#=GyJT3Knndr-k(B))HTt3A_A_( z+gPAVfct1XoeG{GF&^YfpdN%ujDY-|OPGvVc%tFZtT@H#Ld~Dz+Tm-F@Ne^(Qrnc` z^23QnS)!G_yU}d6(bGD`(VaVa9TM{C^WX(~++Cq6&EWiQ^yr7mMpJQ`axWSkQrXz|27 zr2OrYla!+bGw13wKZzI3T_wxyhjnYRvzy6K?`-X5CLLXN_bldhaW^l4kNKaAr*PgW z206ngd64`H9yu-1njnkg!r?ZB)V^?xU$1P^1$@sH3-L#Gbl(0lyU-iQ>D_?K^kifD zMT|+4n!IRHi?T_7j z9CNgcbr%gIZ6blmu)_Jm^ocKKRp~YQvw=`;Um5)ym8~(Q7!f@N??AnX#d-K=B#GA)x>?Ao520g7o z$Kx&JkEqhDM%Gy)@pWbGMjwOQFKxYcBR1i|g+TTeyY7q%2Wnp4&K2TXYl~HUQb%@; z!eKYt@O1A+hIGl%A3GycTWbrPd*^J?9_oqL682lFY+M*85*AQpu*F@!`Mtw`nDuqID(Xcgp>Fx zd$`%#@Luicb4=*CnbDE?5Ub^`AI6s+6g(eyx;4@JRgBiH^@R*+We5y=DKIJ-bu%mw zhwG;UV*kE7vF%UTVg&~TPUO`YYvB_BgFqY}p%X*MOuN=v4CfLa!7%S`wj`PwggSML zz9LxV6#Mj{B>fc{j|ov`9yC71KJ}+K#IoVpLT5vn+7X20U8rJX&8*&B|H?t+%bwoQGnx z1Q{U#>B?tK@RI&>3bW=1AXO_X*+2^v^hexQI|9J4B4p*S>nGr}0h>}BbeJtE5@#!d zDMfv1fc~AE(*ydLfK}(G;N3&rAdw-0{}YohCNR>|t263qX*sNXY3V#6wfI?yK^&P(_V{rRIJxlI9;e<_02)*O z*&26*3=@78=zs&Aj1hr2aAF!nFWQWXhIT=csZ$~5f63M02TGg#{Cosegf2QN7+TNp zuo4sg%=83V6OERsshVT8X=mU=$1;uc;^G3FmE7I+N-_K2(au_WkdTn@X3F2e2rwd| zLYw(C((EiUtNGq!Y*v$mnw?--d?X#K(_( z{|-Mtrx5e?@bWs3z$E&X=R)>SZ2{>B5zt-jLs_jrWzV0UG7&EKRWKp^tr4KZZL)YLzff3l54hu{KC z6XS3}1i7eS5Eqza7vyIbu-FxXfPfT?goKC+K|@8}&km1@8q45`I?#h4VWZDIdi3Op zMBoi**i$Y(MacH%_$6l_bGJ8EEMke0mQ|HX=b`rG=H14u5_RGOA`L4O(~~F4@}HaEWf+-Trlu z!Ezx)ouI*IdrCs$dvUldu;LST5dE0u`0J@ws$zU>thorysIrZX4HSy8SWC>-+t-IB zl}I-J6ie`tpkE>{W{#c~O#u#Sc5ri)=im!o?(6Y-Hmza=#xl`$HooBbXL5y|75QYS zWN!rxBu1%N0+}CvqzN_-o3sUUBWRT($iL+nZS~ZWG;IzzU)HVv6TuK!~55ksY<4yoWBG+Y{;d%J=tr3Ik!z%|Xy6e|1 zVh}TG&l!w`VF)#ng|}tF*0#+^Vu)5_|2_ZB_JRZUQ1HSxjV?r3h>VC% z2nv0T31X#EjPzIpDrPVW_Iw6L90oY0&+3RWp{uMw%8GveEF>ibw-*-}4PH9b4nBK! zWY!azaq0xyRZ`&2&dem)MQ0^>c=&fhK4Rrq6ZSJt(lNvm`Q`I}?_w7se*Z4qBgxpM zSL|4ARs+$KJQQT<`X19{vX54EKce@=@x#A&Uq0LwxFsRIq~YRWh^MaGW0HAm;n;f=$5l)$Fv(lNe2nWVsYUVg^W&A0f2KXqMj`y(`^uFf z0_)J}i7Vt`d4%F2o1+o@eoPuU<_r@evsD@)tTw*M1{a9o}gO_}fiH2f-@pQ4QYCB*MciUS){i z19Qzqran>sRa}(ex9$wxDcy}oN_VHyEg>NxpmYs2(ny1pG)T8JNJtGxgGdQTNtcu$v0we~ zeQx%-I=^!>FyFlOt$5b+tT#$aLm3x~5(@%>;Hs)9=s+M)8Swux1`_zZ)8vqVKo~bw z6=d~%vJSE_^&S|uA)L?Egarhm>9Hc&E#OL~82qd#8+k~SU!R)43spGnd0KG#)KrNm zIm$A|x`2=++IfJCKh7kESed3!Y3*%NX=G`h9D%mhgZcbj`7;iLaw2hiH=*kyCDD%zt8r*gZEb84Umodp&|ARO zZ*Ff{h@zAVC%uuvEk)uS1t>F~4s5!Orq#i(bi8F|p2&61;vlo|cH`ye=TqY;Z_$T) zHt)bv2Pk7%IXPoKJ2*%u4!yu&Xnba7YWkE02Opo!+FVaBlry**721sy8WAx)6K$Dp zP{GB)!Qro|ZRwmPR%GoW2AIS6jhPuImHl(|G#!aMZy8 zu5e4eM3&^CK_;=1zw4?$|2R>P22DP`^8bMTMkY^>!>yf=&bE)30=CXnbHfgjSf0RWQJ~1*g5~nrxwwkFLV|-)kf0Ak?hKVP z!cKns-(788_b_wiIm?iv;M5K^I?ggOGU{>Yk85!1i~uA1ORZ!PT6~s?y}fX%*sHM3 ztTLxY_;ES=At9j|g>!2-P?I2B-3FUymtQ*43kc{v|2_~yF->>ATfudSg~J3jKsjeO z(R6m#93Ew3~e)%$`%@b}JO~xa{@OU5>MEdUTM@D_NJuzsJ$DgY;Z)qC6&rM~GnTb+2jMUBTM zA(5p=KeM7lw{l2)y|2CQIQD?vqWf)aPT81}SJ%tNXV*{A5w5iHb`EJ&^XoR@FzCNf z{=a5}(KfG`hF ze5?`F;LX^nOukOp!oosUb~Y6iRoCssV!)pZ+`c76#>tJLWJD|#*@FknDQYw{H2NI+ z*4EZGHa6PY+OJ=~R#fbl`99lJ+h@AHGhK4OqZw4-rK_u3QC^;KYjwG^d3vQ&_JCpI z@UYW+x@w^fSiX!QRJU$Vv&$+BN`e6UN|PGb4cYL?d`Q&d=8ExW_uinO&j0r zFvHOXBf;ul?(oyhkucWR?_YJ1kd$P5nx2rAC1KTvF>v%c8V-j}YnAD3Zf;f>)=0Vh zfUGxVO8Q-dViK1wrKYA9JxN<`^NbeLne4y2{R3;;nOeoRbEP3haSQtd)! zB22l`>gsBcj)RFzXq^vYfQV3r6ad&q&Hl7c|CJVgYDFJiuwlsq5U%$59U;m?g ze05`J?i&`!%+H@(ZH`5az^9XP()m#=^{m)d@=>crAm+%{=}OT3?L*ySEoDhBw@`rifzBk}jd#KoC+`is6aeYyI{EDM9RL4%%OM@C2g8Ge3OU~MHfU9A4+xEJ5k{OWXTyrd#6czla$ zW$;0CKV85XVUc;VM7esFNTRDUmTrm0?caf4pCCp@50W*d_$E+nB)nmaDQXm#;$(z` zvMV+Y82n?E$`$v<&TmY&4XKQ{(}FJM?RFU4 ztpwB4xJ;CcYa1Iq!CAU)eqra1=L$L+I5=?lN{ESxF)*wm=z^HNB_$-x1Fvj265`_G zMn*=ye>bf&x|w>yGny?vI~bavA>+M2=ej+?&}vFcL?ri8o;&USY+AFmwN+nV9~T$5 zs;bJW&gW~X_TSe`t$rIHe}BDK+}~XSVAhe2r52s~Fv!Bf64h_z;C*|24q{;ALU_f0eQ%G7m{|U>_`?S+ zgB&qWj`&NFJCo+ulCEng^Ukflr#~kPm8n+L+pH0BRVK|zi)n3nQ>E^FpD4O{4<;~7PEKAQ4qF^* zO(5sXFPGkL$6P<2;#GaTH)+MOht5crPUzz3xHpu{R%Vt>q{PN{{o;Fz>(?ez?%9`D zS<*o{A3xUA98KiQS5#D}jxU@|Z+}z9ppo*QQ-M~@>>hR9o3GSZ55z>p$K&JT(ujGK z78Y99I8OQc_|S*vWg;c-(1lbL=Cc=cDNistcb%*^D;VVvAd zdCs?S&@b743kWy&>#;1+m4Hi{+ut!1{N$L=5mbBAn$oeH(WiyV(TSDKF-nzIjLK$a z*(bz~gXYxPWK9Z;gwg$HzrHLkE)GJ@jZ>GyN)0Nyu6HZy?Z$-!1wpmb)EozRoCg&O z)8i1#Ds5{MdtvNCT~k&z|H&7W;w(u&q53yuq@+T^!n#bVfq{YJl9#5^%1OH;um+6L^zOqf#6veh5qfJvm+c%fVq723(Bw4V(*jRX+pIQg-@aWOPUQmSZC5l6 zxwp2jPa#E3@%(tF_mlGQer2;nsu5LLYimZQ_^Sm07=nIYSU!axz?-qL@wmikOhv_` zcto-aGq5-ym4J@r0u)B4^OrI6+@IrX)0>)_va+%YmCM)Txb3C8o4C(tQ&(62>SbYJ z;o;Gs#qQzm?zb97cJ~`0eZkg&CgQe%af|7<9xDuRlLq)SE6dhf_EyitWLWRAhN7Xl zng8)fVK1m+JkL9y9*BvHJ1;cs#0oECU|(IdtqnV*1e65cZrFgEgIb2+)r9e%>~mgO_MDFF73>y=oO6O}{dEFH*xqR!cWE41 z{p(kc;~%oUTh!8l5=>0;CHuR{2aC;nF|>)LdgWXuO=s?^=g8=Irk{N3wp^2BZkuVJ1?92@`<*N%>ONTdA@+Qr>}j`T;9t*@^a78EGO({iP#fmAf*c7FZ3 z8u%DEmV;v|!@GLMVYbS|`|x`!ATfz_{9k8gHn+9_YA(*q%*dqW@s-Z(0%JITt274H z<^1vz!CMKaYi+H|c#h=x`FVJW17)%~a+ZiIBVcM-{+aSb&x zB-?$BwVcSL41>YU+dLlf@=nam=vNu6w0p-N_Udz_Twh&*%9Xh1y430(aV^v_?$~ct z*VWZkU(X-W`|{PR4)?7%skFoqIn7E9ec~xc^s7w8M+rNd$1SewfSWbHUJ`>bulS#; zlaZx?`j~j<0j%rq?=L{94oDdQX-5YKSa|OH_q&^$ikDUGfHTL%;r-gX&)~Py0AT>Q z5{Rur<@ne3_P=Ml?)1&gL9tKD%Gy6X3?N(u`00`EaaZftG}3JQjWh4F2NWvOL%zGwDLxT#^XR;j7la5jivGb|BPzhlEE zB_Z+j@|s#IQDsj0@xx+@M%lvRM=&b(;c`d2!%X@4-YhmsFwob^2<_05kt|VuadB}b zrovC3B)GV^czJmxByOC8{wyvuIu_|XTzYFDVA^vSeL&&$gz_1!y{*6*vm5mfF~ zU0p$dm%e=Y($22rSrzMT7601OBCp4i9PEH6h-})UBIH?BC!q5{4zQ;^1fk28Hp@Vh zX<%r0wAif4oi;l&b9gsCSC(D=!?4qxy2hf&I%HN2YXcRaL}H9;*ODi3Ddx<_*W&{iAb>AkBe%t_(l zXl-xaXJ!`Zyv&`oBLBIzHZ?IJ<840k{kzi#s>?v6oyMaZv&t?>|C2RE5K7(MGH%{$ zeNjb4MZgLYwBzIBM?mp^%>c;;61R9v0JF-#@ARj-TRWhEz%Cy@CjBaVrmNe#>N5B- z8?laxhGyOsn0;9Nsj@QW8F|&EP_3%js6*rX99+uS@DXO(_z27NF|i8Jb?DS7e&Z-g z9j8e)_yvBp;Ch#umIk^v3Q9_VB*1)qudc6?us=pCFn-L}kT&K{qw2DNWH&VlwHd!t zW08E}HbdgZ#h$3rx9PUt#yjwcNwcJGHg{6)@u|m6`stNFjq+AU!KA$lb(i1eYa1ID zN|nLa9LP+I1DEr1uqxglGH*{^AU<~y@)A}qR zpaYOW8G8D^?A+ska5@LceihL?GBCq@OlnDm~sreYX7Y*T|f4Mb2n0B)f8xI zZS9kr)A9DUwy7oA``_#FKp6tY1Q_Ar;bBe3#e1c~9Z$(wAjI$@_^k(UfJ8kwxCJw) zx<2@6;!%tI*x9+-t*8M$I=S)(6e~SF9YpH0o<}yiy3-&lZ*OiGnV5!LLD81W4kJ0A z{PxZ3d{8kBx{`QBJ6VZhOr_J#}$bL)67#1@~@g>ZEkU)=E_|4;ve z)spL#1-}743WT&S>4f)!2|9)9L>BXkqTcIIdOCS1L5I79kWgyXAOx;@=KmTH6M}Xm zDbFtj!efJx`IQhbI&r!IJ>3RsV$@;wl9jT9-mF{dMNFMu+Rw=uKkKHjRNCirzXd;% z-4Vo_7mxm&S}QH0G3$!x995h>`bfdoo%BOw>}|Mcsv%F98EF?ajw;P0|L5)DS?zbC zxp5!I&rY^I&`#2B=5$dlisJbYzjhl-*3!m=*|eR|-k&_YK6zX>yqecsTuZ~&y^PQ$ zze~4FAnU@&|E6&^`tY4d+#KyrRH*+4t$bA7$t=|+wo<{;I$X2XkfzN%zw;$@!_LUH zp2%3kF1cw0VVZDr;cVybpB{al{4Kf2SWW!AJ`8~cs)sY%3WN(VtPY~s;&3K5biHdx zKp@Hz?6*i#VFXcE9L<|7MU~|!?iHoQ@jP*}<%PS{@Eq9L(CrjOADtX~0Na;Gd+Tz@ zWyh|{&I5(K(re{yq>NJYhLb#9M5DNW=!Jv~RuE_gTtCi!(#XZ!*PWWK^SqprT3zer z=KD^x<~m7WC%{6j7{^F^n9A05eHUQbOmDKF-hSL+yhIfzcedt?u_G4U9v>Pnllv(~ zr;E8EmH-A5xOT)^b8ipw^kmi(en`$WAO03Mkj(xj>`c#s{F;-*SK1AAi-qN`AXn~X zkh0AT8W*aOJEl{Oh-lt@&i9Uh_Hg#VD60duwVH|=qNuR#uE3C=2qN{(bb>SFRjC6$ zrj7}d=fpM-b_j=lV@GpLev!2Ihg=_f_f^-Yw;WHfSX~Os4o;&E-Aoj@6BnVRGcpz7((jAu+Tl693>+}Er)*E-g|T^7f^Pb5$+nBa5;C4-x#@2#JQ^o-ZP8M~NN2w`jl7p#R^W>x_~og*!s){pNBcGSPyB?uv`wkRvFmoC0#8q zWf}0ERh7em&N)MdiUma>1oH$9ap%i@OmB z62<1P_=~P##6Nk%r6p8F#zGu1kMj3_jjA@RKjlHl2ec{roa0^pUMbaxvy#^y2s)>Y zd}jSK?46e1Qc<3OdlPv;3nEf4!;?Xh1S8+Qs4q9|!BtEC4@-8gIQxMv+GrtKAqFIw zE|eRyKjW=mh}_x<8}B}}z@AS})DxfB*$f?C4_)450fv@R-B5B%hROP#^1pTex&_ zlrT(Wv7x8d%U}0x@KXOJrIcr&Vh=+WBH81|7imFf?{yLF^=`*abPhq!x#aacJx?*S z$L=WJD#=afw?CJ>BodLyfy&)UMk_3zplL}8;cbIO3DWbvf%vWc5;B!Fti*G;8M+jO zKvD^7F^C273|gDyOHd5f9AK`GdN9V%DzdlQ+{n%Oi6D^E#cnCn0tBz-d0zn$*}J8R zD(&Cy5d>V8igkRJNDzyBqTj;7-Pm6;BgA-42)(Iujj-3tug5-*A)>Vs`mp4KwC`X~ zwM%8n?NF>GM2G~d%MhEwdio^03&Pnszl9>IhE^cF+bGn1R2MN8BjaC^Bx$<#cYcRS zkbgPtsPa9dQ6pP6oz-(atG@V7-5*QcPi&37{GHbQ9s;SIQ;2(T!Y|*-ZAZd_`>d6i z^*uZJ`KR8{OOwtSQ7$zCfvmki9oH(obD6kiaSJ5xIOfo;Qxn-)f73_qk(iK?Hzr5C zQ{Da(_(*8`>fPy{cucs|PJT0}@VlNv??jv$d>jaz1qwxmA7G2TxF>D0MluSPzP}o; zs=7Fuu|Mw4xEZ|1wkL-;;gK5H($Bu2cgD>&f_HdWtyZ4Nc^l@Jxslgmn!|RA*4EZQ zLlQIr;;DoWf1j*J;L$J!sXckp+dg40080B}v-9Qo`9ULAN8s)C?ydtqe*Ep9OQ5)y z+r5ttnpbQe%EAw1q|8O|0x?Hl{Ms0LRwcy5)Z5#;URIJL=JKN(=OF^ukbNqFE$Cfs6Fe(2%I# z1!p4_0YToRJq#vW-KqJw-~tvXC=jdU4w^R(%`Gi+D=R^8 zT?j8G#@v95yE`#fSYx9Aq6!13eeK0PAYVWy30%Jf`1^}c$Hn8GrQjSY#4-Az2 zJ~TgxmccCa2VZNQO|ot?c=wL*!=Qp_m( zm{~;>d|F7za9m_0Gzb+M3JydF2LpsKIRP(Zj+fp7QfmqBDlK~9@Pp)pgapv)sHefU z=!QZU!4Vk1#R>4Wl{h2(b}X#vrgBoY$Q-a_Ac}#o$zk)KM5WTMw{uC&aX5~$$psg# zxH|<~qM#Y#q<~9Kkcaikuyn@ZZ!?1vG7M#@HPe3f4D?X^uFqaNJ0AhwKQlXfDN)ka z_CB^0deKAwEHs!UI5_xlrR)BiiE|xIqAZG(PmaUmGCn>&C*{5zOe`!l4Gmjy(vUDf z)Md95k;Mw2;!wMzMB9AgXf@^sJ#ZR=(^78HNF^mY-_)?T0v2p3c3DMeyyCqoXWk_5 zdf~A|@_Pshg?=7X@a2H0*K6L9M2i)^D_{{l)jw~*^Ji0Pj}-!`x9s>i(g|0U8Gyff zQ^#fYKdk!y``?kUI>oodL_{&72f(F+8c=LFDiLQjl2hKg0|JKj_uHHSbU-gAHbz03 zrx~pq$>I%4h4vdvq;IW{n3AX>dC~D|Ax89{zv#g;VDZqYIhlx+pns$GbfLETQy(=b zLQuPrFu#=}#U;LZrlf69WJ2@z_d=nP;81RI?6J4b<@o=Wc&l&Wgb6T^1Y8G0+6Q{h z(JRWOli~k8+xm&caNqL6hbQQq5K@&|DU#!-xZZin-IWyovp)r$S@ftZg%(u?mJx(A z!J?moHy`DjD%|&B-A?O-1+=zX`;qP&bLjAk$Gw*mQK7z`7RY?8Oj_Vh-v|jTnqb_4 zRV%eF>HpisdKvd=0H$iVuD-q^jiq8Qm<%5w)q|g3ePbwmy=t6yR%&AYpQlQCa0+8P z@@y9hF=+*z!AFZrFdXr-d4hGO|WqxoM61Z-5r+u_(iT=Z`Lw z>QIx;ey*ckun+q8EzZwT+;9xf=0E0b`sIHHmS&{VlU>obA4V)wF1LI9+qSX1J2b6@89e7u}#diPK3+v;HP#KTK*e$P?~pClQ@Ds3qhs{y#E^;FN6w$JG;`eEQ;ZOl8LDFEB_s0KF{!fcOw5^^5CP~ Z9o@OPM|DEH88H9= diff --git a/tests/snapshots/v3/test_plugins/test_v3_parameter_edit/param_tweaked.png b/tests/snapshots/v3/test_plugins/test_v3_parameter_edit/param_tweaked.png index a1007cf4b084f43a20d5695291a3e4d18cd18ede..44f38a8eaa229042a28ef447a9792873e4bdc11b 100644 GIT binary patch literal 6391 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 literal 6648 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 Q{=d_7H4QaN)a+mWKgMv>;s5{u diff --git a/tests/snapshots/v3/test_plugins/test_v3_parameter_midi_change/0.png b/tests/snapshots/v3/test_plugins/test_v3_parameter_midi_change/0.png index 1f819fd27bda19515a68c654b3c789a926d54261..38d96b4cc049694497e36e5ee314d935e1190ea3 100644 GIT binary patch literal 6299 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 literal 6573 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 diff --git a/tests/snapshots/v3/test_presets/test_v3_preset_change_via_lcd/nav_B.png b/tests/snapshots/v3/test_presets/test_v3_preset_change_via_lcd/nav_B.png index 5e624e09ced65bf3a37835cf7df2bd7dc1f56697..40db093a8ab409f5adec5949dda0824b511a04ae 100644 GIT binary patch literal 8749 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 literal 8768 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 a2gWa!2bo?T!W?n diff --git a/uilib/container.py b/uilib/container.py index 443be4bd..d33aea00 100644 --- a/uilib/container.py +++ b/uilib/container.py @@ -14,6 +14,7 @@ # along with pi-stomp. If not, see . from uilib.widget import * +from uilib.paint import PaintContext from PIL import Image, ImageDraw class ContainerWidget(Widget): @@ -66,83 +67,63 @@ def _setup(self): self.mask = None def _visible_box(self, box): - """Returns if any part of the box intersects this widget""" if box is None: return False return box.intersects(self.box.norm()) - - def _focus(self, box): - box = box.deoffset(self.offset) - if self.visible and self._visible_box(box): - return (self.image, self.draw, box) - else: - return (None, None, None) - - def _unfocus(self, box): - # A child updated itself, tell parent to "compose" a subsection of ourselves - if self.visible and self.parent: - box = box.deoffset(self.offset) - self.parent._compose(self, box, box.offset(self.box)) - - def _compose(self, widget, orig_box, real_box): - assert isinstance(widget, ContainerWidget) - - real_box.deoffset(self.offset) - - # Crop real box to this image box. This avoids trying to copy pixels - # that are outside of it - crop = real_box.intersection(self.box.norm()) - if crop.is_empty(): - return - - # XXX TODO: Fast path the case where no cropping occurs - - # Now create a new orig box that is cropped as well - offset = orig_box.get_offset(real_box) - orig_crop = crop.deoffset(offset) - - # Alpha path: If both images have alpha channels, then do an - # alpha composition which handles the cropping - if self.has_alpha and widget.has_alpha: - self.image.alpha_composite(widget.image, crop.topleft, orig_crop.rect) - else: - sub_image = widget.image.crop(orig_crop.rect) - if widget.mask is not None: - sub_mask = widget.mask.crop(orig_crop.rect) - else: - sub_mask = None - self.image.paste(sub_image, crop.rect, sub_mask) - # Compose ourselves into parent if we are visible - if self.visible and self.parent != None: - self.parent._compose(self, crop, crop) def refresh(self): - trace(self, "ContainerWidget.refresh: vis=",self.visible,"parent=", self.parent) + trace(self, "ContainerWidget.refresh: vis=", self.visible, "parent=", self.parent) if not self.image: return + local_clip = self.box.norm() + ctx = PaintContext(self.image, self.draw, local_clip) + local_frame = self.box.norm() + self._draw_erase(ctx, local_frame) + self._draw(ctx, local_frame) + for c in self.children: + if c.visible: + c._do_draw(ctx, c.box.offset(local_frame)) + self._draw_outline(ctx, local_frame) + self._draw_selection(ctx, local_frame) + if self.visible and self.parent is not None: + self._propagate_dirty(local_clip) + + def _do_draw(self, ctx: PaintContext, frame: Box): + """Draw this container into the parent surface at frame.""" + local_clip = ctx.clip.deoffset(frame).intersection(self.box.norm()) + if local_clip.is_empty(): + return - # Refresh the content of the container - self._do_draw(self.image, self.draw, self.box.norm()) - - # Update into parent container (call the parent refresh who will do the job) - if self.visible and self.parent != None: - self.parent._compose(self, self.box, self.box) - - def _do_draw(self, image, draw, real_box): - # We replace the base Widget implementation because of how we deal with - # offsets: The erase and outline aren't offsetted, the rest is - off_real_box = real_box.deoffset(self.offset) - self._draw_erase(image, draw, real_box) - self._draw(image, draw, off_real_box) + local_ctx = PaintContext(self.image, self.draw, local_clip) + local_frame = self.box.norm() + self._draw_erase(local_ctx, local_frame) + self._draw(local_ctx, local_frame) for c in self.children: - crb = c.box.offset(off_real_box) - c._do_draw(image, draw, crb) - self._draw_outline(image, draw, real_box) - self._draw_selection(image, draw, real_box) - - # Then update the parent unless we are drawing ourselves - if image is not self.image: - image.paste(self.image, real_box.rect) + if c.visible: + c._do_draw(local_ctx, c.box.offset(local_frame)) + self._draw_outline(local_ctx, local_frame) + self._draw_selection(local_ctx, local_frame) + + # Blit dirty region into parent surface + src_box = local_clip + dst_topleft = local_clip.offset(frame).topleft + sub = self.image.crop(src_box.rect) + if self.mask is not None: + sub_mask = self.mask.crop(src_box.rect) + else: + sub_mask = None + if self.has_alpha and ctx.image.mode == 'RGBA': + ctx.image.alpha_composite(sub, dst_topleft, src_box.rect) + else: + ctx.image.paste(sub, dst_topleft, sub_mask) + + def _propagate_dirty(self, local_clip: Box): + """Bubble a dirty region (in our local coords) up to our parent container.""" + if not self.visible or self.parent is None: + return + # Translate local_clip into parent's local coords: offset by self.box topleft + parent_clip = local_clip.offset(self.box) + self.parent._propagate_dirty(parent_clip) def scroll(self, offset): print(offset) diff --git a/uilib/dialog.py b/uilib/dialog.py index c506576c..d7a7b91f 100644 --- a/uilib/dialog.py +++ b/uilib/dialog.py @@ -51,12 +51,12 @@ def _adjust_box(self): self.title.set_box(tbox, refresh = False) self.title.show(refresh = False) - def _draw(self, image, draw, real_box): - trace(self, "DialogDecorator draw, real_box=", real_box, "self.box=", self.box) - line_xy = (real_box.x0, real_box.y0 + self.th + 1, - real_box.x1 - self.outline, real_box.y0 + self.th + 1) + def _draw(self, ctx, frame): + trace(self, "DialogDecorator draw, frame=", frame, "self.box=", self.box) + line_xy = (frame.x0, frame.y0 + self.th + 1, + frame.x1 - self.outline, frame.y0 + self.th + 1) # The +2 here is magic ... need to figure out what's up, otherwise we get only 1 pixel - draw.line(line_xy, fill=self.fgnd_color, width=self.outline + 2) + ctx.draw.line(line_xy, fill=self.fgnd_color, width=self.outline + 2) class Dialog(Panel): def __init__(self, width, height, title, title_font = None, **kwargs): diff --git a/uilib/footswitch.py b/uilib/footswitch.py index fc1c50c1..e20b6fc7 100644 --- a/uilib/footswitch.py +++ b/uilib/footswitch.py @@ -30,28 +30,24 @@ def __init__(self, box, font, label, color, is_bypassed, **kwargs): self.foreground = (255, 255, 255) self.color_plugin_bypassed = (80, 80, 80) - def _draw(self, image, draw, real_box): - self.xy1 = (real_box.x0, real_box.y0) - self.xy2 = (real_box.x0 + 60, real_box.y0 + 40) # TODO should these offsets be here? - self.draw = draw + def _draw(self, ctx, frame): + self.xy1 = (frame.x0, frame.y0) + self.xy2 = (frame.x0 + 60, frame.y0 + 40) # TODO should these offsets be here? + self._ctx = ctx - # halo self._draw_halo() - # cap bottom fx1 = self.xy1[0] + 10 fy1 = self.xy2[1] - 34 fx2 = self.xy2[0] - 10 fy2 = fy1 + 16 - draw.ellipse(((fx1, fy1), (fx2, fy2)), fill=self.background, outline="gray", width=2) + ctx.draw.ellipse(((fx1, fy1), (fx2, fy2)), fill=self.background, outline="gray", width=2) - # cap top fy1 -= 6 fy2 -= 6 - draw.ellipse(((fx1, fy1), (fx2, fy2)), fill=self.background, outline="gray", width=2) + ctx.draw.ellipse(((fx1, fy1), (fx2, fy2)), fill=self.background, outline="gray", width=2) - # label - draw.text((self.xy1[0], self.xy2[1]), self.label, self.foreground, self.font) + ctx.draw.text((self.xy1[0], self.xy2[1]), self.label, self.foreground, self.font) def _draw_halo(self): hx1 = self.xy1[0] + 2 @@ -59,7 +55,7 @@ def _draw_halo(self): hx2 = self.xy2[0] - 2 hy2 = self.xy2[1] - 2 color = self.color_plugin_bypassed if self.is_bypassed else self.color - self.draw.ellipse(((hx1, hy1), (hx2, hy2)), fill=None, outline=color, width=self.footswitch_ring_width) + self._ctx.draw.ellipse(((hx1, hy1), (hx2, hy2)), fill=None, outline=color, width=self.footswitch_ring_width) def toggle(self, is_bypassed): self.is_bypassed = is_bypassed diff --git a/uilib/icon.py b/uilib/icon.py index 96f8c095..c1d584c1 100644 --- a/uilib/icon.py +++ b/uilib/icon.py @@ -72,26 +72,22 @@ def add_pedal(self): self.lines.append(l) - def _draw(self, image, draw, real_box): - # Draw shapes and text - # The loc calculation lines are a copy/paste from TextWidget._draw() - # + def _draw(self, ctx, frame): h_margin, v_margin = self._get_margins() extra = self.outline - hroom = real_box.width - h_margin - extra - vroom = real_box.height - v_margin - extra + hroom = frame.width - h_margin - extra + vroom = frame.height - v_margin - extra if hroom < 0 or vroom < 0: return h_margin = 1 - loc = (real_box.x0 + h_margin, real_box.y0 + v_margin) + loc = (frame.x0 + h_margin, frame.y0 + v_margin) - # Draw features for e in self.ellipses: - draw.ellipse(xy=e['xy'], fill=e['fill'], outline=e['outline'], width=e['height']) + ctx.draw.ellipse(xy=e['xy'], fill=e['fill'], outline=e['outline'], width=e['height']) for l in self.lines: - draw.line(xy=l['xy'], fill=l['fill'], width=l['height']) + ctx.draw.line(xy=l['xy'], fill=l['fill'], width=l['height']) - draw.text((loc[0] + self.height + h_margin, loc[1]), self.text, fill=self.text_color, font=self.font) + ctx.draw.text((loc[0] + self.height + h_margin, loc[1]), self.text, fill=self.text_color, font=self.font) diff --git a/uilib/image.py b/uilib/image.py index efc8105b..541ef73c 100644 --- a/uilib/image.py +++ b/uilib/image.py @@ -23,16 +23,12 @@ def __init__(self, image_path, **kwargs): super(ImageWidget,self).__init__(**kwargs) self.image = Image.open(image_path) - def _draw(self, image, draw, real_box): - # XXX TODO Centre and crop it ? For now just centre. XXX Assume box > image size, - # this needs to be cleaned up and made shinnier, possibly with a Box() helper - width,height = self.image.size - offx = int((real_box.width - width) / 2) - offy = int((real_box.height - height) / 2) - loc = real_box.offset((offx,offy)).topleft - - # Draw image - image.paste(self.image, loc) + def _draw(self, ctx, frame): + width, height = self.image.size + offx = int((frame.width - width) / 2) + offy = int((frame.height - height) / 2) + loc = frame.offset((offx, offy)).topleft + ctx.image.paste(self.image, loc) def replace_img(self, image_path): # XXX Note that the new image must be the same size as the original diff --git a/uilib/paint.py b/uilib/paint.py new file mode 100644 index 00000000..db6ab450 --- /dev/null +++ b/uilib/paint.py @@ -0,0 +1,35 @@ +# This file is part of pi-stomp. +# +# pi-stomp is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# pi-stomp is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with pi-stomp. If not, see . + +from dataclasses import dataclass, replace +from PIL import Image, ImageDraw + +from uilib.box import Box + + +@dataclass(frozen=True) +class PaintContext: + """Immutable paint state passed down the widget tree. + + image : target surface being drawn into + draw : cached ImageDraw for image + clip : dirty rect in image-coordinate space + """ + image: Image.Image + draw: ImageDraw.ImageDraw + clip: Box + + def with_clip(self, new_clip: Box) -> "PaintContext": + return replace(self, clip=self.clip.intersection(new_clip)) diff --git a/uilib/panel.py b/uilib/panel.py index c77a0ce8..79cfa65d 100644 --- a/uilib/panel.py +++ b/uilib/panel.py @@ -14,6 +14,7 @@ # along with pi-stomp. If not, see . from uilib.container import * +from uilib.paint import PaintContext from pathlib import Path # @@ -148,13 +149,10 @@ def __init__(self, radius = 10, **kwargs): mdraw = ImageDraw.Draw(self.mask) mdraw.rounded_rectangle(self.box.norm().PIL_rect, radius, 1, None, 0) - def _draw_outline(self, image, draw, real_box): + def _draw_outline(self, ctx: PaintContext, frame: Box): if self.outline != 0: - if self.outline_color is not None: - color = self.outline_color - else: - color = self.fgnd_color - draw.rounded_rectangle(real_box.PIL_rect, self.radius, None, color, self.outline) + color = self.outline_color if self.outline_color is not None else self.fgnd_color + ctx.draw.rounded_rectangle(frame.PIL_rect, self.radius, None, color, self.outline) class LcdBase: def dimensions(self): @@ -205,47 +203,34 @@ def poll_updates(self): if self.lcd_needs_update: self.refresh() - def _compose(self, widget, orig_box, real_box): - # This always called with widget = a Panel which is a direct - # child of the stack, so we can drop orig_box - self._do_refresh(widget, real_box) - def refresh(self): - self._do_refresh(None, self.box) + self._propagate_dirty(self.box.norm()) self.lcd_needs_update = False - def _do_refresh(self, panel, box): - # XXX TODO: Optimize the case where there is only one panel, - # or the refreshed box only intersects the top level one: - # go straight to LCD ! (If we want to do stacked panels with - # alpha this can get complicated...) - - # Erase image - self._draw_erase(self.image, self.draw, box) - - # XXX Do some alpha blending to "dim" inactive panels ? + def _propagate_dirty(self, clip: Box): + """Recompose the dirty clip region from all stacked panels, then push to LCD.""" + erase_ctx = PaintContext(self.image, self.draw, clip) + self._draw_erase(erase_ctx, clip) - # Compose panels for p in self.stack: if self.dimmer is not None: - self.image.alpha_composite(self.dimmer, box.topleft, box.rect) + self.image.alpha_composite(self.dimmer, clip.topleft, clip.rect) d = p.decorator if d is not None: - inter = box.intersection(d.box) + inter = clip.intersection(d.box) if not inter.is_empty(): - d.refresh(inter) - inter = box.intersection(p.box) + ctx = PaintContext(self.image, self.draw, inter) + d._do_draw(ctx, d.box) + inter = clip.intersection(p.box) if not inter.is_empty(): - # Get intersection in panel local coordinates - local_inter = inter.deoffset(p.box) - super(PanelStack,self)._compose(p, local_inter, inter) + ctx = PaintContext(self.image, self.draw, inter) + p._do_draw(ctx, p.box) - # Update LCD - trace(self, "updating lcd with image", self.image, "box=", box) - self.lcd.update(self.image, box) + trace(self, "updating lcd with image", self.image, "box=", clip) + self.lcd.update(self.image, clip) - def _do_draw(self, image, draw, real_box): - assert(False) + def _do_draw(self, ctx: PaintContext, frame: Box): + assert False def _get_stack(self): return self diff --git a/uilib/text.py b/uilib/text.py index 277b4421..841f6f49 100644 --- a/uilib/text.py +++ b/uilib/text.py @@ -54,8 +54,8 @@ def __set_mode(self, mode): self.l_count -= 1 self.l_half = self.l_count // 2 - def _draw(self, image, draw, real_box): - loc = (real_box.x0 + self.l_w // 2, real_box.y0 + self.l_h // 2) + def _draw(self, ctx, frame): + loc = (frame.x0 + self.l_w // 2, frame.y0 + self.l_h // 2) cs = self.charsets[self.mode] for i in range(self.l_idx - self.l_half, self.l_idx + self.l_half): ci = i % len(cs) @@ -68,13 +68,13 @@ def _draw(self, image, draw, real_box): if i != self.l_idx: a = log(abs(self.l_idx - i) + 1) + 1 color = (int(color[0]/a),int(color[1]/a),int(color[2]/a)) - draw.text(loc, cs[ci], fill = color, font = self.font, anchor = 'mm') + ctx.draw.text(loc, cs[ci], fill=color, font=self.font, anchor='mm') loc = (loc[0] + self.l_w, loc[1]) - def _draw_selection(self, image, draw, real_box): - l = real_box.x0 + self.l_w * self.l_half - b = Box(l, real_box.y0, l + self.l_w, real_box.y1) - draw.rounded_rectangle(b.PIL_rect, self.l_w//4, None, self.sel_color, 1) + def _draw_selection(self, ctx, frame): + l = frame.x0 + self.l_w * self.l_half + b = Box(l, frame.y0, l + self.l_w, frame.y1) + ctx.draw.rounded_rectangle(b.PIL_rect, self.l_w//4, None, self.sel_color, 1) def input_event(self, event): @@ -246,18 +246,12 @@ def set_font(self, font): self.text_size_valid = False self.refresh() - def _draw(self, image, draw, real_box): - # Draw text - # - # XXX TODO: Handle cropping etc... (using continuation characters ?) - # Should we use a local image & support scroll ? basically make this a - # ContainerWidget subclass ? For now assume it fits ... - # + def _draw(self, ctx, frame): h_margin, v_margin = self._get_margins() tw, th = self._get_text_size() extra = self.outline - hroom = real_box.width - h_margin - extra - vroom = real_box.height - v_margin - extra + hroom = frame.width - h_margin - extra + vroom = frame.height - v_margin - extra if hroom < 0 or vroom < 0: return if tw > hroom: @@ -270,11 +264,10 @@ def _draw(self, image, draw, real_box): hoffset = hroom - tw else: hoffset = int((hroom - tw) / 2) - loc = (real_box.x0 + h_margin + hoffset, real_box.y0 + v_margin) + loc = (frame.x0 + h_margin + hoffset, frame.y0 + v_margin) if self.prompt is not None: - #draw.text((loc[0] - self.prompt_offset, loc[1]), self.prompt, fill=self.fgnd_color, font=self.font) - draw.text((0, loc[1]), self.prompt, fill=self.fgnd_color, font=self.font) - draw.text(loc, self.text, fill=self.fgnd_color, font=self.font) + ctx.draw.text((0, loc[1]), self.prompt, fill=self.fgnd_color, font=self.font) + ctx.draw.text(loc, self.text, fill=self.fgnd_color, font=self.font) def input_event(self, event): if self.edit_message is not None: diff --git a/uilib/widget.py b/uilib/widget.py index 490bbe28..d5f40858 100644 --- a/uilib/widget.py +++ b/uilib/widget.py @@ -16,6 +16,7 @@ from enum import Flag from uilib.misc import * from uilib.box import * +from uilib.paint import PaintContext # This is the root of all evil: the Widget class, parent of all things # displayed on the screen. @@ -225,29 +226,47 @@ def _setup_act_attrs(self): # box is established early and thus rely on the stack bounding box. When a # panel is popped off the stack, it still keeps its reference to said stack - def _focus(self, box): - """Prepare for drawing. Called by children of this - box : Box object to draw relative to self origin - Returns a tuple (image, draw, box) where: - image : The image to draw into - draw : An ImageDraw instance for it - box : The box parameter translated into image coordinates - """ - if not self.visible: - return None, None, None - return self.parent._focus(box.offset(self.box)) + def _build_paint_target(self, dirty): + """Walk up to the nearest ContainerWidget, accumulating frame offset. - def _unfocus(self, box): - """Child finished drawing, handles updates of parent container or - screen as needed + Returns (container, frame, clip) where: + container : the nearest ContainerWidget ancestor (owns the image) + frame : self.box translated into container-local coords + clip : dirty translated into container-local coords, clipped to container bounds + Returns (None, None, None) if no visible ContainerWidget ancestor found. """ - if self.visible: - self.parent._unfocus(box.offset(self.box)) + from uilib.container import ContainerWidget + offset = self.box.topleft + node = self.parent + while node is not None: + if not node.visible: + return None, None, None + if isinstance(node, ContainerWidget): + frame = self.box.offset( + (offset[0] - self.box.x0, offset[1] - self.box.y0) + ) + # frame in container-local coords = self.box shifted by accumulated parent offsets + # Rebuild: walk again collecting offsets cleanly + break + offset = (offset[0] + node.box.x0, offset[1] + node.box.y0) + node = node.parent + else: + return None, None, None - def _compose(self, widget, orig_box, real_box): - """ContainerWidget child updated itself""" - if self.visible: - self.parent._compose(widget, orig_box, real_box.offset(self.box)) + # Re-walk to get proper frame: self.box offset by sum of non-container ancestors + frame_x, frame_y = 0, 0 + cur = self + while cur.parent is not node: + frame_x += cur.box.x0 + frame_y += cur.box.y0 + cur = cur.parent + frame_x += cur.box.x0 + frame_y += cur.box.y0 + frame = Box(frame_x, frame_y, frame_x + self.box.width, frame_y + self.box.height) + + clip = dirty.offset((frame_x - self.box.x0, frame_y - self.box.y0)) + clip = clip.intersection(node.box.norm()) + return node, frame, clip def set_outline(self, width, color = None): self.outline = width @@ -373,20 +392,23 @@ def _notify_detach(self, widget): if self.parent: self.parent.notify_detach(widget) - def refresh(self, box = None): - """Refresh widget (and children) - """ - trace(self, "Widget.refresh: vis=",self.visible,"parent=", self.parent) + def refresh(self, box=None): + """Refresh widget (and children)""" + trace(self, "Widget.refresh: vis=", self.visible, "parent=", self.parent) if self.parent is None or not self.visible: return if box is None: box = self.box if box is None: return - image, draw, real_box = self.parent._focus(box) - if image is not None: - self._do_draw(image, draw, real_box) - self.parent._unfocus(box) + container, frame, clip = self._build_paint_target(box) + if container is None: + return + if clip.is_empty(): + return + ctx = PaintContext(container.image, container.draw, clip) + self._do_draw(ctx, frame) + container._propagate_dirty(clip) def scroll_into_view(self): """Scroll parent if necessary to ensure this object is into view. Only works @@ -401,50 +423,48 @@ def _scroll_into_view(self, box): return self.parent._scroll_into_view(box.offset(self.box)) return False - def _do_draw(self, image, draw, real_box): - """Draw self and children, internal use only""" - # Note: This erase becomes redudant when refreshing a whole hierarchy, - # not sure it's worth optimizing though - self._draw_erase(image, draw, real_box) - self._draw(image, draw, real_box) + def _do_draw(self, ctx: PaintContext, frame: Box): + """Draw self and children. frame is self's rect in ctx.image coords.""" + if ctx.clip.intersection(frame).is_empty(): + return + self._draw_erase(ctx, frame) + self._draw(ctx, frame) for c in self.children: if c.visible: - crb = c.box.offset(real_box) - c._do_draw(image, draw, crb) - self._draw_outline(image, draw, real_box) - self._draw_selection(image, draw, real_box) - - # Draw helpers - def _draw_erase(self, image, draw, box): - # Workaround Pillow rectangle off-by-one bug - if self.outline_radius is None: - draw.rectangle(box.PIL_rect, self.bkgnd_color, None, 0) + c._do_draw(ctx, c.box.offset(frame)) + self._draw_outline(ctx, frame) + self._draw_selection(ctx, frame) + + def _draw_erase(self, ctx: PaintContext, frame: Box): + erase_box = ctx.clip.intersection(frame) + if erase_box.is_empty(): + return + if self.outline_radius is not None and erase_box == frame: + # Full-frame erase: preserve rounded corners by using the round shape. + ctx.draw.rounded_rectangle(frame.PIL_rect, self.outline_radius, self.bkgnd_color, None, 0) else: - draw.rounded_rectangle(box.PIL_rect, self.outline_radius, self.bkgnd_color, None, 0) + # Partial erase: plain rect so only the dirty region is touched. + ctx.draw.rectangle(erase_box.PIL_rect, self.bkgnd_color, None, 0) - def _draw_outline(self, image, draw, real_box): + def _draw_outline(self, ctx: PaintContext, frame: Box): if self.outline != 0: - if self.outline_color is not None: - color = self.outline_color - else: - color = self.fgnd_color + color = self.outline_color if self.outline_color is not None else self.fgnd_color if self.outline_radius is None: - draw.rectangle(real_box.PIL_rect, None, color, self.outline) + ctx.draw.rectangle(frame.PIL_rect, None, color, self.outline) else: - draw.rounded_rectangle(real_box.PIL_rect, self.outline_radius, None, color, self.outline) + ctx.draw.rounded_rectangle(frame.PIL_rect, self.outline_radius, None, color, self.outline) - def _draw_selection(self, image, draw, real_box): + def _draw_selection(self, ctx: PaintContext, frame: Box): if self.selected: radius = self.sel_radius if radius is None: radius = self.outline_radius if radius is None or radius == 0: - draw.rectangle(real_box.PIL_rect, None, self.sel_color, self.sel_width) + ctx.draw.rectangle(frame.PIL_rect, None, self.sel_color, self.sel_width) else: - draw.rounded_rectangle(real_box.PIL_rect, radius, None, self.sel_color, self.sel_width) + ctx.draw.rounded_rectangle(frame.PIL_rect, radius, None, self.sel_color, self.sel_width) - def _draw(self, image, draw, real_box): - # It's ok for widgets to not have anything to draw, some are pure rectangles + def _draw(self, ctx: PaintContext, frame: Box): pass def input_event(self, event): From 78bee77b620c0be9cd3cacd9fd88cc7c35727f70 Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Tue, 12 May 2026 00:47:01 -0400 Subject: [PATCH 02/46] Fix bugs and add paint context unit tests --- tests/test_paint_context.py | 276 ++++++++++++++++++++++++++++++++++++ uilib/box.py | 5 + uilib/container.py | 10 +- uilib/paint.py | 4 +- uilib/widget.py | 2 - 5 files changed, 289 insertions(+), 8 deletions(-) create mode 100644 tests/test_paint_context.py diff --git a/tests/test_paint_context.py b/tests/test_paint_context.py new file mode 100644 index 00000000..5dddc7da --- /dev/null +++ b/tests/test_paint_context.py @@ -0,0 +1,276 @@ +""" +Unit tests for paint-context drawing logic: + - Box.contains + - Widget._draw_erase (safe-interior vs full-frame erase) + - ContainerWidget._do_draw clip expansion for rounded containers + - ContainerWidget._propagate_dirty scroll-offset translation +""" + +import pytest +from PIL import Image, ImageDraw + +from uilib.box import Box +from uilib.paint import PaintContext +from uilib.container import ContainerWidget +from uilib.widget import Widget + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + +def _container(w=100, h=100, outline_radius=None, **kwargs): + box = Box(0, 0, w, h) + c = ContainerWidget(box=box, outline_radius=outline_radius, **kwargs) + return c + + +def _ctx(container, clip=None): + if clip is None: + clip = container.box.norm() + return PaintContext(container.image, container.draw, clip) + + +def _painted_colors(image): + """Return the set of distinct RGB tuples present in the image.""" + return set(image.getdata()) + + +# --------------------------------------------------------------------------- +# Box.contains +# --------------------------------------------------------------------------- + +class TestBoxContains: + def test_identical_boxes(self): + b = Box(10, 10, 50, 50) + assert b.contains(b) + + def test_inner_fully_inside(self): + outer = Box(0, 0, 100, 100) + inner = Box(10, 10, 90, 90) + assert outer.contains(inner) + + def test_touching_edge_is_contained(self): + outer = Box(0, 0, 100, 100) + edge = Box(0, 0, 100, 50) # shares top/left/right edge + assert outer.contains(edge) + + def test_partial_overlap_is_not_contained(self): + a = Box(0, 0, 60, 60) + b = Box(40, 40, 100, 100) + assert not a.contains(b) + + def test_larger_box_not_contained(self): + inner = Box(10, 10, 90, 90) + outer = Box(0, 0, 100, 100) + assert not inner.contains(outer) + + def test_empty_box_contained(self): + outer = Box(0, 0, 100, 100) + empty = Box(50, 50, 50, 50) # zero-area + assert outer.contains(empty) + + +# --------------------------------------------------------------------------- +# Widget._draw_erase +# --------------------------------------------------------------------------- + +class TestDrawErase: + """_draw_erase erases with a plain rect when the dirty region fits in the + safe interior; falls back to a full rounded_rectangle when it touches a + corner.""" + + def _erase_and_read(self, clip, frame, outline_radius=None): + """Erase `frame` in a white 100×100 image using `clip` as the dirty + region. Returns the image so the caller can inspect pixels.""" + img = Image.new("RGB", (100, 100), (255, 255, 255)) + draw = ImageDraw.Draw(img) + ctx = PaintContext(img, draw, clip) + + w = Widget(box=frame) + w.outline_radius = outline_radius + w.bkgnd_color = (0, 0, 0) + + w._draw_erase(ctx, frame) + return img + + def test_no_radius_erases_only_clip(self): + frame = Box(0, 0, 100, 100) + clip = Box(10, 10, 50, 50) + img = self._erase_and_read(clip, frame, outline_radius=None) + # Clipped region is black + assert img.getpixel((20, 20)) == (0, 0, 0) + # Outside clip stays white + assert img.getpixel((80, 80)) == (255, 255, 255) + + def test_radius_safe_interior_erases_only_clip(self): + """Dirty region inside the safe interior → plain rect erase.""" + frame = Box(0, 0, 100, 100) + r = 10 + # clip well inside the safe zone (r..100-r on each axis) + clip = Box(20, 20, 80, 80) + img = self._erase_and_read(clip, frame, outline_radius=r) + assert img.getpixel((50, 50)) == (0, 0, 0) # inside clip → erased + assert img.getpixel((5, 5)) == (255, 255, 255) # corner → untouched + + def test_radius_partial_clip_erases_only_intersection(self): + """Partial clip on a rounded widget → plain rect erase of the intersection. + Full-frame expansion for rounded shapes is ContainerWidget._do_draw's job, + not _draw_erase's. A leaf widget with outline_radius still gets a rect + erase when the clip is smaller than the frame.""" + frame = Box(0, 0, 100, 100) + r = 10 + clip = Box(0, 0, 20, 20) + img = self._erase_and_read(clip, frame, outline_radius=r) + # Only the clipped region is erased + assert img.getpixel((10, 10)) == (0, 0, 0) + # Centre untouched — no full-frame expansion at this level + assert img.getpixel((50, 50)) == (255, 255, 255) + + def test_radius_full_frame_uses_rounded_rectangle(self): + """When clip == frame, always use rounded_rectangle (corners preserved).""" + frame = Box(0, 0, 100, 100) + r = 10 + img = self._erase_and_read(frame, frame, outline_radius=r) + # Centre erased + assert img.getpixel((50, 50)) == (0, 0, 0) + # Absolute corner pixels NOT erased (rounded rect leaves them) + assert img.getpixel((0, 0)) == (255, 255, 255) + + +# --------------------------------------------------------------------------- +# ContainerWidget._do_draw clip expansion +# --------------------------------------------------------------------------- + +class TestContainerClipExpansion: + """When a rounded container's dirty clip touches a corner, _do_draw must + expand the clip to the full frame so that both erase and child-draws are + consistent (no content left erased-but-not-redrawn).""" + + def _make_rounded_container(self, r=10): + return _container(w=100, h=100, outline_radius=r) + + def test_no_radius_no_expansion(self): + c = _container(outline_radius=None) + # Paint a sentinel pixel in the top-left corner of the container image + c.image.putpixel((5, 5), (255, 0, 0)) + + # Dirty clip covers only the bottom-right area — does not include (5,5) + clip = Box(50, 50, 100, 100) + frame = Box(0, 0, 100, 100) + parent_img = Image.new("RGB", (100, 100), (128, 128, 128)) + parent_draw = ImageDraw.Draw(parent_img) + ctx = PaintContext(parent_img, parent_draw, clip) + + c._do_draw(ctx, frame) + # The sentinel pixel in container image should be unchanged (no expansion) + assert c.image.getpixel((5, 5)) == (255, 0, 0) + + def test_radius_corner_clip_expands_to_full_frame(self): + """A clip touching a corner should expand so all children get redrawn.""" + r = 10 + c = _container(w=100, h=100, outline_radius=r) + + # Add a child widget that tracks whether it was drawn + drawn_frames = [] + class TrackingWidget(Widget): + def _draw(self, ctx, frame): + drawn_frames.append(frame.copy()) + + child_box = Box(5, 5, 40, 20) # in top-left — inside corner region + child = TrackingWidget(box=child_box) + child.attach(c) + child.bkgnd_color = (0, 0, 0) + child.fgnd_color = (255, 255, 255) + + # Dirty clip covers only the bottom-right, away from the child + clip = Box(60, 60, 100, 100) + frame = Box(0, 0, 100, 100) + parent_img = Image.new("RGB", (100, 100)) + ctx = PaintContext(parent_img, ImageDraw.Draw(parent_img), clip) + + c._do_draw(ctx, frame) + + # Child must have been drawn (clip was expanded to cover it) + assert len(drawn_frames) == 1 + + def test_radius_safe_interior_clip_does_not_expand(self): + """A clip fully inside the safe interior should NOT trigger expansion.""" + r = 10 + c = _container(w=100, h=100, outline_radius=r) + + drawn_frames = [] + class TrackingWidget(Widget): + def _draw(self, ctx, frame): + drawn_frames.append(frame.copy()) + + # Child is in top-left corner region + child = TrackingWidget(box=Box(2, 2, 8, 8)) + child.attach(c) + child.bkgnd_color = (0, 0, 0) + child.fgnd_color = (255, 255, 255) + + # Dirty clip is fully in the safe interior (r..100-r) + clip = Box(20, 20, 80, 80) + frame = Box(0, 0, 100, 100) + parent_img = Image.new("RGB", (100, 100)) + ctx = PaintContext(parent_img, ImageDraw.Draw(parent_img), clip) + + c._do_draw(ctx, frame) + + # Child frame doesn't intersect clip → not drawn + assert len(drawn_frames) == 0 + + +# --------------------------------------------------------------------------- +# ContainerWidget._propagate_dirty scroll offset +# --------------------------------------------------------------------------- + +class TestPropagateDirtyScrollOffset: + """_propagate_dirty must account for self.offset (scroll) when translating + a local dirty region into parent coordinates.""" + + def test_no_scroll_translates_by_box_position(self): + """Without scrolling, dirty clip should be offset by the container's + position in the parent.""" + received = [] + + class CapturingParent(Widget): + def _propagate_dirty(self, clip): + received.append(clip) + + parent = CapturingParent(box=Box(0, 0, 200, 200)) + c = _container(w=100, h=100) + c.box = Box(20, 30, 120, 130) # container positioned at (20,30) + c.parent = parent + + local_clip = Box(10, 10, 50, 50) + c._propagate_dirty(local_clip) + + assert len(received) == 1 + result = received[0] + # Expected: local_clip shifted by container position = (30,40,70,80) + assert result == Box(30, 40, 70, 80) + + def test_scroll_offset_shifts_propagated_clip(self): + """With a scroll offset of (dx, dy), the propagated clip should be + shifted by -offset before being translated to parent coords.""" + received = [] + + class CapturingParent(Widget): + def _propagate_dirty(self, clip): + received.append(clip) + + parent = CapturingParent(box=Box(0, 0, 200, 200)) + c = _container(w=100, h=100) + c.box = Box(20, 30, 120, 130) + c.parent = parent + c.offset = (5, 10) # scrolled: content shifted by (5,10) + + local_clip = Box(10, 10, 50, 50) + c._propagate_dirty(local_clip) + + assert len(received) == 1 + result = received[0] + # deoffset(5,10) → (5,0,45,40), then offset by (20,30) → (25,30,65,70) + assert result == Box(25, 30, 65, 70) diff --git a/uilib/box.py b/uilib/box.py index b3ee453c..e82d46e0 100644 --- a/uilib/box.py +++ b/uilib/box.py @@ -171,6 +171,11 @@ def intersection(self, box): y1 = min(self.box[3], box.box[3]) return Box(x0,y0,x1,y1) + def contains(self, other): + """Returns True if other is fully contained within this box""" + return (other.box[0] >= self.box[0] and other.box[1] >= self.box[1] and + other.box[2] <= self.box[2] and other.box[3] <= self.box[3]) + def is_empty(self): return self.box[0] >= self.box[2] or self.box[1] >= self.box[3] diff --git a/uilib/container.py b/uilib/container.py index d33aea00..72dc1077 100644 --- a/uilib/container.py +++ b/uilib/container.py @@ -94,8 +94,13 @@ def _do_draw(self, ctx: PaintContext, frame: Box): if local_clip.is_empty(): return - local_ctx = PaintContext(self.image, self.draw, local_clip) local_frame = self.box.norm() + if self.outline_radius is not None: + r = self.outline_radius + safe = Box(r, r, local_frame.width - r, local_frame.height - r) + if not safe.contains(local_clip): + local_clip = local_frame + local_ctx = PaintContext(self.image, self.draw, local_clip) self._draw_erase(local_ctx, local_frame) self._draw(local_ctx, local_frame) for c in self.children: @@ -121,8 +126,7 @@ def _propagate_dirty(self, local_clip: Box): """Bubble a dirty region (in our local coords) up to our parent container.""" if not self.visible or self.parent is None: return - # Translate local_clip into parent's local coords: offset by self.box topleft - parent_clip = local_clip.offset(self.box) + parent_clip = local_clip.deoffset(self.offset).offset(self.box) self.parent._propagate_dirty(parent_clip) def scroll(self, offset): diff --git a/uilib/paint.py b/uilib/paint.py index db6ab450..92789856 100644 --- a/uilib/paint.py +++ b/uilib/paint.py @@ -13,7 +13,7 @@ # You should have received a copy of the GNU General Public License # along with pi-stomp. If not, see . -from dataclasses import dataclass, replace +from dataclasses import dataclass from PIL import Image, ImageDraw from uilib.box import Box @@ -31,5 +31,3 @@ class PaintContext: draw: ImageDraw.ImageDraw clip: Box - def with_clip(self, new_clip: Box) -> "PaintContext": - return replace(self, clip=self.clip.intersection(new_clip)) diff --git a/uilib/widget.py b/uilib/widget.py index d5f40858..833c938a 100644 --- a/uilib/widget.py +++ b/uilib/widget.py @@ -440,10 +440,8 @@ def _draw_erase(self, ctx: PaintContext, frame: Box): if erase_box.is_empty(): return if self.outline_radius is not None and erase_box == frame: - # Full-frame erase: preserve rounded corners by using the round shape. ctx.draw.rounded_rectangle(frame.PIL_rect, self.outline_radius, self.bkgnd_color, None, 0) else: - # Partial erase: plain rect so only the dirty region is touched. ctx.draw.rectangle(erase_box.PIL_rect, self.bkgnd_color, None, 0) def _draw_outline(self, ctx: PaintContext, frame: Box): From af24bacde8c2567bdd60df8b03af674522497d92 Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Mon, 18 May 2026 18:09:06 -0400 Subject: [PATCH 03/46] Add wifi SSID entry snapshot test --- .../test_v3_wifi_ssid_entry/main.png | Bin 0 -> 6063 bytes .../test_v3_wifi_ssid_entry/ssid_editor.png | Bin 0 -> 12495 bytes .../test_v3_wifi_ssid_entry/wifi_dialog.png | Bin 0 -> 9701 bytes .../test_v3_wifi_ssid_entry/wifi_menu.png | Bin 0 -> 10355 bytes tests/v3/test_wifi_paint.py | 39 ++++++++++++++++++ 5 files changed, 39 insertions(+) create mode 100644 tests/snapshots/v3/test_wifi_paint/test_v3_wifi_ssid_entry/main.png create mode 100644 tests/snapshots/v3/test_wifi_paint/test_v3_wifi_ssid_entry/ssid_editor.png create mode 100644 tests/snapshots/v3/test_wifi_paint/test_v3_wifi_ssid_entry/wifi_dialog.png create mode 100644 tests/snapshots/v3/test_wifi_paint/test_v3_wifi_ssid_entry/wifi_menu.png create mode 100644 tests/v3/test_wifi_paint.py diff --git a/tests/snapshots/v3/test_wifi_paint/test_v3_wifi_ssid_entry/main.png b/tests/snapshots/v3/test_wifi_paint/test_v3_wifi_ssid_entry/main.png new file mode 100644 index 0000000000000000000000000000000000000000..200297525f8478abf4720af572ddbd41b662a9d7 GIT binary patch literal 6063 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 ZkB~hF!WN!@DTRNR%fD8Uu7H{Z{vS}98S(%C literal 0 HcmV?d00001 diff --git a/tests/snapshots/v3/test_wifi_paint/test_v3_wifi_ssid_entry/wifi_dialog.png b/tests/snapshots/v3/test_wifi_paint/test_v3_wifi_ssid_entry/wifi_dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..f57b837fe8291e5557f5974453732f84d54a4717 GIT binary patch literal 9701 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�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 Date: Mon, 18 May 2026 20:38:02 -0400 Subject: [PATCH 04/46] Implement a clip buffer for pixel-perfect rendering --- pistomp/lcd320x240.py | 4 +- .../test_v3_parameter_edit/param_tweaked.png | Bin 6391 -> 6391 bytes .../test_v3_parameter_midi_change/0.png | Bin 6299 -> 6299 bytes .../test_v3_preset_change_via_lcd/nav_C.png | Bin 8772 -> 8772 bytes .../test_v3_wifi_ssid_entry/wifi_dialog.png | Bin 9701 -> 9689 bytes tests/test_paint_context.py | 10 +-- uilib/box.py | 5 ++ uilib/container.py | 64 +++++++------- uilib/footswitch.py | 15 ++-- uilib/paint.py | 83 ++++++++++++++++++ uilib/panel.py | 4 +- uilib/widget.py | 15 ++-- 12 files changed, 146 insertions(+), 54 deletions(-) diff --git a/pistomp/lcd320x240.py b/pistomp/lcd320x240.py index b7ac6eaf..578192f8 100644 --- a/pistomp/lcd320x240.py +++ b/pistomp/lcd320x240.py @@ -478,7 +478,7 @@ def draw_footswitch(self, plugin): x = self.get_footswitch_pitch() * fs_id self.footswitch_slots[fs_id] = label color = self.get_plugin_color(plugin) - p = FootswitchWidget(Box.xywh(x, y, self.plugin_width, self.plugin_height), self.small_font, + p = FootswitchWidget(Box.xywh(x, y, 60, 60), self.small_font, label, color, plugin.is_bypassed(), parent=self.footswitch_panel, object=c) self.w_footswitches.append(p) self.footswitch_panel.add_widget(p) @@ -493,7 +493,7 @@ def draw_unbound_footswitches(self): label = "" if dl is None else dl y = 0 x = self.get_footswitch_pitch() * slot - p = FootswitchWidget(Box.xywh(x, y, self.plugin_width, self.plugin_height), self.small_font, + p = FootswitchWidget(Box.xywh(x, y, self.footswitch_width, self.footswitch_height), self.small_font, label, None, True, parent=self.footswitch_panel, object=fs) self.w_footswitches.append(p) self.footswitch_panel.add_widget(p) diff --git a/tests/snapshots/v3/test_plugins/test_v3_parameter_edit/param_tweaked.png b/tests/snapshots/v3/test_plugins/test_v3_parameter_edit/param_tweaked.png index 44f38a8eaa229042a28ef447a9792873e4bdc11b..b8913950f463a176e11f9b1051e8828315995282 100644 GIT binary patch delta 4004 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 diff --git a/tests/snapshots/v3/test_plugins/test_v3_parameter_midi_change/0.png b/tests/snapshots/v3/test_plugins/test_v3_parameter_midi_change/0.png index 38d96b4cc049694497e36e5ee314d935e1190ea3..a11af361cc5b3ea753aab2d2a9aa5a5952a45060 100644 GIT binary patch delta 3777 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 NM@#>DnTB21e*wq8BOm|( delta 3777 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 literal 9701 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�j!cljMMMoXRb^QDZCCFOr<=;my=5tE)YbdflS&VY!LY^TbZ=+Kv z;}Htq73NPNRpIQ)B17;{kkS9=U{USJ2&obecRZHmEk>mlZ-qJILLlz~xsBR%D-3xo z9xdG+vuVNykxa45`6}~W1XjBP=M48P`Lc~WWw>Ya%pyCToVpe}0s;UX3k*aC#Le2; zx?bPt_3PK#Gbip%wY9a$$&UpP4&d|V4SAbCjytFM(`@5xK8jg#3Q?cG@A5USrqs5C zisIwrKYaM0pr9}@F|o3;;?i_GoXVG|NeNT4FiX4e0*HpM9sfWv3$W8V7``C z_vWA0wzd$d^^tTTccvc8TJJX}R%r8C2F^Z%>wruyEg4qpiFzE)H#RmBGppiIi#`_+ zNF3XdxI3EyEJeis_PKjOSXf_%u&d*0duB#PnHHN|6d556%|q71t=zF&g(w4BCEfYS zm2axDj){pHX$RnAM@K3&u|6;uYvSPKq(-9R%>2CkKuQzl)2y-mY7-C*cHWP9c^3Zu z{xDdRMsch2dY~k2ctphD;9yB#(JTu)_XWoKt+BYHN{(kSvZQq$87 zjE$+G&;p@tC=&jhxnksF3qym_yH3MMjpDlcr#k{nnBONRstXD%J;=er=<4nqE}hs4 zpV1+S5k$*MS3W9JXZfsX34;lXE!SwV{rcn8<{i)X_2>Nj<>lp4yI*=SpsYmF_N;%D zxx8$r?F9Hdz-{HzjusZu1i_=tdu)jjO))K_PbQ`c)g)ZEmBAF0nT7@iU^j?wd*7EX zCxU}fqu#5l6SyYlR#Y4T8OO@X>bgB_R#@5Mll?ANr?jmteNJVZ*P<6^P`$u+LgAH$ zvGLK?G_PM$M~6i3<&3TgA}!c}4l6{;I+b+08CMG>f$aktGE!_GHZHD;>F;i0HB8j& zWW?IR*&m9%6M@(BB8hLsvnoB!J%h)wxmv3{kB#Hy&z4-r6!Ir+rwR~DO;de+%sf2R zBYEDB@bKC_5NT~~cby+ltVhz$5#LtZ&nA`r{Q1*6_rBhd1gq!v>hzn#qHGw4VPjQ$ z`xpKE6`9u7))n8=5jF9vuPBe^tIVXOq>$}1lZ}G&^72L(R+)0O*aRq4Dw2+<6+iL- z3hepbHWfC~+uJ)ZFfiVI#I94;KQdxeZ>J4X)yQZ$oGp_bp=xwY%t|YaZ@=qnem8?{&`q@toi znY0cYEV70Mugy3uF?*~PHMZZwz267PaZsY-Sx(m0I|m1mJc4y(pFrZ++OqO}ZEd{; zdPMM75o?A-fVhCb`LARXM_pSB%O|2<&eKJ&ySf&Bnh>T5*h8hlS=X$;z|bv3?LK=* zm0R)h^7=pAd3t-^U7xF}s)9LjyCnmHURY3|m_HdB8hUtm_>nk0$$zohq7Q?{cWr-P zQF|dW61VK!loJyb83-Vtx%N1i7M}UvAcQ@Bj%JU1{@K^*-Rl z#~0Il9Tpr6g3(@4;dr+DuNg6`W)MX7@9XOur+xYzn@c&3 ze-Gq{$d_!7*V@{N8Oo!7Uikbyv>ZwT#)j~V7Y{&?N^^YhCT9o+_l#z~2;%`Mx8S+z z_YH_Tt9x#LtxDp^mHdyfv3+D?=|W?Ta306&S|*lsP=aM|YPV<04Yte)zkC6$1mugF z*g476$9l6L=*3!gPL)RSNIC8Yvje|e23Zy5q|X0pA_%FNXSq6VT|hn+95b-9AIw)< zxNXhMIB-^e7jQ1c;Zsl=yUwTrA{?wCKffDjmUwu0FFcQ0f#L^kS4G&4UQ1faX>|rf z9y4%lkmEFSeXT11F-in(UsMQ`-`t%8Ji4W zn7Q!*ownHK<0&O2wc75Ny6)lO0YG7IZ*Q2FnVsGK*2}Nd6J_>7?03FWa)aZth|@}I zR}cmuwV;P*d0(Wv)Tw|L4=0$kRl4A3BpLwA2(=aVy>vc+s+gIX$;zT@M}Fb8i~z=1 z?Y;8p0CSdU)M~(kpH(&xm*wS%67AAmN71N13-$IsU?@GYXjRgk{G_C$;G4Uo}Q1$L)}x{nm!^EFKe-_{7mrb)@j z$oTr+&Y1+LL{A+JFfud05EcgGu(Uof*?TS~)>c>NcD_HuXFbZlu@8)gQmGuh77tFU zTy+*+KEBP(&D0<6DbsUvQ$eUmr9{6!JymjXaoO0|0QP{Wm{{^NqwDQ-Cx8dQ`>BUb zVYg71fIij>uJo&ly~^!wA|d>@3XT>-f!EOi?mAoZvM92o(!=i4yv=N z;9lPx){YgZW)9*QHn~_zN`h915f~Iyj2GVBE#ti_@9*Cp6eO*sMe=!ImT4^|B?aho z$A!9L&<2Z&Y)ZF_9r`6G0ZxXuC$;lVp#9Q9MZ{EBCVSes$m=YU{&$%`|Jq-p(CF~+ou4CXQ z;T#J;k~PQI`58TJ45q=|OGrqVq>72rIUbE#g$4SEO1faCn9twuA=pW(*yDJe+L+m3 zgh@$B=20L(SlesRvinx*U21a+i>~P>Xo{wgHE!DfbATG?hiE4(cb0vYWOl`-WcD}~ zCg^5x4MB#pR^{LXvhhdyRXr-GN&w$;bDj_PcP~5+^*a39@-o{37JG&CYXAc{Z zTv2_qQ%PKPC2v>_D&;*uXPI?PJGr_w`w{xFXQQ=Mv^m80{`Ly26dtwcd{-A8KmQr% zGSg{d-alZXU$ofne*eHPwvPq63@|CR_xGUWinQ45dXf|pm~8pe0`5<JysL|_`--wnn;WHfE_At5Kp9&0o>UWC`2mpb=2F1()ozR=DcX)UhG|UNI zTq+T*ya~Nhcy!9pWnfUDY9<>n&<`9*KFW}7US4`lS)d@f;!q)JPS4I7gChJjn0RJy zKugeivEl=qxMag;g=%>RURPIFXlQ7F8@RfNA-8Tw3j%BVhc&2yD;w^>x|rJiVY@X%;A_a+@J@uD#Ba6+0c~d(370HHoX6 z%%s)p{X(6so2WD(E4*(pYdqYBEq%LQ=4-(I9{&7UYn}dl3q6VJFh_frK`w>_3XORp zJUKGraCP!444XPk zHS$R@pKKFA|AbIG|G{ke>Dd_$9-gX_Qmr{x9ieMTaB%;x6Of2)*m#r1yTIi( zZu9Qx?jFYu)LfPq5#ps@y@M9(e6ZEG*13j zGdwz-orQ&km30raA6#5qkiGQr;rdyr^o)#*oSfzQLm!EmrKF{!G3UMBiBdZOA_AJz znz;n`(ExG-Q`zxHh$?1^Pa+fov61YAbejFoVV182YaC_gH8N5GcqJw)0Fc}P_F!E z_2=|IuqJzv(y>IFcf6y|W5+?pER+SSKZ6!R==!NI|R%>(ZqY$P-{Hb&7%i1YEe0%8aFXn%xW zwRsO<;Ll9jMeU|p9zRZg6$u5~D<;iutlZq=lL{#C7?JAU7^+g8QUDK?#2~Y&si;O8 zh#G&WmH`b=JhLAwai2oIyS3%EGnxsIfjZXO{1J{SN0O<4|IbmZOOQ|+#nXU_kN+A< z;>>%dTRIaG5(36^aekg3t0BBHHFXNEsjsgGl-sHOis|&^pAz}{6*Pm{>FKv`-$qf3 zrNLMP1VHf!^7Fs7wpPn{UVVV-3mE?Xz8wYzM&=X|5fOKJq5#`Ko=Cm5nl#K5KReU;gdZu9p*c4w{fe^q8AN=!};c(}VDW>R)`cQ+SVF9TA$&0n%n+VFB!FVTF7LvLoPfJxnqGQ_?pWnleGK zG7|tZCqI2jNl35PVuM3DTC4Z@K4=Z?mm85(N|5npXo-g8lB7T7~^jG_(l|=}k9!W_^#_g<6hPXNm+q@HDEdMP9jOa`mVr`wADkp64 zs6=EWRDm<|l3?+hQ)OjkmawZ;7%`ahIR0%oXOy1e|BXO>WMGS%ijI*4Yma!^u3nF$ z!1MI<6l}#7V*`nl^668qMzPyQU2Sb-M1-Q6nl&|m4GIZ=(S771v*A!`P3ySY=;#qZ z^RvL-AxM~l{CxLU-jJj3&$#N8nM#X`%^GYC7>GXVR2Vkd&9DJCi8^*?b2Es*{4Y1K zZ+P5Ul7|2k6G}NcI{J#6RI2qaFE7u|dd!q)yWKpoXa%AQ#53=iBvS&ALlP1lvtdP@ zAWV~V0Fc#yhl9px6i)`9s#5C2%mH>qERDoUII%t8AT1sU5&zppWu_lw-;zG$d@65l z*3Z`ffLVD?m#SQ#Qz~)2%dqj<#;FR{MMmj83-; zKP4sQG-tRBJ*XWZ3zPp^MOpVdCQE;{%oh`qpws zKu1mvorHu5BM~kcclH5l6hXwtk5_wzStTVUpB3|E=zli37OLW!?7Ro2AgEH{HGodF zkPgXKLPBySy38QRh69rm(sZ84=v2+?-HI7 zS3&e>qx{&`YP$*htoA11Xr0Jr9GXaG-YzW;jL=eV!cJt<58TkwY^tYKqbP2N3eUx$ z6yPcSW~o>>SSd}0DJwp^jJX!>rVOkFM6~hpaUl?FI9hNS2!K_yn3$LfOep0*NuKS? z;Gm*NH$4UVzq5wwNE6!zVT#@t(=K~E)=X_T0ytpMn8LZp-@8SmbtT|AGM*iwUC5?L zbe>w0DW4oOr#&+tM%0^IRDPHuRl(yl*=Us&gig~OQ{sPge@>wS^N{QpAg$vxl}_86 z{0U!3C#!}0dt_4q@^`~Po*Q4^=-9ex@Vl0T}KyEK_EIrcqQ2gHn)qyFSy4>O#gX6Ih#$N zJO_46-fn11EgkN^->Nc&$ET~udoA{GmILHA|AkfRs3;pz87~5@By1MBA4U1^`35$0 zU^G03K2XnZ{JV$C$}yXJD2II<8GggMUnB^s(dHhoeGKKMpZqlboyO#^>AX^H&r z_BX}IfnsBwQp*kK|2eCG7TlBdfw. from dataclasses import dataclass +from typing import Generator, Optional, Tuple +from contextlib import contextmanager from PIL import Image, ImageDraw from uilib.box import Box +class BufferPool: + """Stack of reusable RGBA buffers sized up to (max_w, max_h). + + Used as a stack to support reentrant slow paths (slow-path widget + contains a slow-path child). Each acquire returns a buffer of at + least the requested size; the buffer is cleared on acquire and + returned to the pool on release. No allocation after warm-up.""" + def __init__(self, max_size: Tuple[int, int]): + self.max_size = max_size + self._free: list[Image.Image] = [] + + def acquire(self, size: Tuple[int, int]) -> Image.Image: + # We always return an image of the max_size to avoid repeated allocations + # if sizes vary slightly. Clear it to transparent. + if self._free: + img = self._free.pop() + else: + img = Image.new("RGBA", self.max_size, (0, 0, 0, 0)) + + # Clear the region we might use. Actually, it's safer to clear the whole thing + # or at least the requested size. PIL's paste((0,0,0,0), ...) or similar. + # Simplest is just to create a new one if it's the first time, and clear it. + # For reuse, clearing the requested size is enough. + # img.paste((0, 0, 0, 0), (0, 0, size[0], size[1])) + + # Actually, clearing the whole image is fast and safer. + img.paste((0, 0, 0, 0), (0, 0, img.size[0], img.size[1])) + return img + + def release(self, buf: Image.Image) -> None: + self._free.append(buf) + + @dataclass(frozen=True) class PaintContext: """Immutable paint state passed down the widget tree. @@ -26,8 +61,56 @@ class PaintContext: image : target surface being drawn into draw : cached ImageDraw for image clip : dirty rect in image-coordinate space + pool : optional buffer pool for slow-path clipping """ image: Image.Image draw: ImageDraw.ImageDraw clip: Box + pool: Optional[BufferPool] = None + + @contextmanager + def painting(self, frame: Box) -> Generator[Tuple['PaintContext', Box], None, None]: + """Yield (paint_ctx, paint_frame) suitable for painting `frame`. + + Fast path (clip ⊇ frame): yields (self, frame). __exit__ is a no-op. + Slow path (clip ⊊ frame): yields a temp-backed ctx with origin + re-anchored to (0,0). __exit__ composites + visible ∩ frame into self.image. + """ + if self.clip.contains(frame): + yield self, frame + return + + # Slow path + if self.pool is None: + # Fallback to a one-off buffer if no pool provided (e.g. in tests) + temp = Image.new("RGBA", frame.size, (0, 0, 0, 0)) + else: + temp = self.pool.acquire(frame.size) + + try: + temp_draw = ImageDraw.Draw(temp) + # Re-anchored frame for the temp buffer + pframe = Box(0, 0, frame.width, frame.height) + # Clip is the intersection of our clip and the frame, but re-anchored to temp + pclip = self.clip.intersection(frame).deoffset(frame.topleft) + pctx = PaintContext(temp, temp_draw, pclip, self.pool) + + yield pctx, pframe + # Composite result back to self.image + # We only composite the intersection of clip and frame + visible = self.clip.intersection(frame) + if not visible.is_empty(): + src_rect = visible.deoffset(frame.topleft).rect + crop = temp.crop(src_rect) + dest_topleft = visible.topleft + + if self.image.mode == 'RGBA': + self.image.alpha_composite(crop, dest_topleft) + else: + # RGB target uses paste with mask + self.image.paste(crop, dest_topleft, crop) + finally: + if self.pool is not None: + self.pool.release(temp) diff --git a/uilib/panel.py b/uilib/panel.py index 79cfa65d..712e7e5b 100644 --- a/uilib/panel.py +++ b/uilib/panel.py @@ -14,7 +14,7 @@ # along with pi-stomp. If not, see . from uilib.container import * -from uilib.paint import PaintContext +from uilib.paint import PaintContext, BufferPool from pathlib import Path # @@ -192,6 +192,8 @@ def __init__(self, lcd, box = None, image_format = None, use_dimming = True): self.dimmer = Image.new('RGBA', size, (0,0,0,64)) else: self.dimmer = None + + self.pool = BufferPool((box.width, box.height)) # We don't have a parent, establish all the defaults self._setup_act_attrs() diff --git a/uilib/widget.py b/uilib/widget.py index 833c938a..6bb8eed8 100644 --- a/uilib/widget.py +++ b/uilib/widget.py @@ -427,13 +427,14 @@ def _do_draw(self, ctx: PaintContext, frame: Box): """Draw self and children. frame is self's rect in ctx.image coords.""" if ctx.clip.intersection(frame).is_empty(): return - self._draw_erase(ctx, frame) - self._draw(ctx, frame) - for c in self.children: - if c.visible: - c._do_draw(ctx, c.box.offset(frame)) - self._draw_outline(ctx, frame) - self._draw_selection(ctx, frame) + with ctx.painting(frame) as (pctx, pframe): + self._draw_erase(pctx, pframe) + self._draw(pctx, pframe) + for c in self.children: + if c.visible: + c._do_draw(pctx, c.box.offset(pframe)) + self._draw_outline(pctx, pframe) + self._draw_selection(pctx, pframe) def _draw_erase(self, ctx: PaintContext, frame: Box): erase_box = ctx.clip.intersection(frame) From b7483dee1cfe70c75eda8c4fd1e39cbcb2d62aea Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Mon, 18 May 2026 20:52:08 -0400 Subject: [PATCH 05/46] Finish the refactor --- tests/test_paint_context.py | 119 ++++++++++++++++++++++++++++-------- uilib/container.py | 5 +- uilib/paint.py | 79 +++++++++++++----------- uilib/widget.py | 4 +- 4 files changed, 143 insertions(+), 64 deletions(-) diff --git a/tests/test_paint_context.py b/tests/test_paint_context.py index f71c1ca9..7bec848e 100644 --- a/tests/test_paint_context.py +++ b/tests/test_paint_context.py @@ -10,7 +10,7 @@ from PIL import Image, ImageDraw from uilib.box import Box -from uilib.paint import PaintContext +from uilib.paint import PaintContext, BufferPool from uilib.container import ContainerWidget from uilib.widget import Widget @@ -19,6 +19,7 @@ # Helpers # --------------------------------------------------------------------------- + def _container(w=100, h=100, outline_radius=None, **kwargs): box = Box(0, 0, w, h) c = ContainerWidget(box=box, outline_radius=outline_radius, **kwargs) @@ -40,6 +41,7 @@ def _painted_colors(image): # Box.contains # --------------------------------------------------------------------------- + class TestBoxContains: def test_identical_boxes(self): b = Box(10, 10, 50, 50) @@ -52,7 +54,7 @@ def test_inner_fully_inside(self): def test_touching_edge_is_contained(self): outer = Box(0, 0, 100, 100) - edge = Box(0, 0, 100, 50) # shares top/left/right edge + edge = Box(0, 0, 100, 50) # shares top/left/right edge assert outer.contains(edge) def test_partial_overlap_is_not_contained(self): @@ -67,7 +69,7 @@ def test_larger_box_not_contained(self): def test_empty_box_contained(self): outer = Box(0, 0, 100, 100) - empty = Box(50, 50, 50, 50) # zero-area + empty = Box(50, 50, 50, 50) # zero-area assert outer.contains(empty) @@ -75,6 +77,7 @@ def test_empty_box_contained(self): # Widget._draw_erase # --------------------------------------------------------------------------- + class TestDrawErase: """_draw_erase erases with a plain rect when the dirty region fits in the safe interior; falls back to a full rounded_rectangle when it touches a @@ -96,8 +99,8 @@ def _erase_and_read(self, clip, frame, outline_radius=None): def test_no_radius_erases_only_clip(self): frame = Box(0, 0, 100, 100) - clip = Box(10, 10, 50, 50) - img = self._erase_and_read(clip, frame, outline_radius=None) + clip = Box(10, 10, 50, 50) + img = self._erase_and_read(clip, frame, outline_radius=None) # Clipped region is black assert img.getpixel((20, 20)) == (0, 0, 0) # Outside clip stays white @@ -106,12 +109,12 @@ def test_no_radius_erases_only_clip(self): def test_radius_safe_interior_erases_only_clip(self): """Dirty region inside the safe interior → plain rect erase.""" frame = Box(0, 0, 100, 100) - r = 10 + r = 10 # clip well inside the safe zone (r..100-r on each axis) - clip = Box(20, 20, 80, 80) - img = self._erase_and_read(clip, frame, outline_radius=r) - assert img.getpixel((50, 50)) == (0, 0, 0) # inside clip → erased - assert img.getpixel((5, 5)) == (255, 255, 255) # corner → untouched + clip = Box(20, 20, 80, 80) + img = self._erase_and_read(clip, frame, outline_radius=r) + assert img.getpixel((50, 50)) == (0, 0, 0) # inside clip → erased + assert img.getpixel((5, 5)) == (255, 255, 255) # corner → untouched def test_radius_partial_clip_erases_only_intersection(self): """Partial clip on a rounded widget → plain rect erase of the intersection. @@ -119,9 +122,9 @@ def test_radius_partial_clip_erases_only_intersection(self): not _draw_erase's. A leaf widget with outline_radius still gets a rect erase when the clip is smaller than the frame.""" frame = Box(0, 0, 100, 100) - r = 10 - clip = Box(0, 0, 20, 20) - img = self._erase_and_read(clip, frame, outline_radius=r) + r = 10 + clip = Box(0, 0, 20, 20) + img = self._erase_and_read(clip, frame, outline_radius=r) # Only the clipped region is erased assert img.getpixel((10, 10)) == (0, 0, 0) # Centre untouched — no full-frame expansion at this level @@ -130,18 +133,19 @@ def test_radius_partial_clip_erases_only_intersection(self): def test_radius_full_frame_uses_rounded_rectangle(self): """When clip == frame, always use rounded_rectangle (corners preserved).""" frame = Box(0, 0, 100, 100) - r = 10 - img = self._erase_and_read(frame, frame, outline_radius=r) + r = 10 + img = self._erase_and_read(frame, frame, outline_radius=r) # Centre erased assert img.getpixel((50, 50)) == (0, 0, 0) # Absolute corner pixels NOT erased (rounded rect leaves them) - assert img.getpixel((0, 0)) == (255, 255, 255) + assert img.getpixel((0, 0)) == (255, 255, 255) # --------------------------------------------------------------------------- # ContainerWidget._do_draw clip expansion # --------------------------------------------------------------------------- + class TestContainerClipExpansion: """When a rounded container's dirty clip touches a corner, _do_draw must expand the clip to the full frame so that both erase and child-draws are @@ -153,10 +157,10 @@ def _make_rounded_container(self, r=10): def test_no_radius_no_expansion(self): c = _container(outline_radius=None) # Paint a sentinel pixel in the top-left corner of the container image - c.image.putpixel((5, 5), (255, 0, 0)) + c.image.putpixel((5, 5), (255, 0, 0)) # pyright: ignore[reportOptionalMemberAccess] # Dirty clip covers only the bottom-right area — does not include (5,5) - clip = Box(50, 50, 100, 100) + clip = Box(50, 50, 100, 100) frame = Box(0, 0, 100, 100) parent_img = Image.new("RGB", (100, 100), (128, 128, 128)) parent_draw = ImageDraw.Draw(parent_img) @@ -164,7 +168,7 @@ def test_no_radius_no_expansion(self): c._do_draw(ctx, frame) # The sentinel pixel in container image should be unchanged (no expansion) - assert c.image.getpixel((5, 5)) == (255, 0, 0) + assert c.image.getpixel((5, 5)) == (255, 0, 0) # pyright: ignore[reportOptionalMemberAccess] def test_radius_corner_clip_does_not_expand(self): """A clip touching a corner does NOT expand. Framework-level clipping @@ -174,18 +178,19 @@ def test_radius_corner_clip_does_not_expand(self): # Add a child widget that tracks whether it was drawn drawn_frames = [] + class TrackingWidget(Widget): def _draw(self, ctx, frame): drawn_frames.append(frame.copy()) - child_box = Box(5, 5, 40, 20) # in top-left — inside corner region + child_box = Box(5, 5, 40, 20) # in top-left — inside corner region child = TrackingWidget(box=child_box) child.attach(c) child.bkgnd_color = (0, 0, 0) child.fgnd_color = (255, 255, 255) # Dirty clip covers only the bottom-right, away from the child - clip = Box(60, 60, 100, 100) + clip = Box(60, 60, 100, 100) frame = Box(0, 0, 100, 100) parent_img = Image.new("RGB", (100, 100)) ctx = PaintContext(parent_img, ImageDraw.Draw(parent_img), clip) @@ -194,12 +199,14 @@ def _draw(self, ctx, frame): # Child must NOT have been drawn (no expansion) assert len(drawn_frames) == 0 + def test_radius_safe_interior_clip_does_not_expand(self): """A clip fully inside the safe interior should NOT trigger expansion.""" r = 10 c = _container(w=100, h=100, outline_radius=r) drawn_frames = [] + class TrackingWidget(Widget): def _draw(self, ctx, frame): drawn_frames.append(frame.copy()) @@ -211,7 +218,7 @@ def _draw(self, ctx, frame): child.fgnd_color = (255, 255, 255) # Dirty clip is fully in the safe interior (r..100-r) - clip = Box(20, 20, 80, 80) + clip = Box(20, 20, 80, 80) frame = Box(0, 0, 100, 100) parent_img = Image.new("RGB", (100, 100)) ctx = PaintContext(parent_img, ImageDraw.Draw(parent_img), clip) @@ -223,9 +230,71 @@ def _draw(self, ctx, frame): # --------------------------------------------------------------------------- -# ContainerWidget._propagate_dirty scroll offset +# BufferPool # --------------------------------------------------------------------------- + +class TestBufferPool: + def test_best_fit_allocation(self): + pool = BufferPool((320, 240)) + + # 1. First allocation + img1 = pool.acquire((100, 100)) + assert img1.size == (100, 100) + pool.release(img1) + + # 2. Exact match reuse + img2 = pool.acquire((100, 100)) + assert img2 is img1 + pool.release(img2) + + # 3. New allocation for larger request + img3 = pool.acquire((150, 150)) + assert img3.size == (150, 150) + assert img3 is not img1 + pool.release(img3) + + # 4. Best fit reuse: img1(100x100) and img3(150x150) are free. + # Request for 120x120 should take img3. + img4 = pool.acquire((120, 120)) + assert img4 is img3 + pool.release(img4) + + # Request for 80x80 should take img1. + img5 = pool.acquire((80, 80)) + assert img5 is img1 + pool.release(img5) + + def test_max_size_cap(self): + pool = BufferPool((100, 100)) + img = pool.acquire((200, 200)) + assert img.size == (100, 100) + + def test_pool_lifecycle_and_nesting(self): + """Verify that pool size is bounded by nesting depth, not operation count.""" + pool = BufferPool((320, 240)) + img = Image.new("RGBA", (320, 240)) + draw = ImageDraw.Draw(img) + + # Force slow path with a small clip + ctx = PaintContext(img, draw, Box(0, 0, 5, 5), pool) + + # 1. Serial draws (should reuse same buffer) + for _ in range(100): + with ctx.painting(Box(0, 0, 100, 100)): + pass + assert len(pool._free) == 1 + + # 2. Nested draws (should grow to depth) + with ctx.painting(Box(0, 0, 100, 100)) as (ctx2, _): + # Inner clip must also be 'slow path' relative to ctx2.clip + # ctx2.clip is (0,0,5,5) re-anchored. + with ctx2.painting(Box(0, 0, 100, 100)): + assert len(pool._free) == 0 # 2 are currently active + assert len(pool._free) == 1 # Inner released + assert len(pool._free) == 2 # Both released + + class TestPropagateDirtyScrollOffset: """_propagate_dirty must account for self.offset (scroll) when translating a local dirty region into parent coordinates.""" @@ -241,7 +310,7 @@ def _propagate_dirty(self, clip): parent = CapturingParent(box=Box(0, 0, 200, 200)) c = _container(w=100, h=100) - c.box = Box(20, 30, 120, 130) # container positioned at (20,30) + c.box = Box(20, 30, 120, 130) # container positioned at (20,30) c.parent = parent local_clip = Box(10, 10, 50, 50) @@ -265,7 +334,7 @@ def _propagate_dirty(self, clip): c = _container(w=100, h=100) c.box = Box(20, 30, 120, 130) c.parent = parent - c.offset = (5, 10) # scrolled: content shifted by (5,10) + c.offset = (5, 10) # scrolled: content shifted by (5,10) local_clip = Box(10, 10, 50, 50) c._propagate_dirty(local_clip) diff --git a/uilib/container.py b/uilib/container.py index 78d0381e..1a501791 100644 --- a/uilib/container.py +++ b/uilib/container.py @@ -76,7 +76,8 @@ def refresh(self): if not self.image: return local_clip = self.box.norm() - ctx = PaintContext(self.image, self.draw, local_clip) + stack = self._get_stack() + ctx = PaintContext(self.image, self.draw, local_clip, stack.pool if stack else None) local_frame = self.box.norm() self._draw_erase(ctx, local_frame) self._draw(ctx, local_frame) @@ -96,7 +97,7 @@ def _do_draw(self, ctx: PaintContext, frame: Box): # 1. Update our own backing store (only the dirty region) local_clip = pctx.clip.deoffset(pframe.topleft) local_frame = self.box.norm() - local_ctx = PaintContext(self.image, self.draw, local_clip) + local_ctx = PaintContext(self.image, self.draw, local_clip, pctx.pool) self._draw_erase(local_ctx, local_frame) self._draw(local_ctx, local_frame) for c in self.children: diff --git a/uilib/paint.py b/uilib/paint.py index 567b9ef5..37b82173 100644 --- a/uilib/paint.py +++ b/uilib/paint.py @@ -33,21 +33,29 @@ def __init__(self, max_size: Tuple[int, int]): self._free: list[Image.Image] = [] def acquire(self, size: Tuple[int, int]) -> Image.Image: - # We always return an image of the max_size to avoid repeated allocations - # if sizes vary slightly. Clear it to transparent. - if self._free: - img = self._free.pop() - else: - img = Image.new("RGBA", self.max_size, (0, 0, 0, 0)) + # 1. Look for the best existing buffer: smallest one that's at least as big as 'size' + # on both dimensions. + best_idx = -1 + best_area = -1 - # Clear the region we might use. Actually, it's safer to clear the whole thing - # or at least the requested size. PIL's paste((0,0,0,0), ...) or similar. - # Simplest is just to create a new one if it's the first time, and clear it. - # For reuse, clearing the requested size is enough. - # img.paste((0, 0, 0, 0), (0, 0, size[0], size[1])) + for i, img in enumerate(self._free): + if img.size[0] >= size[0] and img.size[1] >= size[1]: + area = img.size[0] * img.size[1] + if best_idx == -1 or area < best_area: + best_idx = i + best_area = area + + if best_idx != -1: + img = self._free.pop(best_idx) + else: + # 2. No suitable buffer found. Allocate exactly what's needed, + # capped by max_size. + alloc_size = (min(size[0], self.max_size[0]), + min(size[1], self.max_size[1])) + img = Image.new("RGBA", alloc_size, (0, 0, 0, 0)) - # Actually, clearing the whole image is fast and safer. - img.paste((0, 0, 0, 0), (0, 0, img.size[0], img.size[1])) + # Clear the region we will use + img.paste((0, 0, 0, 0), (0, 0, size[0], size[1])) return img def release(self, buf: Image.Image) -> None: @@ -73,44 +81,43 @@ def painting(self, frame: Box) -> Generator[Tuple['PaintContext', Box], None, No """Yield (paint_ctx, paint_frame) suitable for painting `frame`. Fast path (clip ⊇ frame): yields (self, frame). __exit__ is a no-op. - Slow path (clip ⊊ frame): yields a temp-backed ctx with origin - re-anchored to (0,0). __exit__ composites - visible ∩ frame into self.image. + Slow path (clip ∩ frame is sub-region): yields a temp-backed ctx + sized exactly to the intersection, with origin re-anchored. + __exit__ composites temp into self.image. """ if self.clip.contains(frame): yield self, frame return - # Slow path + visible = self.clip.intersection(frame) + if visible.is_empty(): + # This should have been caught by the caller, but handle it gracefully + yield self, frame + return + + # Slow path: allocate only what we can actually see if self.pool is None: - # Fallback to a one-off buffer if no pool provided (e.g. in tests) - temp = Image.new("RGBA", frame.size, (0, 0, 0, 0)) + temp = Image.new("RGBA", visible.size, (0, 0, 0, 0)) else: - temp = self.pool.acquire(frame.size) + temp = self.pool.acquire(visible.size) try: temp_draw = ImageDraw.Draw(temp) - # Re-anchored frame for the temp buffer - pframe = Box(0, 0, frame.width, frame.height) - # Clip is the intersection of our clip and the frame, but re-anchored to temp - pclip = self.clip.intersection(frame).deoffset(frame.topleft) + # Re-anchor: we want the widget to draw at 'frame' relative to 'visible.topleft' + # So if visible is at (10, 10) and frame is at (0, 0), the widget + # should draw at (-10, -10) in the temp buffer. + offset = visible.topleft + pframe = frame.deoffset(offset) + pclip = Box(0, 0, visible.width, visible.height) pctx = PaintContext(temp, temp_draw, pclip, self.pool) yield pctx, pframe # Composite result back to self.image - # We only composite the intersection of clip and frame - visible = self.clip.intersection(frame) - if not visible.is_empty(): - src_rect = visible.deoffset(frame.topleft).rect - crop = temp.crop(src_rect) - dest_topleft = visible.topleft - - if self.image.mode == 'RGBA': - self.image.alpha_composite(crop, dest_topleft) - else: - # RGB target uses paste with mask - self.image.paste(crop, dest_topleft, crop) + if self.image.mode == 'RGBA': + self.image.alpha_composite(temp, visible.topleft) + else: + self.image.paste(temp, visible.topleft, temp) finally: if self.pool is not None: self.pool.release(temp) diff --git a/uilib/widget.py b/uilib/widget.py index 6bb8eed8..82149dbb 100644 --- a/uilib/widget.py +++ b/uilib/widget.py @@ -406,7 +406,9 @@ def refresh(self, box=None): return if clip.is_empty(): return - ctx = PaintContext(container.image, container.draw, clip) + stack = self._get_stack() + pool = stack.pool if stack else None + ctx = PaintContext(container.image, container.draw, clip, pool) self._do_draw(ctx, frame) container._propagate_dirty(clip) From 86421874ce9e0c26a860ab75db5af2a4c484fda6 Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Mon, 18 May 2026 20:59:37 -0400 Subject: [PATCH 06/46] Use footswitch width/height everywhere --- pistomp/lcd320x240.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pistomp/lcd320x240.py b/pistomp/lcd320x240.py index 578192f8..98e20375 100644 --- a/pistomp/lcd320x240.py +++ b/pistomp/lcd320x240.py @@ -478,7 +478,7 @@ def draw_footswitch(self, plugin): x = self.get_footswitch_pitch() * fs_id self.footswitch_slots[fs_id] = label color = self.get_plugin_color(plugin) - p = FootswitchWidget(Box.xywh(x, y, 60, 60), self.small_font, + p = FootswitchWidget(Box.xywh(x, y, self.footswitch_width, self.footswitch_height), self.small_font, label, color, plugin.is_bypassed(), parent=self.footswitch_panel, object=c) self.w_footswitches.append(p) self.footswitch_panel.add_widget(p) From ed5f281152f73a89effb3b8335952084de42a677 Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Mon, 18 May 2026 21:11:57 -0400 Subject: [PATCH 07/46] Change to protocol strategy --- uilib/paint.py | 53 +++++++++++++++++++++++++++++++++----------------- uilib/panel.py | 3 +-- 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/uilib/paint.py b/uilib/paint.py index 37b82173..dd91136d 100644 --- a/uilib/paint.py +++ b/uilib/paint.py @@ -14,13 +14,33 @@ # along with pi-stomp. If not, see . from dataclasses import dataclass -from typing import Generator, Optional, Tuple +from typing import Generator, Tuple, Protocol from contextlib import contextmanager from PIL import Image, ImageDraw from uilib.box import Box +class BufferManager(Protocol): + """Protocol for providing RGBA buffers.""" + + def acquire(self, size: Tuple[int, int]) -> Image.Image: ... + def release(self, buf: Image.Image) -> None: ... + + +class NaiveBufferPool: + """Naive implementation that always allocates a new image.""" + + def acquire(self, size: Tuple[int, int]) -> Image.Image: + return Image.new("RGBA", size, (0, 0, 0, 0)) + + def release(self, buf: Image.Image) -> None: + pass + + +_NAIVE_POOL = NaiveBufferPool() + + class BufferPool: """Stack of reusable RGBA buffers sized up to (max_w, max_h). @@ -28,6 +48,7 @@ class BufferPool: contains a slow-path child). Each acquire returns a buffer of at least the requested size; the buffer is cleared on acquire and returned to the pool on release. No allocation after warm-up.""" + def __init__(self, max_size: Tuple[int, int]): self.max_size = max_size self._free: list[Image.Image] = [] @@ -37,7 +58,7 @@ def acquire(self, size: Tuple[int, int]) -> Image.Image: # on both dimensions. best_idx = -1 best_area = -1 - + for i, img in enumerate(self._free): if img.size[0] >= size[0] and img.size[1] >= size[1]: area = img.size[0] * img.size[1] @@ -50,10 +71,9 @@ def acquire(self, size: Tuple[int, int]) -> Image.Image: else: # 2. No suitable buffer found. Allocate exactly what's needed, # capped by max_size. - alloc_size = (min(size[0], self.max_size[0]), - min(size[1], self.max_size[1])) + alloc_size = (min(size[0], self.max_size[0]), min(size[1], self.max_size[1])) img = Image.new("RGBA", alloc_size, (0, 0, 0, 0)) - + # Clear the region we will use img.paste((0, 0, 0, 0), (0, 0, size[0], size[1])) return img @@ -69,19 +89,20 @@ class PaintContext: image : target surface being drawn into draw : cached ImageDraw for image clip : dirty rect in image-coordinate space - pool : optional buffer pool for slow-path clipping + pool : buffer pool for slow-path clipping (defaults to a naive impl) """ + image: Image.Image draw: ImageDraw.ImageDraw clip: Box - pool: Optional[BufferPool] = None + pool: BufferManager = _NAIVE_POOL @contextmanager - def painting(self, frame: Box) -> Generator[Tuple['PaintContext', Box], None, None]: + def painting(self, frame: Box) -> Generator[Tuple["PaintContext", Box], None, None]: """Yield (paint_ctx, paint_frame) suitable for painting `frame`. Fast path (clip ⊇ frame): yields (self, frame). __exit__ is a no-op. - Slow path (clip ∩ frame is sub-region): yields a temp-backed ctx + Slow path (clip ∩ frame is sub-region): yields a temp-backed ctx sized exactly to the intersection, with origin re-anchored. __exit__ composites temp into self.image. """ @@ -96,28 +117,24 @@ def painting(self, frame: Box) -> Generator[Tuple['PaintContext', Box], None, No return # Slow path: allocate only what we can actually see - if self.pool is None: - temp = Image.new("RGBA", visible.size, (0, 0, 0, 0)) - else: - temp = self.pool.acquire(visible.size) + temp = self.pool.acquire(visible.size) try: temp_draw = ImageDraw.Draw(temp) # Re-anchor: we want the widget to draw at 'frame' relative to 'visible.topleft' - # So if visible is at (10, 10) and frame is at (0, 0), the widget + # So if visible is at (10, 10) and frame is at (0, 0), the widget # should draw at (-10, -10) in the temp buffer. offset = visible.topleft pframe = frame.deoffset(offset) pclip = Box(0, 0, visible.width, visible.height) pctx = PaintContext(temp, temp_draw, pclip, self.pool) - + yield pctx, pframe # Composite result back to self.image - if self.image.mode == 'RGBA': + if self.image.mode == "RGBA": self.image.alpha_composite(temp, visible.topleft) else: self.image.paste(temp, visible.topleft, temp) finally: - if self.pool is not None: - self.pool.release(temp) + self.pool.release(temp) diff --git a/uilib/panel.py b/uilib/panel.py index 712e7e5b..05c6e388 100644 --- a/uilib/panel.py +++ b/uilib/panel.py @@ -15,7 +15,6 @@ from uilib.container import * from uilib.paint import PaintContext, BufferPool -from pathlib import Path # # Note about coordinates: @@ -193,7 +192,7 @@ def __init__(self, lcd, box = None, image_format = None, use_dimming = True): else: self.dimmer = None - self.pool = BufferPool((box.width, box.height)) + self.pool = BufferPool(box.size) # We don't have a parent, establish all the defaults self._setup_act_attrs() From 58e47ded0344a261cb3d3c5b03c0e20490050d03 Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Mon, 18 May 2026 21:21:12 -0400 Subject: [PATCH 08/46] Clarity --- uilib/container.py | 14 ++++++++--- uilib/widget.py | 59 ++++++++++++++++++++-------------------------- 2 files changed, 36 insertions(+), 37 deletions(-) diff --git a/uilib/container.py b/uilib/container.py index 1a501791..fa2f3fa0 100644 --- a/uilib/container.py +++ b/uilib/container.py @@ -72,12 +72,17 @@ def _visible_box(self, box): return box.intersects(self.box.norm()) def refresh(self): + """Redraw the container's backing image and notify the parent of the change. + + This constructs a local PaintContext for the container, redraws self and all children + into the internal image, and then bubbles the updated region up the widget tree.""" trace(self, "ContainerWidget.refresh: vis=", self.visible, "parent=", self.parent) if not self.image: return local_clip = self.box.norm() stack = self._get_stack() - ctx = PaintContext(self.image, self.draw, local_clip, stack.pool if stack else None) + pool = stack.pool if stack else None + ctx = PaintContext(self.image, self.draw, local_clip, pool) local_frame = self.box.norm() self._draw_erase(ctx, local_frame) self._draw(ctx, local_frame) @@ -90,7 +95,11 @@ def refresh(self): self._propagate_dirty(local_clip) def _do_draw(self, ctx: PaintContext, frame: Box): - """Draw this container into the parent surface at frame.""" + """Draw this container's pixels into a parent's PaintContext. + + It first updates its internal backing store for the dirty region, then blits + the relevant slice into the parent surface, delegating coordinate management + and potential buffer allocation to the framework's painting() context.""" # Note: We still draw into self.image as a backing store. # Framework painting() handles the clip/temp-buffer/composite back to ctx.image. with ctx.painting(frame) as (pctx, pframe): @@ -174,4 +183,3 @@ def _scroll_into_view(self, box): self.scroll((ox, oy)) return True return False - diff --git a/uilib/widget.py b/uilib/widget.py index 82149dbb..36c48885 100644 --- a/uilib/widget.py +++ b/uilib/widget.py @@ -13,10 +13,12 @@ # You should have received a copy of the GNU General Public License # along with pi-stomp. If not, see . -from enum import Flag +from typing import Tuple from uilib.misc import * from uilib.box import * +from uilib.container import ContainerWidget from uilib.paint import PaintContext +from uilib.panel import PanelStack # This is the root of all evil: the Widget class, parent of all things # displayed on the screen. @@ -226,7 +228,7 @@ def _setup_act_attrs(self): # box is established early and thus rely on the stack bounding box. When a # panel is popped off the stack, it still keeps its reference to said stack - def _build_paint_target(self, dirty): + def _build_paint_target(self, dirty: Box) -> Tuple[ContainerWidget, Box, Box] | Tuple[None, None, None]: """Walk up to the nearest ContainerWidget, accumulating frame offset. Returns (container, frame, clip) where: @@ -235,38 +237,27 @@ def _build_paint_target(self, dirty): clip : dirty translated into container-local coords, clipped to container bounds Returns (None, None, None) if no visible ContainerWidget ancestor found. """ - from uilib.container import ContainerWidget - offset = self.box.topleft - node = self.parent - while node is not None: - if not node.visible: + off_x, off_y = 0, 0 + curr = self + while curr is not None: + if not curr.visible: return None, None, None - if isinstance(node, ContainerWidget): - frame = self.box.offset( - (offset[0] - self.box.x0, offset[1] - self.box.y0) - ) - # frame in container-local coords = self.box shifted by accumulated parent offsets - # Rebuild: walk again collecting offsets cleanly - break - offset = (offset[0] + node.box.x0, offset[1] + node.box.y0) - node = node.parent - else: - return None, None, None - - # Re-walk to get proper frame: self.box offset by sum of non-container ancestors - frame_x, frame_y = 0, 0 - cur = self - while cur.parent is not node: - frame_x += cur.box.x0 - frame_y += cur.box.y0 - cur = cur.parent - frame_x += cur.box.x0 - frame_y += cur.box.y0 - frame = Box(frame_x, frame_y, frame_x + self.box.width, frame_y + self.box.height) - - clip = dirty.offset((frame_x - self.box.x0, frame_y - self.box.y0)) - clip = clip.intersection(node.box.norm()) - return node, frame, clip + + off_x += curr.box.x0 + off_y += curr.box.y0 + + parent = curr.parent + if isinstance(parent, ContainerWidget): + # We found our backing image owner. + # frame = where we are in container local coords + frame = Box.xywh(off_x, off_y, self.box.width, self.box.height) + # clip = the dirty region re-anchored to the same container coords + clip = dirty.offset((off_x - self.box.x0, off_y - self.box.y0)) + return (parent, frame, clip.intersection(parent.box.norm())) + + curr = parent + + return (None, None, None) def set_outline(self, width, color = None): self.outline = width @@ -477,7 +468,7 @@ def input_event(self, event): return True return False - def _get_stack(self): + def _get_stack(self) -> PanelStack | None: """Helper to return the top-level panel stack. Useful for creating pop-up dialogs such as text editing helpers """ From 952b1648c6a35cb58ebfc55987d5606fe7adf7de Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Mon, 18 May 2026 21:24:25 -0400 Subject: [PATCH 09/46] Fix circular import --- uilib/widget.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/uilib/widget.py b/uilib/widget.py index 36c48885..b6f424a6 100644 --- a/uilib/widget.py +++ b/uilib/widget.py @@ -13,12 +13,14 @@ # You should have received a copy of the GNU General Public License # along with pi-stomp. If not, see . -from typing import Tuple +from typing import TYPE_CHECKING, Tuple from uilib.misc import * from uilib.box import * -from uilib.container import ContainerWidget from uilib.paint import PaintContext -from uilib.panel import PanelStack + +if TYPE_CHECKING: + from uilib.container import ContainerWidget + from uilib.panel import PanelStack # This is the root of all evil: the Widget class, parent of all things # displayed on the screen. @@ -228,7 +230,7 @@ def _setup_act_attrs(self): # box is established early and thus rely on the stack bounding box. When a # panel is popped off the stack, it still keeps its reference to said stack - def _build_paint_target(self, dirty: Box) -> Tuple[ContainerWidget, Box, Box] | Tuple[None, None, None]: + def _build_paint_target(self, dirty: Box) -> Tuple["ContainerWidget", Box, Box] | Tuple[None, None, None]: """Walk up to the nearest ContainerWidget, accumulating frame offset. Returns (container, frame, clip) where: @@ -237,6 +239,8 @@ def _build_paint_target(self, dirty: Box) -> Tuple[ContainerWidget, Box, Box] | clip : dirty translated into container-local coords, clipped to container bounds Returns (None, None, None) if no visible ContainerWidget ancestor found. """ + from uilib.container import ContainerWidget + off_x, off_y = 0, 0 curr = self while curr is not None: From 88dfb12afe2fdbf0c23f1e47fc6557fc2674d1d2 Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Mon, 18 May 2026 23:06:18 -0400 Subject: [PATCH 10/46] Fix code review findings --- uilib/container.py | 4 ++-- uilib/paint.py | 11 ++++++++--- uilib/panel.py | 6 +++--- uilib/widget.py | 4 ++-- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/uilib/container.py b/uilib/container.py index fa2f3fa0..794ff8b6 100644 --- a/uilib/container.py +++ b/uilib/container.py @@ -14,7 +14,7 @@ # along with pi-stomp. If not, see . from uilib.widget import * -from uilib.paint import PaintContext +from uilib.paint import PaintContext, _NAIVE_POOL from PIL import Image, ImageDraw class ContainerWidget(Widget): @@ -81,7 +81,7 @@ def refresh(self): return local_clip = self.box.norm() stack = self._get_stack() - pool = stack.pool if stack else None + pool = stack.pool if stack else _NAIVE_POOL ctx = PaintContext(self.image, self.draw, local_clip, pool) local_frame = self.box.norm() self._draw_erase(ctx, local_frame) diff --git a/uilib/paint.py b/uilib/paint.py index dd91136d..c7267bc2 100644 --- a/uilib/paint.py +++ b/uilib/paint.py @@ -131,10 +131,15 @@ def painting(self, frame: Box) -> Generator[Tuple["PaintContext", Box], None, No yield pctx, pframe - # Composite result back to self.image + # Composite result back to self.image. The pool may have handed us + # a buffer larger than `visible.size`; only the top-left + # (visible.width, visible.height) region was cleared and painted, + # so restrict the composite source to that region. + src_box = (0, 0, visible.width, visible.height) if self.image.mode == "RGBA": - self.image.alpha_composite(temp, visible.topleft) + self.image.alpha_composite(temp, visible.topleft, src_box) else: - self.image.paste(temp, visible.topleft, temp) + sub = temp.crop(src_box) + self.image.paste(sub, visible.topleft, sub) finally: self.pool.release(temp) diff --git a/uilib/panel.py b/uilib/panel.py index 05c6e388..34bcd9d3 100644 --- a/uilib/panel.py +++ b/uilib/panel.py @@ -210,7 +210,7 @@ def refresh(self): def _propagate_dirty(self, clip: Box): """Recompose the dirty clip region from all stacked panels, then push to LCD.""" - erase_ctx = PaintContext(self.image, self.draw, clip) + erase_ctx = PaintContext(self.image, self.draw, clip, self.pool) self._draw_erase(erase_ctx, clip) for p in self.stack: @@ -220,11 +220,11 @@ def _propagate_dirty(self, clip: Box): if d is not None: inter = clip.intersection(d.box) if not inter.is_empty(): - ctx = PaintContext(self.image, self.draw, inter) + ctx = PaintContext(self.image, self.draw, inter, self.pool) d._do_draw(ctx, d.box) inter = clip.intersection(p.box) if not inter.is_empty(): - ctx = PaintContext(self.image, self.draw, inter) + ctx = PaintContext(self.image, self.draw, inter, self.pool) p._do_draw(ctx, p.box) trace(self, "updating lcd with image", self.image, "box=", clip) diff --git a/uilib/widget.py b/uilib/widget.py index b6f424a6..751b8422 100644 --- a/uilib/widget.py +++ b/uilib/widget.py @@ -16,7 +16,7 @@ from typing import TYPE_CHECKING, Tuple from uilib.misc import * from uilib.box import * -from uilib.paint import PaintContext +from uilib.paint import PaintContext, _NAIVE_POOL if TYPE_CHECKING: from uilib.container import ContainerWidget @@ -402,7 +402,7 @@ def refresh(self, box=None): if clip.is_empty(): return stack = self._get_stack() - pool = stack.pool if stack else None + pool = stack.pool if stack else _NAIVE_POOL ctx = PaintContext(container.image, container.draw, clip, pool) self._do_draw(ctx, frame) container._propagate_dirty(clip) From 9b836a46053d5a58e1ce126a11c459ae74a7feb4 Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Mon, 18 May 2026 23:33:01 -0400 Subject: [PATCH 11/46] Paint primitives --- pistomp/lcd320x240.py | 4 +- tests/test_paint_context.py | 144 +++++++++++++++++++++++++++++++----- uilib/container.py | 42 ++++++----- uilib/dialog.py | 9 +-- uilib/footswitch.py | 48 +++++++----- uilib/icon.py | 21 +++--- uilib/image.py | 9 +-- uilib/paint.py | 95 +++++++++++++++++++++--- uilib/panel.py | 19 ++--- uilib/text.py | 29 ++++---- uilib/widget.py | 42 +++++------ 11 files changed, 328 insertions(+), 134 deletions(-) diff --git a/pistomp/lcd320x240.py b/pistomp/lcd320x240.py index 98e20375..b291323f 100644 --- a/pistomp/lcd320x240.py +++ b/pistomp/lcd320x240.py @@ -81,8 +81,8 @@ def __init__(self, cwd, handler=None, flip=False): self.plugin_width = 78 self.plugin_height = 29 self.plugin_label_length = 7 - self.footswitch_height = 60 - self.footswitch_width = 56 + self.footswitch_height = 40 + self.footswitch_width = 60 # space between footswitch icons where index is the footswitch count # 0 1 2 3 4 5 6 7 self.footswitch_pitch_options = [120, 120, 120, 128, 86, 65, 65, 65] diff --git a/tests/test_paint_context.py b/tests/test_paint_context.py index 7bec848e..7c7e9d28 100644 --- a/tests/test_paint_context.py +++ b/tests/test_paint_context.py @@ -2,8 +2,8 @@ Unit tests for paint-context drawing logic: - Box.contains - Widget._draw_erase (safe-interior vs full-frame erase) - - ContainerWidget._do_draw clip expansion for rounded containers - - ContainerWidget._propagate_dirty scroll-offset translation + - ContainerWidget.do_draw clip expansion for rounded containers + - ContainerWidget.propagate_dirty scroll-offset translation """ import pytest @@ -88,13 +88,13 @@ def _erase_and_read(self, clip, frame, outline_radius=None): region. Returns the image so the caller can inspect pixels.""" img = Image.new("RGB", (100, 100), (255, 255, 255)) draw = ImageDraw.Draw(img) - ctx = PaintContext(img, draw, clip) + ctx = PaintContext(img, draw, clip, frame=frame) w = Widget(box=frame) w.outline_radius = outline_radius w.bkgnd_color = (0, 0, 0) - w._draw_erase(ctx, frame) + w._draw_erase(ctx) return img def test_no_radius_erases_only_clip(self): @@ -118,7 +118,7 @@ def test_radius_safe_interior_erases_only_clip(self): def test_radius_partial_clip_erases_only_intersection(self): """Partial clip on a rounded widget → plain rect erase of the intersection. - Full-frame expansion for rounded shapes is ContainerWidget._do_draw's job, + Full-frame expansion for rounded shapes is ContainerWidget.do_draw's job, not _draw_erase's. A leaf widget with outline_radius still gets a rect erase when the clip is smaller than the frame.""" frame = Box(0, 0, 100, 100) @@ -142,12 +142,12 @@ def test_radius_full_frame_uses_rounded_rectangle(self): # --------------------------------------------------------------------------- -# ContainerWidget._do_draw clip expansion +# ContainerWidget.do_draw clip expansion # --------------------------------------------------------------------------- class TestContainerClipExpansion: - """When a rounded container's dirty clip touches a corner, _do_draw must + """When a rounded container's dirty clip touches a corner, do_draw must expand the clip to the full frame so that both erase and child-draws are consistent (no content left erased-but-not-redrawn).""" @@ -166,7 +166,7 @@ def test_no_radius_no_expansion(self): parent_draw = ImageDraw.Draw(parent_img) ctx = PaintContext(parent_img, parent_draw, clip) - c._do_draw(ctx, frame) + c.do_draw(ctx, frame) # The sentinel pixel in container image should be unchanged (no expansion) assert c.image.getpixel((5, 5)) == (255, 0, 0) # pyright: ignore[reportOptionalMemberAccess] @@ -180,8 +180,8 @@ def test_radius_corner_clip_does_not_expand(self): drawn_frames = [] class TrackingWidget(Widget): - def _draw(self, ctx, frame): - drawn_frames.append(frame.copy()) + def _draw(self, ctx): + drawn_frames.append(ctx.frame.copy()) child_box = Box(5, 5, 40, 20) # in top-left — inside corner region child = TrackingWidget(box=child_box) @@ -195,7 +195,7 @@ def _draw(self, ctx, frame): parent_img = Image.new("RGB", (100, 100)) ctx = PaintContext(parent_img, ImageDraw.Draw(parent_img), clip) - c._do_draw(ctx, frame) + c.do_draw(ctx, frame) # Child must NOT have been drawn (no expansion) assert len(drawn_frames) == 0 @@ -208,8 +208,8 @@ def test_radius_safe_interior_clip_does_not_expand(self): drawn_frames = [] class TrackingWidget(Widget): - def _draw(self, ctx, frame): - drawn_frames.append(frame.copy()) + def _draw(self, ctx): + drawn_frames.append(ctx.frame.copy()) # Child is in top-left corner region child = TrackingWidget(box=Box(2, 2, 8, 8)) @@ -223,7 +223,7 @@ def _draw(self, ctx, frame): parent_img = Image.new("RGB", (100, 100)) ctx = PaintContext(parent_img, ImageDraw.Draw(parent_img), clip) - c._do_draw(ctx, frame) + c.do_draw(ctx, frame) # Child frame doesn't intersect clip → not drawn assert len(drawn_frames) == 0 @@ -286,7 +286,7 @@ def test_pool_lifecycle_and_nesting(self): assert len(pool._free) == 1 # 2. Nested draws (should grow to depth) - with ctx.painting(Box(0, 0, 100, 100)) as (ctx2, _): + with ctx.painting(Box(0, 0, 100, 100)) as ctx2: # Inner clip must also be 'slow path' relative to ctx2.clip # ctx2.clip is (0,0,5,5) re-anchored. with ctx2.painting(Box(0, 0, 100, 100)): @@ -296,7 +296,7 @@ def test_pool_lifecycle_and_nesting(self): class TestPropagateDirtyScrollOffset: - """_propagate_dirty must account for self.offset (scroll) when translating + """propagate_dirty must account for self.offset (scroll) when translating a local dirty region into parent coordinates.""" def test_no_scroll_translates_by_box_position(self): @@ -305,7 +305,7 @@ def test_no_scroll_translates_by_box_position(self): received = [] class CapturingParent(Widget): - def _propagate_dirty(self, clip): + def propagate_dirty(self, clip): received.append(clip) parent = CapturingParent(box=Box(0, 0, 200, 200)) @@ -314,7 +314,7 @@ def _propagate_dirty(self, clip): c.parent = parent local_clip = Box(10, 10, 50, 50) - c._propagate_dirty(local_clip) + c.propagate_dirty(local_clip) assert len(received) == 1 result = received[0] @@ -327,7 +327,7 @@ def test_scroll_offset_shifts_propagated_clip(self): received = [] class CapturingParent(Widget): - def _propagate_dirty(self, clip): + def propagate_dirty(self, clip): received.append(clip) parent = CapturingParent(box=Box(0, 0, 200, 200)) @@ -337,9 +337,113 @@ def _propagate_dirty(self, clip): c.offset = (5, 10) # scrolled: content shifted by (5,10) local_clip = Box(10, 10, 50, 50) - c._propagate_dirty(local_clip) + c.propagate_dirty(local_clip) assert len(received) == 1 result = received[0] # deoffset(5,10) → (5,0,45,40), then offset by (20,30) → (25,30,65,70) assert result == Box(25, 30, 65, 70) + + +# --------------------------------------------------------------------------- +# Relative-coordinate API contract +# --------------------------------------------------------------------------- + + +class _RelDrawWidget(Widget): + """Test widget that draws via the relative-coord PaintContext API. + + Fills its own background, draws a 1-pixel marker at relative (0,0), and a + single-pixel rectangle at the opposite corner. Any frame translation bug + surfaces as a marker landing at the wrong absolute coordinate. + """ + + def _draw(self, ctx): + ctx.fill((255, 255, 255)) + ctx.draw_rectangle(Box(0, 0, 1, 1), fill=(255, 0, 0)) + ctx.draw_rectangle(Box(ctx.width - 1, ctx.height - 1, ctx.width, ctx.height), + fill=(0, 255, 0)) + + +class TestRelativeCoords: + """The wrappers must translate (0,0) → frame.topleft for any frame placement.""" + + @pytest.mark.parametrize("frame", [ + Box(0, 0, 20, 20), # at origin + Box(50, 30, 70, 50), # offset into image + Box(99, 99, 119, 119), # straddling beyond image (rest clipped naturally) + ]) + def test_origin_marker_lands_at_frame_topleft(self, frame): + img = Image.new("RGB", (200, 200), (0, 0, 0)) + draw = ImageDraw.Draw(img) + ctx = PaintContext(img, draw, Box(0, 0, 200, 200)) + + w = _RelDrawWidget(box=frame) + w.bkgnd_color = (0, 0, 0) + w.fgnd_color = (255, 255, 255) + w.do_draw(ctx, frame) + + # (0,0) marker lands at frame.topleft. + assert img.getpixel(frame.topleft) == (255, 0, 0) + # (width-1, height-1) marker lands at frame's botright minus 1. + far = (frame.x1 - 1, frame.y1 - 1) + if 0 <= far[0] < 200 and 0 <= far[1] < 200: + assert img.getpixel(far) == (0, 255, 0) + # Pixel just outside top-left is still untouched. + if frame.x0 > 0: + assert img.getpixel((frame.x0 - 1, frame.y0)) == (0, 0, 0) + + +# --------------------------------------------------------------------------- +# Slow-path scissor containment +# --------------------------------------------------------------------------- + + +class _SloppyWidget(Widget): + """Intentionally draws well outside its own frame to test the slow-path + scissor. A correctly-clipping PaintContext must discard any pixels that + fall outside clip ∩ frame.""" + + def _draw(self, ctx): + # Try to bleed 10px past every edge. + ctx.draw_rectangle( + Box(-10, -10, ctx.width + 10, ctx.height + 10), + fill=(255, 0, 0), + ) + + +class TestSloppyDrawContainment: + """A widget that paints outside its frame must NOT leak onto the parent + surface beyond clip ∩ frame when the slow path is engaged.""" + + def test_slow_path_scissors_oversized_draw(self): + from uilib.paint import BufferPool + + img = Image.new("RGBA", (200, 200), (0, 0, 0, 255)) + draw = ImageDraw.Draw(img) + + # Force slow path: clip is a strict sub-rect of frame. + frame = Box(50, 50, 150, 150) + clip = Box(60, 60, 140, 140) + pool = BufferPool((200, 200)) + ctx = PaintContext(img, draw, clip, pool) + + w = _SloppyWidget(box=frame) + w.bkgnd_color = (0, 0, 0, 0) # transparent erase so we see leaks clearly + w.fgnd_color = (255, 255, 255) + w.do_draw(ctx, frame) + + # Inside clip: should be red (widget drew there). + assert img.getpixel((100, 100))[:3] == (255, 0, 0) + + # Outside clip but inside frame: widget *tried* to paint here via the + # oversized rect, but the slow-path scissor must have dropped it. + # frame extends [50,150)×[50,150); clip is [60,140)×[60,140). + # Pixel (55, 100) is inside frame, outside clip. + assert img.getpixel((55, 100))[:3] == (0, 0, 0) + assert img.getpixel((145, 100))[:3] == (0, 0, 0) + assert img.getpixel((100, 55))[:3] == (0, 0, 0) + + # Well outside frame: definitely untouched. + assert img.getpixel((10, 10))[:3] == (0, 0, 0) + assert img.getpixel((190, 190))[:3] == (0, 0, 0) diff --git a/uilib/container.py b/uilib/container.py index 794ff8b6..3a6994a8 100644 --- a/uilib/container.py +++ b/uilib/container.py @@ -80,21 +80,21 @@ def refresh(self): if not self.image: return local_clip = self.box.norm() + local_frame = self.box.norm() stack = self._get_stack() pool = stack.pool if stack else _NAIVE_POOL - ctx = PaintContext(self.image, self.draw, local_clip, pool) - local_frame = self.box.norm() - self._draw_erase(ctx, local_frame) - self._draw(ctx, local_frame) + ctx = PaintContext(self.image, self.draw, local_clip, pool, frame=local_frame) + self._draw_erase(ctx) + self._draw(ctx) for c in self.children: if c.visible: - c._do_draw(ctx, c.box.offset(local_frame)) - self._draw_outline(ctx, local_frame) - self._draw_selection(ctx, local_frame) + c.do_draw(ctx, c.box.offset(local_frame)) + self._draw_outline(ctx) + self._draw_selection(ctx) if self.visible and self.parent is not None: - self._propagate_dirty(local_clip) + self.propagate_dirty(local_clip) - def _do_draw(self, ctx: PaintContext, frame: Box): + def do_draw(self, ctx: PaintContext, frame: Box): """Draw this container's pixels into a parent's PaintContext. It first updates its internal backing store for the dirty region, then blits @@ -102,18 +102,20 @@ def _do_draw(self, ctx: PaintContext, frame: Box): and potential buffer allocation to the framework's painting() context.""" # Note: We still draw into self.image as a backing store. # Framework painting() handles the clip/temp-buffer/composite back to ctx.image. - with ctx.painting(frame) as (pctx, pframe): + with ctx.painting(frame) as pctx: + pframe = pctx.frame + assert pframe is not None # 1. Update our own backing store (only the dirty region) local_clip = pctx.clip.deoffset(pframe.topleft) local_frame = self.box.norm() - local_ctx = PaintContext(self.image, self.draw, local_clip, pctx.pool) - self._draw_erase(local_ctx, local_frame) - self._draw(local_ctx, local_frame) + local_ctx = PaintContext(self.image, self.draw, local_clip, pctx.pool, frame=local_frame) + self._draw_erase(local_ctx) + self._draw(local_ctx) for c in self.children: if c.visible: - c._do_draw(local_ctx, c.box.offset(local_frame)) - self._draw_outline(local_ctx, local_frame) - self._draw_selection(local_ctx, local_frame) + c.do_draw(local_ctx, c.box.offset(local_frame)) + self._draw_outline(local_ctx) + self._draw_selection(local_ctx) # 2. Blit our backing store into pctx.image (which might be a temp) # We only need to blit the local_clip portion. @@ -122,24 +124,24 @@ def _do_draw(self, ctx: PaintContext, frame: Box): # pctx.image is aligned with pframe. # So local_clip.topleft in pctx.image coords is pframe.x0 + local_clip.x0, etc. dst_topleft = (pframe.x0 + local_clip.x0, pframe.y0 + local_clip.y0) - + sub = self.image.crop(src_box.rect) if self.mask is not None: sub_mask = self.mask.crop(src_box.rect) else: sub_mask = None - + if self.has_alpha and pctx.image.mode == 'RGBA': pctx.image.alpha_composite(sub, dst_topleft) else: pctx.image.paste(sub, dst_topleft, sub_mask) - def _propagate_dirty(self, local_clip: Box): + def propagate_dirty(self, local_clip: Box): """Bubble a dirty region (in our local coords) up to our parent container.""" if not self.visible or self.parent is None: return parent_clip = local_clip.deoffset(self.offset).offset(self.box) - self.parent._propagate_dirty(parent_clip) + self.parent.propagate_dirty(parent_clip) def scroll(self, offset): print(offset) diff --git a/uilib/dialog.py b/uilib/dialog.py index d7a7b91f..dd705131 100644 --- a/uilib/dialog.py +++ b/uilib/dialog.py @@ -51,12 +51,11 @@ def _adjust_box(self): self.title.set_box(tbox, refresh = False) self.title.show(refresh = False) - def _draw(self, ctx, frame): - trace(self, "DialogDecorator draw, frame=", frame, "self.box=", self.box) - line_xy = (frame.x0, frame.y0 + self.th + 1, - frame.x1 - self.outline, frame.y0 + self.th + 1) + def _draw(self, ctx): + trace(self, "DialogDecorator draw, self.box=", self.box) + y = self.th + 1 # The +2 here is magic ... need to figure out what's up, otherwise we get only 1 pixel - ctx.draw.line(line_xy, fill=self.fgnd_color, width=self.outline + 2) + ctx.draw_line(((0, y), (ctx.width - self.outline, y)), fill=self.fgnd_color, width=self.outline + 2) class Dialog(Panel): def __init__(self, width, height, title, title_font = None, **kwargs): diff --git a/uilib/footswitch.py b/uilib/footswitch.py index c99ea56c..ce6e40c5 100644 --- a/uilib/footswitch.py +++ b/uilib/footswitch.py @@ -30,35 +30,43 @@ def __init__(self, box, font, label, color, is_bypassed, **kwargs): self.foreground = (255, 255, 255) self.color_plugin_bypassed = (80, 80, 80) - def _draw(self, ctx, frame): - self.xy1 = (frame.x0, frame.y0) - self.xy2 = (frame.x0 + 60, frame.y0 + 40) # TODO should these offsets be here? + # Visual constants (in pixels). + CAP_INSET_X = 10 # horizontal inset of the cap ellipse from each side + CAP_HEIGHT = 16 # height of each cap ellipse + CAP_STACK_OFFSET = 6 # how much the top cap sits above the bottom cap + CAP_BOTTOM_MARGIN = 18 # gap between bottom of cap and bottom of cap area + HALO_INSET = 2 # halo inset from frame edges + HALO_TOP = 10 # halo top relative to frame top + + def _draw(self, ctx): + w, h = ctx.width, ctx.height - # halo self._draw_halo(ctx) - # cap bottom - fx1 = self.xy1[0] + 10 - fy1 = self.xy2[1] - 34 - fx2 = self.xy2[0] - 10 - fy2 = fy1 + 16 - ctx.draw.ellipse(((fx1, fy1), (fx2, fy2)), fill=self.background, outline="gray", width=2) + # Cap is a stack of two ellipses near the top of the frame, leaving + # room below for the label. + cap_x0 = self.CAP_INSET_X + cap_x1 = w - self.CAP_INSET_X + cap_bottom_y = h - self.CAP_BOTTOM_MARGIN - self.CAP_HEIGHT + cap_top_y = cap_bottom_y - self.CAP_STACK_OFFSET + # cap bottom + ctx.draw_ellipse(Box(cap_x0, cap_bottom_y, cap_x1, cap_bottom_y + self.CAP_HEIGHT), + fill=self.background, outline="gray", width=2) # cap top - fy1 -= 6 - fy2 -= 6 - ctx.draw.ellipse(((fx1, fy1), (fx2, fy2)), fill=self.background, outline="gray", width=2) + ctx.draw_ellipse(Box(cap_x0, cap_top_y, cap_x1, cap_top_y + self.CAP_HEIGHT), + fill=self.background, outline="gray", width=2) - # label - ctx.draw.text((self.xy1[0], self.xy2[1]), self.label, self.foreground, self.font) + # label sits at the bottom of the frame + ctx.draw_text((0, h), self.label, self.foreground, self.font) def _draw_halo(self, ctx): - hx1 = self.xy1[0] + 2 - hy1 = self.xy1[1] + 10 - hx2 = self.xy2[0] - 2 - hy2 = self.xy2[1] - 2 color = self.color_plugin_bypassed if self.is_bypassed else self.color - ctx.draw.ellipse(((hx1, hy1), (hx2, hy2)), fill=None, outline=color, width=self.footswitch_ring_width) + ctx.draw_ellipse( + Box(self.HALO_INSET, self.HALO_TOP, + ctx.width - self.HALO_INSET, ctx.height - self.HALO_INSET), + fill=None, outline=color, width=self.footswitch_ring_width, + ) def toggle(self, is_bypassed): self.is_bypassed = is_bypassed diff --git a/uilib/icon.py b/uilib/icon.py index c1d584c1..998d153d 100644 --- a/uilib/icon.py +++ b/uilib/icon.py @@ -35,9 +35,10 @@ def __init__(self, box, text='', text_color=None, height=13, outline_width=2, ** self.text_color = text_color if text_color is not None else self.fgnd_color def add_knob(self): - loc = (self.box.x0, self.box.y0 + 2) # TODO use box directly, replace height with box height + # Widget-relative coords from (0, 0). + loc = (0, 2) e = { - 'xy': ((loc[0], loc[1]), (loc[0] + self.height, loc[1] + self.height)), + 'box': Box(loc[0], loc[1], loc[0] + self.height, loc[1] + self.height), 'fill': self.bkgnd_color, 'outline': self.fgnd_color, 'height' : self.outline_width @@ -54,7 +55,7 @@ def add_knob(self): self.lines.append(l) def add_pedal(self): - loc = (self.box.x0, self.box.y0 - 1) # TODO use box directly, replace height with box height + loc = (0, -1) l = { 'xy': ((loc[0], loc[1] + self.height), (loc[0] + self.height, loc[1] + int(self.height / 3))), @@ -72,22 +73,22 @@ def add_pedal(self): self.lines.append(l) - def _draw(self, ctx, frame): + def _draw(self, ctx): h_margin, v_margin = self._get_margins() extra = self.outline - hroom = frame.width - h_margin - extra - vroom = frame.height - v_margin - extra + hroom = ctx.width - h_margin - extra + vroom = ctx.height - v_margin - extra if hroom < 0 or vroom < 0: return h_margin = 1 - loc = (frame.x0 + h_margin, frame.y0 + v_margin) + loc = (h_margin, v_margin) for e in self.ellipses: - ctx.draw.ellipse(xy=e['xy'], fill=e['fill'], outline=e['outline'], width=e['height']) + ctx.draw_ellipse(e['box'], fill=e['fill'], outline=e['outline'], width=e['height']) for l in self.lines: - ctx.draw.line(xy=l['xy'], fill=l['fill'], width=l['height']) + ctx.draw_line(l['xy'], fill=l['fill'], width=l['height']) - ctx.draw.text((loc[0] + self.height + h_margin, loc[1]), self.text, fill=self.text_color, font=self.font) + ctx.draw_text((loc[0] + self.height + h_margin, loc[1]), self.text, fill=self.text_color, font=self.font) diff --git a/uilib/image.py b/uilib/image.py index 541ef73c..f5997793 100644 --- a/uilib/image.py +++ b/uilib/image.py @@ -23,12 +23,11 @@ def __init__(self, image_path, **kwargs): super(ImageWidget,self).__init__(**kwargs) self.image = Image.open(image_path) - def _draw(self, ctx, frame): + def _draw(self, ctx): width, height = self.image.size - offx = int((frame.width - width) / 2) - offy = int((frame.height - height) / 2) - loc = frame.offset((offx, offy)).topleft - ctx.image.paste(self.image, loc) + offx = int((ctx.width - width) / 2) + offy = int((ctx.height - height) / 2) + ctx.paste(self.image, (offx, offy)) def replace_img(self, image_path): # XXX Note that the new image must be the same size as the original diff --git a/uilib/paint.py b/uilib/paint.py index c7267bc2..02c086a4 100644 --- a/uilib/paint.py +++ b/uilib/paint.py @@ -13,8 +13,8 @@ # You should have received a copy of the GNU General Public License # along with pi-stomp. If not, see . -from dataclasses import dataclass -from typing import Generator, Tuple, Protocol +from dataclasses import dataclass, replace +from typing import Generator, Optional, Tuple, Protocol from contextlib import contextmanager from PIL import Image, ImageDraw @@ -90,30 +90,107 @@ class PaintContext: draw : cached ImageDraw for image clip : dirty rect in image-coordinate space pool : buffer pool for slow-path clipping (defaults to a naive impl) + frame : the current widget's rect in image-coordinate space; widget-relative + drawing methods translate (0,0) → frame.topleft. None on root + contexts before painting() has been entered. """ image: Image.Image draw: ImageDraw.ImageDraw clip: Box pool: BufferManager = _NAIVE_POOL + frame: Optional[Box] = None + + # --- Widget-relative geometry helpers --- + + def _f(self) -> Box: + """Return frame, asserting it has been set (drawing requires it).""" + assert self.frame is not None, "PaintContext drawing requires a frame; enter via painting()" + return self.frame + + @property + def width(self) -> int: + return self._f().width + + @property + def height(self) -> int: + return self._f().height + + @property + def bounds(self) -> Box: + """The widget's own coordinate space: Box(0, 0, width, height).""" + f = self._f() + return Box(0, 0, f.width, f.height) + + def _abs_xy(self, xy): + ox, oy = self._f().topleft + return (xy[0] + ox, xy[1] + oy) + + def _abs_box(self, box: Box) -> Box: + return box.offset(self._f().topleft) + + def _abs_points(self, xy): + """Translate a sequence of points (2-tuples) or a flat coord tuple.""" + ox, oy = self._f().topleft + if len(xy) == 0: + return xy + if isinstance(xy[0], (tuple, list)): + return [(p[0] + ox, p[1] + oy) for p in xy] + out = [] + for i in range(0, len(xy), 2): + out.append(xy[i] + ox) + out.append(xy[i + 1] + oy) + return tuple(out) + + # --- Widget-relative drawing primitives --- + + def fill(self, color): + """Fill the widget's frame with `color`.""" + self.draw.rectangle(self._f().PIL_rect, color, None, 0) + + def draw_rectangle(self, box: Box, fill=None, outline=None, width=0, radius=None): + ab = self._abs_box(box) + if radius is None: + self.draw.rectangle(ab.PIL_rect, fill, outline, width) + else: + self.draw.rounded_rectangle(ab.PIL_rect, radius, fill, outline, width) + + def draw_ellipse(self, box: Box, fill=None, outline=None, width=0): + ab = self._abs_box(box) + self.draw.ellipse(ab.rect, fill=fill, outline=outline, width=width) + + def draw_line(self, xy, fill=None, width=0): + self.draw.line(self._abs_points(xy), fill=fill, width=width) + + def draw_text(self, pos, text, fill=None, font=None, anchor=None): + self.draw.text(self._abs_xy(pos), text, fill=fill, font=font, anchor=anchor) + + def paste(self, src, pos, mask=None): + self.image.paste(src, self._abs_xy(pos), mask) + + def alpha_composite(self, src, pos=(0, 0), src_box=None): + if src_box is None: + self.image.alpha_composite(src, self._abs_xy(pos)) + else: + self.image.alpha_composite(src, self._abs_xy(pos), src_box) @contextmanager - def painting(self, frame: Box) -> Generator[Tuple["PaintContext", Box], None, None]: - """Yield (paint_ctx, paint_frame) suitable for painting `frame`. + def painting(self, frame: Box) -> Generator["PaintContext", None, None]: + """Yield a PaintContext suitable for painting `frame`. - Fast path (clip ⊇ frame): yields (self, frame). __exit__ is a no-op. + Fast path (clip ⊇ frame): yields self with frame set. __exit__ is a no-op. Slow path (clip ∩ frame is sub-region): yields a temp-backed ctx sized exactly to the intersection, with origin re-anchored. __exit__ composites temp into self.image. """ if self.clip.contains(frame): - yield self, frame + yield replace(self, frame=frame) return visible = self.clip.intersection(frame) if visible.is_empty(): # This should have been caught by the caller, but handle it gracefully - yield self, frame + yield replace(self, frame=frame) return # Slow path: allocate only what we can actually see @@ -127,9 +204,9 @@ def painting(self, frame: Box) -> Generator[Tuple["PaintContext", Box], None, No offset = visible.topleft pframe = frame.deoffset(offset) pclip = Box(0, 0, visible.width, visible.height) - pctx = PaintContext(temp, temp_draw, pclip, self.pool) + pctx = PaintContext(temp, temp_draw, pclip, self.pool, frame=pframe) - yield pctx, pframe + yield pctx # Composite result back to self.image. The pool may have handed us # a buffer larger than `visible.size`; only the top-left diff --git a/uilib/panel.py b/uilib/panel.py index 34bcd9d3..61a15830 100644 --- a/uilib/panel.py +++ b/uilib/panel.py @@ -148,10 +148,10 @@ def __init__(self, radius = 10, **kwargs): mdraw = ImageDraw.Draw(self.mask) mdraw.rounded_rectangle(self.box.norm().PIL_rect, radius, 1, None, 0) - def _draw_outline(self, ctx: PaintContext, frame: Box): + def _draw_outline(self, ctx: PaintContext): if self.outline != 0: color = self.outline_color if self.outline_color is not None else self.fgnd_color - ctx.draw.rounded_rectangle(frame.PIL_rect, self.radius, None, color, self.outline) + ctx.draw_rectangle(ctx.bounds, None, color, self.outline, radius=self.radius) class LcdBase: def dimensions(self): @@ -205,13 +205,14 @@ def poll_updates(self): self.refresh() def refresh(self): - self._propagate_dirty(self.box.norm()) + self.propagate_dirty(self.box.norm()) self.lcd_needs_update = False - def _propagate_dirty(self, clip: Box): + def propagate_dirty(self, clip: Box): """Recompose the dirty clip region from all stacked panels, then push to LCD.""" - erase_ctx = PaintContext(self.image, self.draw, clip, self.pool) - self._draw_erase(erase_ctx, clip) + # PanelStack acts as its own framing here: erase against clip-as-frame. + erase_ctx = PaintContext(self.image, self.draw, clip, self.pool, frame=clip) + self._draw_erase(erase_ctx) for p in self.stack: if self.dimmer is not None: @@ -221,16 +222,16 @@ def _propagate_dirty(self, clip: Box): inter = clip.intersection(d.box) if not inter.is_empty(): ctx = PaintContext(self.image, self.draw, inter, self.pool) - d._do_draw(ctx, d.box) + d.do_draw(ctx, d.box) inter = clip.intersection(p.box) if not inter.is_empty(): ctx = PaintContext(self.image, self.draw, inter, self.pool) - p._do_draw(ctx, p.box) + p.do_draw(ctx, p.box) trace(self, "updating lcd with image", self.image, "box=", clip) self.lcd.update(self.image, clip) - def _do_draw(self, ctx: PaintContext, frame: Box): + def do_draw(self, ctx: PaintContext, frame: Box): assert False def _get_stack(self): diff --git a/uilib/text.py b/uilib/text.py index 841f6f49..18412636 100644 --- a/uilib/text.py +++ b/uilib/text.py @@ -54,8 +54,8 @@ def __set_mode(self, mode): self.l_count -= 1 self.l_half = self.l_count // 2 - def _draw(self, ctx, frame): - loc = (frame.x0 + self.l_w // 2, frame.y0 + self.l_h // 2) + def _draw(self, ctx): + loc = (self.l_w // 2, self.l_h // 2) cs = self.charsets[self.mode] for i in range(self.l_idx - self.l_half, self.l_idx + self.l_half): ci = i % len(cs) @@ -68,13 +68,13 @@ def _draw(self, ctx, frame): if i != self.l_idx: a = log(abs(self.l_idx - i) + 1) + 1 color = (int(color[0]/a),int(color[1]/a),int(color[2]/a)) - ctx.draw.text(loc, cs[ci], fill=color, font=self.font, anchor='mm') + ctx.draw_text(loc, cs[ci], fill=color, font=self.font, anchor='mm') loc = (loc[0] + self.l_w, loc[1]) - def _draw_selection(self, ctx, frame): - l = frame.x0 + self.l_w * self.l_half - b = Box(l, frame.y0, l + self.l_w, frame.y1) - ctx.draw.rounded_rectangle(b.PIL_rect, self.l_w//4, None, self.sel_color, 1) + def _draw_selection(self, ctx): + l = self.l_w * self.l_half + b = Box(l, 0, l + self.l_w, ctx.height) + ctx.draw_rectangle(b, None, self.sel_color, 1, radius=self.l_w // 4) def input_event(self, event): @@ -246,12 +246,12 @@ def set_font(self, font): self.text_size_valid = False self.refresh() - def _draw(self, ctx, frame): + def _draw(self, ctx): h_margin, v_margin = self._get_margins() tw, th = self._get_text_size() extra = self.outline - hroom = frame.width - h_margin - extra - vroom = frame.height - v_margin - extra + hroom = ctx.width - h_margin - extra + vroom = ctx.height - v_margin - extra if hroom < 0 or vroom < 0: return if tw > hroom: @@ -264,10 +264,13 @@ def _draw(self, ctx, frame): hoffset = hroom - tw else: hoffset = int((hroom - tw) / 2) - loc = (frame.x0 + h_margin + hoffset, frame.y0 + v_margin) + loc = (h_margin + hoffset, v_margin) if self.prompt is not None: - ctx.draw.text((0, loc[1]), self.prompt, fill=self.fgnd_color, font=self.font) - ctx.draw.text(loc, self.text, fill=self.fgnd_color, font=self.font) + # Prompt is drawn at image x=0 (container origin), to the LEFT of our frame. + # See __init__: box.x0 was shifted right by prompt_offset; drawing at + # widget-relative x=-prompt_offset puts the prompt back at image x=0. + ctx.draw_text((-self.prompt_offset, loc[1]), self.prompt, fill=self.fgnd_color, font=self.font) + ctx.draw_text(loc, self.text, fill=self.fgnd_color, font=self.font) def input_event(self, event): if self.edit_message is not None: diff --git a/uilib/widget.py b/uilib/widget.py index 751b8422..f6091a4d 100644 --- a/uilib/widget.py +++ b/uilib/widget.py @@ -404,8 +404,8 @@ def refresh(self, box=None): stack = self._get_stack() pool = stack.pool if stack else _NAIVE_POOL ctx = PaintContext(container.image, container.draw, clip, pool) - self._do_draw(ctx, frame) - container._propagate_dirty(clip) + self.do_draw(ctx, frame) + container.propagate_dirty(clip) def scroll_into_view(self): """Scroll parent if necessary to ensure this object is into view. Only works @@ -420,20 +420,24 @@ def _scroll_into_view(self, box): return self.parent._scroll_into_view(box.offset(self.box)) return False - def _do_draw(self, ctx: PaintContext, frame: Box): + def do_draw(self, ctx: PaintContext, frame: Box): """Draw self and children. frame is self's rect in ctx.image coords.""" if ctx.clip.intersection(frame).is_empty(): return - with ctx.painting(frame) as (pctx, pframe): - self._draw_erase(pctx, pframe) - self._draw(pctx, pframe) + with ctx.painting(frame) as pctx: + assert pctx.frame is not None + self._draw_erase(pctx) + self._draw(pctx) + child_origin = pctx.frame.topleft for c in self.children: if c.visible: - c._do_draw(pctx, c.box.offset(pframe)) - self._draw_outline(pctx, pframe) - self._draw_selection(pctx, pframe) + c.do_draw(pctx, c.box.offset(child_origin)) + self._draw_outline(pctx) + self._draw_selection(pctx) - def _draw_erase(self, ctx: PaintContext, frame: Box): + def _draw_erase(self, ctx: PaintContext): + frame = ctx.frame + assert frame is not None erase_box = ctx.clip.intersection(frame) if erase_box.is_empty(): return @@ -442,25 +446,21 @@ def _draw_erase(self, ctx: PaintContext, frame: Box): else: ctx.draw.rectangle(erase_box.PIL_rect, self.bkgnd_color, None, 0) - def _draw_outline(self, ctx: PaintContext, frame: Box): + def _draw_outline(self, ctx: PaintContext): if self.outline != 0: color = self.outline_color if self.outline_color is not None else self.fgnd_color - if self.outline_radius is None: - ctx.draw.rectangle(frame.PIL_rect, None, color, self.outline) - else: - ctx.draw.rounded_rectangle(frame.PIL_rect, self.outline_radius, None, color, self.outline) + ctx.draw_rectangle(ctx.bounds, None, color, self.outline, radius=self.outline_radius) - def _draw_selection(self, ctx: PaintContext, frame: Box): + def _draw_selection(self, ctx: PaintContext): if self.selected: radius = self.sel_radius if radius is None: radius = self.outline_radius - if radius is None or radius == 0: - ctx.draw.rectangle(frame.PIL_rect, None, self.sel_color, self.sel_width) - else: - ctx.draw.rounded_rectangle(frame.PIL_rect, radius, None, self.sel_color, self.sel_width) + if radius == 0: + radius = None + ctx.draw_rectangle(ctx.bounds, None, self.sel_color, self.sel_width, radius=radius) - def _draw(self, ctx: PaintContext, frame: Box): + def _draw(self, ctx: PaintContext): pass def input_event(self, event): From 74962394fea8470fa3664601cdc842f141c50980 Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Mon, 18 May 2026 23:50:10 -0400 Subject: [PATCH 12/46] Add dirty painting --- uilib/container.py | 92 ++++++++++++++++++++++++++++++++++------------ uilib/widget.py | 9 ++++- 2 files changed, 77 insertions(+), 24 deletions(-) diff --git a/uilib/container.py b/uilib/container.py index 3a6994a8..355b2f86 100644 --- a/uilib/container.py +++ b/uilib/container.py @@ -28,6 +28,10 @@ class ContainerWidget(Widget): def __init__(self, box, **kwargs): # Non-inherited attributes self.mask_format = self._get_arg(kwargs, 'mask_format', None) + self.virtual = self._get_arg(kwargs, 'virtual', False) + self._content_height = self._get_arg(kwargs, 'content_height', None) + kwargs.pop('virtual', None) + kwargs.pop('content_height', None) # Inheritable attributes self._init_attrs(ContainerWidget.INH_ATTRS, kwargs) @@ -47,11 +51,12 @@ def _setup(self): super(ContainerWidget,self)._setup() w = self.box.width - h = self.box.height + h = self._content_height if (self.virtual and self._content_height) else self.box.height # Check if we are already setup for this box if (self.image != None and self.old_box != None and - self.old_box.width == w and self.old_box.height == h): + self.old_box.width == w and self.old_box.height == self.box.height and + self.image.height == h): return trace(self, "container setup, box=", self.box, "old_box=", self.old_box) @@ -65,6 +70,15 @@ def _setup(self): self.mask = Image.new(self.mask_format, (w, h)) else: self.mask = None + + def _viewport(self) -> Box: + """Visible region in content (image) coords.""" + ox, oy = self.offset + return Box.xywh(ox, oy, self.box.width, self.box.height) + + def _content_bounds(self) -> Box: + """Full backing image bounds — used as clip ceiling for children.""" + return Box(0, 0, self.image.width, self.image.height) def _visible_box(self, box): if box is None: @@ -79,20 +93,39 @@ def refresh(self): trace(self, "ContainerWidget.refresh: vis=", self.visible, "parent=", self.parent) if not self.image: return - local_clip = self.box.norm() - local_frame = self.box.norm() stack = self._get_stack() pool = stack.pool if stack else _NAIVE_POOL - ctx = PaintContext(self.image, self.draw, local_clip, pool, frame=local_frame) - self._draw_erase(ctx) - self._draw(ctx) - for c in self.children: - if c.visible: - c.do_draw(ctx, c.box.offset(local_frame)) - self._draw_outline(ctx) - self._draw_selection(ctx) - if self.visible and self.parent is not None: - self.propagate_dirty(local_clip) + if self.virtual: + viewport = self._viewport() + local_frame = self._content_bounds() + ctx = PaintContext(self.image, self.draw, local_frame, pool, frame=local_frame) + self._draw_erase(ctx) + self._draw(ctx) + for c in self.children: + if c.visible: + if viewport.intersects(c.box): + c.do_draw(ctx, c.box) + c._painted = True + c._dirty = False + else: + c._dirty = True + self._draw_outline(ctx) + self._draw_selection(ctx) + if self.visible and self.parent is not None: + self.propagate_dirty(viewport) + else: + local_clip = self.box.norm() + local_frame = self.box.norm() + ctx = PaintContext(self.image, self.draw, local_clip, pool, frame=local_frame) + self._draw_erase(ctx) + self._draw(ctx) + for c in self.children: + if c.visible: + c.do_draw(ctx, c.box.offset(local_frame)) + self._draw_outline(ctx) + self._draw_selection(ctx) + if self.visible and self.parent is not None: + self.propagate_dirty(local_clip) def do_draw(self, ctx: PaintContext, frame: Box): """Draw this container's pixels into a parent's PaintContext. @@ -119,10 +152,10 @@ def do_draw(self, ctx: PaintContext, frame: Box): # 2. Blit our backing store into pctx.image (which might be a temp) # We only need to blit the local_clip portion. - src_box = local_clip - # local_clip is relative to self.image (0,0) - # pctx.image is aligned with pframe. - # So local_clip.topleft in pctx.image coords is pframe.x0 + local_clip.x0, etc. + # For virtual (tall) containers, local_clip is in viewport coords, so we must + # shift by self.offset to address the correct slice of the tall image. + src_box = local_clip.offset(self.offset) + # dst stays at the viewport position within pctx.image. dst_topleft = (pframe.x0 + local_clip.x0, pframe.y0 + local_clip.y0) sub = self.image.crop(src_box.rect) @@ -144,12 +177,25 @@ def propagate_dirty(self, local_clip: Box): self.parent.propagate_dirty(parent_clip) def scroll(self, offset): - print(offset) self.offset = offset - # XXX Optimize ? at least optionally for things like menus, use a local blit - # of the backing store instead of a full refresh to work around slow text - # drawing speed with Pillow on 64bit ? - self.refresh() + if not self.virtual: + self.refresh() + return + if not self.image: + return + viewport = self._viewport() + stack = self._get_stack() + pool = stack.pool if stack else _NAIVE_POOL + content_frame = self._content_bounds() + ctx = PaintContext(self.image, self.draw, content_frame, pool, frame=content_frame) + for c in self.children: + if c.visible and viewport.intersects(c.box): + if not c._painted or c._dirty: + c.do_draw(ctx, c.box) + c._painted = True + c._dirty = False + if self.visible and self.parent is not None: + self.propagate_dirty(viewport) def __adj_off_step(self, off, step): aoff = abs(off) diff --git a/uilib/widget.py b/uilib/widget.py index f6091a4d..292c1631 100644 --- a/uilib/widget.py +++ b/uilib/widget.py @@ -108,6 +108,8 @@ def __init__(self, box, align = None, parent = None, visible = True, object=None self.object = object self.selected = False self.selectable = False + self._painted = False + self._dirty = False # Non-inherited attributes self.label = self._get_arg(kwargs, 'label', None) @@ -257,7 +259,7 @@ def _build_paint_target(self, dirty: Box) -> Tuple["ContainerWidget", Box, Box] frame = Box.xywh(off_x, off_y, self.box.width, self.box.height) # clip = the dirty region re-anchored to the same container coords clip = dirty.offset((off_x - self.box.x0, off_y - self.box.y0)) - return (parent, frame, clip.intersection(parent.box.norm())) + return (parent, frame, clip.intersection(parent._content_bounds())) curr = parent @@ -401,10 +403,15 @@ def refresh(self, box=None): return if clip.is_empty(): return + if container.virtual and not container._viewport().intersects(frame): + self._dirty = True + return stack = self._get_stack() pool = stack.pool if stack else _NAIVE_POOL ctx = PaintContext(container.image, container.draw, clip, pool) self.do_draw(ctx, frame) + self._painted = True + self._dirty = False container.propagate_dirty(clip) def scroll_into_view(self): From eaa53cdc8fcfd5b88eeaa9dfe676cdd7eb993961 Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Tue, 19 May 2026 00:57:11 -0400 Subject: [PATCH 13/46] Virtual menu rendering --- .../test_initial_render/initial.png | Bin 0 -> 3722 bytes .../test_scroll_back_and_forth/0.png | Bin 0 -> 3718 bytes .../test_scroll_back_and_forth/1.png | Bin 0 -> 3725 bytes .../test_scroll_back_and_forth/2.png | Bin 0 -> 3945 bytes .../test_scroll_back_and_forth/3.png | Bin 0 -> 4021 bytes .../test_scroll_back_and_forth/4.png | Bin 0 -> 3886 bytes .../test_scroll_shows_later_items/initial.png | Bin 0 -> 3722 bytes .../scrolled_to_last.png | Bin 0 -> 3554 bytes tests/test_virtual_container.py | 542 ++++++++++++++++++ uilib/container.py | 27 +- uilib/menu.py | 6 +- uilib/widget.py | 4 +- 12 files changed, 565 insertions(+), 14 deletions(-) create mode 100644 tests/snapshots/test_virtual_container/test_initial_render/initial.png create mode 100644 tests/snapshots/test_virtual_container/test_scroll_back_and_forth/0.png create mode 100644 tests/snapshots/test_virtual_container/test_scroll_back_and_forth/1.png create mode 100644 tests/snapshots/test_virtual_container/test_scroll_back_and_forth/2.png create mode 100644 tests/snapshots/test_virtual_container/test_scroll_back_and_forth/3.png create mode 100644 tests/snapshots/test_virtual_container/test_scroll_back_and_forth/4.png create mode 100644 tests/snapshots/test_virtual_container/test_scroll_shows_later_items/initial.png create mode 100644 tests/snapshots/test_virtual_container/test_scroll_shows_later_items/scrolled_to_last.png create mode 100644 tests/test_virtual_container.py diff --git a/tests/snapshots/test_virtual_container/test_initial_render/initial.png b/tests/snapshots/test_virtual_container/test_initial_render/initial.png new file mode 100644 index 0000000000000000000000000000000000000000..6562e60ca02950e06a0166ea35a0702335c3693a GIT binary patch literal 3722 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 H+c*CMW-b(< literal 0 HcmV?d00001 diff --git a/tests/snapshots/test_virtual_container/test_scroll_back_and_forth/1.png b/tests/snapshots/test_virtual_container/test_scroll_back_and_forth/1.png new file mode 100644 index 0000000000000000000000000000000000000000..64a68424230504c9a88989fbbacfc664360b479c GIT binary patch literal 3725 zcmbtXX*gSJ*N#$Ci|S-74s}|sxn>EagixZ1nj2INr9#wLqKY_9)jYIfp6aL)N*hx` zCvA}!VveD$nV@0{LB5>teBX7wzux!9yMOF!@4eP@J?pved)@2Wf7)1^3Gj>a0{{R4 zh`9+20N}XJe*VRKjD0_XUI79Cg0>J7Bir!&)ky)Hv)+YYHdrT%WyNDvDz9>4^DQPY zfqbP^k~(SqrX!Q(DHaiVk|M*^lh@|wkZVBrIlc%r$7EAq(z%8?u?vUWQdB9us)u}2~7C~H0I;3vLQ zb6(oJdqx4&Ez#wf>3V6S*D$?3x4+?FSlW|{m~qmSxsUa-NT|6h)iO=YecayUIvgMb zU7sYpwnwbGyVGYPnN1;FL&yilLco|-SK)|o&t7B3slC8lV&9njL%YPKBUzZ2bo7ebTv z*=+k)($_9o2s8brn96TkAgP(Umcbjo2GNLAc8s8#P!n z196_bARp2T#ehSLfyWoiz~(-QCZ>y3j9u65i@*Se)r*VJ4O$_v}Olxe{x*w%zSgdLBoygW^83mM}u}6rR z=BRBE7cxv9`hOwN_C3)41)8P5(zM z_#U2*PGNd7`qlyr(}h1i8mS}KR{Lo+&3$r2|L8*zJn&AQJ?4bBs-hfP;|0Rn2kDgr2dnbw}=UJ*XUHR?k=wYCS7#vtr(*F;N%RgQuo6I^?9H!=>MzfrY9u+Y!GOc~I0vx)giNLLHm03u zmJ0u*iWbx*{hljpXXwJ)C-=p$EnrAw^SVImxw#>FCUXmOX<<=&OZ$=A8QY;{p3Jb@DX`h&7X&STG3{(AK)NJkQb!6+#y z9XyE@MNIXQWz zGx@5rGSbhF`7=oc28VC^;x-rT?d`*YgK6V$uj=WIw=KkX$aL@r>J>ypM36|N9Hdqr zVop;{t^U=kR|En`K|w)Jucf@a{Pk-^1%+>6DoLMz1~uoXxJsQl19xC>klXi>46emBuhHko({wbpY_FMMhV6?AcOdbHSA($`l#GH~10mNwB$X{7}< zYgpxhBH!&&)jT>~h*5jLetf)?^gNv z@gs#oL8ECI@|G{H3-;Gq*RAuklz>2>vNCxoxYp@y7cJ+54VQxeyL2|8RD8g0IB;sS zqv-KbL{QM1-O<}{IE7rG@2}-td`wbYd>Qn5e}4s+^tHdtOw)?Zqu|%L8~*v=4;^JF zalY#TYVq7>!7&^dVYlnsA95BXeD7f-2QiT-?DlyH;IJj^{h0Vbx6{t#+?~bbPit zc*isJ9xjm2rQ?YEPe*vSI<907ZcOdw1rT*ZX%6AxI<4!;eVlTlmdo)Nj6e0AKW(%g z3fwR;GviT#)s>W|WIR)-@~C&v@*mGCEG*2M|%qe)(a<8+Ui1A$D_x&kkTA>aqs0r&MUjTC@O0A9eUN) z))oVl+2{M`dyb;x&%@=%N4cz7zy*;Yx9|N;X`KHKTsBC=@Qt5n=FZ!9@3b^DqJF*S z5d!{-QBZnM5_Z!Rb%A-mk3AkX88SkF8iJw^7+G0aNg^t1Qv_<{ByTK#5%@#MgNdeo zeAMjMbj%5nLj5r1t5;Xp5FZd?`9XEZ`1$#Rf`Vk_9PCetu!J(G3Er&Ox!hzTWxWgZn-{FLY3MT@mZ=jjk=hEY6%Pt$Y;@ zDd_65SWg=2>-+URPKbM7LGZHph_T$L#WLFq;u8|AbJaaZYVWY+kUoiA(B#+Zc`~G2 zHN!%+PfSeQDgz&{D^JQM%Fo}Quufze95H5MfI5Sn_b;9VidUusw$9)1`Ij#F zzoyYK&vk}yK&ub9Ze;lV-iS>+1b(sFWJ#3oRxcWa44ke2cijCvU7gOf6W z-X6=)lQT;JhSEmI-}(`zPk&$k{I-v`G(+#IeXS(>+}75DIE%D0<;HROkR0VZ%k5K- zeJBeVdMFes>AX@GnXEO}r2PmJ=U}lslA*^Y_k5D)<~)h$>ntoRJT^9leMu_N*Y1NJ z$72B1@4sf~F?Uv(WTtUsB=elNa^bI7cGmX{y$%7kmvE+n zAr}B$`QV>0!S6e2Jlto!=orcKNzGKAK`F}t&VPm;Z(y1_zMM=OYdB<~s$Sk_8?IJ` ze3LGl3An}b#fujiwJ#;Fc|CjY{G~?b?^*c2AjN$*i#hi_SZ|X~$L8e`${h1Z^Ga3l z+qZ|NrV6vN&R)212L^-L+09?AqM)CW|Ko5$5+~_&I+;vPNJtQn&`Jy4Y6^0QPpXf_ zms|V#E?47-;vyp2L9<_VAI?h}L^TnK(QI#_eHx*!eRDaHEOVu*fjuhOBE@2{!^6XG z-n{AQ=~-O#sib^MI{V;qRatqoQq{wnI3A(lk&)hf-D}rLW*w?LcChxG!6(MNb>hzy z*^iNmvf7Bbl;F#TV(IN{fqSWQ0-xvK_vv zP32@i93cmbbwVJf1_v8aGo6#IVZATZX4uZk5fR9h#wWe7N&Yl2Ffg&kKZ6(Ka&f{= zu7*bT61rvh>KvVU_KkX#{i9+?KR_$~cq$3W8`w$Lq9Q_M0;#Q*;M5-yCLOvnoowYE-EP?A y#S(Q;^h(Vq3Dt?PgNj~eBLCgL)_+W-_N_^|Fkf^%)rY40)Z}@niyDv zKvcJZ`%OA(U_7&w)C7T8o?ST5he1PD8Wm;3LikRAxkRT;R4LdKO!?`p|1}&k56-#GvxGu5Bbloh`b^Ck%@ zNRsC*lU8+oO|7>9sMGVfoLK%bsr14d81buntP_t9C^;EPbi?-KUiNtuLMn;x%N_{& zD=QW`uAWVHuXs4`Pvs_)ySLx$I_J51-_{Gg`9N)c2-kYC~-T+l< zEckQCTzV|Gf6{`(TXlcfR=9rs-qf-PZ#AYPT&_XjPYDuNjIhfLhk~rZsqcVgeyiEq zu@S!{I|XBNuAwmc_0aWP8+^*DCw*3@Y6ojvl2wV1(4A}iD~IZga*(BgBG#(pS#`@r z+x#Wsf|fC2;m#GzU#Pb^#UHF-n$f%bYzo%XuMex9wj&9-D;fEV&3>k}wY3esxM_C= zN`rX9l~uIdT(}H1Exnv2+xPOKIi2v?j5|3NC&H#Z3HSF=$hgN*Bb3E+Q9+*3V=kR@ zr`_#>f)8JhiE-EwM#Gh<@l))$-AUn5H&qnzB099`pfRISX{B#iS|Wd(ZmmI6vnO97 zy0N&Vf)je0u4-Q(F1eaFqDGOTpIb~MKiYptMYi;n;y`PcV541)N(c^wKG(BLaHW=? z^l;Sus)GfBuaX_YF(vQehR2eKr|NT7C$wC6#j0(ucTN=-MB{m5y3MwnCrhI1NQctW zUY5>RiwJ>dAdQLFPNm&%Sg!}ikyOvqpr<*yi3SeI>LWWV#eg!l+=n+*TB|l*lLJ~==5r_R@cAA!xbyxdt8Ta_^oR2W($J-2#Gy=% z#Q??fp}`UQ1v;ln)<8sW

wg{lvm8RGOTHnq7Co#$W7U(-mNAn-awk4D<}Xs6XNR z-ZwFrxT=CchRhr`>c64m6As^RiaWAbPN+sW0Z{cP@a?5Wi_}Tq{(Rctav5YWU0AO_C@eb428$>&BPy2h zoo~M3m6)X>^ZHll_Gd|2YcOB56uQW5K--VncCaj0v=ssdyu?UIr6ZI=r?FL|ggi589X z^7v_~k9LAYRaq)R)O0#8E~QpPQpL0V?;4|s9HLZpYyOSCC>HG!(^X+%;f#!oUaWwZ zuWwaJN$^J7ehd@-*OMDfYPhJ;wwKbKgmk&;>gphyRq^DNo_Kb8diwVEb}K6@91iF1 z?oLCCaM+xn+~jR5yBZ0jJv=-FrjGY0Ksec(H$zr%=^qoWZuj5%vPqy8@k=uPzP9H5 z;Uhj^Sz3o(P%t++IpA<>F)b}kKbF}%S92V>T~Sd%CX*j`$1E-_DJv-n=!9#EiyKw$ zsRulPKp)6SMkX;G`j97b2uCCm6A}_)VlFw*M(I{=@v^bO z4mN)*EiHZeWYXrCm!6)UmnU@fDx@vdqL|RvXJ%>1!ptlyDcSe=b9_>g<()fsOibul zSX6kJyvC|1OLAco^$@+djrL=#1bss1o-NJBWa9>afTN>IHBL%edaBMN$z4NA3T%~f z^KOw%I}-zgClsm!C*SJ`Kb1ytN!vIpXPus&qH85|b#-;l4(7+}JiG8Pm-PvmY1_df~H)s1v-DJm+es#-6vZf_26tJ|>%3Bkw4 z8k>CbNk#cCQYdW!%Y$$AW7{{o7-eKsFtGQKKiR=%R8&+mGczyLN$ZVTtakSHUdpr5 z&BH`u;E%40lXA~lgM=dC>eHi@_VaUduU@^XKN=Hm(!lD0OW(eI@2xCn-*6{Lie**j zTI=xQu9nu9TF;R(kGwEtF)??5A_%hTS^|jhqc2rzbg`UujyzHhaN@H>-p*QG^9ndk z+SJ@UY(7y12tQ_Q{(XkcSuOOK(x|Pi4THf(6%aqVp1XcbINa=J0fMd0&$DxJrDbL| z`!AZcD5?alPxbfrr%FA1;^szLWF9i6tKs+e_gD6rsP`I^tsD1NV>ua6nKdvpw8c7% zjEqpm>w2B#Nm8AR+_Lqd4O-_@r^6P0?vKpq#|r#zibdqQFkCiC0MT3#>5S;1lfR}w z%>+DZ-1GsHnfO)x&Q1=EvHTEk?~1arqn%+(p|Bk*bL6uYkxqX5*9M_fo*H~j zLj$$)4R>~SW|vA-$Qr=pKf?Rtpn^h$UAPoP=_fWewjm<1-nAD?D;RuDUVanEs}(`X zd{=1k;KAr~M(zgatoGxs=!l4j{aJKJRh6u^cKH0qL}XhyvBYX|aj_+6^RE+<@87?#1oe+=3|=uYG11r8XN2Vsfwsk*0)FT_>?(oEu0scLPVqVjqByMX+U ztUZQ{%)e;uKQb|iOG^5p&!Xj4Dox;+p#Qz6snFudlcj~v$&3sPz)Q3NiG2L{F;*xX z&;?00h#3##rLQvnp?Ky0swQco4b_-`qXGIWcKh1DswYqmln*#Qt)gCk_okC?R&@LH zQpszy_3UW1va<3dGn<_%E#iR~{O`KDFWG9_?`eg0e$7YSYf7=kyiy-7wp7U)nD0$$ zYz=v>v^k9*DxXLcEUOoTpPZZw=4!S0POB5rFC1{g060qu2Qi#dNBbKcfh*RzoD#+k zPw`-~v|artLgrk=$V$)7uJ{at?$FWJ77~la;MCOAf$Gx@K9dzA4WVIS z$;ru_h8fB}nQcN0>-1Dr5Yinz5hJXDcFdGFX-{!ht z1DIDSO1f(U)?w;k@adRZ3DKCKfC0P*-*8|6Gk``}Do}As(6UjrrwX#< zTN*JwK0ahQCkV(7z@^9{2T3ND0+awOX>Y(4evx5JuRFwy%&!?NFC$Y4n0jrkf{u=k zf`V1`SaDI&7QY&w8QG-N5=@?2C)K*9rlzt>Sk&L$f2_ja^U69ejTmY0n?JVJ%Lst^ zjLgj1$ej|J3B4rNfAMB8<}x4PUwZobw3m4~goHW(%ido8;^E;jxj6XP_#be#*IPC| z_VjRYa1cjEe8&G??2M#g7r)aK{43vKo!@_6@yes5E{G`TTei_$#0|d<8ycD`!v}iI zITn+9RQTmr3IFXJYlZbPrLGEqc>(DH3gyM9;180!szgq$5N3ykKsreGib&F7G7 z5P{K=;Q>omjMl4buRjP#l+lv;M1q4PoLJbdVF=3w*gSq4sF8Y z)&BUyx_WFG@Pp-LdoVdLJAW8x$hhKST3T9ePR_-Jg`VDC32||8QPJqwSU#qhcV1(N z5tqQgKnP@I?!yc8!H-w~wj9k6|M$->Vv$XLz6qU!PS(qSAbos%fVe;_kD_G>-yM0# zX&6FzH-_8}ZBYk$*Wd%|-tO-1;o)0iVz|P>!uIy?UGfMXj|X}{tqc#yqjOt0$W&nR z9n8+o&e{2mgBh7PI?5o7dGVqW1q?JaH2V7b$7>32Rp@F`j+zSxf6e!z8;pDJS6jq` z2=CvE!KK9tB+N72rngD1Ne<0{EBzU_!iM;fiT})MAFtItd-e^7`gKP+un(5S#_6${$$d#czx^!zK==-qTT zo~pkb4GTbC0jvZ>k#3Ce&4K}rZw}&Lf=-4FV}u0?0$L;9X(n>;@p+BQXWZ%G@i!bJ z!bszL?iKWu-mrbU)9!aa>vPq-gq#^&nD9UAv9kZ!zvTb7`!;F(oMyD%c|z+rS^f87 NQ$q`bDm~|C{{@4sjuij^ diff --git a/tests/snapshots/test_virtual_container/test_scroll_back_and_forth/3.png b/tests/snapshots/test_virtual_container/test_scroll_back_and_forth/3.png index f52d3c652230297c7ef61f1f4fd874243a73d02e..9d0d780239108782abbd523ca7f1b9b9b02fcc45 100644 GIT binary patch literal 4006 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 diff --git a/tests/snapshots/test_virtual_container/test_scroll_shows_later_items/initial.png b/tests/snapshots/test_virtual_container/test_scroll_shows_later_items/initial.png index 6562e60ca02950e06a0166ea35a0702335c3693a..e520a612f16368a0704ab60e31f51e4822b33e46 100644 GIT binary patch literal 3702 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 z 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 literal 9030 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 literal 6365 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 literal 9030 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 z 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 literal 6299 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 diff --git a/tests/snapshots/v3/test_plugins/test_v3_preset_change_plugin_update/0.png b/tests/snapshots/v3/test_plugins/test_v3_preset_change_plugin_update/0.png index 7f848722bac506768dd04a55f6c82cf0747cf8b1..8bb5893dcbc689ecee1c23c5d283e21a62a3a928 100644 GIT binary patch literal 6948 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 KsFXdjc=%{ta$ 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 KsFXdjc=F%yWiAZ;McO%VR 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 literal 8772 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 diff --git a/tests/snapshots/v3/test_presets/test_v3_preset_change_via_lcd/nav_D.png b/tests/snapshots/v3/test_presets/test_v3_preset_change_via_lcd/nav_D.png index fd52b902d9c77413cb465202c1c5661d93a11e12..9ded59b02500119e67a7782c4696bf5df6d90186 100644 GIT binary patch literal 6288 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 literal 5893 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 BVbA~o diff --git a/tests/snapshots/v3/test_startup/test_v3_footswitch_press/0.png b/tests/snapshots/v3/test_startup/test_v3_footswitch_press/0.png index 3dd7abc49571e489072ea23ac1eddfd026c3601a..dd781f94cf36b042ee4056f64cca325451bd7c64 100644 GIT binary patch literal 6615 zcmdUzX*^W@`^S+Im7U6NY>}n1PnMF9JtSni?fX8$V3NufLM3~a$?azBV~Me(vP?r{ z8~Zj!_HFDle&6ojli$<-!@mdfI_8}Dp6guS>-t>p&xtcO)V{>P#Xv2sHm>yKG3{t7LvU-3AZraC(~^Tzwx_Jf2Se#xwWS8U0#g%V7{4o z-FgNps0KQw#E$B~PSga)tF2l2OTo|)gXXt`LY|Nt@nfp<5C1YRLziXc#6kq*&R%Cd zPcL|fl{NJw*FQIR`cOnznO;mWyp@k4K#WwI-VhTb?vbl4sb&JS3g>sK@u&OhF)1i& zDk?uU#605kihRUto0=<$!;D|>c>G4o@p@w*F+M)NtdHQiQAcwl0p}9);>C-Y81T6n zq9UD+b*Ku0PIh&5wOv7)xMz3C7!r5(_g($mJx9uI&>kEK-;Q?jPQy|pb+tY2US)r0UzD=V(h)mvPN(b3UdiCV?K$n~~IN9WF++dd3e$XeUj$b0*i zott}nYz!(Vw;*^{l%0W%mDOjW;jY(>sLpw37nk7RU|pn1C+G2MP2ZTjD(jUA0R;tx zn>SNB4mae@&{mT}Lqj7YicqMB)$ND~At9k+!<^-f4Sr_kHyIh?oCzYVapPG1YwVvs zecIdIHLgkj=HQODda03;nc3q|#e@CJValJp>ZITPq@?wA zAHCv+!oot*PgfH^z`&RjAEjq-`D7W%x|TprGZq!;Z295dwao*F=^S^DmQL? z9P(JRX+ZvZQBY7o%!M=3U*yX#DG|SUv#O~H?&tUB3M&hXAoF>Rd-u8%EWpDle0P%z zhQY+&^^A^=`nDW?XKRVDkbG|;Stl1|A<223_U6r-PdBE}PiLR5PjvV6Kq##tTM*bF zX=UUBgMM)*%aw^c#lI#S17i-{G^wViKShJ-X==$qa83qbK$alwyve@i{lr-MYb=g`vJ4GV+9SMde? z{ryo<)MzW5Llq4T4G23<&+_Wkt2i7kpfUS!==gR3Y;1bEwZ1+bT2xc>%PDhqb~ZNl zd=qC@R#sCW(U6}%&%ZNQCA7MwWhz_=q}bifO{cJbGo-oc=|=F=r>4n{U$6RVXgoJB zC1oe{8CE-Wr&d?rx&#ud}{lrk_OwCIq*}r|0pO~DJdxkqyUA&oiwrsB9X`^bzb7);)2!t zsQM`=g3@fm9UW-DDX_M-_I1{C!c};6=5#VmaPV?+*@-W)q*`Cp)7?GersMZ}Osc}^ z*f>wGyLaz?eMfx%o-;#VEAU}tWaQVhBE&%le{arh*ZrM^yk<+!eYtBz=$*rpxw$zuF+({;#eEX#chKkje8DOUYa1Jk_jujzZjcyiBtcm` zYNX8ao=urptN3CynG`Sd3Q7BEV1-nH+2g8NA#H8pTO!~HL@Vi0f+l1mzF2k!rt!hz z?3`aPXcc?rdm0+jw#^o{wtSqNE)lwFd3`fs746>gvkc~Xr2K04+{A>At6CqOY4Kpv9LOw zf;#S?ohfp2tCL?(m=$GyJw?YbPfgW#N@ZCRs8@9)SK!L9)beh7dpozHPg!|+%hQcq zT_hJDpO2^K?SKWH;NZGnbZNQBUe~)e$YFrFtmyQnPnp$qiEfC>ulB%9y;py%(-=vYniq09k=0 zV$)@cm3^a8A!AR_t5RXach5~(4|?8R?@Z=btoZ1GhRVqFRnbN+X1K<>9CSW<^yq%A z&7E(vevJHTUTRfZh4?yeZZd7;Qhvk?YqDuXHq};I#%mR(j747;qCYv= z=^M8$F)y|G9Q2!3&lN%vl#tLZ9ZD^<(7z@lQ(W$|F@@PBdROuob^h}nbAO}R#Bcb% zWTSOU_~G`)j~_#K79TPdfoZYOm&$S7yb`~P_8c*B&A#b)E|l!jo2{&A=gS|yNqzP1 zOO2{9(lQv!4Gj(3+W`UJi}NBg!-xXX(mvyL-V2@i`T37Z%|VTR`})<)%l1uIcg7X85Z3-YTC?A8Z0M+F& zLa}1u<&BtWqh2=T;NUn*M|XktIjHKCwIct<2_fwyi{Fnk4Sy?r@9UG1mEBqBPSX_A z(oANM6xGkT_423+jfTx(*`a1=o@-&3(`n9V+gEcta3+uz(u_>By+aaEU%{;iL2)j2i zVSV{+5{E<8K~*Q;ZTOy~ke=x^_Se&kHgm>94n<2grVNZzTC54*!Z5ifIzc-3AyA)B zGSbpXCw2nN#_3+ts;Zd6!ssR8OrFu{X>l#m4eb>2LOY%y{2SfuxP9LtT&#s4KuT zYHAcPbRcxEUcJgy4t$kD05z0xl#(JAivRDr50Eo)Mh-9-tUvFA*M-)mrYxRo%;%p+ zN0+3Dh>8wae?)ef^tIPot;rw`u|QAk?Ccb>c=`GJ0wS-y(8wp{6#NRMt9h+8Uq2mr zJfJ7DHr<-XbA^kmr|XM4AiI_pwQWa$isa+AALdf^>=>eG<%8QJi~AF5sU}kojv^-61?ZC!~&CN}a_Ql1;mXmEPP<}DPYyl$F ze~woEQ4bb-;lhP8G&BJIrb6Z~?P&9^-e3EA2%kQllI>GryK?0U8(WS4yw>&0n5ESU zju<9>K0ZEC_4P4yLW3eFC#N~|6%TA@n=KMD?q18{JQ z$V?M6QUhDNN0ES&Nh1b6waj2v_Vo1peUImFCpt!+2EWDwrCn5{mYtmbm%&KH1_N;x+QSaJUG= z>W&D+*q$cXojh+y%s0LU!u#s5m47b=6xMy!!<((bIx&XD$NkBXweG(@0h3f>CXuN1 ztH0lWb+qbmhj_Y`jL1HqSZ&S5@B?8XkF-)?1_p_m5WvR$ZgMs@HlQ*>B`~VZ96!+xbsjTe zb4XK(>W1Vw5xkL7-yYNzGc8hvEq&IWrRYmbNLV!nIN!ZXjYWCMd32g3J+=)+HZ&ZpRJ4lH0mpQnmZrb}T~;QUqVqO06AFcf z&3{jfrem7Iz(>NB0ZwggZLJKWgkqX^dT-ymcTcm1Tc+jUkK6!G-N~9hahYlkRaI5> zZ6yagI?jVV($&=koST`M8N4wi^-i}NpO%^$pO65y8aux=Ha4bqFmuM^a-u>~n*vj_ zm%?o!p+XFX{N?2ZhbkpmSyKUK=E4^mU}Rn3V7PB!U|?gDlbqaFa6bW9v85l}TwI^s z`XLxw#P0#*4zX{4ch||)Rd$p?8MYzmyn(+ddZwz?)~p5Q*yte+5A1w%=8uDtlha&t z))ioOa&~5!G<9)yeq?4g0SsUxG55N-_}0$Ocq;-C6jXcW$v2l8yYQ`Vj-5$lFfTEo zJ1(Gg%*}`A!6*hYjy6||VYQub9@m!BC=_g3*9=%dn# z76_NVo45BnEa7$Sx&htZ(|~l}^`|9z$RQ6IyO!+qbZvzi!`+2Da;}f8tta~Xt9+-` z8m*^>hDc+c61v=;#n(rI)`G z(5Q0jR%&lEcnsFK7h_Zgc6QSZxCU9qlQ*Tj1p6WT8T*pnRq_6cfMnIQ2vc3e{z2O~*Rd;H^;ap<7*D=g|)zUEg7yCJa^t zc5)TgT>dwE)y#*H+Of-N_%Q$OC6mqV9UQ_xF#kid3kva7X7TPdC)}FCO7mLK%&)EuT0fvvJ+)q zfq{WKIyzcfuk!Nj?CobdnAE+1v4xt~E)1idgsZ6o@m5kA?d*){BZ`TMjjytdQ!n%n z3ES|7EM7cbi6UejPyYG06Qi!5{d}q=qN%7z7`$$3py(?BTL%WVyL-tUfe*Kwdw^#r zg{h)DjR(FZT#g72A1=4S5_f=f06B5{?qt2udP)If3CvSgR#wnibMx~6JETZrtM>Z^ z?{$y^K$Rfi4THM+wEc}Pr|LenV|}Daf5uaL`;X=2(%_7kSm(&dW26abcUNDSSplJw z4DUj(q;RZOxW4yYA7%RO&(t_isVzsLCYwWR%p@?8WT^7y7~1m>9qR}~Vax3P{0+6W zZ^JGn3%}E~Ly$?Ssj0=eVgDeJ&V9M6PwIVOA@k$o<0GgiVytmf5&M%sh2u0$?CcQ0 zy>#P6hiMIli*b^nKlkc=s#|~j&!qW(df40P;&B&}65HzpNVV(%1Iry+P3bH~PE)4TK3xQ-@jcGf7g0 zAF{>#`9=mu(|<)YeQBKo|L<>XGtWvJN-+KSOOuL)InQYr`Au-;OiZ@82!d2OqZ9}4X z=HBysdT*_(8^0p-b85wJm~M2qW~7`aS7~PzrpK6t*cgy(jgys8u3xwT zc{48pd*&?*r(f`OceO*v_Ss%0RwC^TG!GjEXck3?b39tK0nNpXmA{>2+84q{uZ~Ph zI#*x=Moqdi-sbH<>`NA`-*?2`NqRg)t&p>dbV<4}2Km@1QZA|NF=)+9o%!U8lBPiC z`0}$g+Pb&0hTfODrV{^pfqY}xbG2Bj4II;g7`$Q6aAsd_O!4I<1cuDfcZASdXa8CB z@-Ve0{pxpkW%=|!{z8O*43CBPD;0JO1+`f{fe$9fgoVIL25d-5Xj*w@+#KeGR*z^pJ-J! hVgI+*e@2L+To#wEuy{$A>ig%X5AGXkmTTBQ{|`b|#RvcZ literal 6247 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 diff --git a/tests/snapshots/v3/test_startup/test_v3_nav_to_system_menu/0.png b/tests/snapshots/v3/test_startup/test_v3_nav_to_system_menu/0.png index c085d109df9067f407184bff4d7e18dfab5d5700..88d9200ce8be0579b84821a3531d4ddf558431f9 100644 GIT binary patch literal 12289 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 Zu;<4e+mu#KZT}6YDECmdSlZ;({{bAK;j;h$ literal 11971 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 KsFXdjc=%{ta$ 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

X@2@e%zm6fBTqgev3 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 cud=zROdO2k zhZE}f>1C%O;{OQuY}xiR^Bo(0|9x)t@Y0NhpKQFbyA=o3|Z1`+=2E7jmrU>7zack_*9WV}U zNHqK3j);1D3pwB@!YaagC27Fq_j!Ri3C(jGyGa@8^hj~4w}HG8UH^USstD7Q+7Ox0 zbRtx6>+&@?2R!k{CKvW=f-_?Jz0a;M$FQr26`>47#_vR!AzL%fHgEA-?>Vi>>pJa! zUz`v7mFt!^YeO`ObX&QKoel%(zpHH+cC|XUIX9xU-fSPwO%L(HgDt?cw-o!W)BogM zB>(t-9vjS1MPoo0`SZ%R;@^I5Y>Hqt<&hyaXvl;R#3DcD>%wcUk+x>WO_+brU75f& z_hog;TE}l2^G1n>#6woTBE{~1v3;lEb`t9kY`fZ0f?}Nz;uza9wou@vd3 z{P(`%JM04dBEj`4elr)sf0lt|s8Z={Yr^GGD>M1;k^p^#|97bR|KpQ>gxhCEwpB4b SX$q%*x4)N=7q5UCeEDCG8qS0O literal 12495 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 ZkB~hF!WN!@DTRNR%fD8Uu7H{Z{vS}98S(%C diff --git a/tests/snapshots/v3/test_wifi_paint/test_v3_wifi_ssid_entry/wifi_dialog.png b/tests/snapshots/v3/test_wifi_paint/test_v3_wifi_ssid_entry/wifi_dialog.png index 2ba9999c417a3fb7f61410ca03c548d7f699c9b1..1eef0b996b7bc610cb81b305742c8593fec3171b 100644 GIT binary patch literal 9974 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 diff --git a/tests/snapshots/v3/test_wifi_paint/test_v3_wifi_ssid_entry/wifi_menu.png b/tests/snapshots/v3/test_wifi_paint/test_v3_wifi_ssid_entry/wifi_menu.png index 689d9d40b5b649dd1121ba812bef75f35b6d716c..390fabfdffdc091ef27408f8b262671fe232ee52 100644 GIT binary patch literal 10748 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 literal 10355 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 Date: Wed, 20 May 2026 19:06:03 -0400 Subject: [PATCH 35/46] Off-by-one text snapshots, due to using metrics instead of measuring after blit --- .../test_analog_assignments_snapshot/0.png | Bin 6673 -> 7072 bytes .../test_main_panel_snapshot/0.png | Bin 9852 -> 10256 bytes .../test_parameter_dialog_snapshot/0.png | Bin 6712 -> 6997 bytes .../test_system_menu_snapshot/0.png | Bin 13557 -> 13812 bytes .../test_tap_tempo_snapshot/0.png | Bin 5693 -> 6114 bytes .../test_update_footswitch_off_snapshot/0.png | Bin 4862 -> 5268 bytes .../test_update_footswitch_on_snapshot/0.png | Bin 5098 -> 5493 bytes .../test_wifi_menu_snapshot/0.png | Bin 11466 -> 11766 bytes .../test_v3_pedalboard_change_via_lcd/0.png | Bin 6360 -> 6748 bytes .../test_v3_pedalboard_change_via_modui/0.png | Bin 6360 -> 6748 bytes 10 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/snapshots/test_lcd320x240/test_analog_assignments_snapshot/0.png b/tests/snapshots/test_lcd320x240/test_analog_assignments_snapshot/0.png index 0323712351e6dbadb3f1b0e55c49b8e6804df1ac..5e0fdeeab904340324083cf1c93daa666952acf4 100644 GIT binary patch literal 7072 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 AfdBvi diff --git a/tests/snapshots/test_lcd320x240/test_main_panel_snapshot/0.png b/tests/snapshots/test_lcd320x240/test_main_panel_snapshot/0.png index 77ee94567a41a77c121038ecc2326382ef0a99b9..3bd30737b606066c66fd1daebe2cd341493e81d5 100644 GIT binary patch literal 10256 zcmd6NWmuF^*Y42LD&0ssbR#K^beA;J-5nx`v~;)RfPi$Pl$4Z1cS$1+QfKRXz8~N9 z{yjg=z%>`l>}T)wtiATV?t85#LRDE78-o-B0)b$^l9N)0KoDMnzkfeM1n>7MP+zGH`EAr>qUU=)o_Ofc`nGbm-8KDZO6IAnZ!HOk{}q>?K-JDU!E ze2&P4Zb&d5BilH$q-2B_m7;aN@JJv<7JrOf79^Dt*(q2=|FwvkFse|d$!avmIOy(t zsol@m|5&;|-}`ehf%q45{`x-NGj06S#;*lp)2AEI>p;qVm~zQlo3{5jnIODMceDCI%VXarZh} z8W|bk%^cxvOZc#D+)pah!Ytx@mIud#EC)RV)ZeRh$*ohz%bA&(r8Nwh)g+~)?79nr zrPbJdgxT5IBcvqMlH}+jKYVzEjjg1lqy>XJx^{!ry1TpCjoRcG(`2Y0_w@H$y?KL= zkN=ZpZoE*ob%P2eng=mIKfhAHe$5%WrCP7=;OW^Qk*L3dGDOucsXs(VvoJBqDJZ~v z`B+(Fx>u!SWKxonw$FWaXdC$zy^ni|`eP}g5M>rZl9H0NEA=-wHh>c**tpUap~-)) zuQ?NSp~>>Es&!drXJ?_wP#&JMsmj-fzt0eY&(7TaC?_T-i_~r8-ncw$CIi^Wh%BBRP2)&~%icW118iWaFW?dew{354r?`oiqtkMG6DJz*N4M;&Kte%Mt_bI|6Px zPJakR`;J(iuJuM`YqDbyyRg&H(uReWmNGf(xDNPLeE%-zN4edz-0s&nSL%CtIO6CB zMkmlK;E)Tf_?uOu$UL6rAjaZ%T=+P&=`dGUV;k-xY^10dt;o>ovMvMnc&?SsY2LR# zTU(-(DFgG`nJBusIBHR zO;tXe<~{(!C*16pmX^+jPwVZbljMsM)zHHv02&b)``36K8Kq7qwvs}`GaxiXokr#3 z21L1|xR{ujj~?ZT^^Muq%NKF+^G~OX3$=;1FUMoluL$&hJ<`hHh@3Y z*4Dacy-T^~A#!vH1Br}I3r)wna2Q6|HxrIh`0m-+*2T#fXOi#!{MkfqfHGJ zk>0F?p-u1_eqKAf-&HQBu`kj3+AScBM4*L3YASR6huPqoy+yVi<>}Q+}v3EW~Ml5{}w``dE!|#9f`yCoCI1RS-bD8{3 zpADM1XlQ7l(8%oXB;1zO??OXEt4IF^^~%ztuy4Sb)rMfY%_t&v?Q@$N-Hw~XR@=)t z^Y!(0ZeSbO5i1Le>rvn3mzHi% z6e+xV^-4wTu5LtC>u9~}EmEVyd`e~}Yerdz#8HVkZkm1zMHjojqHU-Dq$D9B;dw9z z?+glRSg$tizSy6gtkB~weS$B|`nqBNeA?K`fRNot7@X$}C+QsnON!r1en;(R6AD_3 zVG^s1x&DZh$bQ?Hkk4~&U;5KH%^MsS0n#7%q=5~M6T6qoeCL&Oe|J-5&^+-r9P9~^ zk#~N1s~p{*`+7`1@>U}my~I~*r`LAVpDp;3lLp=ZTrejZ>5Cx~^4OJff{g=E2*V_@w6K^}AeL5R z*7@vzP(Mwa+6YCWaaYNJ%p8tQ zW=Y`uH3Y?8tk!bGEcfnYh<(5P^Nl)gxO&l*)uFrD}yU`5@YfwtfPiWHqb0yVs4h z=zQJMEN~g+5 zsg+8=IoO3KbL82xXR(R>Y>tToJ-1Uk?zA$|*44v;r9qu{7i2=HFrC6e**H(?6^8y6 zkG+}MbkTs8Q_}+i>Q;HCWO-O~G(fQng4Yf91EM!G=5Yb%a2=~3Sp%b^(>v~bM?0BL z9X9MF($doVKl0$wg>d)m%#{;Z{D%)8CQDS}$X`s@9!YvSmFMMk+0wp%89qyY!tS@7 znV7gfF;%tyy49>V67WHST~fbvkC)cgOsB1-rKL?xX#rDTbCQ&vFwg%@NM!+8`_N~} z@=6SeNTW41HH}Wo#b_GL+7-@Q=xZxla=yNTH?C)Vc33|YqgvJ_aB#vW3#6lp6jHfj z0|NsG1_r?9+2^v2FmaFxwhH2!#!VXs1%RVeAKi03Ecgl@0NaChI(`G>Z8ltc@`|^+ zh$dk%s8;|45aWCh+A$FUK@Bd2n9xG#E)|q8YV$|75C}}e278kA?O(qx!C9+qx3IF} z?nFXDs%#kpyzk5PhNX&X*!%a|^I?{5$7|A-ae6r6wT_E|7m#90fpk5zjg1YC&LZ`) zbyw?Mav@K}d{vHcPEJl*+1Lt;to=w$*0vj%-AuPryV1j(T@{$=#9KJBV8#hg7?;Qw z1(S&F&2lA(P0zilm>0L}abhz$j7k|jqFKT|TsOZ#aG&8`tb`Yo{>?hqXH58!fp>p6 zU)O>>biOwoMWqL{u$ZJ(IgGqK~I8~Eq>{N}tum6}lcr|1^BpFYveG5R@P12zCQ;QPo(QKqV&f`Bkyza809;EltD-bKjj z%8E(7{z#U3ndaFZUQo~jz;!@pwti*{d8JLuxi&BC;-!50^a+PT5afk)#VK&kaYe6I zKrFd%oIW8S@VGoQ>>Ib{5xrb+JI~fbbK?McZF28?-zQ$JP$r^xEiW%`RP<)pR-&kE zRATZ71(!;6Sh+!_P_NEft=01Y@W95#%fdKOL69MmlJH@-bIe`9sAT!xEJ44E{jq#W zaPqJH17E&;3GfSWqPvTEC%^~&03Iur;xQ_7h=b%R6HUCjxk>Q!DVN)pVvJ0;^3u&w z=h235Lb10{dD$f3Gk-}X?tZE{xS~!o+^DKiKbqHdL#}Xqn_8}(xdspld<>LzM-Jkw z{qJywS{%n)FoTl|4(?-)cJGU;^tcE8KOqxMUAd3o}iy5`#k zDDVTRh%b-dBMnvn;L9MdXn7?LY~)l0?PB)FJcW4s_y87BbEjKb0(e;(x781j9o$@9 z-37C?VIarO0lZ?aYFjfwHD)1H$>6a87{9Z#^N&j}w)waLwE_?!b!hX4FgxDUr!(2~ zAhh>uN2iP}VRvb!Js+L`g65~D_9Q!13#KhCCFQ<1HS)C}gyHzRS8!b1=+80@ey63Z zjEr(kXpBsuOyMgPm1W?o5ERS`7FW&J!A~PLHdBq40Q)$YZ{#J#zO(t7%&Y@AZngDz zK}nA9;PiCrK`vN7>%}REUZ4VC@TC?HySqQ<2Xpm6l~FDr(qa$tFZ*|Y##7qiCPMa+ zdxV1{>UFpvbksHp9JV!*d3xw z$&ba1DF(a#(2YSz2FwGdZ&{vCVdFW?&a1h!U0+#2uUqX;m$gZ;! zOJ)Oui0(j|aa>y`oVflpv}%!j%JQP!U9~q8T=#qI#_rP3M8V=*9aqEQqFN~C8fCP- zv*EP~+Qc3C3QDjtWEn{qCl7Lkv7(R??g@$d{`^Uo&%}{PpP&%N3TX1yZ83vvby7 zn+gB<^XJ1>d+_(?=jSmoG08)lYL-$dmK6I*FHVC-U6yAXU|mxw*MgG$4i^E|-H?2^9cp zoSdH86n+H^0+a~84-8!IRdsT4b4yA}&ez!_CMQd?dw7yhjgB52_fxU6vWfs40a%KH zC=L|#>B)(^pkbw3#P#C+#|7iqc1LcD&Utd=-$-5P!Da=c=a8dir@>Un8$?Bj92yhy z)#DW&h`G%PQn1E`D#Ay^->5IGULTVU%uYkr5CkQVYO+mElT?|82M5)m$?kaN9tNXnHVS~EDfNgYS#3Hj-oe5vr@x6fp zM<=CQkdIbL1}wV@iZE7-v$MfZ`)wVmP5ORj>{uZ}ifSX7AZ5!fxaQNjD0&_ZZWzl` z(*TVF1(Z2O7B_1i(w)qnU#HI_C-%;@Q}$*WGRQ-VayR$;eY(?{yKj9b?l!ezMwbYP zO>g4+QUP^uiXUlsDuE#I|mh z(ZWPOG;wA~sUrzWh|~lm7x$}8s4}@n+1gDwGDrTBo&%FB{|-&4M;|3r#Dap9bk3xe z-Zbzl-jS0MvcXHi7LivP!Xzd%>DdMS?GGp)P-l=IV^X79BXN+eMBN}PGvPY4Zq)k?+I`{E(~SUJB=W~V?L;A!jWCLy zm31V&TIaI?C?bHwdU1Tb>e~D?f{u&p3pk9b(Fg(yjBIf9_=VMMDH1CfEvg-w2!>3OhfN%ivf{uA zjr1)o{0QCfCo26Ka7@Zk~$g!uuJ66GB2 z{L$>%9}IgllU#mOyQXSYO4xpFz6TbQr$6m9x-W@by)7*dEJrlpd$W3OIm(pfOXYgq z$-0jwLS59lT+M{SpGCQ=iuB7^@d_7Rc{jP1DTtpa(Svn548PPYJ>7f@`21J18h}>3 z!<&PHY*|9GiyhgIls>+9csu!FrN1d4>(PW%>A+vNNoqn+dKOR}JTeeX;;@5g_(c69ICDIE z#BL&qK0HVTV+FhPkW+@IExC|eDRI6Y7E8`1*SLb?p&ViBuo;#uRW(*uZi=padFB>4 zuw{jxdjY))l1z#cQ+F8QBM^)ghC6%N>^QAsb{=Z{4h-s*t-`OmF1*EXyU2Lf>i6|q zqdcD`_Lafv!yo)MW82TwWJWsc!@qz32J+(9uV0xXTaJq@<5r-Cm6Mf~^-nF=*48E_ zB+$?t>RlZywYT<~T>};j>+=CR_~gX3OmnbF;6uqAk0voe><2kzWo>9OKrE0MK=G{7 zC6G5`a%X4Mu!G$5zKw~#$U~;D?&Ks>I}q!A)_kLJo3~ovecRPsJsUlJbXYGMKH+^* z#@yaFl;zW3y$|>EZ2Xtpwasn2&Mj@i>r<63scb0OLjB{`%Be~Ff?lzM13t^phA5&t z4RzvfXM&`p{dSi^u~#KJ^74u@eQzpLrs80R+d2^K<%jH78}73aIH$NhGK7-QYaw}= z^4N6Dt{lo12}+V12#z)%YbNFx0X6P!X3_3)!`_dj*5c+Xw1b+=Vqt~k+oQ1@!-6H# zj-$^Uu#2QzvCo|?6G8fP>@!9i5xqlHqvx&JIHOJ#aX9CJPW*@Kt(&|ynM`{HsWQ?j5i zPL8gfSZsFI?ev6FQzQFuaIy7Nt306cHPxq5H26>JVI`#lTb>pJrQ|^>E-uRLk~ZP` zHeszwQBtDREi+92&{7@63eC;Ovn-5T<>fZ|hp+qpeBk*ZSTIjFk%c(>A*^Bj{`O9U znx#h=7edasyNTp4Pe~~MWj->AY1wwdOU%X(ce(Mt<6B@>{YsW-K7tDt_%V1IN+NyKbENcfzVNkyJdY^;RogZvm|b zfqH&?oX@m-wlfJ5FQCMuqocV3E@ryApz0MF9esOyI(m0^2k`e*xPE7#NbV?=P(#A% zSOgxk?Gh-}?MPa!)uf{KwKp|2fx37{M+Z={v(=_ZsY8afme>y7vp#im3SNi9km~Pm zG|bG|>z%4%qgrPRdTsNo)hA2T4>pexUpI+GH(a z3e=q`ahSL4>t}x5urRzS58o}c*GeqCIQ13>`vlldod#o6V`FWjVt(nEiuJZE80@i~ z7Zs&|iL3H7!uqc1C*maD6&2!e)6oeu_^oaRjPS{9aX`FSv^B_`}P+zo(=P#il&W=TI$W=%j85*6SZ|j|v0T{Z3@VDBxU6G*`^`Y#Yd~ zF*YDFoZ8Q|?d|u$2t0D~tkl#-)9&}uQG`la0xqCoP)GIlC5Pp3+U@NvAn}4!aqT=~ z#8~gYzC&AXQacW1V`a_eFqM#!k{Zns3CAKiIUN-f%IyycNro^q-zF2XYLBrQIEJbc zKTB1y@LPAiD=fG;xhB9CO=Y$jUu#`kTjt5&jz$YBD9AuX>!f(YqI>hqAzGU$8Xtq!;!DJ5%q!vR2Q!QQ2<1mtFTS+S zI&+;Ji1V?#q0Y5bXbGYv_FWLph73G(m{0rautN;^we9=(55qqE<38hi8Rl zvxqVdsh0Ip#_fwQXt57OSQ$>|)*jqhYF|tD*pQQ6PWUW?|5lWYk}@YXH8nZeV|y$g zC_b@2+l3GJH|!8B5-urdGALE0o_#h}?lWh{juxskdJo!iXFy#6a=?bJTUcg2frOOa z@SSgINyPem!nyfrel@*cRs~#JQ=_a-o%j5dYN!jf=ypCxtJejsA?fvgxQ~KNBiiWzM<_ge4f`}cNEj@wSAxBLKhI~qFSP4?n0(J4^Ay9EF92O)aSmypd4^i)0xvsXJ{MZH#AhcnW| z4-c`6Z|C(h12msnOY>RIdTD;S8Pf_K31V4j@fCSwt&*Q*#2@~KMoR-5oxq>3?s&t> z&SGE1n?k(@V7PH#ns=l}I5Uq%_BfJ~G&Oqw2N)h!L_+{I%3}30Bk$EPP>%7@}(5hh+_?ji~XHl@$T3P7_-+%@=&9V$qEWKg98+hGX zU;0RLgC19=2SZ{;zhAW$sk9o`EONSi$be=!+=z))BrEs9!sU1>Ee%ug)G>@gd@Q?P zDVZV&LiGFDQRouw%avoL8OaM#yG_+=oV5y+@i$q`#$Im^nsj92 zm?Z8c}J` z_KQzDlT^_Y4h3*q&MiVfy5}#9vke4;rY3z^G?iF~nYY){9~pu7 zIg(JOCVqn|PBRy2URIWhq>+RK5gGH2mt%uDUDn=h5H35zoiNo`1CC!Z)3BQis3Jb; zSa17%{pxo92P-+U9ah4PSnMZrlwh+YO!LW!S%qPC-G$4^|Ls1zu8b$zeMHkF?kx3$ zRPHm4{{8+#g^dTZlP^%rybo>DMUx!OEzEOKwS>Z~yT}k2ZzrRj3Q-0;%<`P?z!=7Z zR@oLq=(WC&{~bISfHw5^SpY;U$=RAw1+QWfw;`5I`mHZ^@Av6O;+rps#3o11=e~$x zD3-fMtrl}$O2XOsP!=S|7(&-Ol`f}OPncC6QCf7Wmy2~=Z;=&_3pg#cfqrLif4>6V z)BhCkK>hx3M$N`H`%qeinmDFUDU%P*Lh1MW`u49l*_o83iLY~9^aZ7scHeWL7=^qJ z-Ji?8eOra-Oc1F>LNZx5H)QFi=X1>(w$>UQ{hY0rHc?A+vaPMRxjA>|Tu;VaO>KPi z>@`(-MTRYuuwNso>C+n>@vn_C<~3hGR%tR=SSr_^c;5Y4_wi8}8e~gTgw{4I7QQgl z{XP|UYPc;5(HJ;ftcn-QD2bq^IA!-?d?QWQRl5;R)P=V}q1D@lWs2mpcPh|D9{dpR z)p@Fi;HNcPUI)DZv6YSTL{j=;Hvi@ZaE(#;Ww`>b_*wD|JGu>x_g75+_d)tCB6?ne zdOBs+G)=h0k`=_y5C8aG7vpg3Nr(~$cpT<< z7`^yRA4koLoP6g81VR-$&6I3M>=m(r?u z{^*UYh*9TI-4_{~39~O`K9y%uBMRK$>Krgc)-HVT6Q-@$#*}h?CxoFdE?EOg*=&X_ zx4*k_)6>&^+dJ~|RzSu9UD(x+&m_zLY@9MPTvYrS{oH4s2;>T-i0}SPO<`%N91NZV z_#2>iphW@`k3~c>j))cA`o$mJkNJryUv);GE$D@CR-oSw;z(xD_?Jx?rz1-8*wBJd z8Z`s!?Sj%$By#0*I1kJI_kf@Aw__&fcIzJh4}8{P1ifA zf`+_d^zE<|B8cJG0Als!Hdu%kE7b!ty|W4X&P|b29rva@-Q>Smm4>@y=wm z*tvk1(4S;L+Ak(O1nr8@tl&Ow=ueQb4?*;lZLn1d$X}9vpkzPP3XjTtf{TQ*-*KhB z*741Avh9Y~Q{wR@N~O9lsde&6{ulWO&wLS#I?TK3*)SPO3}NpZ#O7a?BP6P0xR^Qm z;{>>06}bMF?EbH=`Tzgl_Hg3=d=e26@xxm|ULFw_MFFBfUGr7zCEQD2M0ZpdQ5P{H zrV_DSS$$s}! z%_~>(($q}i9(~{P=V?MLBY4!u#RmUB_VJ()sQwW4$WjbAD9bpM8Rz(WLlSsu2%B$m z-zolOc_G;m|1~myr!?4=VNtuRs`HxPZ^x12|4#87Oz|m`q8P#ci9mXSAlkpN zWo3E32=kMQ?fOWryqq40|K`=uK+w_&DRcAl$F4ACL11|s%20|Zi|E+nRgIks{htqR zvmT3Qa4?x5AFCn=<)~CSkzVc|enkEE^{%bSh*kbxG6N^3Vbwpc2&g@K;dq7b9{!7s z?C%g{FRizj%r&Gg6w*irixd;VfBm^)hVAajTDPuiE7@&4&iQxy(UoLTlmlWk-+5E0 zE+0=*{%7@qklju+NB0F=oHDhpr(I74R&Ou69JSspj?u^>y#rG@f76O0KU9q%3qU8s z{(Dm)WUye@ZmgyV_t}5;G!>J4bXoJJLZLuVl?r+ tuqlZ2!1_DIH_0l*|0gHPS@K>i_6Z~>?d`Ky;7LEoD`{n^&k`mf{|6Qg*h&BZ literal 9852 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 m7I^Hd0{uS;x9m?(=os{@}C# diff --git a/tests/snapshots/test_lcd320x240/test_parameter_dialog_snapshot/0.png b/tests/snapshots/test_lcd320x240/test_parameter_dialog_snapshot/0.png index 3b6e38e911a84cab3299a959be4ba02e788805c4..c978abd7586c5e641bcc0ff3df28448b63d515cd 100644 GIT binary patch literal 6997 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 w%D|6qIMQ6~R^zZ*<%okfKGU#kP3{=;Koq); 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 diff --git a/tests/snapshots/test_lcd320x240/test_system_menu_snapshot/0.png b/tests/snapshots/test_lcd320x240/test_system_menu_snapshot/0.png index 04b7c1beb97676f168f464555d80dd0cae41d803..f0ce11d2db792bff5acdb8901683f286b7c689ed 100644 GIT binary patch literal 13812 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 Uo~kPNZ7ztExV%`Ih{2ct1>}DhKmY&$ literal 13557 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 diff --git a/tests/snapshots/test_lcd320x240/test_update_footswitch_off_snapshot/0.png b/tests/snapshots/test_lcd320x240/test_update_footswitch_off_snapshot/0.png index 1cc3d1c445e026c43ecdffcaf39c6f73f1fc88e7..20710f8869f452a107c167bbe51177c3a5f7abd3 100644 GIT binary patch literal 5268 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 bsE98~IzC|FcByil{|xJB8fa9i!6W|#q73a8 literal 4862 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 Vd6>pdFS-1)tfytHS)~q(`7i(Fzq|kd diff --git a/tests/snapshots/test_lcd320x240/test_wifi_menu_snapshot/0.png b/tests/snapshots/test_lcd320x240/test_wifi_menu_snapshot/0.png index e80fc87d0ec49f78408393ea7309f877a5b27433..23ef21d1d8de5c47b2059382bd605ca75fc8d332 100644 GIT binary patch literal 11766 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 Im2Kbr565Zm5&!@I literal 6360 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 diff --git a/tests/snapshots/v3/test_pedalboards/test_v3_pedalboard_change_via_modui/0.png b/tests/snapshots/v3/test_pedalboards/test_v3_pedalboard_change_via_modui/0.png index e7e9cdfe0b30ec660ff0544f97b66d18f30b5c87..21b9290f8d021c16bd0d1cbc29feace608dd9ba4 100644 GIT binary patch literal 6748 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 Im2Kbr565Zm5&!@I literal 6360 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 From d9b7c67ade0945ca93af4df780c57ac64d0b9728 Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Wed, 20 May 2026 19:26:20 -0400 Subject: [PATCH 36/46] Stop rendering the dialog titlebar background over the whole dialog; update snapshots --- .../test_parameter_dialog_snapshot/0.png | Bin 6997 -> 6956 bytes .../test_system_menu_snapshot/0.png | Bin 13812 -> 13807 bytes .../test_wifi_menu_snapshot/0.png | Bin 11766 -> 11752 bytes .../test_initial_render/initial.png | Bin 3702 -> 3686 bytes .../test_scroll_back_and_forth/0.png | Bin 3704 -> 3684 bytes .../test_scroll_back_and_forth/1.png | Bin 3708 -> 3669 bytes .../test_scroll_back_and_forth/2.png | Bin 3929 -> 3899 bytes .../test_scroll_back_and_forth/3.png | Bin 4006 -> 3975 bytes .../test_scroll_back_and_forth/4.png | Bin 3873 -> 3840 bytes .../test_scroll_shows_later_items/initial.png | Bin 3702 -> 3686 bytes .../scrolled_to_last.png | Bin 3554 -> 3507 bytes .../test_v3_parameter_edit/param_closed.png | Bin 9467 -> 9452 bytes .../test_v3_parameter_edit/param_dialog.png | Bin 6747 -> 6717 bytes .../test_v3_parameter_edit/param_menu.png | Bin 9467 -> 9452 bytes .../test_v3_parameter_edit/param_tweaked.png | Bin 6771 -> 6735 bytes .../test_v3_parameter_midi_change/0.png | Bin 6602 -> 6558 bytes .../test_v3_preset_change_via_lcd/nav_B.png | Bin 9154 -> 9151 bytes .../test_v3_preset_change_via_lcd/nav_C.png | Bin 9180 -> 9176 bytes .../test_v3_nav_to_system_menu/0.png | Bin 12289 -> 12283 bytes .../test_v3_wifi_ssid_entry/ssid_editor.png | Bin 12825 -> 12822 bytes .../test_v3_wifi_ssid_entry/wifi_dialog.png | Bin 9974 -> 9951 bytes .../test_v3_wifi_ssid_entry/wifi_menu.png | Bin 10748 -> 10734 bytes uilib/dialog.py | 27 ++++++++++++++++++ 23 files changed, 27 insertions(+) diff --git a/tests/snapshots/test_lcd320x240/test_parameter_dialog_snapshot/0.png b/tests/snapshots/test_lcd320x240/test_parameter_dialog_snapshot/0.png index c978abd7586c5e641bcc0ff3df28448b63d515cd..1803041d0cb1b08abc69846bbd53cbe8a50d224e 100644 GIT binary patch literal 6956 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 CK^x`( literal 13812 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 Uo~kPNZ7ztExV%`Ih{2ct1>}DhKmY&$ diff --git a/tests/snapshots/test_lcd320x240/test_wifi_menu_snapshot/0.png b/tests/snapshots/test_lcd320x240/test_wifi_menu_snapshot/0.png index 23ef21d1d8de5c47b2059382bd605ca75fc8d332..8569ede7c15b55af2c44c4c53a40c0a810146035 100644 GIT binary patch literal 11752 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 U^3Nd$C%7T9Qi_t5;>N-M1B7(^{{R30 literal 11766 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 z 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 JTF>FxKLL)!`d0t| diff --git a/tests/snapshots/test_virtual_container/test_scroll_back_and_forth/1.png b/tests/snapshots/test_virtual_container/test_scroll_back_and_forth/1.png index 47d851a34600ea1e7424fc38e324ac9f0fe52dd6..de905b4949d1ba4fde3f2aae69bbb285e6a80a1b 100644 GIT binary patch literal 3669 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 Wf%GwohqMxb$5S;O)e>c^fd2ydj$~;7 diff --git a/tests/snapshots/test_virtual_container/test_scroll_back_and_forth/3.png b/tests/snapshots/test_virtual_container/test_scroll_back_and_forth/3.png index 9d0d780239108782abbd523ca7f1b9b9b02fcc45..9949f6d02d8d9767ee6f922f097e962cc5245cb3 100644 GIT binary patch literal 3975 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 z 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 L^i<)`tUmn%wZN{+ literal 3554 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 delta 8635 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 literal 6747 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 diff --git a/tests/snapshots/v3/test_plugins/test_v3_parameter_edit/param_menu.png b/tests/snapshots/v3/test_plugins/test_v3_parameter_edit/param_menu.png index bc6d369bc7ab6dcc6ab5177023da439f2fc78c6c..0106c5ceecd32af1b3026f038650403bdc926318 100644 GIT binary patch delta 8648 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 delta 8635 zcmYjWWmptU*QTVAZlnbSq@+`jPNhM*8>G_(X_1hXE|*+D328|IT|%TA7Nom7zwvqh zeEWlo3uY(InRD)#9hGa9Bp!$fsXY>rmrW!`;9-`b7cua-kPUB8K z+vs$2^(H)%Q80}xVb`OTUThfsI360N!>|5+E=I zWQgbNAzOnQ+~$*&Sxv{)P9h$YsDO{F>sQSZYk>@DY3W*fimZW$I5>`OZWX1an^(>n z8X8_+Udj+<>?~J}-6>NMOAtJrVs(BJYOXz0l-9zQ7D)~ccxh>@3khDNT-fu)%}teu zR(19DeW#2OG_kym$ec8-*TB_?WxgtQig8R+T#{P~l3 zmR8v1^PTtg*>1&u(HL^78y_FCIT11O4~xZP z;#y-@HMKb7uWV+&iR!As%(}W`^UZ$bxRJZ=gLQV^nfJ+*YOXx-|U(apB|yP#+P z?mk`I;-W=GZc-A_3S9YwH$OZ)yjdbFCRj%YTI5rySu)!i z=1Dcy#ZAE_DQUt%rf*=7HR{px`}fUG&EUk>*Ggp#pFelx_dI8y@?dmwa*EmN-=M>Z zljw-~W*Io!S@F$;r}E1ed;)^_xHxG4YByC@bF&2hk%^I!quq7J4G~&bRcp|>ahcgg zHj&4xMn$uX%+9iE9*Vft^>uc7B5Z8pvT>&j^@;f}0tNWg0ybwm)7Y?ZEW*r%{Rhw= z7*r5CB99$S!q@dK)PfE~)ghZBMYjE^!(_yimTHi?brvsJ8n3yu&z7#I-_Q5t`s#l$ zOfbWbo{tO<508v!>*#px&eX9eCFttvp8T8-kVJOJl139U(9_axude=FKb8;|FVx-y z*CZ}3?)dl^x^?{D@1Y6&erzSx9q$1^3mq1hbS_TgoMOyFt^of z{g3Nx{WM=N8&u34+0x{-o^1Yrw94=cqtx=R_@K?AH0hgzuDLmrvG%Y*oG>IgBb(RV z&84tlesnY1TlwB(eVT zsUi1-#D2>&mnps@<)EPJyW8vIqa%=vbalJu&pTp>S?mTf$%%jc)0-~gY;aEfpo-B1P*C#@KNv7l%a@7!>?bzIy*Z-sGnu1 zZ^eV?eu6@+nV-ta${HCNfxVrapSK5J3Jk}t9{O8Vi}LgHgU-bYVU_0~`)0^pq-|tw z4gr0nrKRO~eNe~R>TO^UozUsY$?u*XDycwk8yiqt-F)h7(3I5FTp7sS#&E&z?r!T~ z4w4btyS2UTx_uGV_1DJM_Eq8+^Y+{_GtTITkG^qusKuog8EL8U7@DJdiDru|1Vc>} z<2?-Wl9L4h20>D|49vcJ_rB+YCMTN(?FzwODoau2v$L=)_k3j8o~+#8*!XO;PuM8lyF0<>U5fCBs^)?SKF1Oar#E`PEK1gcZY=Nq&gV_wtchi z?XDgkU{1vaFAve|G_%0o->;ATTiWk$_u1TB-@PhOY`xkl?dX+TW%6`;<`Gye7)dxmqIOz>F?BL+w`2pm>e=Wm)Z6M3uPL4ikhabPocW3HwIZ>v* zwzeCAfX=++AX7@D9~d00tf)v;Ey9g_H@FUfc;j+Ck3rm<7ihIiPZ51YF#VB1E7qw(=Pe8`8Vc))egWPVLGrYZEy3_%; zQQ;%tB$?6CSWV4t^WSw!G>KkJyV^E?dl`Aq zdt(LO@y9?|-W;E-ntr+y{@B=?POOJG!_O?veD{oRi3uzfaZp zhLmoyu;svfoJ%v@Mn5R{edG0{?Z*Ma8VSlaYHI2=hz-mYVeLxt$<-^`1|SS6yJogj z(AnO6b8mRC^nH#WvRdT=(6_O9&;(DU)uaA9$bwSSVhpJmAW8#yhA*xFe5P_$)#*P<`!B=gNu=PZ~h$Q-sW2 z_4zZOtgNiw-SqVI!a`ON5fKK4yx+gootSEvTiHZ|FZk*rS}&I3pllkRetzcw9L8SU zjSUSw|KKqq_xkm0u2hf<{SKkb&A%gh8gP)kJ)5=%v9+?XVNL7z@$*ZJi2>YauHJR_ zXtjTU8tWUR!oeu#w898|p(Q}4d^~v<8W0$>JCG%^ztC>Znez7L5aHf-$u?XN6Bl>A zE_3fF2nWRA<7|9VAK- z{7VGsA3k+@aPXOenKg!anZbq+MzxDp^8gzQmrM^L`7iuCBX#7+^P^tEzDnupPXa+1b(pqk2ewQPE=w ziJ;kfS2k{o;kc#cRLXx#-c30YZI5cne1*f6)zoN3Jw8WAM-NvwkCteeH+oo(6smv> z#wR3D#LBw}zlOc+vH1oFK$eI*1tlfzZ;8oGZ|BJhP)OXD{4ZX-==vE)*$x=2ySw{V z25w~Mh^TYj36Z86Yb3T|#@fB&)n)Aje&#dpOq z2q4+%=~PS4K5uO~l{M>pR3@XR-vbKp3qtSJE7`aH^UHPg^z_8U#LORKepmox(bv`W zUKjXwo^C`b8<-;qsTqI=k&=?;K_GXRbX1_$qMu%Z$*vpGyB?hJlD{Je~(NU22 zI%8KOqiFyiKxQ>ZK~qx5iHHEr!9428yT7q7(r)tE){hth_^K37a|*sXkRu@?E)LQL z8u0m_90{O+pV|FBI6f|i!>5|O*vD6&zkE3a>a3ukVA{pk2jX)I0D5em*MANSQbTnt*mhtc40FYcVUV#a(*kT*9seSLi%Qr+iENoMPP3-N(peM^u# zJ3Di8a}aN-rluy)41gdPRZj1ZM&B$7NG(_z=j{Q`%_#K)V~It+st0lt{^?j2gS zVRmY&FX&F4S)HF{!}Ig=6BuL?h-d(n$s3db^%773fW|?PrnB9^#KZ)M=)AlI;0ios zkftLd;`7-WD=RDO?(POWJ5MUe7t$Gl^Y`!H!e>=UNlEQ@rV$-ZfJo)zOS*W%%$yIt2bedAYHMpNI7P1w z0HsW?-HtGHJx)Cpl~~oH5vMvmJv~soY{=FD)RFC(%dD>m$l_ zeqcl7$09Ygi51IndD1dm6jp=gj@epAH)Z^shN>N<}O5a}+`D{?K#(hD$ z^Knn9PDvC#wOoZfI6ppURG@!=bk*0_1MNVBH2n~D^Ri>@+@BvGs#>&Cp zF#)P1R$fjh$%LmwoI&W#S7p|GGqpy)TDRfnYGEheeedl2WOhsp4L4R-$w5+g5@>|B zfbR8d${w%-EzP|BZH^?=-%~+J=`}IxSA8|{2*+_9Jw1iD>;~rMgEj&<=b=D5v$3sR zoo?&;tpd5f(&?ah)qyG1L60bh;OlDx_d=endfEju+;Wk;sh}Wy>teRMuDd4tO0?k* zbxzUqKvM}wjYgXwI5$+8HNp)Y9lfiwGp4TJUy>f$D`;pc3wud*F(Cp4{zw_)xRcPh z3T^ckZnbJ0V3%<}RmZIpU{j_D_wTgBo7JD41!?fR;9Qs_ZUY1Ykn!%il#~=-&n2-Z_6cluofr+c*0N;-AMrtI7{)3v zJ%z5`rW-=#$RAUl67ZU}^jK9FYvuh}K79A?9r(rVE*bikoFA1NT1CzTdBT-shWNeU z67pikA;r1Y(bUlJ;$&0{@Q;PIkSs|1*}Dvj&j`xD;uvgc8K=pqK72QD{I zYqy6824IuS)z}a2OxJu(2-eUT0QUv-!26@LcCddH*5rR>xzY=**d#4aYus|F+1qg6 zoZr}Dc!q)k`Cr$!AWj&;s_()JL8)R&?3OvgcxHGqfWum}?Gbh8oT&16*xje7wGaD} zvIP)@5q<9>w2&ZNJrN&zlT$%ejSi7DNL2Ad1aDg1-&rZMi^ORTG5UpzMHE#nd45^t zud?lA1+D=bO{{_e97ot(XXa&qd$J254{)XM#BkE9!}s%D|l4$stNgeb{+54 zO}N%xnkM3&NUm~U{y~wHi32k^tj%GV^%D_Vf;n`Ml9~UpcFxCr*fqHe#S!Jw2#pjr z@7z(edB}20`pgq$qbys>wnLkB%mo4|sfRKeE5iXcP-d#f5K3*G9~Pezzr9TITh~Hw zIcP6L40S?aBjR51n4%^GJ7xag3+{8KnoP|S4cf6`_Y&{#HxXju56*&dk$Rd5N-|4( zqx2-?F%*!<$ydfXwv-eG`FcS^F&rmnIu{i^=_V>-!UB>_b>g|K69P zW~<@IF{hpMGTZh?N z!_b->b`HsoR#;Tx!zV||?%#%HUI+R0C7?|(?G$b`1fLGDnZ_mkp#2$}+1Dkt;k%kp zf0uT)BrtF*TzF*DNN9(p<-_n7LB?oczl{?tU&3_=%VBQO4!gT_AA>)C@?vPq{sUJ2 zuyFv>6WxMl))A~sF)#GiR>TKgBOfLqa%@;l!vUln)r_MX>*s^z-A}{eLwHX%mS0fF zqim#vo^#x1RqnZ*D_5l!Y?YsTYvWTtWVtgiJ!%!mljQ80`Q!J=Y!_~_B_@?_`-O88 zE6G^f`QVogoHx)-Zo$mq-E7@Oc!ySKF4YG=c`cJJbCc++r2Cz*R+cst%jYO%1nX{YQLb!7Tqx;eb* zl!PNX+b|l(`Bx?E(k;`)uE>HLy^h5JPljVEiSF>;l+78|TSHe2!_8g?6hfDf)R@IFbcVHtlW;9=wyV7A3kErk<&Ybk zk>$vFriX}o{6<~3EV5It-$$wenjv^hg7YCZ0wQKTi#XIR3vZU~zb6Wd?$%yKQEXBi z=^)+|D5%q8Ro|q)yZ;-nViBFyN;}?I?*dLD);O+2nYp$D zd3sXv)Sr9?-ZA@K1GmL$E_lTCl{-#8Gwr6ax zlFfK>jN;65FazD_PTO?*_0hhmKQq=4L`JMMugCI!bI48zmXe+sOQn0d^tOW9WUnBO zwtnM4Z`RvX{1=At$;L4q3d%KhI$}|^ibAYd5FR$3=#-3DWX5mhN?-0e*$MfLf>Ncy zAo?k?lJt%2twm~R?(tSMPZbXHH0p&j=Bb8PCk9G~rqF??+s#+DVSUeeKni<0;EN#k+LVwL4T4 zi-uS_uK+E4i@=;8_Et|Y@R7=zW9se}R-YbLlTr_j${fv^8?@otK#^2-Wx^ z9tk9r=Ou1iJmg31@U=*|rYUuo-oQdduVAx?vTjq{lGr#a!$WC}MD8=Ywn#%`A8}#X zMqxP%EH*%!A8|oso|-fgjTVeM?IT;8L$1%jYgvKDhR-%2nB#!(0Fqf-TdQke(0{(sD6vNR>@98$Ps;1kn zCLZ?!8152&d+MsHB(d_9?RVl)mcTvqcNb`2(0sS4=4qd?M;IC!)C(9Yuv%X1DJm#9 z*3DF)u>p4flh5U3V_5OQ2TMamMa+Ps90|WRU{D}`Rpx~ab6WVvuh{TWeE@VE2>4_r zXbt@nG|zJ=lAeLwtrFOUKqL02@e&dc*a~F8U>9;w5{Ad*QXAmy1lk+33*H>ukS&+M zuIqM#sxweSKKAtVOilesY^B1F0_0V-h#8V2;!gi)7-I(md+O4#HPA;}djwed!66}7 zg!C@b|)-7U|{TlrWm730B!;Ya452~klc7y<$UfbIzbR*AEd zQyXxH{T4zDzUntLEYm+AmW!k0l@2;{0hW~!qmhxEoSd((@ciKe6FmQTo7dpkR-QTF z{`TCJj>m%j0E)rLqM$>Ci-CfIQLiE|t4mR1@#7tM7694`1ON!8YU@+3&nUNA9fJPd z{z;l1zfc=VsB-?1pv4bE!XMG4Susp-J`__!T^JQOB`9a^Y80e*4I!pK+TB z$}(u%GDVrnPM)3u^Tcm#fj+hWlda;%eTCQC+j~32f`u=S&V#0C{;}ASC{CSKw=)zk z>E`p(=|toQ=>u*&0>=&onn6REO%!No6skRY(?VGqiXgryZ||*1D@GyCXE6fN0%C9e z@8fEahAdxFl+f`ZX%7WxJd-^(#S={}Es^zF=nWGu=j$1H&k$m}1yl+Yyh4d|T&h%L zL89Qqfw*O47W+tYj&vPIA{ z(ldqe->eW9PKzm3KH+nOy*)wrzhUgUVNXy;FCI?ZRiphk7aR?|9in7Y5%Hlk!b3F@ zOU{K(kn_Y#C?G~LL7ZU|iE`&pH2HDoOa5Et87}K6YTmnqgSjHKeCdBaRcw@ z(|zfj@M9@D&@95Nj@z+(;Uqhu^kO^shA7-GT}qW6DsgnzYFV=UH}S(SXi?~F9kPXL z5B{5=5SJ=JC*je{2Gjr6NGL?>$C#sZ^uV3>{oer6P~0zM9`4#ph3|z3z>JK0=bTU& glLGbghduY`r|m9Vh=Gal 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 MQP7aDk~I(hFS1M-@c;k- literal 6771 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 diff --git a/tests/snapshots/v3/test_presets/test_v3_preset_change_via_lcd/nav_B.png b/tests/snapshots/v3/test_presets/test_v3_preset_change_via_lcd/nav_B.png index 38faad0fc41d263855c90e199a9a46d8a5ee83ea..82f042a4a32361f2d2ddb92c62e68cfd4c53f103 100644 GIT binary patch literal 9151 zcmb`tWn5HW_$@v|w@5kCB_h(PbV`SWGz=---AD-t2#6yf-6fzB0s}*Xpn!Bsmvr~t zeDCkg{lEFYxOZOc&*5<9JUgDfp0(DVXbm-aLOe=52n0f?s35Befj}j}^&SoyXm8Zn zL?IA*h@z~Nw$JD73|u|!m7DJQR5Pqdt4L!nGJP^wXJDADG^S!)aDnEB*)ros6X!%_ zYvZBvboKC+U;pNm%Ipm|XIZt-c_Qdv&PYG$luVR+YZa*v*Rx)|%Hoq(FM>u+zW%*; zDJm+u_WAiCXUpmJ@5axkS0>>gJ_J%FO7OG;7xF6H9qV>pq&r;d;{2Q;JS{z4l^pKi z;9zcU?&7jnqE&>4k6$yh0WW2RqTohGMl&-rpEEKh9Ry=LrE#95{G6Mc`+Yf4@A#ZL z9#=+LSvg(An^W3G;rLAm^y$*h&d%1>*7|y}YeuKJ>oaOyUEQYYf7_1s_M~_bu*gZZ zGJ6&f2D6qQ627 z4-e1JXZ2b#hWq*XO-)U8nDgl1Vz5)h4y;|Cow+=tmY46Ys;Vk1WXaL6Ip$qDJa27n zWlU6H`h^!E&613Xjm;EJFzlkCF$kyomCCo)|IkzS4Vse_q>4K;GgE~{t3Y!W>3_QV zD_uILs>Lrlu}XurytLHL&Q7yLTZILLAKr{u`TLg`2Adcf8k(4xxE=25>WYt#N1-IK zv1JUpTO)DZ*M4V61m8fSdFY8C+)2}Q&X<>$b#-;g#^$sMYpbiPo102%=AK?&N+a~) zU=YG0BFLtuw6wHxr+|C+?uEbq_<>(QVBbenU47u=M~Xo7%F4=wm>9)3eBu0Iq!!fKuy=kHA5Ub5 z$SEq4FVIXZQYz47r)d1~W8>*x*QKtAsHl4SCnu+zoE!qIW?HEd?Vpxk z=jKcnTM33JMV>#8h=`c|;V#dXk|ypK&+u)Snn<3Rn(1Y${5a^LcNWaw5YB#Tb8;QV+ zG~3?Z28&YC<&}ATa&%KwswfUwMByNLz^J4(n8o9j!RlB_BuuBxbuPOda(&HH{1{d z1H)wm0}G4MP_8(Ln1+~`dxB7Qae8|C*wJ5yZL~EEo6DrB*xx)G6AL0!I2c_+O}Wh- z+lhyZyRh#AR;R&(`VUB2|6SzFjFBdCWo53Hxm&8GT$U9c-sf1%{ zHf83dhK7dh?Cj!V)@WJj{_5w?pWo*j0P`SxlGXcwftx@i;H;{7Gh!SUDiXnmV$yPi z@sD?!S2rP%vokX|_fJkvVmcRFU!@Q#sHpTOJyIr?mQSD^4V=Nh!-|j^XaaQzF3cv8 z4vq__poG{E^h=|&SP&74noJm0VjI9A**x_BXTu$BMRW3RlF#qRX7TJ`rEhDj;+v-Q zzi_ek(ad1ty+}eT3U)ooOsARpp^(nhklE~)bP5+27nZ#G78Vv(R#s9{QjU%l&&}7| zez>ppr*fM~TUzEfHa5n_Dw~>SDKIyH-BM#euB5EIwYk}Up9@(fi~srK$J(H4zXN_g zzTt_2&DyxxHN-D#|KjMlIODIDy*JmF_b)oa7x+^9-@SWh)%P*c8I!b1k3CpmxJW&C zHTCsez~Qf}s{sC{P)>e0nF`BcNl_+mPDn;Z#=Or`-2PJcJ>SQOJ^`KlBTNhjnpa

OdJ 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 R9C7zHML9LuFVgTg{|jHbZkhl9 literal 9154 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 SHRf73d-PEA!6yaF*Z&8bbm#d1 delta 8399 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 diff --git a/tests/snapshots/v3/test_startup/test_v3_nav_to_system_menu/0.png b/tests/snapshots/v3/test_startup/test_v3_nav_to_system_menu/0.png index 88d9200ce8be0579b84821a3531d4ddf558431f9..791e9435795ab8ad66d66df057c9988a9e0f5df0 100644 GIT binary patch literal 12283 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 literal 12289 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 Zu;<4e+mu#KZT}6YDECmdSlZ;({{bAK;j;h$ diff --git a/tests/snapshots/v3/test_wifi_paint/test_v3_wifi_ssid_entry/ssid_editor.png b/tests/snapshots/v3/test_wifi_paint/test_v3_wifi_ssid_entry/ssid_editor.png index 158d4fcf1ecdc42b32c6b287ef3b1c39d8a6205c..01b7db41cc0d0be3c5ea9c89c0c21a4b6a23b659 100644 GIT binary patch literal 12822 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 R`Tw5w;<>tfCDi=g{{cX#`bz)+ literal 12825 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

X@2@e%zm6fBTqgev3 z6`vaYhpIkxwcqUn7I?Z}S~-%!vGXTi7ObFCu5mbx=VZQ4mNrgq(rE1^8=KqJoLO9K zY#{WLZLge;j*dbG759=m@Fs9}!Y+rJ+-Z7xdP|>;o6A+o#69{cgO9nsL37yl#W-A# zfsf5p=(Si(6wJ?S10MjSR8{o?2s&1g+Ar$YBInVUY+v`~C61hcatctsYc%aLYW`&FEX1 zo8JJwd8*RlxHB?2IoT6VP^ndmh|Z4Tbh)1)wP)S?{$gRs8IZm3 z@NhkEzE3JD6D4Y;`tDl^T_KnpDMMfX*M!ok5IC(p{rV2&GL`Pgoaw+1Ai%*;#$;rBN^K*3Tel>aA#D2+$)cnRCkS>arRv*PUJ_EE-hmT5KR@Rql{Ys2UM@8plbTwhTx_$r>##1U z`G%f8ncYMNq*kS#+0LHM-4lEoTx<8=P zrBhG$E6G`uQcXezf7NWvB3)wM81;s_~j6UfBT|U7*ErH37#+!NGC9`ZHkr&s?opluW+%5AzsG@qA^FDu5J}vLLLUqew`* z4+AIDIVyNQRR4LQH-e-b-S;ng>#_Nwp@(fSZ{dol3mtQ#W9@!aO{#w`W@*i-4p4r*PDojUF$xl=ICq z3%DFoxV%(lc#Sg4!yJVWF9~_ao3s&>TBPG6a&cvO0VoJ;h9|k5TLg4>)iCWpH?}7W@!51o}Qg~Y$a&?9vlQ}#sij3pwKW5Atl7Gy))7V zc0nGp2kR$0kZhRckt2l-Ar1Gw%biW-mnMMRVdw;zs?jL2LM}+S2g-K{v-KgnW@Q8! zbzRbmj);CfT^>!B6b8F4h!DCzd64p&P6Hp9?5t{KCpKJE$RZ&Y8>I0qg#pCQNVF3m zEMBS3i9&^$Jtx-IzhAnj;X1Q(HDE!RERip~2c9|LPeeq-pCMnY>fzxL+Z9D71eDBb z9a8GvDDuh!i~|V)r`<8RG;UCni&eEjhSSu%*-o>KZ5z;z^y2{83vuGXoRhd(lL-%{ z17rgt4%1{uQaDHjvQOynt1XA7SFc_f6Eq^{T(9_cWtT?uX3JBevVEeNivHJU_1$fHvUIa*F)?`4hl8{tTP>9~RrOu#kr8 z&e@k(_07hzIz?t6(FQ*rf(6%UeR`mM>CnUVil5Y)>_%gf4+ zr}^30Q07`L^wniWef`YDM3N;b$hfVOm#{y)z`%H#$a)IA-f&XnhUuKsDWy;N4Uiwe&!AD1F5*jO zixYv>>~f?H3dR0ZDag!O{N*bxuC}0C;SYyov(!8_If+L|c=HRDwM@4O=j85_9Q>f0 zhliwugwW%~#7X--OV%jZ3+H?`5oFPg28Hqhl+g8LtC@<|AtwtBm>~)o{0XGTv-YbX zO}PkIF^GteSAIQy`{k0O8U+<~fP)jJv#rnnEh3y1=b!Kn5QuquiIFA%s-3i+M~YIo z{ay9fE>D!E0jjTU+vPMWYpdT$M;|i&m}T9+z%46V1d;`4rX^)$2=zChA|YmjE3}bWP)V}C)z15MuAl| zcL*d`5-2_1ZvdA^()ot z@OSl{!;c?7IQ>Np7zRHt)NgHVjhl0d^#d;lwHm;E(0&@$iyts%(QW*@^89pNZPbTB z%3J00co!Oq>}5VzV{$NEE{5z4uv8F5fJii!a7;yeS~LV-A<9x%@du{b&f8w-ou^Q>oGH8oIdyAAF2_4VJq z`?))wH=t(U8R3_rDZdS<7vN0F^78V4zoc-OHDBtSfeQc#Gchx>ovV>xND#i9RMBN| zeSUgeqICmy$EB11kiu>P^ncJnpdkMm8fs9j3BYB6nY+8Y))f&-BdvkIUM`~*C;^m| zl=y;|hbtW`V0CI_iiy{{RK3M~N zD=-kACFx*o4g1xr$Mta5e^8khs-r_f)@WEe*VfLQEdoJ3%J*&}i`#bDYoiy09cA1=Noi@v^V2=pHkwrQfHAr6!)dur13y3i-8L-* z$*5ic$4+Ju z9uucRzyip|_AdAwx4V0K{ADfu(0=$YK@MREH0+~D`PL5)A#nL9=)A84yq|Nd=hW%XGOi87F2T|!FA)5Ak1|4&It38*)OF3txrAb~vJ zRX#WSJT}W0l5kn7IyyQ!J3BYL6}wc`&|t*-3Y_D3xs4QFtZGgMf%QTgAbsvrzRwTv63AZI&O55O&O(>l7p2-`+rFN%CzAB`My5us6F@3mmWJkLZ3--D8XO?{93CFd&d$ciM*SQQHEWKfYgFNPo}XuiIG|NaFE3J6WAnBCtAjQG<^T7Ysv9URz`1{0)d zfU9n6lM6xf#sP&oP1DO)2IB;}O%C~44LPn7Fd>0~t6Fs~$-0B^2ne@#cUR_H&0Bzp zSl02seOsNMFTsRgt6A3A$O}d$P*MGcK2_-W_D54X@h_!|@H_7JZ0_tBp{vm2#Yh{M zdSFBQuuA@Dq|G4{dBLV1w0Q_&X-7uG=J-+>w-gEqXNj1Nkao>biUk7-#sRpli!D!D zbTpgwEZf7}%E~iH90lX%VBn#?KrCN5%jeD_U*=wm)4pGBR4#S`HU(t~fTTW3l%VyqtwCUgdfH2n z<-v~+CBNMO;53+lvwm}yX|_ZkEi^Cmr7D{RB9NJ>si}#H znuf*#e>evvrT^%TEKTfS5-SfE7m&h$Eu82p>dc2^Z}%yrsFbyh-7Fly@RfZT$cP=cUoli{~8IRbantfsh7?gq|p(i06nn7a`z zdYqh`(Ly0W@BpmZ0kBF?tXz*5tEqqf{w)(Q(NU^V>EY=~M@x%{gtWk4kN4^o5MDvG zU`dd%?|&uKzhu|yXa5Sc?g{Ymxj8w(>I za~t$iD019&)l z#iCUMPifp1{84guV0P%z>9S!ce9sYVO$VMp&q^zSjeJd+bN9U|n<&BR7&SkbE-^T!>byJE^V3ZN3u z#vQG6bmZi`D^}fiY6h+y*HUMVpkPJmD}g*W?)(7MxQ`z{3M?;G1aBnaE_eK+%hbS$ zI633x3pd`ae(DMaBWEB%d`zX5{02sUcx>l&$vMaV{P{9dhKPvx$DC6^VRUoTcoD1S zatF*(0RXI1;8z!DuYPo&o~CGDN&)DxZUG&|LaReG`-@2{T@<&r(J;3WD}W) zfN&b6rJZ-eOiS#5JS=Md78?AH$`yr8WH>|EBFd zGYbm~AK#qVD9Fq}kHbTe(9_E(-vbFHO}$ii96kXtAhKQP)fLf+TGXN3-SWtk&?2muJwVWI39{gGMU3FAphm= z-_Ts#dcM8{01+Grm?Q#|fcg3PK+%N)^*H@iBs`E>-P~@X zDaHC(@dTwh+jdL00>PvXm^B1>q_Ia+OUwOaS?IndIXyi+Hda|vb9T_59wQ_!F_GJ8 zR}nyuDN7w~ZJ@iFW~oJe{YuPZqibhZrC#a{0urdA0P4+#sN@}j3gacv!lUz58AG zX!YPAEj~UFmx-CVu0>xmZya1p^y<~{#wlnap~`RCbsFktkV%=M>~clky;}`&wl7m6 zZ=8gI@F2n;`m6?tx4|dkVxWn31}Jr9FT=ngyNy{8P6|XrlK2DUyH-Pu#$IR^PWT(i z%)n3bDposO6oxQx?t+<2=_uGA_2_7MKOtkbnyfru3Ah7-*)T#F$SS9!zdQKqX=K5l-z*i;LA7p$(Q zyPNQrx3@P)Eb!-B&+`CwH zetDS;56{>Gc|~B3*VE0-*wi#JDG4>`S9?F&>U3kGA2t+JocHqbVAOP*)Lbr=(_*FF zn}Ain`y+E{#y3?4z2)urVsOxGh!Gwl`F91JmU?*E1bY&PVfg z2Q!roUC+2|e)i?uY}EVhhD1uMI3=61F@pkA;zKCYy%FZ}5j zyh>p=m}o33V`5|smpLkgoojKeEG*msGY;Yy#tS@<*0Y@kY{GZD)DtD15)wT?shXIWm?_smB1Y70K#_Cf zT56~)DX|1D`qAq&sG*@jlc^nO=POTFJcn+#fQPyrlsB|LoXM7}Gh!hFrf9v{F%1j$ z1HkOoiO+RQW&0gU2h-E-sC?9JgUyl$SVR(VL5m4mP+kCR0`kV@R*WmE<3GyW1i}Dh z+>YCA62Q5@j31zlz)q>>ncg5Ar%E-Rk8FMKK?HykGb`oMh3rPz8(jZ7wqJc3g^U$; z@&akzB&VH-I2=fgwWkaG^;v4z zMI-}geFUcpH<6X-*bzv8$M+QLLks?S$1}%h5bsB6OcrW1h>cwA`A{V_ode*fTDawa zXZ`)BXWDi=)|W4Qfb~0wj*tHV*1ufTX`yD$cy1X9`0qMq_9p{K(RGCWQ1ekl<{OOh zaydS>?+{`{#8?l;BjtCj2_LHOV=;;mqjfM0zQVYcaVs1;_o>;&OH^MHW0bWUE&d=N zhD7JJWE?3H_1rnVV$ox#FzReeo;9PE#7NXhC+qvZ<&jj2NDo8r& cud=zROdO2k zhZE}f>1C%O;{OQuY}xiR^Bo(0|9x)t@Y0NhpKQFbyA=o3|Z1`+=2E7jmrU>7zack_*9WV}U zNHqK3j);1D3pwB@!YaagC27Fq_j!Ri3C(jGyGa@8^hj~4w}HG8UH^USstD7Q+7Ox0 zbRtx6>+&@?2R!k{CKvW=f-_?Jz0a;M$FQr26`>47#_vR!AzL%fHgEA-?>Vi>>pJa! zUz`v7mFt!^YeO`ObX&QKoel%(zpHH+cC|XUIX9xU-fSPwO%L(HgDt?cw-o!W)BogM zB>(t-9vjS1MPoo0`SZ%R;@^I5Y>Hqt<&hyaXvl;R#3DcD>%wcUk+x>WO_+brU75f& z_hog;TE}l2^G1n>#6woTBE{~1v3;lEb`t9kY`fZ0f?}Nz;uza9wou@vd3 z{P(`%JM04dBEj`4elr)sf0lt|s8Z={Yr^GGD>M1;k^p^#|97bR|KpQ>gxhCEwpB4b SX$q%*x4)N=7q5UCeEDCG8qS0O diff --git a/tests/snapshots/v3/test_wifi_paint/test_v3_wifi_ssid_entry/wifi_dialog.png b/tests/snapshots/v3/test_wifi_paint/test_v3_wifi_ssid_entry/wifi_dialog.png index 1eef0b996b7bc610cb81b305742c8593fec3171b..d1091d1b6bca300ed33b392b3639d2f67509324d 100644 GIT binary patch delta 8971 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 diff --git a/tests/snapshots/v3/test_wifi_paint/test_v3_wifi_ssid_entry/wifi_menu.png b/tests/snapshots/v3/test_wifi_paint/test_v3_wifi_ssid_entry/wifi_menu.png index 390fabfdffdc091ef27408f8b262671fe232ee52..f99fb5728ce1b35a6923fe8cd0b190f84c947e2a 100644 GIT binary patch literal 10734 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≧)OhTg7l*q6zIcw1q2Mq4nbnx zGuy5|q72f9!ivMES8jTHB=GpywS_5d00ngqBH9#M2e!fJ8b#n4}bkGPz0jOPOW?NU6*-C%Js;+(W$g(*ATRF!O${9{a$9wWDf?-Lt=9U&tJY3x9#!n{5 zNdQZe)ef!KU|b=YUsYH4@^GS$Vwo1OQ$|==SYczE7P9o0970w%I(1~#&({o#_rU{y zz&|KC?grf-nLsLe^ym?)-ya|x3n7WIv1&Rxn=31yA|tQ$)kS;ID!k6~>OGF4JU+R) zY6VgPP3E!z5HUXP4uUL*tx!#`&dUTf(8SJ;wi})0E|)I3_V)I|sYK)(3PVGC01HD` zYdGJNIp=-b0$ddx)Ep}-kaZtdzgIs$$pv_Pv8@Y4405<{R2cj!Cow(Cxo5|xycu+pK;fDsg~`u+|vu@f8w#0$tFy#P2j z$Gi}&}2H~ZMN ztB}yX>=&d0J`@yKNlA4|@C7XGzQ-j!-Dtz*kd;ltFfJP-3-US`R+sK&0ym3^iN^Up z1%){6?SVOcfF^jS6XnSVa zzS@;bz-@0KPrWFlZ4M%II*ftmm-KrB6Lx$HNN zPVu*IU=uxg(kB+x33mtk`=ga;>FFtq$bvA$ETr$@;em@AIzFzs_Z_^qVZF%Nzb6Z} z4uB;<`0a^fXLuTREpSF5;z2~k!pF~2WV}x2Q&b2R_;9$hLni3Tv7dT&lb|?gVPPTQ z?b{>n;9>C1AX7mv*?R^I6zm=02DLHJF2LORP@0kPpyUw|j+JG~U-Z?rHR);9caZUk2o^l*ZV5#8@HCFaA-IDyI<8tmvoB@7_thd}(KEOUCcG0vfpW7Y=jR`_%! zL)XMbMq0W(EHW^pv#-y_)Rfozyz1@Sw}dG3^`=k|Qt;xWGl55e7m3+KAC4_3`Is@k zpn&||J&Y% zr&TgEG&D9|0@<$V9onlV_kC&XUS7m2RJ5Xx(A9z!Sa*UjJ`sLOF*cgzB)slkNCbz0 zXcGe23Xf@ehl1jw0P_c11R@w6^_h~=K(&s)rB=?40X&0c^78b!`+I z`wJq-@$vETTGR?Oheg~Fr>Iy}I6jSv}25V9GP@9iBN&OpfqeX`DZQ}ca6oqh}E zq(J`2fKE4N3`#xe5E2G$iFzn=y`zggaSqkmky0QkiGYc-Hd3Hv{@NMbcAV`+R9`0K z@h#qJ?JX$rH5ca4a>#;iZy8^n^!XT&Rls9QpSOc^XHV)rQDJ3dLaNP1DiYr^3j$<* zVWB)DQHp>|xGil~t9~Y`P-cEB`B!6|l@!7a9yE~BML_%ogE}!G0Z!cbXMzMw` zba5!ZP^z)}V(w|T^*7-)sNtu5rWA5lp(Au!*Nl8%j!#bBn3w=hkFM9xWkD`tJO32b*Pn$*1^@CcUOQ9(pX1pZ zCMG7IwM8!WU%9$g6%=fOD+4YA39Clhm@3}QAAc+k5X`x6-*$k`%7Ir43=pJ%<)4W! z4&OM^&W8>SW%+YEz%e@!x4lwpKu(> z*U{e+6z`!EKSo+xgCNLfGhLU`E#dqwJ|(4he%JOvwi7WLI$C3Y5E>)}x7i>}6RP-6 zBu9nK307IXwkQX=|bqf17-HVF7$Z*(6?0X6D>4UjU9UK;4E`4Z#LAzMb4; z@%Q+6LVP@vo7$KEjGP;YiQTY2C<6oCfT74tW?DZp;vew#BjOtUdV-T4Jy`*fE1c*!S=` zRd$1N*3o;qyLCNxB?JU&0|L+~BV0h;Y_6tC{P}fgb-|H9OpsDxeT;Gm*^%P5bp3*8UFW=6=%FG;MTOs>H3|=Al z*kvRi|9COcreW3WA&Hx{tY0BhM|-<89bq%Mv6>o5YTwb};fO1VrrSR_cX#&o_#r=J zWy7E^M|WMj*ZcwkyNU|n5rTR9B7zdaiZJnKiil5x2CHtBZ91kprznSi(J)$ewx6FL z04p{oCNprP%*>b`J<_SPPL7Eowi8oSB;YH=zn&1EP&K!hkyz@=d0x#_|s=Ma=)K!xq9Rl&IUGxPJlw`*K zKulSDJT(IpL>e1>{=X>6e+b6^TcXi?Z=<2|$o=E*9~~Wikc=z3?CUG{;m@BxkjImx zbjWeV)2pcC+5jRff_#|+em=h8krD9x3K=#&WMt&wYj6k+o7ZC;V>;&Q2J}<&>GYLU zR^FIT#On{_VWJ}p1~tcp&G!;b6B#`R%mp+g5PsnO9&NTtt)g)H4HC2!{6AhuojU{s zJAnFKrrlmFtD|Bf3n)b;hN(bp6lcV43b6P#ZJe%8dynHT$AzkykgUOXG`c3b^p*Lp zY+;l1^anRTAwKDL_`4tXHTi{eBTn!t`gEuBT@mbJiPUW7<0ytO$~K+b+b4 zj>+nGMz}N(tOP|i#ERunhTrV_kBIhhudmo}FsGS%zATWECpBBURgBP}o^DbRRXV!I zKlrI|Xj=e@QY=~*nMvL5U zi5Q~YfK#iRI47UoZ~S`$lK4}O_uW9$4@LZZ z3r|KugTA98QNkm$eLowdqV#!*{AhIg=^|o52BZHWi@;&bUC^RAs!8-&XPUYAs{ilv zRhZMVqiptUPQR1-h42mV|NGeAD*d&-9)n@>^(Z-scMA|C2wdARISe8zY{~V@{d4B8QJb#FHRSnGo%Jr=*C8@sk`j;;y!&bPtWx!;vm7xcD4rpWRQKafUl$^`mHdh?)RLRP0Q5W{M=Nd&2mvn*QGkzf1 zIi0U9)oer%69EP?wza-)`7ocK-&R|oJ%A2@cy-8&BqBh3#S-g$jg=XvY;^VXu*KEX z)LN|M20}tYB&DUjJU!Dy{Dm1A<=!-*!y=x=*3`U?AE>UZF!8fS(~7!P3%_zCW@bV( z#8C0f$-f5&2N)O_2?+_{8lqFzjBRaEk&TvCvMK{L#`omp>zf;OH8o^-*x@fR(b1~A zK3HrS&-V8B7Z(=tRcA@8b#!#>>`Fw*$r)k7rL!w$ZE0y~`P1x;j8@jxPOpyFZf?9< zmN~go_BS?qwoY+RnBru=fB)Xx+>9mu-D+lXvZ|>p%aqc*M~n?j5$@vRLY1K=J3G6u zu&}hWv}y8(vQ-O-jEoFEK0ZT&wSz;MJ4{M)vZsd!7Z=x&NAt+?iH9Ic=<3P}1y1DA zQi!$-k9dHz>)p?G8{`}eAF6!gGJ5{n?_HcJP%5L&v zG#n3%Rk`5n;Ku5_y1F_kDe1Rw-_mF+_V)I)b#y!h^_`ua<>XM0pWkL zC@(MPbKb<-NqC!sNh)}BcJ@QL02ddxp`n4tVQKFqoZL_pDogdn`|@DilB;=zI@m~4 zPfyRpBwO{tZ8}q@+DZrMz{U%JIR4~1Q4!d@xEy%y6P@2 zqT%`ZlpbTp23<9Nj5lxI82Fy6Sz9w?E_HT_*Koj@7`6xeIri{4{k=hiT=T3wqB_$@ zXE?J`iLN+5A50z%4ebR==oLvyP7by3sqXvtnZ}RF9@wy5<&-j?@{9Db*bFtfUcXNG z_U)C4DBTON`TYF+9Le%{QK6XAHrCcVySr*+)nt55>owE*5=i^YZ3gF#tc0_tJP^nY z!BIa9fUp1gaY0~OAH%e=vTAK@y}F1Y=K02=SC|)_gk*L9JAJeyRKL~7Q(PRjqRDCF zEjpeBEKRVuFS(_IgM+p8>ahpdr=g)CCRWzzp5KIM(yFSenwpxTq5&W_YHD1)y#=77 z{#QpvU@`ps{G_BpSxRkm&w2*Y0Ll!0W2SW58cLp=&)Er!8AzO7SXfX{kd^HpO6I&g zTz*`1U$$cRWk}%nzSz?+@J;YwBmlYIFhD5awikqe+IqDb6&;QCt1WOEIdDmhoZ&o% zXK5@8yQH|d)_(D3O2>gdzm5|PQ6g&kwelZV@%tliiNXYqOgT9v#oN=f<#a?KTRLXq zhT4*A?&f?q9GzI2#LCW2$m`5fK>;JSFI%|)0AE))CY0TzHvk5%+RxPl9v&@U#@qY$ z{`T_myv+apY*KM^b93&sfwJ;M1U6-aUZzsL>A+LKV#|>Je50tSC@-(N`1dQa$y7>Y z>-%i!cTi#9{?8QhG*uN974`L3?SXJ+W@g=rU*h98j>*$a9v|+z-8?<7n>|k>^bmuw z@$q@Uctk`*XyPNAUf-_8ij1W4O{QrGhbVb?Tt%_A5@2B&8X3LU(ed7&tC0xDcweA; z66&@$6PKP|`h&^d-rjk0h>+blBtBl{{d;WT2s1VU5)4{^W4ydGU0uOF#^aXNAd+@= zc0?ZUIB99Oc77MFr{?P~ky^a7v$b7aTa$?)dTlvI4x-E`NtB$9k+I3^e5b*A3t*17 zzq?nkD0zNq=~U?&v9t3j$mY+nwzHL?#rhn1icob%N7tfnjdl90?qa8SGYbno!{1*^ z61-l}^EEYH2RN-!rtiDfi;g}K9TA~fYfJcG&lMP+dUbULf{IzEwz{q^zAZc#EB>IFUP1MwpFXDSHK`l{{LiIxjU$TWz{g}W|aU*MMYa^q~yu2-dYl2`C?&_nW z6=flWYq@nL=cCk0hfJa3~htyS0=6AL7t3c)5yLTNO9UyZO0qOF zliJJ8&E4GCSeXaExHvia&SizudOK%RhOPc7CWd+kOWblaU8wEhhVj7tw(ar03<`zr zO#TqLJAyl=I&CEJ@$UQd62$@~v@V%Qc+QThJN~ylY`AZ zH#s@ExVUKGhez5sFhKw6RaVok_3;7L=jRkyk&;mV2fhhJl+l=K4z@SH@~y3Qr*>Ca zEM?lkTF%bSc9)8yPOd!{MCk17jIhg8%4a)iaN0mIGGk?B)zFwOEMyS;#&^vXYH{bveme*A9l_5433>MHSyMxUmX3})-(lgH%Nb%NJ(jq|Xgc*_I-heG7TbYZ z{oq{oVpDdAOe|@Mev7saJ^@^gxhrYB_pZd% zWWsBhNjtu{=q=g%^GB4#*49?F{=Tp;6I3ImE9MRvGG8v=n=?|CZT7LSozJMh$Hp?o zQ0QM2HvM}Wyu16Q|KsiQQ<5crDJUtSK3p}b^p4DyR+D3_YjrpX3M-)d<>4glDg>Q1 z8><^Jic?dp62NagK0Yp75Z@o^v! zeJLQl#~{dgdw;ncmo6(Omm=s{*+}srff6qYlZ5x^py?1t29)5RYsZbcgK?ifk1Z`J z3>~?Ko2$vK={S66?b;lLlD&Ls2N;5hNjz2fRbg%}B6Q^!>hSO|;D%FPl^}^2 z85mxZ|1+7+pnbh-l?(2pA>`YP_nk00Ca>>s?m zZUC`yjYqFw}S;O zeSK15Vu25TL;*IlY#p%Z)*pc_l9G{$CFJZK9gQ6}2O{J(H#Z7=(A?adfcwGMuV3kk z1rE2jW#7D^r=ug+H_tC9Xz;tg0l=}px7Tk0h-1}K1&pbk35lGt+3_x4IN;hkRJfgu0#8e4WFkS}r8xkj)XQxv{Y!m&k%}4x9VYv92A7 z0%(@wwLVNT;RS%b9UU<4DM~;PtE+#5LJc%E^GgyJ|0fB)!7UV)M#01!9UYaSk@4{0 zt+4xou(!3bSZhaI@y_jXHWprf!RdL^@_J!$Kx9I-|2KEyH;pKkQUjpMjgOBrYLrTb z-En{U(q#Y3<+{wYFmykBWAQ@1#k7PWt{Ryo2QAU$i~oesl=<_b+53{_c`xNMdisW4 zJk3a#XXr%h>+3Fn2KoE@-@PVhNtAPQ|7l(YtO7v5jy!b11iPcAg&wAU{;B{MVAq4nDQ?c1N(GO-cCsQ4_V6`CnL4$?>n z@bKL|J)T}(Z*wL9JxzN;oyJCIeo&Pi-Q1QMT^Sus$Frn>90#>j8tI9ruJ^}*Tm8;| zYuw-6UHLr3QOX=Fw~>*M2-?kYfv5)q06aKe52L=Jftrfy>iRl4IoYvc!NBi2r-|G_ zuUR3#d8MYRs;agY@S#{T5f)a~KDMF0zVOklwFA8wTQ^x*Sv|eQGy(U*qN0~1BmlJl z;WeRt_XyyGnU4L-M z-Jss2atJV=lY?V*-PF|d*VL4>q@;_B%hzw;R%zLihuZG<9e}O`YY77b1J(r)?9HVX zZ&XxNJ`x3hn1CD~yz7{rp6=^=%6p{DOo?#7aPeQfz``dI@~W16)p75QfQaY?f`gym z+`wY+a_F)cWpX3vS3qS}0z$cK`f8?OK@et?OIsXHZPGEXsfbQZls^@!D0>6f&Gh!X=5YFL% znudl-f$D+~d5rYwc!^XtHQCV53>{UD(K-nzCdxKU$TA3prh0U7ob#jMFu@$3C-+7m~y2@I}% z)L#o>Uks$e}XYLhmzxg9b;hN z0I>eW3sV~#xlcz~j8IM3z(1SADWF;aqX7*SwTrE|zFw1}{8iwaLVOCo5`%sN)x$Kj%glXSbil7@yHsuN3)9BDk9oBO6)v80foa zA{;P>G*%N>PK|X%eJ}LdcvRZBs~cu%#AR!S7Ow1vu6nW&5ruX}`(4ijh|O6W)<0kNa)!BG6e!$j_K_nOZQ% z?@psCmFKM{Gn)4+)YggFGIE6m}wO>Cg8?O&5E84wP#=S?&U>S6N{n6&LS57j5TX z!N7d;qf(lw8?~X_Y+v7|sd%Dkeqhs2qB*XO*mw-OE3*4tWg3byqy5l+vi>@mW8kW3 z;3N|3#7VU2@p?g{BR#@CtosKpzqj)^<#kY_jxN`fL9V_GjaQbw?Hf_lfB;ummgx@C zN*bP5+pKTan4JTNiG*ci9;$ldHBJ4P#SVLg6D)n7H>!Tj#qd6WZ)%$wq!-WZf3WX| zEiLwL6eHoa~s+ z9Ph}Nlr9NrHz+#T(e6)dsgaXK$g;JsZx)b)&G_pozM|U)3ypUsv25ly25(C#q9>gH zUQYVeBgvB?m4PsYyWU!{*MW06dyMj8*t5|${Bof?wv@g|JZ`t~UVSdGHdP!t{KeHP zvH8e_ols$kS&cQ$S>@t0A;p`{hUAAW-;ndSBS0be!TQB`&Nrz3da+3wB`Fs~n7lVz2ZutEWdN<-IQ zj^T_xc*e{h&el7w{ZRf3>_Oa5fQ3s_6viNigom3D;Nj8uvyZmdyB{tAD=gxP!=&@O z78V!p?bkv1Mx=n8k@@@gZ<>EpUAt*P3M8qSMxP0Og}i~&6N#kR)6)YCt{K4o0NXgGe0X>u2=hG~m$|avVsS}? zE77fM{^ouE{yi{U_#0FOLBL%wp6=)nqr$;v z)(0kim=W+Lx{;rZ=gky{qy7GVSrB*<5>2)lfakL4``|ev18G54pjzmK8f`QaP57f8 z?F4J0&VKP#c*4-&Af;bcKx`~#m=Q25yCmN8@bFCjJqrkcpmiZ)eD(bB_;7oO01Fdy z@hds)VRiRVCs)s>e6g-JnHTvDQTk4q>FRm9-203Un%R*;EK zT~`CNP&(w#o-3W9M@Jt}LOC2)C9_yRL!lzzA4SE{K)7e(j}4;`7#msO7kYSjxW{Y$ zUzcV*7})LLeJwsEl|Y}Cl)R%b16<2khwjDPjNlgX#PD!Ta}kz<9yyk5&P0vP^cS*y zCAt^X$5yPm^}zYy0j~E-SNL<--tdlins=|#xnX=ENSYGL%F3EdQy^JD3X=+XovaT4 zBM6uV>(4qtWId;m-}W8uW!nS3H?ZWpwdRl0qJ6Jd|iv(Xg_{_IwEykyTLG{J{I9m!hJgVq-^vZl9l@S5a2>@*kZl(ZR>Y zj!R7i<{X>H(H~%kFVr6=W^V;Q!vq~tySeItsi|*WD?Sg`TWya^^dDzWne-aD$jSeJ zo&wPAXo!?-Y#)wSdpsiMSO7*TxVoNKTTKFu9+6Dz<2_exrBSN;-f|sg5e9ZD72uab z5?jacFtdO_Q$fLBKqEn3o^Fkb_-b#4zGh@(1h)Ix_BhZ_fW$RvGNrQ_b%J#B_8)a} zaxx!HzX!JKu}AY0#e1?qqI$aFm{}49K<@_l@u07&*W~7Vcibm5a)5`AA4^1yiW`@h zs9|8>e|O~w+9cGlz24)X`z1)olJFK41%>Vf3R=KBlII@Lrb@uM2fEB*q5l0c;om&N zavW48RPK}(;BEnp#z7GM=g%MDPee(+GB7Y;%hrd$z*%#;A1nX^K2kCZm^snW(N7&5 z?AyG6^X&wjR7XfIJfc25sA@P+%|GaQh1>!3O~c7ue^(S12&kidlX@B!+`Pkn5h#0x0#hEM*91%8~J;r>7Hym1x%# zI-Eex5V1bs->s27@`A_!AuAnCuySzl(1UNlq~GiTIyOW)o?T(+_3oM_*-c;38Q{EF zb30&R4}w6$;_hPJ0k~#cP7SZ(wzr`Er0mAsB|3G#D)++BiC-)YB0yByk6wOoYFGfd z?sEORKaP?ejdEeQ89)s|nB7cy;NE9;3W~sm&?Vqv%+4Yt4)!R5a075$R8oSA5(?0j zGPR%HQL{kQou2VHtUwFDu?fCuC;;Fv@C>hjui4w%3#P19Wga)Uad6-VR7ITZ+0lwb zr*jUX20Is9aM|zs{CogixRH{2jp{kd1wO(ee0+qFuTvy5onH#_wOkfII>fg@J{|?_~X{W2>tA>obLfuCDG;uNEH| z641$S({Zi-^JeQzu^?8^h6NM3+@IF~A0?%uouV=v18{JoLQ{TkbpW^}mO}IQ&yqq9 zl0i=b{IY5m;F)2F66grq+3lP1d3dL!rNtb6>{$gS-g%Otgha69D@Rw?{R8-zaDqaQ zu3xS}IXOA3%|}6LX?i|Bg0X!99!KOW3&0MY{OjVxk3>Nln|E$|NhaE^SMInb9g39+ z4wrbq1r;%Z{t68Z&8t^ISRX)F8nkG^;sCZKKpPRxO71p4H}_<*PROyk@*%3DhJLL% zK(Fe9$K?U$^X5hZ7~plPkLQ)x_8s+`59!$;lZ%x`j!=Cc36&xq-}J+CD#j z3k+9~F5ujZJk4pE`_kX-?RE*FoZMV+)PzjP%cU~}88ibQ?yik1JU|5|(gh)h)~bG) zorQ>qXus6lP+wmU(hO9vA3sdNF%58rq#GGjiuHQot6yAUM(c0zD+3BtcK|=%-Q69C zWd|*BH&8AS`3MOKJ?hz95f;pT0>3knMbFyG3L7OfPa&<-`=P}XqnN5=giuyqeyG1c zA3zHdJaEETTh4GAbO9IwQxLQYz)>Ht!PEvCB}D{8NgdPHCF8LlQMRpO+?U~E;~)?v zVz`&@ArQk1QG6mcAvVoO1V}(5`2WAv$bV^z{|B8BA(V*l|76Py7cvHh!rQkK?ktcr zI9P76px|Im@#$0Pl0(OtYSB5~ zAL6kBFKlrICw{1jg9BzS4`BwXow6(y4q$wTx)9%I)$KGrAb=>@F+u=(`UNE!TDmv#)k>%@;YHzN`B&#|yXL%u*?^L7>tR9a+?|} zh9v=;KFzuF`RZrNw-W9|Z2W(XZ`8{k!WX@GU?7&!OSGkDtcE0?*$s7-&Y1Q7r^o%j zy|PWMeOe4oKIQ$i0{h-C34NOQ zc38te-e6Uj9?>anf|HLJ}Y z8GCwqSYSbh4vaHzDogD1Y4R=6wTi$mBx{6p^z>q0uwd+e2%1sogf{29x+D@F5$#%# zBlEh}jw2|&#-B#o&W?zyq<;TpX9~c{wSx_Uh>E&PA-fQG?v z>f7(4s7s;Xc+{CmY5%6jc>)hw)n9HhJ1099JPH0&(i8TO4kZe~Z-4kU?MwgC^N%`fu!F zg#pIA=Q9x3dBT5R%Q7e_wl~rRzu&Iq1RDkEgQ#X?26(IBP^uL>J>8+urt$wj#q_@o f?*INBhv);@XBB0fD4y%rPuJc^DM*%z8wUL!3iX*N diff --git a/uilib/dialog.py b/uilib/dialog.py index a0de42c8..7df1b17a 100644 --- a/uilib/dialog.py +++ b/uilib/dialog.py @@ -51,6 +51,33 @@ def _adjust_box(self): self.title.set_box(tbox, refresh = False) self.title.show(refresh = False) + def _draw_erase(self, ctx): + # Only the titlebar strip needs the title-bkgnd fill — the panel body + # paints itself. Filling under the body would leak through any + # transparent pixels in the panel's surface (e.g. a virtual menu whose + # viewport overshoots its content_height). We still draw the full + # rounded rectangle (so the top corners curve correctly) but clip the + # SDL surface to the titlebar strip first so nothing below the panel's + # top edge actually hits the surface. + from uilib.paint import _pg_rect + erase = ctx.dirty_bounds + if erase.is_empty(): + return + pb = self.panel.box + titlebar_h = pb.y0 - self.box.y0 # decorator-local + strip = erase.intersection(Box(0, 0, self.box.width, titlebar_h)) + if strip.is_empty(): + return + assert ctx.frame is not None + abs_strip = _pg_rect(strip.offset(ctx.frame.topleft)) + old_clip = ctx.surface.get_clip() + new_clip = abs_strip.clip(old_clip) if old_clip is not None else abs_strip + ctx.surface.set_clip(new_clip) + try: + ctx.draw_rectangle(ctx.bounds, fill=self.bkgnd_color, radius=self.outline_radius) + finally: + ctx.surface.set_clip(old_clip) + def _draw(self, ctx): trace(self, "DialogDecorator draw, self.box=", self.box) y = self.th + 1 From b10b3d467872c4db7212a978c244c0956aad8df2 Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Thu, 21 May 2026 07:41:58 -0400 Subject: [PATCH 37/46] Use subsurface to simplify text painting --- uilib/paint.py | 63 ++++++++++++++------------------------------------ 1 file changed, 17 insertions(+), 46 deletions(-) diff --git a/uilib/paint.py b/uilib/paint.py index 576deb0c..1f75c704 100644 --- a/uilib/paint.py +++ b/uilib/paint.py @@ -204,51 +204,7 @@ def draw_text( return color = _color(fill) x, y = self._abs_xy(pos) - # IMPORTANT: pygame._freetype.Font.render_to bypasses surface.set_clip - # — confirmed in pygame-ce src_c/freetype/ft_render*.c, where the - # rasterizer locks the destination surface and clamps only against - # full surface bounds, never consulting clip_rect. Surface.blit DOES - # honor the clip. - # - # We render into a line-height-sized temp surface with the baseline - # at the ascender position inside it (origin=True), so the glyph - # vertically lives at the same offset from the temp top that PIL's - # 'la' anchor produced (bbox[1] = ascender - glyph_top). Blitting the - # temp at (x, y) then puts pixels at the same absolute coords PIL - # would have, but the blit IS clip-respecting. asc = int(font.get_sized_ascender()) - desc = abs(int(font.get_sized_descender())) - rect = font.get_rect(text) - # font.get_rect(text).x is the left-side bearing — render at -rect.x so the - # leftmost visible glyph pixel lands at temp x=0 (PIL `la` semantics). - # Per-glyph descent below the nominal font descender (e.g. 'g','p','y') - # must extend the temp height; matches misc.get_text_size(). - glyph_desc = 0 - for m in font.get_metrics(text): - if m is None: - continue - min_y = m[2] - if min_y >= 0x80000000: - min_y -= 0x100000000 - if min_y < 0 and -min_y > glyph_desc: - glyph_desc = -min_y - # PIL `la` puts the pen at `pos`; ink lands at pos.x + lsb. When the - # first glyph has negative LSB (e.g. 'j' rect.x=-1), the ink dips left - # of the pen, and our temp surface must include that overhang or the - # leftmost ink column will be clipped. Pad `pad_x` columns on the - # left, render the pen at temp_x=pad_x, and blit with dst.x shifted - # left by pad_x so the final ink lands at the same dst column as the - # PIL output (= base_dst_x + rect.x). - pad_x = max(0, -rect.x) - temp_w = max(1, rect.x + rect.width + pad_x) - temp_h = max(1, asc + desc + glyph_desc) - temp = pygame.Surface((temp_w, temp_h), pygame.SRCALPHA) - prev_origin = font.origin - font.origin = True - try: - font.render_to(temp, (pad_x, asc), text, fgcolor=color) - finally: - font.origin = prev_origin if anchor == "mm": # PIL anchor='mm' centers on (PIL.getbbox(text).w / 2, (asc+desc)/2). # uilib.misc.get_text_size matches PIL getbbox semantics. Use int() @@ -257,12 +213,27 @@ def draw_text( # banker's rounding on .5 boundaries (e.g. 51.5 → 52) would push # the glyph one pixel right of PIL. from uilib.misc import get_text_size + desc = abs(int(font.get_sized_descender())) tw, _ = get_text_size(text, font) base_dst = (int(x - tw / 2), int(y - (asc + desc) / 2)) else: base_dst = (int(x), int(y)) - dst = (base_dst[0] - pad_x, base_dst[1]) - self.surface.blit(temp, dst) + # pygame._freetype.Font.render_to bypasses surface.set_clip (it clamps + # only to the destination surface's bounds). To enforce the active + # clip without a temp+blit, render into a subsurface of the current + # clip rect — the rasterizer then clamps to that, giving us SDL-style + # clipping for free. `painting()` guarantees a non-empty clip. + clip = self.surface.get_clip() + if clip.width <= 0 or clip.height <= 0: + return + sub = self.surface.subsurface(clip) + pen = (base_dst[0] - clip.x, base_dst[1] + asc - clip.y) + prev_origin = font.origin + font.origin = True + try: + font.render_to(sub, pen, text, fgcolor=color) + finally: + font.origin = prev_origin def paste(self, src: pygame.Surface, pos: Sequence[int], mask: Optional[pygame.Surface] = None) -> None: """Blit a surface onto self.surface at widget-relative coords.""" From 607674cd50e93a2718192150fb423f4818c3bf38 Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Thu, 21 May 2026 07:46:33 -0400 Subject: [PATCH 38/46] Pre-multiply RoundedPanel mask into cache --- uilib/container.py | 9 +++++++++ uilib/panel.py | 30 ++++++++++++++++-------------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/uilib/container.py b/uilib/container.py index 6eed004e..d6dbbb9b 100644 --- a/uilib/container.py +++ b/uilib/container.py @@ -117,6 +117,7 @@ def refresh(self): c._dirty = True self._draw_outline(ctx) self._draw_selection(ctx) + self._finalize_cache() self._cache_valid = True if self.visible and self.parent is not None: self.propagate_dirty(viewport) @@ -131,10 +132,17 @@ def refresh(self): c.do_draw(ctx, c.box.offset(local_frame)) self._draw_outline(ctx) self._draw_selection(ctx) + self._finalize_cache() self._cache_valid = True if self.visible and self.parent is not None: self.propagate_dirty(local_clip) + def _finalize_cache(self) -> None: + """Hook called after the backing surface is rebuilt. Subclasses can + apply composite effects (e.g. corner masking) so steady-state blits + out of this container are plain. Default: no-op.""" + pass + def do_draw(self, ctx: PaintContext, frame: Box): """Draw this container's pixels into a parent's PaintContext. @@ -160,6 +168,7 @@ def do_draw(self, ctx: PaintContext, frame: Box): c.do_draw(full_ctx, c.box.offset(local_frame)) self._draw_outline(full_ctx) self._draw_selection(full_ctx) + self._finalize_cache() self._cache_valid = True # 2. Blit our backing store into pctx.surface. diff --git a/uilib/panel.py b/uilib/panel.py index 59136a85..3ed89037 100644 --- a/uilib/panel.py +++ b/uilib/panel.py @@ -140,10 +140,10 @@ def _get_panel(self): class RoundedPanel(Panel): """A panel with rounded corners. - The rounded shape is stored as a separate alpha mask surface and applied - at blit time (BLEND_RGBA_MULT), exactly the way the old PIL implementation - used a mode='1' bitmap with paste(mask=…). This means children that happen - to paint into the corner regions don't leak past the rounded edge.""" + Non-virtual panels pre-multiply the rounded mask into the cached surface + in `_finalize_cache()` so steady-state blits are plain. Virtual panels + apply the mask at blit time since the mask tracks the viewport (which + moves through the tall content surface on scroll).""" def __init__(self, radius: int = 10, **kwargs): kwargs['image_format'] = 'RGBA' @@ -153,10 +153,9 @@ def __init__(self, radius: int = 10, **kwargs): self._build_shape_mask() def _build_shape_mask(self) -> None: - # Mask is viewport-sized, not surface-sized. For virtual containers the - # surface is content_height tall, but the rounded corners must appear - # at the viewport edges (which is what _blit_into addresses via - # viewport-relative local_clip). + # Mask is viewport-sized. For virtual panels the cache surface is + # content_height tall and the mask is re-applied at blit time at the + # current viewport offset. size = (int(self.box.width), int(self.box.height)) mask = pygame.Surface(size, pygame.SRCALPHA) mask.fill((0, 0, 0, 0)) @@ -171,13 +170,16 @@ def _setup(self): if getattr(self, "radius", None) is not None and self.surface is not None: self._build_shape_mask() - def _blit_into(self, target_surface: pygame.Surface, local_clip, dst_topleft) -> None: - """Blit the rounded slice into the parent. + def _finalize_cache(self) -> None: + if self.virtual or self._shape_mask is None or self.surface is None: + return + self.surface.blit(self._shape_mask, (0, 0), special_flags=pygame.BLEND_RGBA_MULT) - Composite our pixels onto a small SRCALPHA scratch, multiply by the - shape mask's matching sub-rect, then blit the result. Cost scales with - the dirty rect, not the full panel — fast incremental updates remain - fast.""" + def _blit_into(self, target_surface: pygame.Surface, local_clip, dst_topleft) -> None: + if not self.virtual: + super()._blit_into(target_surface, local_clip, dst_topleft) + return + # Virtual: mask follows the viewport, so we composite per-blit. assert self.surface is not None assert self._shape_mask is not None from uilib.paint import _pg_rect From 8c7618ab5dc17888d503045ccfc5b50b225cce7b Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Thu, 21 May 2026 08:02:04 -0400 Subject: [PATCH 39/46] Replace push up with lazy pull --- tests/test_cache_valid.py | 55 +++++++++++++++------------------------ uilib/container.py | 21 +++++---------- uilib/panel.py | 2 -- 3 files changed, 27 insertions(+), 51 deletions(-) diff --git a/tests/test_cache_valid.py b/tests/test_cache_valid.py index 5b5f4206..e01ad999 100644 --- a/tests/test_cache_valid.py +++ b/tests/test_cache_valid.py @@ -1,10 +1,11 @@ """ -Tests for ContainerWidget._cache_valid flag and push-up mechanism. +Tests for ContainerWidget._cache_valid flag and lazy-rebuild semantics. Contracts verified: 1. Flag transitions — valid/invalid at the right moments 2. Cache-hit skips rebuild — no child _draw calls on a valid cache - 3. Push-up pixel parity — cached blit produces identical pixels to a full rebuild + 3. Rebuild pixel parity — a stale cache rebuilt on demand produces the same + pixels as a freshly-painted one """ import pygame @@ -100,13 +101,12 @@ def test_invalidation_bubbles_to_ancestor(self): assert inner._cache_valid is False assert outer._cache_valid is False - def test_invalidation_stops_at_panelstack(self): + def test_invalidation_bubbles_through_panelstack(self): from uilib.panel import PanelStack from tests.conftest import FakeLcd lcd = FakeLcd() stack = PanelStack(lcd) - assert stack._skip_cache_push is True child = ContainerWidget(box=Box.xywh(0, 0, 50, 50), parent=stack) child.refresh() @@ -174,11 +174,11 @@ def test_cache_miss_does_invoke_child_draw(self): # --------------------------------------------------------------------------- -# 3. Push-up pixel parity +# 3. Rebuild pixel parity — stale-cache rebuild matches fresh paint # --------------------------------------------------------------------------- -class TestPushUpPixelParity: +class TestRebuildPixelParity: def test_initial_render_blit_equals_rebuild(self): c = _container() _ColorWidget(color=(200, 100, 50), box=Box.xywh(0, 0, 50, 30), parent=c) @@ -191,29 +191,24 @@ def test_initial_render_blit_equals_rebuild(self): assert _bytes(cached) == _bytes(rebuilt), "Cache blit diverged from rebuild on initial render" - def test_leaf_color_change_push_up_parity(self): + def test_leaf_color_change_rebuild_parity(self): outer = _container() inner = ContainerWidget(box=Box.xywh(0, 0, W, H), parent=outer) leaf = _ColorWidget(color=(255, 0, 0), box=Box.xywh(10, 10, 40, 20), parent=inner) outer.refresh() - assert outer._cache_valid is True - leaf.color = (0, 0, 255) leaf.refresh() - assert outer._cache_valid is True, ( - "Push-up must not invalidate the outer cache; it updates outer.surface in place" - ) - optimized = _render(outer) + lazy_rebuild = _render(outer) outer._cache_valid = False inner._cache_valid = False - rebuilt = _render(outer) + forced_rebuild = _render(outer) - assert _bytes(optimized) == _bytes(rebuilt), "Push-up result diverged from full rebuild after leaf color change" + assert _bytes(lazy_rebuild) == _bytes(forced_rebuild) - def test_leaf_hide_push_up_parity(self): + def test_leaf_hide_rebuild_parity(self): outer = _container() inner = ContainerWidget(box=Box.xywh(0, 0, W, H), parent=outer) leaf = _ColorWidget(color=(0, 200, 0), box=Box.xywh(5, 5, 30, 20), parent=inner) @@ -222,15 +217,15 @@ def test_leaf_hide_push_up_parity(self): outer.refresh() leaf.hide() - optimized = _render(outer) + lazy_rebuild = _render(outer) outer._cache_valid = False inner._cache_valid = False - rebuilt = _render(outer) + forced_rebuild = _render(outer) - assert _bytes(optimized) == _bytes(rebuilt), "Push-up result diverged from full rebuild after leaf hide" + assert _bytes(lazy_rebuild) == _bytes(forced_rebuild) - def test_partial_scroll_push_up_parity(self): + def test_partial_scroll_rebuild_parity(self): outer = _container() virtual = ContainerWidget( box=Box.xywh(0, 0, W, H), @@ -240,15 +235,9 @@ def test_partial_scroll_push_up_parity(self): ) ITEM_H = H // 3 COLORS = [ - (255, 0, 0), - (0, 255, 0), - (0, 0, 255), - (255, 255, 0), - (0, 255, 255), - (255, 0, 255), - (128, 128, 0), - (0, 128, 128), - (128, 0, 128), + (255, 0, 0), (0, 255, 0), (0, 0, 255), + (255, 255, 0), (0, 255, 255), (255, 0, 255), + (128, 128, 0), (0, 128, 128), (128, 0, 128), ] for i, color in enumerate(COLORS): _ColorWidget(color=color, box=Box.xywh(0, i * ITEM_H, W, ITEM_H), parent=virtual) @@ -256,11 +245,9 @@ def test_partial_scroll_push_up_parity(self): outer.refresh() virtual.scroll((0, H)) - optimized = _render(outer) + lazy_rebuild = _render(outer) outer._cache_valid = False - rebuilt = _render(outer) + forced_rebuild = _render(outer) - assert _bytes(optimized) == _bytes(rebuilt), ( - "Push-up result diverged from full rebuild after virtual child scroll" - ) + assert _bytes(lazy_rebuild) == _bytes(forced_rebuild) diff --git a/uilib/container.py b/uilib/container.py index d6dbbb9b..ba6e54d7 100644 --- a/uilib/container.py +++ b/uilib/container.py @@ -28,11 +28,6 @@ class ContainerWidget(Widget): # Inherited attributes with defaults INH_ATTRS = { 'image_format' : 'RGB' } - # When True, descendants should not push fresh pixels into this container's - # cache during propagate_dirty. Used by PanelStack, whose surface is rebuilt - # by composition on every propagate_dirty call (push-up would be wasted). - _skip_cache_push = False - def __init__(self, box, **kwargs): # Non-inherited attributes self.virtual = self._get_arg(kwargs, 'virtual', False) @@ -186,21 +181,17 @@ def _blit_into(self, target_surface: pygame.Surface, local_clip: Box, dst_toplef target_surface.blit(self.surface, _ipt(dst_topleft), area=_pg_rect(src_box)) def propagate_dirty(self, local_clip: Box): - """Bubble a dirty region (in our local coords) up to our parent container. + """Bubble a dirty region (in our local coords) up to our parent. - Before bubbling, push our freshly-updated pixels into the parent's cache - so it doesn't need to rebuild on its next do_draw. Skipped for PanelStack - parents, whose surface is rebuilt by composition on every propagate_dirty.""" + Cached composites above us now hold stale pixels of our region, so we + invalidate the immediate parent container — the next do_draw will pull + fresh pixels from our (still-valid) cache via the cache-hit blit path.""" if not self.visible or self.parent is None: return parent_clip = local_clip.deoffset(self.offset).offset(self.box) parent = self.parent - if (isinstance(parent, ContainerWidget) - and not parent._skip_cache_push - and parent._cache_valid - and parent.surface is not None): - viewport_clip = local_clip.deoffset(self.offset) - self._blit_into(parent.surface, viewport_clip, parent_clip.topleft) + if isinstance(parent, ContainerWidget): + parent._cache_valid = False parent.propagate_dirty(parent_clip) def _invalidate_cache(self): diff --git a/uilib/panel.py b/uilib/panel.py index 3ed89037..dc6e3651 100644 --- a/uilib/panel.py +++ b/uilib/panel.py @@ -213,8 +213,6 @@ def has_system_splash(self) -> bool: class PanelStack(ContainerWidget): - _skip_cache_push = True - def __init__(self, lcd, box: Optional[Box] = None, image_format: Optional[str] = None, use_dimming: bool = True): # XXX This implementation currently assumes box is at (0,0) in the LCD # and the offset remains 0,0 (don't try to scroll) From b04461f4cf724a1c6610261d4d4ba8cb625a8b6b Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Thu, 21 May 2026 08:14:44 -0400 Subject: [PATCH 40/46] Replace _cache_valid with dirty_region and unions --- tests/test_cache_valid.py | 228 ++++++++++++++++++++++++++++++++------ uilib/box.py | 13 +++ uilib/container.py | 78 +++++++------ uilib/widget.py | 9 +- 4 files changed, 254 insertions(+), 74 deletions(-) diff --git a/tests/test_cache_valid.py b/tests/test_cache_valid.py index e01ad999..9a5a83fa 100644 --- a/tests/test_cache_valid.py +++ b/tests/test_cache_valid.py @@ -1,11 +1,13 @@ """ -Tests for ContainerWidget._cache_valid flag and lazy-rebuild semantics. +Tests for ContainerWidget._dirty_region accumulation and lazy-rebuild semantics. Contracts verified: - 1. Flag transitions — valid/invalid at the right moments - 2. Cache-hit skips rebuild — no child _draw calls on a valid cache + 1. Dirty-region transitions — set on init/invalidation, cleared on rebuild + 2. Cache-hit skips rebuild — no child _draw calls when dirty_region is None 3. Rebuild pixel parity — a stale cache rebuilt on demand produces the same pixels as a freshly-painted one + 4. Small-clip refresh stays cheap — Widget.refresh(small_box) confines the + parent's next rebuild to only the children that intersect that box """ import pygame @@ -45,61 +47,65 @@ def _bytes(surf): return pygame.image.tobytes(surf, "RGB") +def _force_dirty(c): + """Mark a container fully stale (test helper for forcing a rebuild).""" + c._dirty_region = c._content_bounds() + + # --------------------------------------------------------------------------- -# 1. Flag transitions +# 1. Dirty-region transitions # --------------------------------------------------------------------------- -class TestFlagTransitions: - def test_false_after_init(self): +class TestDirtyRegionTransitions: + def test_initial_full_dirty(self): c = _container() - assert c._cache_valid is False + assert c._dirty_region == c._content_bounds() - def test_true_after_nonvirtual_refresh(self): + def test_clean_after_nonvirtual_refresh(self): c = _container() c.refresh() - assert c._cache_valid is True + assert c._dirty_region is None - def test_true_after_virtual_refresh(self): + def test_clean_after_virtual_refresh(self): c = ContainerWidget(box=Box.xywh(0, 0, W, H), virtual=True, content_height=H * 3) c.refresh() - assert c._cache_valid is True + assert c._dirty_region is None - def test_false_after_child_attach(self): + def test_dirty_after_child_attach(self): c = _container() c.refresh() - assert c._cache_valid is True + assert c._dirty_region is None _ColorWidget(color=(255, 0, 0), box=Box.xywh(0, 0, 10, 10), parent=c) - assert c._cache_valid is False + assert c._dirty_region is not None - def test_false_after_child_detach(self): + def test_dirty_after_child_detach(self): c = _container() leaf = _ColorWidget(color=(255, 0, 0), box=Box.xywh(0, 0, 10, 10), parent=c) c.refresh() - assert c._cache_valid is True + assert c._dirty_region is None leaf.detach() - assert c._cache_valid is False + assert c._dirty_region is not None - def test_false_after_setup_realloc(self): - """_setup() resets the flag when a new surface is allocated.""" + def test_dirty_after_setup_realloc(self): c = _container(W, H) c.refresh() - assert c._cache_valid is True + assert c._dirty_region is None c.set_box(Box.xywh(0, 0, W + 10, H + 10), refresh=False) c._setup() - assert c._cache_valid is False + assert c._dirty_region is not None def test_invalidation_bubbles_to_ancestor(self): outer = _container() inner = ContainerWidget(box=Box.xywh(0, 0, W, H), parent=outer) outer.refresh() - assert outer._cache_valid is True - assert inner._cache_valid is True + assert outer._dirty_region is None + assert inner._dirty_region is None _ColorWidget(color=(0, 255, 0), box=Box.xywh(0, 0, 10, 10), parent=inner) - assert inner._cache_valid is False - assert outer._cache_valid is False + assert inner._dirty_region is not None + assert outer._dirty_region is not None def test_invalidation_bubbles_through_panelstack(self): from uilib.panel import PanelStack @@ -110,11 +116,19 @@ def test_invalidation_bubbles_through_panelstack(self): child = ContainerWidget(box=Box.xywh(0, 0, 50, 50), parent=stack) child.refresh() - assert child._cache_valid is True + assert child._dirty_region is None _ColorWidget(color=(0, 0, 255), box=Box.xywh(0, 0, 10, 10), parent=child) - assert child._cache_valid is False - assert stack._cache_valid is False + assert child._dirty_region is not None + assert stack._dirty_region is not None + + def test_disjoint_invalidations_union_into_bbox(self): + c = _container() + c.refresh() + assert c._dirty_region is None + c._invalidate_cache(Box.xywh(0, 0, 10, 10)) + c._invalidate_cache(Box.xywh(80, 50, 10, 10)) + assert c._dirty_region == Box.xywh(0, 0, 90, 60) # --------------------------------------------------------------------------- @@ -131,7 +145,7 @@ def _spy_container(self): w = _ColorWidget(color=color, box=Box.xywh(i * 30, 0, 30, H), parent=c) leaves.append(w) c.refresh() - assert c._cache_valid is True + assert c._dirty_region is None counts = {i: 0 for i in range(len(leaves))} for i, w in enumerate(leaves): @@ -168,7 +182,7 @@ def test_partial_clip_no_child_draw(self): def test_cache_miss_does_invoke_child_draw(self): c, _, counts = self._spy_container() - c._cache_valid = False + _force_dirty(c) _render(c) assert all(v == 1 for v in counts.values()), f"Expected one _draw per child on cache miss, got {counts}" @@ -186,7 +200,7 @@ def test_initial_render_blit_equals_rebuild(self): c.refresh() cached = _render(c) - c._cache_valid = False + _force_dirty(c) rebuilt = _render(c) assert _bytes(cached) == _bytes(rebuilt), "Cache blit diverged from rebuild on initial render" @@ -202,8 +216,8 @@ def test_leaf_color_change_rebuild_parity(self): lazy_rebuild = _render(outer) - outer._cache_valid = False - inner._cache_valid = False + _force_dirty(outer) + _force_dirty(inner) forced_rebuild = _render(outer) assert _bytes(lazy_rebuild) == _bytes(forced_rebuild) @@ -219,8 +233,8 @@ def test_leaf_hide_rebuild_parity(self): lazy_rebuild = _render(outer) - outer._cache_valid = False - inner._cache_valid = False + _force_dirty(outer) + _force_dirty(inner) forced_rebuild = _render(outer) assert _bytes(lazy_rebuild) == _bytes(forced_rebuild) @@ -247,7 +261,149 @@ def test_partial_scroll_rebuild_parity(self): lazy_rebuild = _render(outer) - outer._cache_valid = False + _force_dirty(outer) forced_rebuild = _render(outer) assert _bytes(lazy_rebuild) == _bytes(forced_rebuild) + + +# --------------------------------------------------------------------------- +# 4. Small-clip refresh stays cheap +# --------------------------------------------------------------------------- + + +class TestSmallClipRefreshIsCheap: + """A leaf widget that calls Widget.refresh(box=small_box) for frequent + point updates (e.g. an animated VU meter, a single tab toggle) must not + force a full sibling re-paint on the parent's next render. The parent's + dirty_region scopes the rebuild to only the children that overlap.""" + + def _make(self): + """Three side-by-side leaves on a parent that's already cached.""" + c = _container() + leaves = [ + _ColorWidget(color=(255, 0, 0), box=Box.xywh(0, 0, 30, H), parent=c), + _ColorWidget(color=(0, 255, 0), box=Box.xywh(30, 0, 30, H), parent=c), + _ColorWidget(color=(0, 0, 255), box=Box.xywh(60, 0, 30, H), parent=c), + ] + # Establish the cache. + c.refresh() + assert c._dirty_region is None + + counts = {i: 0 for i in range(len(leaves))} + for i, w in enumerate(leaves): + orig = w._draw + + def make_spy(orig, idx): + def _spy(ctx): + counts[idx] += 1 + orig(ctx) + + return _spy + + w._draw = make_spy(orig, i) + return c, leaves, counts + + def test_widget_refresh_box_marks_only_that_rect_dirty(self): + c, leaves, _ = self._make() + small = Box.xywh(2, 2, 5, 5) + leaves[0].refresh(box=small) + # Leaf painted into c.surface directly (clip-respecting). Outer cache + # was already clean — propagate_dirty from c bubbles to its parent + # (None here), so c.dirty_region stays None. The leaf itself doesn't + # accumulate region in c — only propagate_dirty does. Wrap c in a + # parent to observe accumulation. + assert c._dirty_region is None # c is its own paint target; no upward dirty + + def test_parent_rebuild_scoped_to_dirty_rect(self): + """Widget.refresh(box) on a leaf invalidates the grandparent's cache + with that rect; the grandparent's next render rebuilds only via the + children whose boxes intersect the rect.""" + outer = _container() + inner = ContainerWidget(box=Box.xywh(0, 0, W, H), parent=outer) + leaves = [ + _ColorWidget(color=(255, 0, 0), box=Box.xywh(0, 0, 30, H), parent=inner), + _ColorWidget(color=(0, 255, 0), box=Box.xywh(30, 0, 30, H), parent=inner), + _ColorWidget(color=(0, 0, 255), box=Box.xywh(60, 0, 30, H), parent=inner), + ] + outer.refresh() + assert outer._dirty_region is None + + # Spy on leaf draws AFTER the warm-up render. + counts = {i: 0 for i in range(len(leaves))} + for i, w in enumerate(leaves): + orig = w._draw + + def make_spy(orig, idx): + def _spy(ctx): + counts[idx] += 1 + orig(ctx) + + return _spy + + w._draw = make_spy(orig, i) + + # A tiny in-leaf-0 redraw. + small = Box.xywh(2, 2, 5, 5) + leaves[0].refresh(box=small) + + # outer's dirty_region must be exactly the small rect (no sibling + # contribution): leaf0.box + inner.box offsets = same rect since both + # are at (0,0). + assert outer._dirty_region == small + + # Now render outer. Cache-miss inside outer scopes the rebuild to + # `small`. Only inner intersects, so inner.do_draw fires once (cache + # hit ⇒ pure blit, no child _draw). Leaves 1 and 2 must NOT see _draw. + _render(outer) + # leaf 0 painted once during refresh(box=small) (direct paint into + # inner.surface). Outer's rebuild sees inner as a cache hit (inner's + # own dirty_region is None) ⇒ pure blit, no child _draw. + assert counts[0] == 1, f"leaf 0 painted exactly once via refresh, got {counts}" + assert counts[1] == 0, f"leaf 1 outside dirty rect — must not re-paint, got {counts}" + assert counts[2] == 0, f"leaf 2 outside dirty rect — must not re-paint, got {counts}" + + def test_repeated_small_refreshes_dont_force_full_rebuild(self): + """Many disjoint small refreshes accumulate into a bounding box but + still skip children that fall entirely outside that box.""" + outer = _container(200, 60) + inner = ContainerWidget(box=Box.xywh(0, 0, 200, 60), parent=outer) + leaves = [ + _ColorWidget(color=(255, 0, 0), box=Box.xywh(0, 0, 50, 60), parent=inner), + _ColorWidget(color=(0, 255, 0), box=Box.xywh(50, 0, 50, 60), parent=inner), + _ColorWidget(color=(0, 0, 255), box=Box.xywh(100, 0, 50, 60), parent=inner), + _ColorWidget(color=(255, 255, 0), box=Box.xywh(150, 0, 50, 60), parent=inner), + ] + outer.refresh() + surf = pygame.Surface((200, 60)) + surf.fill((0, 0, 0)) + outer.do_draw(PaintContext(surf, Box.xywh(0, 0, 200, 60)), Box.xywh(0, 0, 200, 60)) + + counts = {i: 0 for i in range(len(leaves))} + for i, w in enumerate(leaves): + orig = w._draw + + def make_spy(orig, idx): + def _spy(ctx): + counts[idx] += 1 + orig(ctx) + + return _spy + + w._draw = make_spy(orig, i) + + # Refresh tiny rects inside leaves 0 and 1 only. + leaves[0].refresh(box=Box.xywh(2, 2, 5, 5)) + leaves[1].refresh(box=Box.xywh(52, 2, 5, 5)) + + # Outer's dirty_region is the bbox covering both refresh rects: + # (2,2)-(7,7) ∪ (52,2)-(57,7) = (2,2)-(57,7). + assert outer._dirty_region == Box(2, 2, 57, 7) + + outer.do_draw(PaintContext(surf, Box.xywh(0, 0, 200, 60)), Box.xywh(0, 0, 200, 60)) + + # Leaves 0 and 1 already wrote into inner directly (counts stay 0 — + # spies attached after the refreshes). Leaves 2 and 3 must never be + # asked to repaint because they fall outside (57,7). + assert counts[2] == 0, f"leaf 2 outside dirty bbox — must not re-paint, got {counts}" + assert counts[3] == 0, f"leaf 3 outside dirty bbox — must not re-paint, got {counts}" diff --git a/uilib/box.py b/uilib/box.py index 7127e4d7..e0181777 100644 --- a/uilib/box.py +++ b/uilib/box.py @@ -176,6 +176,19 @@ def intersection(self, box): y1 = min(self.box[3], box.box[3]) return Box(x0,y0,x1,y1) + def union(self, box): + """Returns the bounding rectangle that contains both rectangles. + Empty boxes are skipped (treated as the identity).""" + if self.is_empty(): + return box + if box.is_empty(): + return self + x0 = min(self.box[0], box.box[0]) + y0 = min(self.box[1], box.box[1]) + x1 = max(self.box[2], box.box[2]) + y1 = max(self.box[3], box.box[3]) + return Box(x0,y0,x1,y1) + def contains(self, other): """Returns True if other is fully contained within this box""" return (other.box[0] >= self.box[0] and other.box[1] >= self.box[1] and diff --git a/uilib/container.py b/uilib/container.py index ba6e54d7..a768ee1e 100644 --- a/uilib/container.py +++ b/uilib/container.py @@ -41,10 +41,10 @@ def __init__(self, box, **kwargs): self.surface: Optional[pygame.Surface] = None self.old_box = None self.offset: Tuple[int, int] = (0, 0) - # When True, self.surface is trusted to hold the current rendered state - # for any clip, and do_draw can skip the rebuild and just blit. - # Invalidated on (re)allocation and on child attach/detach. - self._cache_valid = False + # Surface-local rect of stale pixels — None ⇒ cache is fully valid. + # do_draw rebuilds only the dirty region on a cache miss, so frequent + # small-clip refreshes stay cheap. + self._dirty_region: Optional[Box] = None super(ContainerWidget,self).__init__(box = box, **kwargs) @@ -74,7 +74,7 @@ def _setup(self): self.surface = pygame.Surface((int(w), int(h)), pygame.SRCALPHA) else: self.surface = pygame.Surface((int(w), int(h))) - self._cache_valid = False + self._dirty_region = Box(0, 0, int(w), int(h)) def _viewport(self) -> Box: """Visible region in content (surface) coords.""" @@ -113,7 +113,7 @@ def refresh(self): self._draw_outline(ctx) self._draw_selection(ctx) self._finalize_cache() - self._cache_valid = True + self._dirty_region = None if self.visible and self.parent is not None: self.propagate_dirty(viewport) else: @@ -128,7 +128,7 @@ def refresh(self): self._draw_outline(ctx) self._draw_selection(ctx) self._finalize_cache() - self._cache_valid = True + self._dirty_region = None if self.visible and self.parent is not None: self.propagate_dirty(local_clip) @@ -141,10 +141,10 @@ def _finalize_cache(self) -> None: def do_draw(self, ctx: PaintContext, frame: Box): """Draw this container's pixels into a parent's PaintContext. - If our cache is valid, this is a pure blit from self.surface into the - parent surface. Otherwise we first rebuild the entire backing store - (so future partial blits can trust it), then blit the requested clip. - """ + On a cache miss we rebuild only the dirty region (SDL clip clamps + every primitive to that rect), then blit into the parent. Virtual + containers maintain their cache via refresh()/scroll() and never + rebuild here.""" assert self.surface is not None with ctx.painting(frame) as pctx: pframe = pctx.frame @@ -152,21 +152,22 @@ def do_draw(self, ctx: PaintContext, frame: Box): local_clip = pctx.clip.deoffset(pframe.topleft) local_frame = self.box.norm() - # 1. Rebuild the cache only on a miss. Virtual containers maintain - # their cache via refresh()/scroll() and never rebuild here. - if not self.virtual and not self._cache_valid: - full_ctx = PaintContext(self.surface, local_frame, frame=local_frame) - self._draw_erase(full_ctx) - self._draw(full_ctx) - for c in self.children: - if c.visible: - c.do_draw(full_ctx, c.box.offset(local_frame)) - self._draw_outline(full_ctx) - self._draw_selection(full_ctx) + if not self.virtual and self._dirty_region is not None: + dirty = self._dirty_region + base_ctx = PaintContext(self.surface, dirty) + with base_ctx.painting(local_frame) as full_ctx: + self._draw_erase(full_ctx) + self._draw(full_ctx) + for c in self.children: + if c.visible: + cf = c.box.offset(local_frame) + if cf.intersects(dirty): + c.do_draw(full_ctx, cf) + self._draw_outline(full_ctx) + self._draw_selection(full_ctx) self._finalize_cache() - self._cache_valid = True + self._dirty_region = None - # 2. Blit our backing store into pctx.surface. dst_topleft = (pframe.x0 + local_clip.x0, pframe.y0 + local_clip.y0) self._blit_into(pctx.surface, local_clip, dst_topleft) @@ -183,23 +184,32 @@ def _blit_into(self, target_surface: pygame.Surface, local_clip: Box, dst_toplef def propagate_dirty(self, local_clip: Box): """Bubble a dirty region (in our local coords) up to our parent. - Cached composites above us now hold stale pixels of our region, so we - invalidate the immediate parent container — the next do_draw will pull - fresh pixels from our (still-valid) cache via the cache-hit blit path.""" + Cached composites above us hold stale pixels of our region, so we + invalidate the parent's cache with the precise rect — the next + do_draw rebuilds only that slice.""" if not self.visible or self.parent is None: return parent_clip = local_clip.deoffset(self.offset).offset(self.box) parent = self.parent if isinstance(parent, ContainerWidget): - parent._cache_valid = False + parent._invalidate_cache(parent_clip) parent.propagate_dirty(parent_clip) - def _invalidate_cache(self): - """Mark our cache stale and bubble the invalidation up the container chain.""" - if not self._cache_valid: + def _invalidate_cache(self, box: Optional[Box] = None) -> None: + """Mark a region of our cache stale and bubble up. + + box=None means "fully invalidate" (used by child attach/detach where + we don't have a precise rect). Otherwise unions box into our dirty + region and bubbles a parent-coord rect to the parent.""" + if self.surface is None: return - self._cache_valid = False - super()._invalidate_cache() + full = self._content_bounds() + region = full if box is None else box.intersection(full) + if region.is_empty(): + return + self._dirty_region = region if self._dirty_region is None else self._dirty_region.union(region) + if self.visible and self.parent is not None: + self.parent._invalidate_cache(region.deoffset(self.offset).offset(self.box)) def scroll(self, offset): self.offset = offset @@ -217,7 +227,7 @@ def scroll(self, offset): c.do_draw(ctx, c.box) c._painted = True c._dirty = False - self._cache_valid = True + self._dirty_region = None if self.visible and self.parent is not None: self.propagate_dirty(viewport) diff --git a/uilib/widget.py b/uilib/widget.py index cefa9519..d881c5b2 100644 --- a/uilib/widget.py +++ b/uilib/widget.py @@ -352,11 +352,12 @@ def detach(self): self.parent = None parent._invalidate_cache() - def _invalidate_cache(self): - """Bubble cache invalidation up. Containers override to flip their own - validity flag before bubbling further.""" + def _invalidate_cache(self, box=None): + """Bubble cache invalidation up. Containers override to accumulate + a dirty region before bubbling further. `box` is in self-local coords + (or None ⇒ fully invalidate).""" if self.parent is not None: - self.parent._invalidate_cache() + self.parent._invalidate_cache(box) def _adjust_box(self): trace(self, "adjusting box, parent=", self.parent) From c6901507a818af0e6a97814c9e9c9b7562f8c1b9 Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Thu, 21 May 2026 08:24:54 -0400 Subject: [PATCH 41/46] Viewports are subsurfacs for virtual containers --- uilib/container.py | 22 ++++++++++++++-------- uilib/panel.py | 23 +++++++++++++---------- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/uilib/container.py b/uilib/container.py index a768ee1e..8b0d261b 100644 --- a/uilib/container.py +++ b/uilib/container.py @@ -171,15 +171,21 @@ def do_draw(self, ctx: PaintContext, frame: Box): dst_topleft = (pframe.x0 + local_clip.x0, pframe.y0 + local_clip.y0) self._blit_into(pctx.surface, local_clip, dst_topleft) - def _blit_into(self, target_surface: pygame.Surface, local_clip: Box, dst_topleft: Tuple[int, int]): - """Copy self.surface[local_clip + self.offset] into target_surface at dst_topleft. - - For virtual (tall) containers, local_clip is in viewport coords; we - shift by self.offset to address the correct slice of the tall surface. - Per-pixel alpha (SRCALPHA) is honored automatically by pygame's blit.""" + def _viewport_view(self) -> pygame.Surface: + """Viewport-local view of the backing surface. + + Non-virtual: viewport == bounds, so this is the whole surface. + Virtual: returns a subsurface slice of the tall surface at the current + scroll offset, clamped to surface bounds (the viewport can extend past + the content when scrolled near the end). Either way, callers treat + `local_clip` as viewport-local coords with no offset math.""" assert self.surface is not None - src_box = local_clip.offset(self.offset) - target_surface.blit(self.surface, _ipt(dst_topleft), area=_pg_rect(src_box)) + vp = self._viewport().intersection(self._content_bounds()) + return self.surface.subsurface(_pg_rect(vp)) + + def _blit_into(self, target_surface: pygame.Surface, local_clip: Box, dst_topleft: Tuple[int, int]) -> None: + """Copy the viewport-local clip from our cache into target_surface.""" + target_surface.blit(self._viewport_view(), _ipt(dst_topleft), area=_pg_rect(local_clip)) def propagate_dirty(self, local_clip: Box): """Bubble a dirty region (in our local coords) up to our parent. diff --git a/uilib/panel.py b/uilib/panel.py index dc6e3651..3f94be5e 100644 --- a/uilib/panel.py +++ b/uilib/panel.py @@ -13,10 +13,11 @@ # You should have received a copy of the GNU General Public License # along with pi-stomp. If not, see . -from typing import Optional +from typing import Optional, Tuple import pygame +from uilib.box import Box from uilib.container import * from uilib.paint import PaintContext @@ -175,20 +176,22 @@ def _finalize_cache(self) -> None: return self.surface.blit(self._shape_mask, (0, 0), special_flags=pygame.BLEND_RGBA_MULT) - def _blit_into(self, target_surface: pygame.Surface, local_clip, dst_topleft) -> None: + def _blit_into(self, target_surface: pygame.Surface, local_clip: Box, dst_topleft: Tuple[int, int]) -> None: if not self.virtual: super()._blit_into(target_surface, local_clip, dst_topleft) return - # Virtual: mask follows the viewport, so we composite per-blit. - assert self.surface is not None + # Virtual: mask follows the viewport, so we composite per-blit off a + # viewport-local view of the tall cache. local_clip may extend past + # the surface (viewport-clamped); clip rect intersected with view. assert self._shape_mask is not None from uilib.paint import _pg_rect - src_box = local_clip.offset(self.offset) - src_rect = _pg_rect(src_box) - mask_rect = _pg_rect(local_clip) - tmp = pygame.Surface((src_rect.width, src_rect.height), pygame.SRCALPHA) - tmp.blit(self.surface, (0, 0), area=src_rect) - tmp.blit(self._shape_mask, (0, 0), area=mask_rect, special_flags=pygame.BLEND_RGBA_MULT) + view = self._viewport_view() + view_rect = view.get_rect() + clip_rect = _pg_rect(local_clip).clip(view_rect) + if clip_rect.width <= 0 or clip_rect.height <= 0: + return + tmp = view.subsurface(clip_rect).copy() + tmp.blit(self._shape_mask, (0, 0), area=clip_rect, special_flags=pygame.BLEND_RGBA_MULT) target_surface.blit(tmp, (int(dst_topleft[0]), int(dst_topleft[1]))) def _draw_outline(self, ctx): From 6f9acafaec8cad9315295f5aa76d1f68b82df3a4 Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Thu, 21 May 2026 08:38:49 -0400 Subject: [PATCH 42/46] Cleaner way to do border radii and only fill titlebars --- uilib/dialog.py | 34 ++++++----------------- uilib/paint.py | 20 ++++---------- uilib/radius.py | 73 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 40 deletions(-) create mode 100644 uilib/radius.py diff --git a/uilib/dialog.py b/uilib/dialog.py index 7df1b17a..3c4c2661 100644 --- a/uilib/dialog.py +++ b/uilib/dialog.py @@ -15,7 +15,10 @@ import functools import textwrap +from typing_extensions import override +from uilib.box import Box +from uilib.radius import Radius from uilib.panel import * from uilib.text import * @@ -51,32 +54,13 @@ def _adjust_box(self): self.title.set_box(tbox, refresh = False) self.title.show(refresh = False) + @override def _draw_erase(self, ctx): - # Only the titlebar strip needs the title-bkgnd fill — the panel body - # paints itself. Filling under the body would leak through any - # transparent pixels in the panel's surface (e.g. a virtual menu whose - # viewport overshoots its content_height). We still draw the full - # rounded rectangle (so the top corners curve correctly) but clip the - # SDL surface to the titlebar strip first so nothing below the panel's - # top edge actually hits the surface. - from uilib.paint import _pg_rect - erase = ctx.dirty_bounds - if erase.is_empty(): - return - pb = self.panel.box - titlebar_h = pb.y0 - self.box.y0 # decorator-local - strip = erase.intersection(Box(0, 0, self.box.width, titlebar_h)) - if strip.is_empty(): - return - assert ctx.frame is not None - abs_strip = _pg_rect(strip.offset(ctx.frame.topleft)) - old_clip = ctx.surface.get_clip() - new_clip = abs_strip.clip(old_clip) if old_clip is not None else abs_strip - ctx.surface.set_clip(new_clip) - try: - ctx.draw_rectangle(ctx.bounds, fill=self.bkgnd_color, radius=self.outline_radius) - finally: - ctx.surface.set_clip(old_clip) + # Paint only the titlebar strip — the panel body owns its own pixels, + # and filling under it would leak through any transparent areas. + titlebar_h = self.panel.box.y0 - self.box.y0 # decorator-local + strip = Box(0, 0, self.box.width, titlebar_h) + ctx.draw_rectangle(strip, fill=self.bkgnd_color, radius=Radius.top(self.outline_radius)) def _draw(self, ctx): trace(self, "DialogDecorator draw, self.box=", self.box) diff --git a/uilib/paint.py b/uilib/paint.py index 1f75c704..4206acc5 100644 --- a/uilib/paint.py +++ b/uilib/paint.py @@ -26,6 +26,7 @@ import pygame.gfxdraw as gfxdraw from uilib.box import Box +from uilib.radius import Radius # Color spec accepted by uilib's PaintContext primitives. @@ -123,16 +124,16 @@ def draw_rectangle( fill: Optional[ColorLike] = None, outline: Optional[ColorLike] = None, width: int = 0, - radius: Optional[int] = None, + radius: int | Radius | None = None, ) -> None: rect = _pg_rect(self._abs_box(box)) if rect.width <= 0 or rect.height <= 0: return - border_radius = int(radius) if radius is not None else 0 + kwargs = Radius._coerce(radius).as_pygame_kwargs() if fill is not None: - pygame.draw.rect(self.surface, _color(fill), rect, 0, border_radius=border_radius) + pygame.draw.rect(self.surface, _color(fill), rect, 0, **kwargs) if outline is not None and int(width) > 0: - pygame.draw.rect(self.surface, _color(outline), rect, int(width), border_radius=border_radius) + pygame.draw.rect(self.surface, _color(outline), rect, int(width), **kwargs) def draw_ellipse( self, box: Box, fill: Optional[ColorLike] = None, outline: Optional[ColorLike] = None, width: int = 0 @@ -239,17 +240,6 @@ def paste(self, src: pygame.Surface, pos: Sequence[int], mask: Optional[pygame.S """Blit a surface onto self.surface at widget-relative coords.""" self.surface.blit(src, _ipt(self._abs_xy(pos))) - def alpha_composite( - self, src: pygame.Surface, pos: Sequence[int] = (0, 0), src_box: Optional[Tuple[int, int, int, int]] = None - ) -> None: - """SRCALPHA blit. Retained for API parity; equivalent to a normal blit - when src has per-pixel alpha (pygame handles compositing automatically).""" - dst = _ipt(self._abs_xy(pos)) - if src_box is None: - self.surface.blit(src, dst) - else: - self.surface.blit(src, dst, area=pygame.Rect(*src_box)) - @contextmanager def painting(self, frame: Box) -> Generator["PaintContext", None, None]: """Yield a PaintContext scoped to `frame`. diff --git a/uilib/radius.py b/uilib/radius.py new file mode 100644 index 00000000..7e5f3f30 --- /dev/null +++ b/uilib/radius.py @@ -0,0 +1,73 @@ +# This file is part of pi-stomp. +# +# pi-stomp is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# pi-stomp is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with pi-stomp. If not, see . + +from dataclasses import dataclass +from typing import TypedDict + + +class PygameBorderRadiusKwargs(TypedDict): + """The per-corner border-radius kwargs accepted by `pygame.draw.rect`.""" + + border_radius: int + border_top_left_radius: int + border_top_right_radius: int + border_bottom_left_radius: int + border_bottom_right_radius: int + + +@dataclass(frozen=True) +class Radius: + """Per-corner border radii for `PaintContext.draw_rectangle`. + + Pass as `radius=Radius.top(10)` (or `.bottom(...)`, `.uniform(...)`) when + only some corners should round. A bare int is also accepted by + `draw_rectangle` and treated as `Radius.uniform(int)`. + """ + + top_left: int = 0 + top_right: int = 0 + bottom_left: int = 0 + bottom_right: int = 0 + + @classmethod + def uniform(cls, r: int) -> "Radius": + return cls(r, r, r, r) + + @classmethod + def top(cls, r: int) -> "Radius": + return cls(top_left=r, top_right=r) + + @classmethod + def bottom(cls, r: int) -> "Radius": + return cls(bottom_left=r, bottom_right=r) + + @classmethod + def _coerce(cls, value: "int | Radius | None") -> "Radius": + if value is None: + return cls() + if isinstance(value, Radius): + return value + return cls.uniform(int(value)) + + def as_pygame_kwargs(self) -> PygameBorderRadiusKwargs: + # pygame.draw.rect treats negative per-corner radii as "use border_radius". + # Setting border_radius=0 and explicit per-corner values is unambiguous. + return PygameBorderRadiusKwargs( + border_radius=0, + border_top_left_radius=int(self.top_left), + border_top_right_radius=int(self.top_right), + border_bottom_left_radius=int(self.bottom_left), + border_bottom_right_radius=int(self.bottom_right), + ) From 51c54b8852a99a1c16de858b3a0d3adbd68131a7 Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Thu, 21 May 2026 08:47:02 -0400 Subject: [PATCH 43/46] Simplifications --- uilib/dialog.py | 12 ++++-------- uilib/panel.py | 4 +--- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/uilib/dialog.py b/uilib/dialog.py index 3c4c2661..afe60550 100644 --- a/uilib/dialog.py +++ b/uilib/dialog.py @@ -87,20 +87,16 @@ def __init__(self, width, height, title, title_font=None, **kwargs): def _build_shape_mask(self) -> None: # Viewport-sized (not surface-sized) so virtual content_height surfaces - # still get rounded corners at the viewport's bottom edge. + # still get rounded corners at the viewport's bottom edge. Only the + # bottom corners round — the titlebar decorator owns the top corners + # and the panel's top edge must stay square to meet it seamlessly. import pygame size = (int(self.box.width), int(self.box.height)) mask = pygame.Surface(size, pygame.SRCALPHA) mask.fill((0, 0, 0, 0)) - # Rounded full-panel base pygame.draw.rect(mask, (255, 255, 255, 255), pygame.Rect(0, 0, size[0], size[1]), 0, - border_radius=self.radius) - # Square off the top half — the titlebar decorator owns the top - # rounded corners. Without this, the rounded cutout clips the top - # of the first menu item / content widget. - pygame.draw.rect(mask, (255, 255, 255, 255), - pygame.Rect(0, 0, size[0], size[1] // 2), 0) + **Radius.bottom(self.radius).as_pygame_kwargs()) self._shape_mask = mask class MessageDialog(Dialog): diff --git a/uilib/panel.py b/uilib/panel.py index 3f94be5e..e2a4bcd2 100644 --- a/uilib/panel.py +++ b/uilib/panel.py @@ -19,7 +19,7 @@ from uilib.box import Box from uilib.container import * -from uilib.paint import PaintContext +from uilib.paint import PaintContext, _pg_rect # # Note about coordinates: @@ -184,7 +184,6 @@ def _blit_into(self, target_surface: pygame.Surface, local_clip: Box, dst_toplef # viewport-local view of the tall cache. local_clip may extend past # the surface (viewport-clamped); clip rect intersected with view. assert self._shape_mask is not None - from uilib.paint import _pg_rect view = self._viewport_view() view_rect = view.get_rect() clip_rect = _pg_rect(local_clip).clip(view_rect) @@ -262,7 +261,6 @@ def propagate_dirty(self, local_clip: Box): for p in self.stack: if self.dimmer is not None: - from uilib.paint import _pg_rect self.surface.blit(self.dimmer, clip.topleft, area=_pg_rect(clip)) d = p.decorator if d is not None: From 2e3bb8b31fa9e4db6e9746cccb145b94ad7a396e Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Thu, 21 May 2026 08:50:19 -0400 Subject: [PATCH 44/46] Encapsulation wins --- uilib/dialog.py | 15 ++++++++------- uilib/panel.py | 23 ++++++++++++----------- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/uilib/dialog.py b/uilib/dialog.py index afe60550..2ee4967a 100644 --- a/uilib/dialog.py +++ b/uilib/dialog.py @@ -17,6 +17,8 @@ import textwrap from typing_extensions import override +import pygame + from uilib.box import Box from uilib.radius import Radius from uilib.panel import * @@ -85,19 +87,18 @@ def __init__(self, width, height, title, title_font=None, **kwargs): super(Dialog, self).__init__(box=box, align=WidgetAlign.CENTRE, radius=radius, decorator=deco, **kwargs) - def _build_shape_mask(self) -> None: - # Viewport-sized (not surface-sized) so virtual content_height surfaces - # still get rounded corners at the viewport's bottom edge. Only the - # bottom corners round — the titlebar decorator owns the top corners - # and the panel's top edge must stay square to meet it seamlessly. - import pygame + @override + def _build_shape_mask(self) -> pygame.Surface: + # Only the bottom corners round — the titlebar decorator owns the top + # corners and the panel's top edge must stay square to meet it + # seamlessly. size = (int(self.box.width), int(self.box.height)) mask = pygame.Surface(size, pygame.SRCALPHA) mask.fill((0, 0, 0, 0)) pygame.draw.rect(mask, (255, 255, 255, 255), pygame.Rect(0, 0, size[0], size[1]), 0, **Radius.bottom(self.radius).as_pygame_kwargs()) - self._shape_mask = mask + return mask class MessageDialog(Dialog): def __init__(self, panelstack, message, title="Error", width=200, height=90): diff --git a/uilib/panel.py b/uilib/panel.py index e2a4bcd2..aa12c01f 100644 --- a/uilib/panel.py +++ b/uilib/panel.py @@ -147,29 +147,30 @@ class RoundedPanel(Panel): moves through the tall content surface on scroll).""" def __init__(self, radius: int = 10, **kwargs): - kwargs['image_format'] = 'RGBA' - super(RoundedPanel, self).__init__(**kwargs) + # Set radius *before* super().__init__() — ContainerWidget.__init__ + # calls _setup() which calls _build_shape_mask(); the mask builder + # reads self.radius. The shape mask itself is populated by _setup(). self.radius = radius self._shape_mask: Optional[pygame.Surface] = None - self._build_shape_mask() + kwargs['image_format'] = 'RGBA' + super(RoundedPanel, self).__init__(**kwargs) - def _build_shape_mask(self) -> None: - # Mask is viewport-sized. For virtual panels the cache surface is - # content_height tall and the mask is re-applied at blit time at the - # current viewport offset. + def _build_shape_mask(self) -> pygame.Surface: + """Build the per-corner viewport-sized alpha mask for this panel's outline shape.""" size = (int(self.box.width), int(self.box.height)) mask = pygame.Surface(size, pygame.SRCALPHA) mask.fill((0, 0, 0, 0)) pygame.draw.rect(mask, (255, 255, 255, 255), pygame.Rect(0, 0, size[0], size[1]), 0, border_radius=self.radius) - self._shape_mask = mask + return mask def _setup(self): super()._setup() - # Rebuild the mask if the backing surface was just (re)allocated. - if getattr(self, "radius", None) is not None and self.surface is not None: - self._build_shape_mask() + # _setup may have just (re)allocated the backing surface; rebuild the + # mask so it matches the current box. + if self.surface is not None: + self._shape_mask = self._build_shape_mask() def _finalize_cache(self) -> None: if self.virtual or self._shape_mask is None or self.surface is None: From 452905d97ee56f141bc2c6f52ef8fae5e86c4458 Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Thu, 21 May 2026 09:37:51 -0400 Subject: [PATCH 45/46] Add a paint readme --- uilib/README.md | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 uilib/README.md diff --git a/uilib/README.md b/uilib/README.md new file mode 100644 index 00000000..03c7aec1 --- /dev/null +++ b/uilib/README.md @@ -0,0 +1,43 @@ +# Paint system + +The UI is a tree of widgets, each widget knowing its own rectangle in its parent's coordinate space. Non-leaf nodes (`ContainerWidget`s) each own a `pygame.Surface` that holds the composite of itself and its descendants. Leaf widgets have no buffer of their own: they draw straight into the nearest ancestor surface. The root of the tree is a `PanelStack`, whose surface is the one pushed to the LCD. + +Drawing happens via `do_draw`; a `PaintContext` is passed to each widget's concrete `_draw` method. This context includes + +* the (PyGame) surface being drawn into, +* the dirty `clip` rect in surface coords, and +* the current widget's `frame`. + +The context manager `PaintContext.painting(frame)` builds a "sub-context" for drawing children. It uses SDL's capability to drop any primitive that strays outside the clip, so drawing methods can treat their own rect as if it were the whole world. + +## Virtual painting + +A container's surface is usually the same size as its box, but a virtual container can hold a surface taller (or wider) than its viewport. This is currently used for scrollable menus where content might run past the screen extents (we're working with a 320x240 LCD). + +The container's `offset` field is the (x, y) of the viewport's top-left within that "tall" surface, while `_viewport_view()` returns a `pygame.Surface` subsurface of the cache at the current offset. For non-virtual containers `viewport == bounds`, so the view is the whole surface; for virtual containers it's a moving window. Either way, the same blit path serves both. + +Virtual containers do, however, diverge from the standard path in a couple ways: + +1. Their `refresh()` paints into "content" coordinates rather than "physical" ones, though children don't need to care about this because they draw in local coordinates anyhow. + +2. `do_draw()` skips the lazy-rebuild path that non-virtual containers use because their cache is maintained externally by `refresh()` and `scroll()`: off-viewport children get a `_dirty` flag so that scrolling lazily paints them as they come into view, without losing previously-painted pixels. + +## Caching + +Each container caches its composite, keeping track of which regions are pending re-draws via `_dirty_Region: Box | None`. `None` means clean — the surface can be blitted as-is. A Box means that rectangle is stale and the rest of the cache is up-to-date. + +When `do_draw` is called on a non-virtual container with a dirty region, it rebuilds only that slice: the `painting(frame)` clip drops everything outside it, and children whose boxes don't intersect the rect are skipped entirely. + +Cache invalidation happens two ways: + +The first method `propagate_dirty(clip)` is called after pixels have been written somewhere (e.g. a leaf called `Widget.refresh(box)`). New pixels exist, but every cached composite is stale (for a certain rectangle) up to the tree root. The new "dirty rectangle" is unioned (after coordinate translation) with ancestors' existing `_dirty_rect`s. + +The chain terminates at `PanelStack.propagate_dirty`, which is the only `propagate_dirty` that actually does something visible: it composes the stacked panels into the root surface and pushes the result to the LCD. + +The second method `_invalidate_cache(box)` is called when a widget is attached or detached from the widget tree; it uses the same logic to mark that area as stale. + +## Masking + +`RoundedPanel` introduces a per-corner alpha mask. For non-virtual panels the mask is multiplied into the cache once, in the `_finalize_cache()` hook called at the end of every rebuild, so the panel blits out as plain pixels from then on. Virtual panels can't pre-multiply, because the mask applies to different parts of the backing surface (via the viewport): instead, they apply the mask per-blit against a temporary copy of the viewport slice. + +Subclasses define their shape by overriding `_build_shape_mask()`. From 227f5cf7f1fc3d05fa615f6b084f3857c1b6e975 Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Thu, 21 May 2026 22:59:00 -0400 Subject: [PATCH 46/46] Initial fixes for wifi menu text rendering --- ui/wifi_menu.py | 18 ++++++++++++++---- uilib/text.py | 9 +++++---- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/ui/wifi_menu.py b/ui/wifi_menu.py index 8f9b06a4..110ae0ac 100644 --- a/ui/wifi_menu.py +++ b/ui/wifi_menu.py @@ -15,9 +15,10 @@ from typing import TYPE_CHECKING, Callable, NotRequired, Optional, Protocol, TypedDict, cast -from PIL import ImageFont +from pathlib import Path import common.util as util +from uilib._pygame_init import freetype as _get_freetype from modalapi.wifi import ( ConnectSavedCmd, ConnectScannedCmd, @@ -99,7 +100,8 @@ def __init__(self, ssid: str, pstack, on_submit: PasswordCallback) -> None: self._on_submit = on_submit self._curline = '' - font = ImageFont.truetype("DejaVuSans.ttf", 18) + _fonts = Path(__file__).resolve().parent.parent / "fonts" + font = _get_freetype().Font(str(_fonts / "DejaVuSans.ttf"), 18) box = Box(0, 0, 300, 80) box = box.centre(pstack.box) super().__init__(box=box, parent=pstack, auto_destroy=True) @@ -526,12 +528,20 @@ def _open_password_prompt(self, ssid: str, on_submit: PasswordCallback) -> None: def _open_join_dialog(self, _: object = None) -> None: d = Dialog(width=240, height=120, auto_destroy=True, title='Join other network') - ssid_w = TextWidget(box=Box.xywh(0, 0, 190, 0), text='', prompt='SSID :', parent=d, + font = Config().get_font('default') + from uilib.misc import get_text_size # local import — uilib.__init__ doesn't re-export + ssid_label_w = get_text_size('SSID :', font)[0] + pw_label_w = get_text_size('Passwd :', font)[0] + TextWidget(box=Box.xywh(0, 0, ssid_label_w, 0), text='SSID :', parent=d, + h_margin=0, v_margin=3, align=WidgetAlign.NONE) + ssid_w = TextWidget(box=Box.xywh(ssid_label_w, 0, 190, 0), text='', parent=d, outline=1, sel_width=3, outline_radius=5, align=WidgetAlign.NONE, name='ssid_field', edit_message='WiFi SSID') d.add_sel_widget(ssid_w) - pw_w = TextWidget(box=Box.xywh(0, 30, 169, 0), text='', prompt='Passwd :', parent=d, + TextWidget(box=Box.xywh(0, 30, pw_label_w, 0), text='Passwd :', parent=d, + h_margin=0, v_margin=3, align=WidgetAlign.NONE) + pw_w = TextWidget(box=Box.xywh(pw_label_w, 30, 169, 0), text='', parent=d, outline=1, sel_width=3, outline_radius=5, align=WidgetAlign.NONE, name='pw_field', edit_message='Password') diff --git a/uilib/text.py b/uilib/text.py index 86277f8e..466c42a1 100644 --- a/uilib/text.py +++ b/uilib/text.py @@ -222,10 +222,11 @@ def _adjust_box(self): return h_margin, v_margin = self._get_margins() tw, th = self._get_text_size() - # For height, always use at least a full line height so empty-text - # widgets don't collapse to near-zero. - ascent, descent = self.font_metrics - th = max(th, ascent + descent) + # Always use at least a full line height so short / empty text doesn't + # collapse the widget. pygame's get_text_size('', font) returns + # (0, asc+desc) — reuse it instead of PIL-style font.getmetrics(). + _, line_h = get_text_size('', self.font) + th = max(th, line_h) # Add outline to account for PIL rectangles being "inset" extra = self.outline trace(self, "margins=", h_margin, v_margin, "text_size=", tw, th)

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 NQ$q`bDm~|C{{@4sjuij^ literal 0 HcmV?d00001 diff --git a/tests/snapshots/test_virtual_container/test_scroll_back_and_forth/3.png b/tests/snapshots/test_virtual_container/test_scroll_back_and_forth/3.png new file mode 100644 index 0000000000000000000000000000000000000000..f52d3c652230297c7ef61f1f4fd874243a73d02e GIT binary patch literal 4021 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/test_virtual_container/test_scroll_shows_later_items/initial.png b/tests/snapshots/test_virtual_container/test_scroll_shows_later_items/initial.png new file mode 100644 index 0000000000000000000000000000000000000000..6562e60ca02950e06a0166ea35a0702335c3693a GIT binary patch literal 3722 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 newly_visible_start: + assert w._painted, f"item {i} should be painted after scroll" + assert not w._dirty, f"item {i} should be clean after scroll" + + def test_scroll_paints_correct_pixels_in_tall_image(self): + c = _virtual_container() + items = _attach_items(c) + c.refresh() + + c.scroll((0, VIEWPORT_H)) + + # Items 3..5 should now have their colors in the tall image + for i, (w, color) in enumerate(items[VIEWPORT_H // ITEM_H :], start=VIEWPORT_H // ITEM_H): + sample_y = i * ITEM_H + ITEM_H // 2 + pixel = c.image.getpixel((VIEWPORT_W // 2, sample_y)) + assert pixel[:3] == color[:3], f"item {i} color {color} not found at tall-image y={sample_y} after scroll" + + def test_scroll_skips_already_clean_children(self): + """Children that are painted and clean must not be redrawn on scroll.""" + c = _virtual_container() + items = _attach_items(c) + c.refresh() + + draw_counts = {i: 0 for i in range(N_ITEMS)} + originals = {} + for i, (w, _) in enumerate(items): + originals[i] = w._draw + idx = i + + def make_counter(orig, item_i): + def _draw_counted(ctx): + draw_counts[item_i] += 1 + orig(ctx) + + return _draw_counted + + w._draw = make_counter(w._draw, i) + + # Scroll to show items 3..5 (items 0..2 are still technically overlapping + # the prior viewport's bottom row, but items 0..2 are clean → skip) + c.scroll((0, VIEWPORT_H)) + + # Dirty items (3..5) should have been drawn exactly once + newly_visible_start = VIEWPORT_H // ITEM_H + for i in range(newly_visible_start, N_ITEMS): + assert draw_counts[i] == 1, f"item {i} should have been drawn once" + # Clean items (0..2) must not have been redrawn + for i in range(newly_visible_start): + assert draw_counts[i] == 0, f"item {i} should not have been redrawn" + + +# --------------------------------------------------------------------------- +# 5. do_draw blits the correct tall-image slice into the parent +# --------------------------------------------------------------------------- + + +class TestDoDrawBlit: + """After scroll(y=N), do_draw must composite the slice starting at y=N in + the tall image into the parent surface — not the slice at y=0.""" + + def test_do_draw_shows_scrolled_content_in_parent(self): + from uilib.paint import BufferPool + + c = _virtual_container() + items = _attach_items(c) + c.refresh() + c.scroll((0, VIEWPORT_H)) # items 3..5 now in viewport + + # Build a parent image and call do_draw on the container + parent_img = Image.new("RGB", (VIEWPORT_W, VIEWPORT_H), (128, 128, 128)) + pool = BufferPool((VIEWPORT_W, VIEWPORT_H)) + ctx = PaintContext(parent_img, ImageDraw.Draw(parent_img), Box.xywh(0, 0, VIEWPORT_W, VIEWPORT_H), pool) + container_frame = Box.xywh(0, 0, VIEWPORT_W, VIEWPORT_H) + + c.do_draw(ctx, container_frame) + + # Item 3 occupies row 0 of the viewport after scroll(VIEWPORT_H). + # Its color must appear at the top of the parent image. + _, item3_color = items[VIEWPORT_H // ITEM_H] + top_pixel = parent_img.getpixel((VIEWPORT_W // 2, ITEM_H // 2)) + assert top_pixel[:3] == item3_color[:3], f"Expected item3 color {item3_color} at top of parent, got {top_pixel}" + + # Item 0 must NOT appear at the top of the parent image. + _, item0_color = items[0] + assert top_pixel[:3] != item0_color[:3], "Item 0 must not appear at top of parent after scroll" + + def test_do_draw_no_scroll_shows_first_items(self): + from uilib.paint import BufferPool + + c = _virtual_container() + items = _attach_items(c) + c.refresh() # no scroll — viewport is at y=0 + + parent_img = Image.new("RGB", (VIEWPORT_W, VIEWPORT_H), (128, 128, 128)) + pool = BufferPool((VIEWPORT_W, VIEWPORT_H)) + ctx = PaintContext(parent_img, ImageDraw.Draw(parent_img), Box.xywh(0, 0, VIEWPORT_W, VIEWPORT_H), pool) + + c.do_draw(ctx, Box.xywh(0, 0, VIEWPORT_W, VIEWPORT_H)) + + _, item0_color = items[0] + top_pixel = parent_img.getpixel((VIEWPORT_W // 2, ITEM_H // 2)) + assert top_pixel[:3] == item0_color[:3], ( + f"Expected item0 color {item0_color} at top of parent (no scroll), got {top_pixel}" + ) + + +# --------------------------------------------------------------------------- +# 6. Pixel-level blit: scroll shows the right slice +# --------------------------------------------------------------------------- + + +class TestScrollBlit: + def _setup_and_scroll(self, scroll_y): + """Return (container, items) after refresh + scroll.""" + c = _virtual_container() + items = _attach_items(c) + c.refresh() + c.scroll((0, scroll_y)) + return c, items + + def test_viewport_slice_corresponds_to_scroll_offset(self): + """After scroll(y=VIEWPORT_H), the visible viewport starts at VIEWPORT_H + in the tall image. The propagate_dirty call must emit the correct slice.""" + received = [] + + class CapturingParent(Widget): + def propagate_dirty(self, clip): + received.append(clip.copy()) + + c = _virtual_container() + _attach_items(c) + c.refresh() + + # Attach a capturing parent and scroll + c.box = Box.xywh(10, 5, VIEWPORT_W, VIEWPORT_H) + c.parent = CapturingParent(box=Box.xywh(0, 0, 200, 200)) + c.scroll((0, VIEWPORT_H)) + + assert received, "scroll() must call propagate_dirty" + last = received[-1] + # propagate_dirty converts viewport content coords → parent-space coords: + # content viewport Box(0, VIEWPORT_H, W, 2*VIEWPORT_H) + # deoffset((0, VIEWPORT_H)) → Box(0, 0, W, VIEWPORT_H) (viewport-relative) + # offset(box.topleft=(10,5)) → Box(10, 5, W+10, VIEWPORT_H+5) (parent-space) + expected = Box.xywh(10, 5, VIEWPORT_W, VIEWPORT_H) + assert last == expected, f"Expected parent-space clip {expected}, got {last}" + + +# --------------------------------------------------------------------------- +# 6. set_selected + scroll_into_view ordering +# --------------------------------------------------------------------------- + + +class TestSelectionScrollOrdering: + def test_selected_state_visible_after_scroll(self): + """Mutate state → mark dirty → scroll → on-scroll paint must capture + the post-mutation state (selected=True visually).""" + c = _virtual_container() + items = _attach_items(c) + c.refresh() + + # Track what color each draw sees for item[N_ITEMS-1] + last_w, _ = items[N_ITEMS - 1] + drawn_selected = [] + + orig_draw = last_w._draw + + def _spy_draw(ctx): + drawn_selected.append(last_w.selected) + orig_draw(ctx) + + last_w._draw = _spy_draw + last_w.selectable = True + last_w.selected = True # mutate state + + # scroll_into_view triggers scroll(), which should paint the dirty widget + scrolled = last_w.scroll_into_view() + + if scrolled: + # Widget was off-screen and scroll happened → paint occurred via scroll() + assert drawn_selected, "widget must have been painted during scroll" + assert drawn_selected[-1] is True, "widget must be painted with selected=True (post-mutation state)" + + +# --------------------------------------------------------------------------- +# 7. Dirty-state transitions +# --------------------------------------------------------------------------- + + +class TestDirtyStateTransitions: + def test_initial_state_never_painted(self): + c = _virtual_container() + items = _attach_items(c) + + for w, _ in items: + assert not w._painted + assert not w._dirty + + def test_after_refresh_visible_clean(self): + c = _virtual_container() + items = _attach_items(c) + c.refresh() + + visible_count = VIEWPORT_H // ITEM_H + for w, _ in items[:visible_count]: + assert w._painted and not w._dirty + + def test_after_refresh_off_screen_dirty(self): + c = _virtual_container() + items = _attach_items(c) + c.refresh() + + visible_count = VIEWPORT_H // ITEM_H + for w, _ in items[visible_count:]: + assert w._dirty and not w._painted + + def test_widget_refresh_on_screen_clears_dirty(self): + c = _virtual_container() + items = _attach_items(c) + c.refresh() + + w = items[0][0] + w._dirty = True # simulate state change + + w.refresh() + + assert w._painted + assert not w._dirty + + def test_widget_refresh_off_screen_sets_dirty(self): + c = _virtual_container() + items = _attach_items(c) + c.refresh() + + w = items[N_ITEMS - 1][0] + assert not w._painted + + w.refresh() + + assert w._dirty + assert not w._painted + + def test_scroll_into_view_clears_dirty(self): + c = _virtual_container() + items = _attach_items(c) + c.refresh() + + w, _ = items[N_ITEMS - 1] + assert w._dirty + + c.scroll((0, (N_ITEMS - 1) * ITEM_H)) # scroll last item into view + + assert w._painted + assert not w._dirty + + +# --------------------------------------------------------------------------- +# 9. Menu snapshot — full PanelStack → LCD render path +# --------------------------------------------------------------------------- + + +@pytest.fixture +def ui_config(): + """Initialize the uilib Config singleton with the project's ui/config.json.""" + import os + from uilib.config import Config + + # Reset singleton so it reinitialises cleanly for each test + Config._instance = None + project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + Config(os.path.join(project_root, "ui", "config.json")) + + +class TestMenuSnapshot: + """Snapshot tests for a real Menu with virtual scrolling. + + These go through PanelStack → do_draw → LCD.update, so they cover the + tall-image blit path that pixel-unit tests above can only approximate. + Running with --snapshot-update regenerates the baselines. + """ + + _ITEM_NAMES = [f"Item {i}" for i in range(8)] + + def _make_stack(self, fake_lcd): + from uilib.panel import PanelStack + + return PanelStack(fake_lcd) + + def _make_menu(self, stack): + from uilib.menu import Menu + + # max_height forces virtual mode when total content exceeds it. + # dismiss_option=True adds the back-arrow item (matches real-world usage). + menu = Menu( + items=[(name, None, None) for name in self._ITEM_NAMES], + max_height=100, + title="Test Menu", + dismiss_option=True, + ) + stack.push_panel(menu) + return menu + + def test_initial_render(self, fake_lcd, snapshot, ui_config): + stack = self._make_stack(fake_lcd) + self._make_menu(stack) + snapshot("initial") + + def test_scroll_shows_later_items(self, fake_lcd, snapshot, ui_config): + stack = self._make_stack(fake_lcd) + menu = self._make_menu(stack) + snapshot("initial") + + # Advance to the last selectable item (includes the back arrow) + for _ in range(len(menu.sel_list) - 1): + menu.sel_next() + + snapshot("scrolled_to_last") + + def test_scroll_back_and_forth(self, fake_lcd, snapshot, ui_config): + stack = self._make_stack(fake_lcd) + menu = self._make_menu(stack) + + # 0 -> 4 + for _ in range(4): + menu.sel_next() + print(f"at 4: offset={menu.offset}") + snapshot() + # -> 5 + menu.sel_next() + print(f"at 5: offset={menu.offset}") + snapshot() + # -> 6 + menu.sel_next() + print(f"at 6: offset={menu.offset}") + snapshot() + # -> 5 + menu.sel_prev() + print(f"back to 5: offset={menu.offset}") + snapshot() + # -> 4 + menu.sel_prev() + print(f"back to 4: offset={menu.offset}") + snapshot() diff --git a/uilib/container.py b/uilib/container.py index 355b2f86..977caa1f 100644 --- a/uilib/container.py +++ b/uilib/container.py @@ -138,17 +138,21 @@ def do_draw(self, ctx: PaintContext, frame: Box): with ctx.painting(frame) as pctx: pframe = pctx.frame assert pframe is not None - # 1. Update our own backing store (only the dirty region) + # 1. Update our own backing store (only the dirty region). + # Skip for virtual containers — their backing image is maintained + # incrementally by refresh()/scroll() and a partial-clip redraw + # here would produce a local_frame/local_clip mismatch. local_clip = pctx.clip.deoffset(pframe.topleft) local_frame = self.box.norm() - local_ctx = PaintContext(self.image, self.draw, local_clip, pctx.pool, frame=local_frame) - self._draw_erase(local_ctx) - self._draw(local_ctx) - for c in self.children: - if c.visible: - c.do_draw(local_ctx, c.box.offset(local_frame)) - self._draw_outline(local_ctx) - self._draw_selection(local_ctx) + if not self.virtual: + local_ctx = PaintContext(self.image, self.draw, local_clip, pctx.pool, frame=local_frame) + self._draw_erase(local_ctx) + self._draw(local_ctx) + for c in self.children: + if c.visible: + c.do_draw(local_ctx, c.box.offset(local_frame)) + self._draw_outline(local_ctx) + self._draw_selection(local_ctx) # 2. Blit our backing store into pctx.image (which might be a temp) # We only need to blit the local_clip portion. @@ -160,7 +164,10 @@ def do_draw(self, ctx: PaintContext, frame: Box): sub = self.image.crop(src_box.rect) if self.mask is not None: - sub_mask = self.mask.crop(src_box.rect) + # Mask describes the viewport shape, so sample at local_clip coords + # (viewport-relative), not src_box coords (content coords). + # In the non-virtual case offset=(0,0) so src_box==local_clip anyway. + sub_mask = self.mask.crop(local_clip.rect) else: sub_mask = None diff --git a/uilib/menu.py b/uilib/menu.py index bd5bb5db..e6e67db6 100644 --- a/uilib/menu.py +++ b/uilib/menu.py @@ -99,8 +99,6 @@ def _adjust_box(self): trace(self, "item <",t,"> tw=", tw, "th=", th) tw = tw + h_margin * 2 th = th + v_margin * 2 - #if tw > w: - # w = tw if h == 0: self.item_h = th h = th * len(self.items) @@ -109,7 +107,9 @@ def _adjust_box(self): if mw is not None and w > mw: w = 240 if mh is not None and h > mh: + # Content taller than viewport: enable JIT paint with a tall backing image + self.virtual = True + self._content_height = h h = mh - print("-> adjusted w,h:", w, h) self.box = Box.xywh(0,0,w,h) super(Menu,self)._adjust_box() diff --git a/uilib/widget.py b/uilib/widget.py index 292c1631..cea75b51 100644 --- a/uilib/widget.py +++ b/uilib/widget.py @@ -270,7 +270,9 @@ def set_outline(self, width, color = None): self.outline_color = color def set_selected(self, selected): - self.selected = selected + if self.selected is not selected: + self.selected = selected + self._dirty = True if selected: if self.scroll_into_view(): # Don't refresh if scroll has made it happen From 66a3e8a698d473011f61bde6c6fc1d5ab0b9c40e Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Tue, 19 May 2026 01:14:55 -0400 Subject: [PATCH 14/46] Scroll-by-blit tests --- tests/test_virtual_container.py | 79 +++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/tests/test_virtual_container.py b/tests/test_virtual_container.py index f699e749..57b739a7 100644 --- a/tests/test_virtual_container.py +++ b/tests/test_virtual_container.py @@ -303,6 +303,85 @@ def test_do_draw_no_scroll_shows_first_items(self): ) +# --------------------------------------------------------------------------- +# 5b. Scroll-by-blit: scrolling back over already-painted children +# must not re-invoke child _draw — neither in scroll() nor in the +# subsequent do_draw on a parent surface. do_draw on a virtual +# container is pure cache-blit. +# --------------------------------------------------------------------------- + + +class TestScrollByBlitNoRebuild: + def _paint_all_and_spy(self, c, items): + """Paint every item into the cache, then install per-item _draw spies + and return the counters dict. After this, all items are _painted and + not _dirty, so subsequent paints would be redundant.""" + c.refresh() # paints items 0..2 + c.scroll((0, (N_ITEMS - VIEWPORT_H // ITEM_H) * ITEM_H)) # paints items 3..5 + c.scroll((0, 0)) # back to top; everything cached + + # Sanity: every item must be painted and clean before the spy goes in. + for w, _ in items: + assert w._painted and not w._dirty + + counts = {i: 0 for i in range(len(items))} + for i, (w, _) in enumerate(items): + orig = w._draw + + def make_spy(orig, idx): + def _spy(ctx): + counts[idx] += 1 + orig(ctx) + return _spy + + w._draw = make_spy(orig, i) + + return counts + + def test_scroll_over_painted_children_does_no_child_draw(self): + """scroll() to a region whose children are all cached+clean must not + invoke any child _draw.""" + c = _virtual_container() + items = _attach_items(c) + counts = self._paint_all_and_spy(c, items) + + c.scroll((0, VIEWPORT_H)) # items 3..5 — all already painted+clean + + assert all(v == 0 for v in counts.values()), ( + f"expected zero child redraws on scroll-over-painted, got {counts}" + ) + + def test_do_draw_after_scroll_is_pure_blit(self): + """After scroll, do_draw on a parent surface must be a pure cache blit: + no child _draw invocations. Pixels must still match the cached state.""" + from uilib.paint import BufferPool + + c = _virtual_container() + items = _attach_items(c) + counts = self._paint_all_and_spy(c, items) + + # Scroll to a previously-painted region, then have a "parent" composite us. + c.scroll((0, VIEWPORT_H)) + parent_img = Image.new("RGB", (VIEWPORT_W, VIEWPORT_H), (128, 128, 128)) + pool = BufferPool((VIEWPORT_W, VIEWPORT_H)) + ctx = PaintContext( + parent_img, + ImageDraw.Draw(parent_img), + Box.xywh(0, 0, VIEWPORT_W, VIEWPORT_H), + pool, + ) + c.do_draw(ctx, Box.xywh(0, 0, VIEWPORT_W, VIEWPORT_H)) + + assert all(v == 0 for v in counts.values()), ( + f"do_draw on virtual must not invoke child _draw; got {counts}" + ) + + # Item 3 (first visible row after scroll) should appear at the top. + _, item3_color = items[VIEWPORT_H // ITEM_H] + top_pixel = parent_img.getpixel((VIEWPORT_W // 2, ITEM_H // 2)) + assert top_pixel[:3] == item3_color[:3] + + # --------------------------------------------------------------------------- # 6. Pixel-level blit: scroll shows the right slice # --------------------------------------------------------------------------- From 5b77ff71d582d094f824ebb99d2af82187d4d31d Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Tue, 19 May 2026 22:49:12 -0400 Subject: [PATCH 15/46] Cache valid; one small rendering bug. --- tests/test_cache_valid.py | 291 ++++++++++++++++++++++++++++++++++++++ uilib/container.py | 107 +++++++++----- uilib/panel.py | 2 + uilib/widget.py | 9 ++ 4 files changed, 372 insertions(+), 37 deletions(-) create mode 100644 tests/test_cache_valid.py diff --git a/tests/test_cache_valid.py b/tests/test_cache_valid.py new file mode 100644 index 00000000..f592719e --- /dev/null +++ b/tests/test_cache_valid.py @@ -0,0 +1,291 @@ +""" +Tests for ContainerWidget._cache_valid flag and push-up mechanism. + +Contracts verified: + 1. Flag transitions — valid/invalid at the right moments + 2. Cache-hit skips rebuild — no child _draw calls on a valid cache + 3. Push-up pixel parity — cached blit produces identical pixels to a full rebuild +""" + +import pytest +from PIL import Image, ImageDraw + +from uilib.box import Box +from uilib.paint import PaintContext, BufferPool +from uilib.container import ContainerWidget +from uilib.widget import Widget + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + +W, H = 100, 60 + + +class _ColorWidget(Widget): + def __init__(self, color, **kwargs): + self.color = color + super().__init__(**kwargs) + + def _draw(self, ctx): + ctx.fill(self.color) + + +def _container(w=W, h=H): + return ContainerWidget(box=Box.xywh(0, 0, w, h)) + + +def _render(container, w=W, h=H): + """Blit container into a fresh image and return it.""" + img = Image.new("RGB", (w, h), (128, 128, 128)) + pool = BufferPool((w, h)) + ctx = PaintContext(img, ImageDraw.Draw(img), Box.xywh(0, 0, w, h), pool) + container.do_draw(ctx, Box.xywh(0, 0, w, h)) + return img + + +# --------------------------------------------------------------------------- +# 1. Flag transitions +# --------------------------------------------------------------------------- + + +class TestFlagTransitions: + def test_false_after_init(self): + c = _container() + assert c._cache_valid is False + + def test_true_after_nonvirtual_refresh(self): + c = _container() + c.refresh() + assert c._cache_valid is True + + def test_true_after_virtual_refresh(self): + c = ContainerWidget(box=Box.xywh(0, 0, W, H), virtual=True, content_height=H * 3) + c.refresh() + assert c._cache_valid is True + + def test_false_after_child_attach(self): + c = _container() + c.refresh() + assert c._cache_valid is True + _ColorWidget(color=(255, 0, 0), box=Box.xywh(0, 0, 10, 10), parent=c) + assert c._cache_valid is False + + def test_false_after_child_detach(self): + c = _container() + leaf = _ColorWidget(color=(255, 0, 0), box=Box.xywh(0, 0, 10, 10), parent=c) + c.refresh() + assert c._cache_valid is True + leaf.detach() + assert c._cache_valid is False + + def test_false_after_setup_realloc(self): + """_setup() resets the flag when a new image is allocated.""" + c = _container(W, H) + c.refresh() + assert c._cache_valid is True + # Trigger reallocation by changing the box size + c.set_box(Box.xywh(0, 0, W + 10, H + 10), refresh=False) + c._setup() + assert c._cache_valid is False + + def test_invalidation_bubbles_to_ancestor(self): + """attach() on an inner container should bubble up to outer.""" + outer = _container() + inner = ContainerWidget(box=Box.xywh(0, 0, W, H), parent=outer) + outer.refresh() + assert outer._cache_valid is True + assert inner._cache_valid is True + + _ColorWidget(color=(0, 255, 0), box=Box.xywh(0, 0, 10, 10), parent=inner) + + assert inner._cache_valid is False + assert outer._cache_valid is False + + def test_invalidation_stops_at_panelstack(self): + """PanelStack._skip_cache_push=True; its own _cache_valid follows the normal + bubble but PanelStack has no parent so the chain terminates there.""" + from uilib.panel import PanelStack + from tests.conftest import FakeLcd + + lcd = FakeLcd() + stack = PanelStack(lcd) + assert stack._skip_cache_push is True + + # Attach a child container; invalidation must reach stack but no further + # (stack has no parent, so there is nothing above it to corrupt). + child = ContainerWidget(box=Box.xywh(0, 0, 50, 50), parent=stack) + child.refresh() + assert child._cache_valid is True + + _ColorWidget(color=(0, 0, 255), box=Box.xywh(0, 0, 10, 10), parent=child) + assert child._cache_valid is False + # stack itself gets invalidated too (it's a ContainerWidget) + assert stack._cache_valid is False + + +# --------------------------------------------------------------------------- +# 2. Cache-hit skips rebuild +# --------------------------------------------------------------------------- + + +class TestCacheHitSkipsRebuild: + def _spy_container(self): + """Return (container, [leaf_widgets], draw_counts_dict).""" + c = _container() + COLORS = [(255, 0, 0), (0, 255, 0), (0, 0, 255)] + leaves = [] + for i, color in enumerate(COLORS): + w = _ColorWidget(color=color, box=Box.xywh(i * 30, 0, 30, H), parent=c) + leaves.append(w) + c.refresh() + assert c._cache_valid is True + + counts = {i: 0 for i in range(len(leaves))} + for i, w in enumerate(leaves): + orig = w._draw + def make_spy(orig, idx): + def _spy(ctx): + counts[idx] += 1 + orig(ctx) + return _spy + w._draw = make_spy(orig, i) + + return c, leaves, counts + + def test_full_clip_no_child_draw(self): + c, _, counts = self._spy_container() + _render(c) # full clip + assert all(v == 0 for v in counts.values()), ( + f"Expected no child _draw calls on cache hit (full clip), got {counts}" + ) + + def test_partial_clip_no_child_draw(self): + c, _, counts = self._spy_container() + img = Image.new("RGB", (W, H), (128, 128, 128)) + pool = BufferPool((W, H)) + partial_clip = Box.xywh(0, 0, W // 2, H) + ctx = PaintContext(img, ImageDraw.Draw(img), partial_clip, pool) + c.do_draw(ctx, Box.xywh(0, 0, W, H)) + assert all(v == 0 for v in counts.values()), ( + f"Expected no child _draw calls on cache hit (partial clip), got {counts}" + ) + + def test_cache_miss_does_invoke_child_draw(self): + """Sanity check: if cache is invalid, children must be redrawn.""" + c, _, counts = self._spy_container() + c._cache_valid = False # force miss + _render(c) + assert all(v == 1 for v in counts.values()), ( + f"Expected one _draw per child on cache miss, got {counts}" + ) + + +# --------------------------------------------------------------------------- +# 3. Push-up pixel parity +# --------------------------------------------------------------------------- + + +class TestPushUpPixelParity: + """The pixels produced by a cache-blit must match those from a full rebuild, + both after initial render and after a leaf update pushed up via propagate_dirty.""" + + def test_initial_render_blit_equals_rebuild(self): + """After refresh(), a cache-blit and a forced rebuild must be identical.""" + c = _container() + _ColorWidget(color=(200, 100, 50), box=Box.xywh(0, 0, 50, 30), parent=c) + _ColorWidget(color=(50, 150, 200), box=Box.xywh(50, 30, 50, 30), parent=c) + c.refresh() + + cached = _render(c) # cache hit → pure blit + c._cache_valid = False + rebuilt = _render(c) # cache miss → full rebuild + + assert cached.tobytes() == rebuilt.tobytes(), ( + "Cache blit diverged from rebuild on initial render" + ) + + def test_leaf_color_change_push_up_parity(self): + """After a leaf widget changes color and calls refresh(), the push-up + should update the parent cache so a blit produces the same result as + a full rebuild.""" + outer = _container() + inner = ContainerWidget(box=Box.xywh(0, 0, W, H), parent=outer) + leaf = _ColorWidget(color=(255, 0, 0), box=Box.xywh(10, 10, 40, 20), parent=inner) + + outer.refresh() + assert outer._cache_valid is True + + # Change leaf and trigger push-up + leaf.color = (0, 0, 255) + leaf.refresh() + + # Optimized path: outer._cache_valid is still True; do_draw blits outer.image + assert outer._cache_valid is True, ( + "Push-up must not invalidate the outer cache; it updates outer.image in place" + ) + optimized = _render(outer) + + # Baseline path: force rebuild of everything + outer._cache_valid = False + inner._cache_valid = False + rebuilt = _render(outer) + + assert optimized.tobytes() == rebuilt.tobytes(), ( + "Push-up result diverged from full rebuild after leaf color change" + ) + + def test_leaf_hide_push_up_parity(self): + """Hiding a leaf triggers parent.refresh() which re-renders the container. + The resulting outer cache should match a forced rebuild.""" + outer = _container() + inner = ContainerWidget(box=Box.xywh(0, 0, W, H), parent=outer) + leaf = _ColorWidget(color=(0, 200, 0), box=Box.xywh(5, 5, 30, 20), parent=inner) + _ColorWidget(color=(200, 0, 0), box=Box.xywh(40, 5, 30, 20), parent=inner) + + outer.refresh() + + # hide() calls parent.refresh() → inner.refresh() → propagate_dirty into outer + leaf.hide() + + optimized = _render(outer) + + outer._cache_valid = False + inner._cache_valid = False + rebuilt = _render(outer) + + assert optimized.tobytes() == rebuilt.tobytes(), ( + "Push-up result diverged from full rebuild after leaf hide" + ) + + def test_partial_scroll_push_up_parity(self): + """A virtual child's scroll() pushes up into the outer cache. + The blitted result must match a forced rebuild.""" + outer = _container() + virtual = ContainerWidget( + box=Box.xywh(0, 0, W, H), + virtual=True, + content_height=H * 3, + parent=outer, + ) + ITEM_H = H // 3 + COLORS = [(255, 0, 0), (0, 255, 0), (0, 0, 255), + (255, 255, 0), (0, 255, 255), (255, 0, 255), + (128, 128, 0), (0, 128, 128), (128, 0, 128)] + for i, color in enumerate(COLORS): + _ColorWidget(color=color, box=Box.xywh(0, i * ITEM_H, W, ITEM_H), parent=virtual) + + outer.refresh() + + # Scroll virtual child; scroll() calls propagate_dirty → push-up into outer + virtual.scroll((0, H)) + + optimized = _render(outer) + + outer._cache_valid = False + rebuilt = _render(outer) + + assert optimized.tobytes() == rebuilt.tobytes(), ( + "Push-up result diverged from full rebuild after virtual child scroll" + ) diff --git a/uilib/container.py b/uilib/container.py index 977caa1f..72639ebb 100644 --- a/uilib/container.py +++ b/uilib/container.py @@ -25,6 +25,11 @@ class ContainerWidget(Widget): # Inherited attributes with defaults INH_ATTRS = { 'image_format' : 'RGB' } + # When True, descendants should not push fresh pixels into this container's + # cache during propagate_dirty. Used by PanelStack, whose image is rebuilt + # by composition on every propagate_dirty call (push-up would be wasted). + _skip_cache_push = False + def __init__(self, box, **kwargs): # Non-inherited attributes self.mask_format = self._get_arg(kwargs, 'mask_format', None) @@ -39,6 +44,10 @@ def __init__(self, box, **kwargs): self.image = None self.old_box = None self.offset = (0, 0) + # When True, self.image is trusted to hold the current rendered state + # for any clip, and do_draw can skip the rebuild and just blit. + # Invalidated on (re)allocation and on child attach/detach. + self._cache_valid = False super(ContainerWidget,self).__init__(box = box, **kwargs) @@ -70,6 +79,7 @@ def _setup(self): self.mask = Image.new(self.mask_format, (w, h)) else: self.mask = None + self._cache_valid = False def _viewport(self) -> Box: """Visible region in content (image) coords.""" @@ -111,6 +121,7 @@ def refresh(self): c._dirty = True self._draw_outline(ctx) self._draw_selection(ctx) + self._cache_valid = True if self.visible and self.parent is not None: self.propagate_dirty(viewport) else: @@ -124,64 +135,85 @@ def refresh(self): c.do_draw(ctx, c.box.offset(local_frame)) self._draw_outline(ctx) self._draw_selection(ctx) + self._cache_valid = True if self.visible and self.parent is not None: self.propagate_dirty(local_clip) def do_draw(self, ctx: PaintContext, frame: Box): """Draw this container's pixels into a parent's PaintContext. - It first updates its internal backing store for the dirty region, then blits - the relevant slice into the parent surface, delegating coordinate management - and potential buffer allocation to the framework's painting() context.""" - # Note: We still draw into self.image as a backing store. - # Framework painting() handles the clip/temp-buffer/composite back to ctx.image. + If our cache is valid, this is a pure blit from self.image into the + parent surface. Otherwise we first rebuild the entire backing store + (so future partial blits can trust it), then blit the requested clip. + """ with ctx.painting(frame) as pctx: pframe = pctx.frame assert pframe is not None - # 1. Update our own backing store (only the dirty region). - # Skip for virtual containers — their backing image is maintained - # incrementally by refresh()/scroll() and a partial-clip redraw - # here would produce a local_frame/local_clip mismatch. local_clip = pctx.clip.deoffset(pframe.topleft) local_frame = self.box.norm() - if not self.virtual: - local_ctx = PaintContext(self.image, self.draw, local_clip, pctx.pool, frame=local_frame) - self._draw_erase(local_ctx) - self._draw(local_ctx) + + # 1. Rebuild the cache only on a miss. Virtual containers maintain + # their cache via refresh()/scroll() and never rebuild here. + if not self.virtual and not self._cache_valid: + full_ctx = PaintContext(self.image, self.draw, local_frame, pctx.pool, frame=local_frame) + self._draw_erase(full_ctx) + self._draw(full_ctx) for c in self.children: if c.visible: - c.do_draw(local_ctx, c.box.offset(local_frame)) - self._draw_outline(local_ctx) - self._draw_selection(local_ctx) - - # 2. Blit our backing store into pctx.image (which might be a temp) - # We only need to blit the local_clip portion. - # For virtual (tall) containers, local_clip is in viewport coords, so we must - # shift by self.offset to address the correct slice of the tall image. - src_box = local_clip.offset(self.offset) - # dst stays at the viewport position within pctx.image. + c.do_draw(full_ctx, c.box.offset(local_frame)) + self._draw_outline(full_ctx) + self._draw_selection(full_ctx) + self._cache_valid = True + + # 2. Blit our backing store into pctx.image (possibly a slow-path temp). dst_topleft = (pframe.x0 + local_clip.x0, pframe.y0 + local_clip.y0) + self._blit_into(pctx.image, local_clip, dst_topleft) - sub = self.image.crop(src_box.rect) - if self.mask is not None: - # Mask describes the viewport shape, so sample at local_clip coords - # (viewport-relative), not src_box coords (content coords). - # In the non-virtual case offset=(0,0) so src_box==local_clip anyway. - sub_mask = self.mask.crop(local_clip.rect) - else: - sub_mask = None + def _blit_into(self, target_image, local_clip: Box, dst_topleft): + """Copy self.image[local_clip + self.offset] into target_image at dst_topleft. - if self.has_alpha and pctx.image.mode == 'RGBA': - pctx.image.alpha_composite(sub, dst_topleft) - else: - pctx.image.paste(sub, dst_topleft, sub_mask) + For virtual (tall) containers, local_clip is in viewport coords; we + shift by self.offset to address the correct slice of the tall image. + Honors self.mask (e.g. RoundedPanel) and the target's pixel format.""" + src_box = local_clip.offset(self.offset) + sub = self.image.crop(src_box.rect) + if self.mask is not None: + # Mask describes the viewport shape, so sample at local_clip coords + # (viewport-relative). In non-virtual case offset=(0,0) so the two coincide. + sub_mask = self.mask.crop(local_clip.rect) + else: + sub_mask = None + if self.has_alpha and target_image.mode == 'RGBA': + target_image.alpha_composite(sub, dst_topleft) + else: + target_image.paste(sub, dst_topleft, sub_mask) def propagate_dirty(self, local_clip: Box): - """Bubble a dirty region (in our local coords) up to our parent container.""" + """Bubble a dirty region (in our local coords) up to our parent container. + + Before bubbling, push our freshly-updated pixels into the parent's cache + so it doesn't need to rebuild on its next do_draw. Skipped for PanelStack + parents, whose image is rebuilt by composition on every propagate_dirty.""" if not self.visible or self.parent is None: return + # parent_clip is local_clip expressed in parent-local coords parent_clip = local_clip.deoffset(self.offset).offset(self.box) - self.parent.propagate_dirty(parent_clip) + parent = self.parent + if (isinstance(parent, ContainerWidget) + and not parent._skip_cache_push + and parent.image is not None): + # _blit_into expects viewport-relative coords; convert from content coords + viewport_clip = local_clip.deoffset(self.offset) + self._blit_into(parent.image, viewport_clip, parent_clip.topleft) + parent.propagate_dirty(parent_clip) + + def _invalidate_cache(self): + """Mark our cache stale and bubble the invalidation up the container + chain. A no-op if already invalid (caps the bubble cost).""" + if not self._cache_valid: + return + self._cache_valid = False + super()._invalidate_cache() def scroll(self, offset): self.offset = offset @@ -201,6 +233,7 @@ def scroll(self, offset): c.do_draw(ctx, c.box) c._painted = True c._dirty = False + self._cache_valid = True if self.visible and self.parent is not None: self.propagate_dirty(viewport) diff --git a/uilib/panel.py b/uilib/panel.py index 61a15830..80dc948f 100644 --- a/uilib/panel.py +++ b/uilib/panel.py @@ -168,6 +168,8 @@ def has_system_splash(self) -> bool: return False class PanelStack(ContainerWidget): + _skip_cache_push = True + def __init__(self, lcd, box = None, image_format = None, use_dimming = True): # XXX This implementation currently assumes box is at (0,0) in the LCD # and the offset remains 0,0 (dont' try to scroll) diff --git a/uilib/widget.py b/uilib/widget.py index cea75b51..458a4226 100644 --- a/uilib/widget.py +++ b/uilib/widget.py @@ -340,14 +340,23 @@ def attach(self, parent): if self.visible: self._setup_act_attrs() self._setup() + parent._invalidate_cache() def detach(self): """Detach a widget from the parent""" trace(self, "Widget detach, parent=",self.parent) if self.parent is not None: + parent = self.parent self.parent.children.remove(self) self.parent._notify_detach(self) self.parent = None + parent._invalidate_cache() + + def _invalidate_cache(self): + """Bubble cache invalidation up. Containers override to flip their own + validity flag before bubbling further.""" + if self.parent is not None: + self.parent._invalidate_cache() def _adjust_box(self): trace(self, "adjusting box, parent=", self.parent) From 40f4aa6a0787baf0444134522def6f2ea0e50198 Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Tue, 19 May 2026 23:24:36 -0400 Subject: [PATCH 16/46] Fix hacky SSID/Passwd "prompts" --- pistomp/lcd320x240.py | 12 ++++++++++-- uilib/text.py | 15 +-------------- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/pistomp/lcd320x240.py b/pistomp/lcd320x240.py index b291323f..043f7c5b 100644 --- a/pistomp/lcd320x240.py +++ b/pistomp/lcd320x240.py @@ -229,13 +229,21 @@ def draw_wifi_dialog(self, event): d = Dialog(width=240, height=120, auto_destroy=True, title='Configure WiFi') - self.w_wifi_ssid = TextWidget(box=Box.xywh(0, 0, 190, 0), text=ssid, prompt='SSID :', parent=d, + font = Config().get_font('default') + ssid_w = get_text_size('SSID :', font)[0] + pw_w = get_text_size('Passwd :', font)[0] + + _ = TextWidget(box=Box.xywh(0, 0, ssid_w, 0), text='SSID :', parent=d, + h_margin=0, v_margin=3, align=WidgetAlign.NONE) + self.w_wifi_ssid = TextWidget(box=Box.xywh(ssid_w, 0, 190, 0), text=ssid, parent=d, outline=1, sel_width=3, outline_radius=5, align=WidgetAlign.NONE, name='cancel_btn', edit_message='WiFi SSID') d.add_sel_widget(self.w_wifi_ssid) - self.w_wifi_pw = TextWidget(box=Box.xywh(0, 30, 169, 0), text=psk, prompt='Passwd :', parent=d, + _ = TextWidget(box=Box.xywh(0, 30, pw_w, 0), text='Passwd :', parent=d, + h_margin=0, v_margin=3, align=WidgetAlign.NONE) + self.w_wifi_pw = TextWidget(box=Box.xywh(pw_w, 30, 169, 0), text=psk, parent=d, outline=1, sel_width=3, outline_radius=5, align=WidgetAlign.NONE, name='cancel_btn', diff --git a/uilib/text.py b/uilib/text.py index 18412636..0edf6c74 100644 --- a/uilib/text.py +++ b/uilib/text.py @@ -169,10 +169,9 @@ def __input_action(self, event, data): # XXX TODO: Add alignment features class TextWidget(Widget): """A simple widget with a text string""" - def __init__(self, box, text='', prompt=None, font = None, edit_message = None, h_margin = None, v_margin = None, + def __init__(self, box, text='', font = None, edit_message = None, h_margin = None, v_margin = None, text_halign = None, **kwargs): self.text = text - self.prompt = prompt if font == None: font = Config().get_font('default') self.font = font @@ -182,13 +181,6 @@ def __init__(self, box, text='', prompt=None, font = None, edit_message = None, self.text_halign = text_halign self.font_metrics = font.getmetrics() self.text_size_valid = False - # TODO Kindof a hack - self.prompt_offset = 0 - if self.prompt is not None: - w, h = get_text_size(self.prompt, self.font, self.font_metrics) - box.x0 += w - box.x1 += w - self.prompt_offset = w super(TextWidget,self).__init__(box, **kwargs) def _get_text_size(self): @@ -265,11 +257,6 @@ def _draw(self, ctx): else: hoffset = int((hroom - tw) / 2) loc = (h_margin + hoffset, v_margin) - if self.prompt is not None: - # Prompt is drawn at image x=0 (container origin), to the LEFT of our frame. - # See __init__: box.x0 was shifted right by prompt_offset; drawing at - # widget-relative x=-prompt_offset puts the prompt back at image x=0. - ctx.draw_text((-self.prompt_offset, loc[1]), self.prompt, fill=self.fgnd_color, font=self.font) ctx.draw_text(loc, self.text, fill=self.fgnd_color, font=self.font) def input_event(self, event): From da651a14ca2d4027f84724f30ab4e2fece1968f2 Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Tue, 19 May 2026 23:24:43 -0400 Subject: [PATCH 17/46] Remove unnecessary tests --- tests/test_paint_context.py | 89 ------------------------------------- 1 file changed, 89 deletions(-) diff --git a/tests/test_paint_context.py b/tests/test_paint_context.py index 7c7e9d28..c84e4e95 100644 --- a/tests/test_paint_context.py +++ b/tests/test_paint_context.py @@ -2,7 +2,6 @@ Unit tests for paint-context drawing logic: - Box.contains - Widget._draw_erase (safe-interior vs full-frame erase) - - ContainerWidget.do_draw clip expansion for rounded containers - ContainerWidget.propagate_dirty scroll-offset translation """ @@ -141,94 +140,6 @@ def test_radius_full_frame_uses_rounded_rectangle(self): assert img.getpixel((0, 0)) == (255, 255, 255) -# --------------------------------------------------------------------------- -# ContainerWidget.do_draw clip expansion -# --------------------------------------------------------------------------- - - -class TestContainerClipExpansion: - """When a rounded container's dirty clip touches a corner, do_draw must - expand the clip to the full frame so that both erase and child-draws are - consistent (no content left erased-but-not-redrawn).""" - - def _make_rounded_container(self, r=10): - return _container(w=100, h=100, outline_radius=r) - - def test_no_radius_no_expansion(self): - c = _container(outline_radius=None) - # Paint a sentinel pixel in the top-left corner of the container image - c.image.putpixel((5, 5), (255, 0, 0)) # pyright: ignore[reportOptionalMemberAccess] - - # Dirty clip covers only the bottom-right area — does not include (5,5) - clip = Box(50, 50, 100, 100) - frame = Box(0, 0, 100, 100) - parent_img = Image.new("RGB", (100, 100), (128, 128, 128)) - parent_draw = ImageDraw.Draw(parent_img) - ctx = PaintContext(parent_img, parent_draw, clip) - - c.do_draw(ctx, frame) - # The sentinel pixel in container image should be unchanged (no expansion) - assert c.image.getpixel((5, 5)) == (255, 0, 0) # pyright: ignore[reportOptionalMemberAccess] - - def test_radius_corner_clip_does_not_expand(self): - """A clip touching a corner does NOT expand. Framework-level clipping - via temp buffers handles consistency; we don't need the expansion hack.""" - r = 10 - c = _container(w=100, h=100, outline_radius=r) - - # Add a child widget that tracks whether it was drawn - drawn_frames = [] - - class TrackingWidget(Widget): - def _draw(self, ctx): - drawn_frames.append(ctx.frame.copy()) - - child_box = Box(5, 5, 40, 20) # in top-left — inside corner region - child = TrackingWidget(box=child_box) - child.attach(c) - child.bkgnd_color = (0, 0, 0) - child.fgnd_color = (255, 255, 255) - - # Dirty clip covers only the bottom-right, away from the child - clip = Box(60, 60, 100, 100) - frame = Box(0, 0, 100, 100) - parent_img = Image.new("RGB", (100, 100)) - ctx = PaintContext(parent_img, ImageDraw.Draw(parent_img), clip) - - c.do_draw(ctx, frame) - - # Child must NOT have been drawn (no expansion) - assert len(drawn_frames) == 0 - - def test_radius_safe_interior_clip_does_not_expand(self): - """A clip fully inside the safe interior should NOT trigger expansion.""" - r = 10 - c = _container(w=100, h=100, outline_radius=r) - - drawn_frames = [] - - class TrackingWidget(Widget): - def _draw(self, ctx): - drawn_frames.append(ctx.frame.copy()) - - # Child is in top-left corner region - child = TrackingWidget(box=Box(2, 2, 8, 8)) - child.attach(c) - child.bkgnd_color = (0, 0, 0) - child.fgnd_color = (255, 255, 255) - - # Dirty clip is fully in the safe interior (r..100-r) - clip = Box(20, 20, 80, 80) - frame = Box(0, 0, 100, 100) - parent_img = Image.new("RGB", (100, 100)) - ctx = PaintContext(parent_img, ImageDraw.Draw(parent_img), clip) - - c.do_draw(ctx, frame) - - # Child frame doesn't intersect clip → not drawn - assert len(drawn_frames) == 0 - - # --------------------------------------------------------------------------- # BufferPool # --------------------------------------------------------------------------- From fa2fe61837a412a48e53fb5ca0ad65efbc7e78bd Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Tue, 19 May 2026 23:25:19 -0400 Subject: [PATCH 18/46] Fix text bleed rendering --- uilib/widget.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/uilib/widget.py b/uilib/widget.py index 458a4226..5e5f15f1 100644 --- a/uilib/widget.py +++ b/uilib/widget.py @@ -419,8 +419,24 @@ def refresh(self, box=None): return stack = self._get_stack() pool = stack.pool if stack else _NAIVE_POOL - ctx = PaintContext(container.image, container.draw, clip, pool) - self.do_draw(ctx, frame) + # Render into a frame-sized temp buffer so any unintentional draw bleed + # (notably PIL's ImageDraw.text, which ignores clips) is naturally + # truncated at the widget's frame. Drawing straight into container.image + # would let anti-aliased glyph edges past frame.right double-composite + # on subsequent refreshes — see PAINT_CLIPPING_PLAN.md. + from PIL import ImageDraw + temp = pool.acquire(frame.size) + temp_draw = ImageDraw.Draw(temp) + local_frame = Box(0, 0, frame.width, frame.height) + temp_ctx = PaintContext(temp, temp_draw, local_frame, pool, frame=local_frame) + self.do_draw(temp_ctx, local_frame) + src_box = (0, 0, frame.width, frame.height) + if container.image.mode == "RGBA": + container.image.alpha_composite(temp, frame.topleft, src_box) + else: + sub = temp.crop(src_box) + container.image.paste(sub, frame.topleft, sub) + pool.release(temp) self._painted = True self._dirty = False container.propagate_dirty(clip) From 2e956bce64da47ea45607143752bd693bbe8a2b3 Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Tue, 19 May 2026 23:56:04 -0400 Subject: [PATCH 19/46] Don't over-invalidate parent hierarchy --- uilib/container.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/uilib/container.py b/uilib/container.py index 72639ebb..7732375b 100644 --- a/uilib/container.py +++ b/uilib/container.py @@ -201,7 +201,11 @@ def propagate_dirty(self, local_clip: Box): parent = self.parent if (isinstance(parent, ContainerWidget) and not parent._skip_cache_push + and parent._cache_valid and parent.image is not None): + # Parent's cache is current — patch it in place so it stays current. + # If parent._cache_valid is False, the blit would be discarded by the + # next do_draw rebuild, so skip it. # _blit_into expects viewport-relative coords; convert from content coords viewport_clip = local_clip.deoffset(self.offset) self._blit_into(parent.image, viewport_clip, parent_clip.topleft) From db5afdfb2863cbde9153cebe8181549891f446fe Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Wed, 20 May 2026 00:00:12 -0400 Subject: [PATCH 20/46] Seal the widget-facing API --- uilib/paint.py | 11 +++++++++++ uilib/widget.py | 12 +++++------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/uilib/paint.py b/uilib/paint.py index 02c086a4..f52838a8 100644 --- a/uilib/paint.py +++ b/uilib/paint.py @@ -122,6 +122,17 @@ def bounds(self) -> Box: f = self._f() return Box(0, 0, f.width, f.height) + @property + def dirty_bounds(self) -> Box: + """Widget-relative dirty rect: bounds ∩ (clip in widget coords). + + On the fast path this equals `bounds` whenever the clip fully covers + the frame. On the slow path the clip is the temp's own bounds and the + frame is re-anchored, so this still resolves to the widget-visible + sub-rect.""" + f = self._f() + return self.bounds.intersection(self.clip.deoffset(f.topleft)) + def _abs_xy(self, xy): ox, oy = self._f().topleft return (xy[0] + ox, xy[1] + oy) diff --git a/uilib/widget.py b/uilib/widget.py index 5e5f15f1..0e197bc2 100644 --- a/uilib/widget.py +++ b/uilib/widget.py @@ -470,15 +470,13 @@ def do_draw(self, ctx: PaintContext, frame: Box): self._draw_selection(pctx) def _draw_erase(self, ctx: PaintContext): - frame = ctx.frame - assert frame is not None - erase_box = ctx.clip.intersection(frame) - if erase_box.is_empty(): + erase = ctx.dirty_bounds + if erase.is_empty(): return - if self.outline_radius is not None and erase_box == frame: - ctx.draw.rounded_rectangle(frame.PIL_rect, self.outline_radius, self.bkgnd_color, None, 0) + if self.outline_radius is not None and erase == ctx.bounds: + ctx.draw_rectangle(ctx.bounds, fill=self.bkgnd_color, radius=self.outline_radius) else: - ctx.draw.rectangle(erase_box.PIL_rect, self.bkgnd_color, None, 0) + ctx.draw_rectangle(erase, fill=self.bkgnd_color) def _draw_outline(self, ctx: PaintContext): if self.outline != 0: From dfc59ec1a50750fe624e8f77ff717ebe094c4e33 Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Wed, 20 May 2026 00:09:22 -0400 Subject: [PATCH 21/46] add pygame --- pyproject.toml | 1 + uv.lock | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index a870238f..0155ebd2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,6 +25,7 @@ dependencies = [ "pyalsaaudio>=0.9; sys_platform == 'linux'", "websockets>=15.0.1", "gpiozero>=2.0; sys_platform == 'linux'", + "pygame>=2.6.1", ] [project.optional-dependencies] diff --git a/uv.lock b/uv.lock index c9131ede..397a9124 100644 --- a/uv.lock +++ b/uv.lock @@ -853,6 +853,7 @@ dependencies = [ { name = "jsonschema" }, { name = "pillow" }, { name = "pyalsaaudio", marker = "sys_platform == 'linux'" }, + { name = "pygame" }, { name = "python-rtmidi" }, { name = "pyyaml" }, { name = "requests" }, @@ -895,6 +896,7 @@ requires-dist = [ { name = "matplotlib", marker = "extra == 'hardware'", specifier = ">=3.5" }, { name = "pillow", specifier = ">=9.4" }, { name = "pyalsaaudio", marker = "sys_platform == 'linux'", specifier = ">=0.9" }, + { name = "pygame", specifier = ">=2.6.1" }, { name = "python-rtmidi", specifier = ">=1.4" }, { name = "pyyaml", specifier = ">=6.0" }, { name = "requests", specifier = ">=2.28" }, @@ -1030,6 +1032,35 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/16/cd/0731490946e037e954ef83719f07c7672cf32bc90dd9c75201c40b827664/pyftdi-0.57.1-py3-none-any.whl", hash = "sha256:efd3f5a7d43202dc883ff261a7b1cb4dcbbe65b19628f8603a8b1183a7bc2841", size = 146180, upload-time = "2025-08-14T15:59:16.164Z" }, ] +[[package]] +name = "pygame" +version = "2.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/49/cc/08bba60f00541f62aaa252ce0cfbd60aebd04616c0b9574f755b583e45ae/pygame-2.6.1.tar.gz", hash = "sha256:56fb02ead529cee00d415c3e007f75e0780c655909aaa8e8bf616ee09c9feb1f", size = 14808125, upload-time = "2024-09-29T13:41:34.698Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/ca/8f367cb9fe734c4f6f6400e045593beea2635cd736158f9fabf58ee14e3c/pygame-2.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:20349195326a5e82a16e351ed93465a7845a7e2a9af55b7bc1b2110ea3e344e1", size = 13113753, upload-time = "2024-09-29T14:26:13.751Z" }, + { url = "https://files.pythonhosted.org/packages/83/47/6edf2f890139616b3219be9cfcc8f0cb8f42eb15efd59597927e390538cb/pygame-2.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f3935459109da4bb0b3901da9904f0a3e52028a3332a355d298b1673a334cf21", size = 12378146, upload-time = "2024-09-29T14:26:22.456Z" }, + { url = "https://files.pythonhosted.org/packages/00/9e/0d8aa8cf93db2d2ee38ebaf1c7b61d0df36ded27eb726221719c150c673d/pygame-2.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c31dbdb5d0217f32764797d21c2752e258e5fb7e895326538d82b5f75a0cd856", size = 13611760, upload-time = "2024-09-29T11:10:47.317Z" }, + { url = "https://files.pythonhosted.org/packages/d7/9e/d06adaa5cc65876bcd7a24f59f67e07f7e4194e6298130024ed3fb22c456/pygame-2.6.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:173badf82fa198e6888017bea40f511cb28e69ecdd5a72b214e81e4dcd66c3b1", size = 14298054, upload-time = "2024-09-29T11:39:53.891Z" }, + { url = "https://files.pythonhosted.org/packages/7a/a1/9ae2852ebd3a7cc7d9ae7ff7919ab983e4a5c1b7a14e840732f23b2b48f6/pygame-2.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce8cc108b92de9b149b344ad2e25eedbe773af0dc41dfb24d1f07f679b558c60", size = 13977107, upload-time = "2024-09-29T11:39:56.831Z" }, + { url = "https://files.pythonhosted.org/packages/31/df/6788fd2e9a864d0496a77670e44a7c012184b7a5382866ab0e60c55c0f28/pygame-2.6.1-cp311-cp311-win32.whl", hash = "sha256:811e7b925146d8149d79193652cbb83e0eca0aae66476b1cb310f0f4226b8b5c", size = 10250863, upload-time = "2024-09-29T11:44:48.199Z" }, + { url = "https://files.pythonhosted.org/packages/d2/55/ca3eb851aeef4f6f2e98a360c201f0d00bd1ba2eb98e2c7850d80aabc526/pygame-2.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:91476902426facd4bb0dad4dc3b2573bc82c95c71b135e0daaea072ed528d299", size = 10622016, upload-time = "2024-09-29T12:17:01.545Z" }, + { url = "https://files.pythonhosted.org/packages/92/16/2c602c332f45ff9526d61f6bd764db5096ff9035433e2172e2d2cadae8db/pygame-2.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4ee7f2771f588c966fa2fa8b829be26698c9b4836f82ede5e4edc1a68594942e", size = 13118279, upload-time = "2024-09-29T14:26:30.427Z" }, + { url = "https://files.pythonhosted.org/packages/cd/53/77ccbc384b251c6e34bfd2e734c638233922449a7844e3c7a11ef91cee39/pygame-2.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c8040ea2ab18c6b255af706ec01355c8a6b08dc48d77fd4ee783f8fc46a843bf", size = 12384524, upload-time = "2024-09-29T14:26:49.996Z" }, + { url = "https://files.pythonhosted.org/packages/06/be/3ed337583f010696c3b3435e89a74fb29d0c74d0931e8f33c0a4246307a9/pygame-2.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47a6938de93fa610accd4969e638c2aebcb29b2fca518a84c3a39d91ab47116", size = 13587123, upload-time = "2024-09-29T11:10:50.072Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ca/b015586a450db59313535662991b34d24c1f0c0dc149cc5f496573900f4e/pygame-2.6.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33006f784e1c7d7e466fcb61d5489da59cc5f7eb098712f792a225df1d4e229d", size = 14275532, upload-time = "2024-09-29T11:39:59.356Z" }, + { url = "https://files.pythonhosted.org/packages/b9/f2/d31e6ad42d657af07be2ffd779190353f759a07b51232b9e1d724f2cda46/pygame-2.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1206125f14cae22c44565c9d333607f1d9f59487b1f1432945dfc809aeaa3e88", size = 13952653, upload-time = "2024-09-29T11:40:01.781Z" }, + { url = "https://files.pythonhosted.org/packages/f3/42/8ea2a6979e6fa971702fece1747e862e2256d4a8558fe0da6364dd946c53/pygame-2.6.1-cp312-cp312-win32.whl", hash = "sha256:84fc4054e25262140d09d39e094f6880d730199710829902f0d8ceae0213379e", size = 10252421, upload-time = "2024-09-29T11:14:26.877Z" }, + { url = "https://files.pythonhosted.org/packages/5f/90/7d766d54bb95939725e9a9361f9c06b0cfbe3fe100aa35400f0a461a278a/pygame-2.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:3a9e7396be0d9633831c3f8d5d82dd63ba373ad65599628294b7a4f8a5a01a65", size = 10624591, upload-time = "2024-09-29T11:52:54.489Z" }, + { url = "https://files.pythonhosted.org/packages/e1/91/718acf3e2a9d08a6ddcc96bd02a6f63c99ee7ba14afeaff2a51c987df0b9/pygame-2.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae6039f3a55d800db80e8010f387557b528d34d534435e0871326804df2a62f2", size = 13090765, upload-time = "2024-09-29T14:27:02.377Z" }, + { url = "https://files.pythonhosted.org/packages/0e/c6/9cb315de851a7682d9c7568a41ea042ee98d668cb8deadc1dafcab6116f0/pygame-2.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2a3a1288e2e9b1e5834e425bedd5ba01a3cd4902b5c2bff8ed4a740ccfe98171", size = 12381704, upload-time = "2024-09-29T14:27:10.228Z" }, + { url = "https://files.pythonhosted.org/packages/9f/8f/617a1196e31ae3b46be6949fbaa95b8c93ce15e0544266198c2266cc1b4d/pygame-2.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27eb17e3dc9640e4b4683074f1890e2e879827447770470c2aba9f125f74510b", size = 13581091, upload-time = "2024-09-29T11:30:27.653Z" }, + { url = "https://files.pythonhosted.org/packages/3b/87/2851a564e40a2dad353f1c6e143465d445dab18a95281f9ea458b94f3608/pygame-2.6.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c1623180e70a03c4a734deb9bac50fc9c82942ae84a3a220779062128e75f3b", size = 14273844, upload-time = "2024-09-29T11:40:04.138Z" }, + { url = "https://files.pythonhosted.org/packages/85/b5/aa23aa2e70bcba42c989c02e7228273c30f3b44b9b264abb93eaeff43ad7/pygame-2.6.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef07c0103d79492c21fced9ad68c11c32efa6801ca1920ebfd0f15fb46c78b1c", size = 13951197, upload-time = "2024-09-29T11:40:06.785Z" }, + { url = "https://files.pythonhosted.org/packages/a6/06/29e939b34d3f1354738c7d201c51c250ad7abefefaf6f8332d962ff67c4b/pygame-2.6.1-cp313-cp313-win32.whl", hash = "sha256:3acd8c009317190c2bfd81db681ecef47d5eb108c2151d09596d9c7ea9df5c0e", size = 10249309, upload-time = "2024-09-29T11:10:23.329Z" }, + { url = "https://files.pythonhosted.org/packages/7e/11/17f7f319ca91824b86557e9303e3b7a71991ef17fd45286bf47d7f0a38e6/pygame-2.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:813af4fba5d0b2cb8e58f5d95f7910295c34067dcc290d34f1be59c48bd1ea6a", size = 10620084, upload-time = "2024-09-29T11:48:51.587Z" }, +] + [[package]] name = "pygments" version = "2.19.2" From 63c8686c404455047e1c718f845b6013f863fcc7 Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Wed, 20 May 2026 00:54:05 -0400 Subject: [PATCH 22/46] pygame swap WIP --- pistomp/category.py | 7 +- pistomp/lcd320x240.py | 25 ++-- pistomp/ledstrip.py | 5 +- pyproject.toml | 2 +- tests/conftest.py | 66 +++++----- uilib/_pygame_init.py | 38 ++++++ uilib/builder.py | 6 +- uilib/config.py | 28 ++-- uilib/container.py | 116 +++++++---------- uilib/dialog.py | 30 ++--- uilib/image.py | 28 ++-- uilib/lcd_ili9341.py | 67 +++++----- uilib/menu.py | 2 +- uilib/misc.py | 23 ++-- uilib/paint.py | 295 +++++++++++++++++++++--------------------- uilib/panel.py | 133 ++++++++++++------- uilib/text.py | 21 +-- uilib/widget.py | 33 ++--- uv.lock | 63 +++++---- 19 files changed, 528 insertions(+), 460 deletions(-) create mode 100644 uilib/_pygame_init.py diff --git a/pistomp/category.py b/pistomp/category.py index 9c1f3340..d7324187 100644 --- a/pistomp/category.py +++ b/pistomp/category.py @@ -14,7 +14,7 @@ # along with pi-stomp. If not, see . import logging -from PIL import ImageColor +import pygame import common.util as util @@ -39,8 +39,9 @@ def valid_color(color): if color is None: return None try: - return ImageColor.getrgb(color) - except ValueError: + c = pygame.Color(color) + return (c.r, c.g, c.b) + except (ValueError, TypeError): logging.error("Cannot convert color name: %s" % color) return None diff --git a/pistomp/lcd320x240.py b/pistomp/lcd320x240.py index 043f7c5b..cfc5b696 100644 --- a/pistomp/lcd320x240.py +++ b/pistomp/lcd320x240.py @@ -22,9 +22,10 @@ import pistomp.category as Category import pistomp.lcd as abstract_lcd import pistomp.switchstate as switchstate -from PIL import ImageColor +import pygame from uilib import * +from uilib._pygame_init import freetype as _get_freetype from uilib.lcd_ili9341 import * from pistomp.footswitch import Footswitch # TODO would like to avoid this module knowing such details @@ -70,10 +71,13 @@ def __init__(self, cwd, handler=None, flip=False): } # TODO get fonts from config.json - self.title_font = ImageFont.truetype("DejaVuSans-Bold.ttf", 26) - self.splash_font = ImageFont.truetype('DejaVuSans.ttf', 48) - self.small_font = ImageFont.truetype("DejaVuSans.ttf", 20) - self.tiny_font = ImageFont.truetype("DejaVuSans.ttf", 16) + from pathlib import Path + _fonts_dir = Path(__file__).resolve().parent.parent / "fonts" + _ft = _get_freetype() + self.title_font = _ft.Font(str(_fonts_dir / "DejaVuSans-Bold.ttf"), 26) + self.splash_font = _ft.Font(str(_fonts_dir / "DejaVuSans.ttf"), 48) + self.small_font = _ft.Font(str(_fonts_dir / "DejaVuSans.ttf"), 20) + self.tiny_font = _ft.Font(str(_fonts_dir / "DejaVuSans.ttf"), 16) self.title_split_orig = 190 self.title_split = self.title_split_orig self.display_width = 320 @@ -271,7 +275,7 @@ def draw_title(self): def draw_pedalboard(self, pedalboard_name): pedalboard_name += ":" - self.title_split = min(self.title_font.getmask(pedalboard_name).getbbox()[2], self.title_split_orig) + self.title_split = min(self.title_font.get_rect(pedalboard_name).width, self.title_split_orig) if self.w_pedalboard is not None: self.w_pedalboard.set_text(pedalboard_name) self.w_pedalboard.set_box(box=Box.xywh(0, 20, self.title_split, 36), realign=True, refresh=True) @@ -403,8 +407,9 @@ def valid_color(self, color): if color is None: return self.foreground try: - return ImageColor.getrgb(color) - except ValueError: + c = pygame.Color(color) + return (c.r, c.g, c.b) + except (ValueError, TypeError): logging.error("Cannot convert color name: %s" % color) return self.foreground @@ -786,9 +791,7 @@ def shorten_name(self, name, width): text = "" for x in name.lower().replace('_', '').replace('/', '').replace(' ', ''): test = text + x - test_bbox = self.small_font.getbbox(test) - test_size = test_bbox[2] - test_bbox[0] - if test_size >= width: + if self.small_font.get_rect(test).width >= width: break text = test return text diff --git a/pistomp/ledstrip.py b/pistomp/ledstrip.py index 96bd64e0..994e65b5 100644 --- a/pistomp/ledstrip.py +++ b/pistomp/ledstrip.py @@ -14,7 +14,7 @@ # along with pi-stomp. If not, see . import matplotlib -from PIL import ImageColor +import pygame import common.util as Util import pistomp.category as Category @@ -74,7 +74,8 @@ def set_color(self, color): c = Util.DICT_GET(self.color_cache, color) if c is None: c = matplotlib.colors.cnames[color] - c = ImageColor.getcolor(c, "RGB") + pc = pygame.Color(c) + c = (pc.r, pc.g, pc.b) self.color_cache[color] = c except: c = color diff --git a/pyproject.toml b/pyproject.toml index 0155ebd2..5f1e43b5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,7 +25,7 @@ dependencies = [ "pyalsaaudio>=0.9; sys_platform == 'linux'", "websockets>=15.0.1", "gpiozero>=2.0; sys_platform == 'linux'", - "pygame>=2.6.1", + "pygame-ce>=2.5.7", ] [project.optional-dependencies] diff --git a/tests/conftest.py b/tests/conftest.py index dd0e956b..1345eb7c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -8,7 +8,11 @@ from unittest.mock import MagicMock import pytest -from PIL import Image, ImageFont + +# Initialize pygame headlessly before any uilib import so SDL is ready. +from uilib._pygame_init import init as _pg_init +_pg_init() +import pygame from uilib.panel import LcdBase @@ -45,29 +49,6 @@ sys.modules[_mod] = MagicMock() -# --------------------------------------------------------------------------- -# Force consistent font rendering across platforms (Linux / MacOS) -# --------------------------------------------------------------------------- - - -_FONTS_DIR = PROJECT_ROOT / "fonts" - - -@pytest.fixture(autouse=True) -def force_basic_layout(monkeypatch): - original = ImageFont.truetype - - def patched(font, size=10, **kwargs): - if isinstance(font, str) and not Path(font).is_absolute() and not Path(font).exists(): - candidate = _FONTS_DIR / font - if candidate.exists(): - font = str(candidate) - kwargs["layout_engine"] = ImageFont.Layout.BASIC - return original(font, size, **kwargs) - - monkeypatch.setattr(ImageFont, "truetype", patched) - - # --------------------------------------------------------------------------- # Snapshot helpers # --------------------------------------------------------------------------- @@ -84,29 +65,36 @@ def snapshot_update(request): return request.config.getoption("--snapshot-update") -def assert_snapshot(image: Image.Image, name: str, *, update: bool = False): +def _surface_to_rgb_bytes(surface: pygame.Surface) -> tuple[bytes, tuple[int, int]]: + rgb = pygame.image.tobytes(surface, "RGB") + return rgb, surface.get_size() + + +def assert_snapshot(surface: pygame.Surface, name: str, *, update: bool = False): path = _SNAPSHOT_DIR / f"{name}.png" - rgb = image.convert("RGB") + rgb_bytes, size = _surface_to_rgb_bytes(surface) if update or not path.exists(): path.parent.mkdir(parents=True, exist_ok=True) - rgb.save(path) + # Use pygame to write the PNG so reads and writes share the same encoder. + rgb_surface = pygame.image.frombytes(rgb_bytes, size, "RGB") + pygame.image.save(rgb_surface, str(path)) return - expected = Image.open(path).convert("RGB") - assert rgb.tobytes() == expected.tobytes(), f"Snapshot mismatch: {name} (re-run with --snapshot-update to accept)" + expected_surface = pygame.image.load(str(path)).convert(24) + expected_bytes = pygame.image.tobytes(expected_surface, "RGB") + assert rgb_bytes == expected_bytes, ( + f"Snapshot mismatch: {name} (re-run with --snapshot-update to accept)" + ) @pytest.fixture def snapshot(request, fake_lcd, snapshot_update): """Assert the latest LCD frame matches a stored PNG snapshot. - Path is auto-derived from the test file and function name so no manual - string is needed. Call snapshot() for an auto-numbered frame or - snapshot("label") for a named one. Re-use the same label to assert the - screen returned to an earlier state. + Path is auto-derived from the test file and function name. """ counter = [0] rel = Path(request.fspath).relative_to(_TESTS_DIR) - module = str(rel.with_suffix("")) # e.g. "v3/test_startup" + module = str(rel.with_suffix("")) test = request.node.name def _assert(suffix=None): @@ -125,7 +113,7 @@ def _assert(suffix=None): class FakeLcd(LcdBase): def __init__(self): - self.frames: list[Image.Image] = [] + self.frames: list[pygame.Surface] = [] def dimensions(self): return (320, 240) @@ -136,8 +124,12 @@ def default_format(self): def clear(self): pass - def update(self, image: Image.Image, box=None): - self.frames.append(image.copy()) + def update(self, surface: pygame.Surface, box=None): + # Always capture a 24-bit RGB snapshot so per-frame format never drifts. + size = surface.get_size() + rgb_bytes = pygame.image.tobytes(surface, "RGB") + snap = pygame.image.frombytes(rgb_bytes, size, "RGB") + self.frames.append(snap) def update_bypass(self, enabled: bool, latched: bool): pass diff --git a/uilib/_pygame_init.py b/uilib/_pygame_init.py new file mode 100644 index 00000000..fe3f6bfc --- /dev/null +++ b/uilib/_pygame_init.py @@ -0,0 +1,38 @@ +# This file is part of pi-stomp. +# +# pi-stomp is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +"""Idempotent pygame + pygame._freetype initialization. + +Use pygame._freetype (the C extension) rather than pygame.freetype: the public +pygame.freetype module triggers a circular import with pygame.font on Python +3.14 / pygame 2.6.1. +""" + +import os + +_initialized = False + + +def init(headless: bool = True): + global _initialized + if _initialized: + return + if headless and "SDL_VIDEODRIVER" not in os.environ: + os.environ["SDL_VIDEODRIVER"] = "dummy" + import pygame + import pygame._freetype as _freetype + + pygame.init() + _freetype.init() + _initialized = True + + +def freetype(): + """Return the pygame._freetype module, initializing if needed.""" + init() + import pygame._freetype as _freetype + return _freetype diff --git a/uilib/builder.py b/uilib/builder.py index f0f5d60f..64ec7152 100644 --- a/uilib/builder.py +++ b/uilib/builder.py @@ -14,8 +14,8 @@ # along with pi-stomp. If not, see . import json -from PIL import ImageFont +from uilib._pygame_init import freetype as _get_freetype from uilib.panel import * from uilib.dialog import * from uilib.icon import * @@ -35,8 +35,8 @@ def _translate_attr(kv): if key == 'font' or key == 'title_font': if isinstance(value, list): fname, size = tuple(value) - return ImageFont.TrueType(fname, size) - return Config().get_font(kv) + return _get_freetype().Font(fname, size) + return Config().get_font(value) if (key == 'fgnd' or key == 'bkgnd' or key == 'sel_color' or key == 'outline_color' or key == 'title_color'): if isinstance(value, list): diff --git a/uilib/config.py b/uilib/config.py index ca087cc1..f03a3ca3 100644 --- a/uilib/config.py +++ b/uilib/config.py @@ -14,7 +14,12 @@ # along with pi-stomp. If not, see . import json -from PIL import ImageFont +import os +from pathlib import Path + +from uilib._pygame_init import freetype as _get_freetype + +_FONTS_DIR = Path(__file__).resolve().parent.parent / "fonts" class Config(): _instance = None @@ -36,21 +41,26 @@ def __init__(self, config_json = None): def _set_defaults(self): if 'default' not in self.fonts: - add_font('default', 'DejaVuSans.ttf', 16) + self.add_font('default', 'DejaVuSans.ttf', 16) if 'default_title' not in self.fonts: - add_font('default_title', 'DejaVuSans-Bold.ttf', 16) + self.add_font('default_title', 'DejaVuSans-Bold.ttf', 16) if 'default_fgnd' not in self.colors: - add_color('default_fgnd', (255, 255, 255)) + self.add_color('default_fgnd', (255, 255, 255)) if 'default_bkgnd' not in self.colors: - add_color('default_bkgnd', (0, 0, 0)) + self.add_color('default_bkgnd', (0, 0, 0)) if 'default_title_fgnd' not in self.colors: - add_color('default_title_fgnd', (255, 191, 63)) + self.add_color('default_title_fgnd', (255, 191, 63)) if 'default_title_bkgnd' not in self.colors: - add_color('default_title_bkgnd', (63, 63, 63)) + self.add_color('default_title_bkgnd', (63, 63, 63)) def add_font(self, label, file_name, size): - f = ImageFont.truetype(file_name, size) - # XXX Add some error handling + # Resolve bare filenames against the bundled fonts directory. + path = file_name + if not os.path.isabs(file_name) and not os.path.exists(file_name): + candidate = _FONTS_DIR / file_name + if candidate.exists(): + path = str(candidate) + f = _get_freetype().Font(path, size) self.fonts[label] = f def get_font(self, label): diff --git a/uilib/container.py b/uilib/container.py index 7732375b..6eed004e 100644 --- a/uilib/container.py +++ b/uilib/container.py @@ -13,26 +13,28 @@ # You should have received a copy of the GNU General Public License # along with pi-stomp. If not, see . +from typing import Optional, Tuple + +import pygame + from uilib.widget import * -from uilib.paint import PaintContext, _NAIVE_POOL -from PIL import Image, ImageDraw +from uilib.paint import PaintContext, _pg_rect + class ContainerWidget(Widget): - """A Widget container with an Image backing store, Children are drawn inside - the container. - A container also supports scrolling its content. + """A Widget container with a pygame.Surface backing store. Children are + drawn inside the container. A container also supports scrolling its content. """ # Inherited attributes with defaults INH_ATTRS = { 'image_format' : 'RGB' } # When True, descendants should not push fresh pixels into this container's - # cache during propagate_dirty. Used by PanelStack, whose image is rebuilt + # cache during propagate_dirty. Used by PanelStack, whose surface is rebuilt # by composition on every propagate_dirty call (push-up would be wasted). _skip_cache_push = False def __init__(self, box, **kwargs): # Non-inherited attributes - self.mask_format = self._get_arg(kwargs, 'mask_format', None) self.virtual = self._get_arg(kwargs, 'virtual', False) self._content_height = self._get_arg(kwargs, 'content_height', None) kwargs.pop('virtual', None) @@ -41,10 +43,10 @@ def __init__(self, box, **kwargs): # Inheritable attributes self._init_attrs(ContainerWidget.INH_ATTRS, kwargs) - self.image = None + self.surface: Optional[pygame.Surface] = None self.old_box = None - self.offset = (0, 0) - # When True, self.image is trusted to hold the current rendered state + self.offset: Tuple[int, int] = (0, 0) + # When True, self.surface is trusted to hold the current rendered state # for any clip, and do_draw can skip the rebuild and just blit. # Invalidated on (re)allocation and on child attach/detach. self._cache_valid = False @@ -63,52 +65,46 @@ def _setup(self): h = self._content_height if (self.virtual and self._content_height) else self.box.height # Check if we are already setup for this box - if (self.image != None and self.old_box != None and + if (self.surface is not None and self.old_box is not None and self.old_box.width == w and self.old_box.height == self.box.height and - self.image.height == h): + self.surface.get_height() == h): return trace(self, "container setup, box=", self.box, "old_box=", self.old_box) - # Create new image and draw instance + # Create new pygame surface self.old_box = self.box.copy() - self.image = Image.new(self.image_format, (w, h)) - self.draw = ImageDraw.Draw(self.image) self.has_alpha = self.image_format == 'RGBA' - if self.mask_format is not None: - self.mask = Image.new(self.mask_format, (w, h)) + if self.has_alpha: + self.surface = pygame.Surface((int(w), int(h)), pygame.SRCALPHA) else: - self.mask = None + self.surface = pygame.Surface((int(w), int(h))) self._cache_valid = False def _viewport(self) -> Box: - """Visible region in content (image) coords.""" + """Visible region in content (surface) coords.""" ox, oy = self.offset return Box.xywh(ox, oy, self.box.width, self.box.height) def _content_bounds(self) -> Box: - """Full backing image bounds — used as clip ceiling for children.""" - return Box(0, 0, self.image.width, self.image.height) - + """Full backing surface bounds — used as clip ceiling for children.""" + assert self.surface is not None + return Box(0, 0, self.surface.get_width(), self.surface.get_height()) + def _visible_box(self, box): if box is None: return False return box.intersects(self.box.norm()) def refresh(self): - """Redraw the container's backing image and notify the parent of the change. - - This constructs a local PaintContext for the container, redraws self and all children - into the internal image, and then bubbles the updated region up the widget tree.""" + """Redraw the container's backing surface and notify the parent of the change.""" trace(self, "ContainerWidget.refresh: vis=", self.visible, "parent=", self.parent) - if not self.image: + if self.surface is None: return - stack = self._get_stack() - pool = stack.pool if stack else _NAIVE_POOL if self.virtual: viewport = self._viewport() local_frame = self._content_bounds() - ctx = PaintContext(self.image, self.draw, local_frame, pool, frame=local_frame) + ctx = PaintContext(self.surface, local_frame, frame=local_frame) self._draw_erase(ctx) self._draw(ctx) for c in self.children: @@ -127,7 +123,7 @@ def refresh(self): else: local_clip = self.box.norm() local_frame = self.box.norm() - ctx = PaintContext(self.image, self.draw, local_clip, pool, frame=local_frame) + ctx = PaintContext(self.surface, local_clip, frame=local_frame) self._draw_erase(ctx) self._draw(ctx) for c in self.children: @@ -142,10 +138,11 @@ def refresh(self): def do_draw(self, ctx: PaintContext, frame: Box): """Draw this container's pixels into a parent's PaintContext. - If our cache is valid, this is a pure blit from self.image into the + If our cache is valid, this is a pure blit from self.surface into the parent surface. Otherwise we first rebuild the entire backing store (so future partial blits can trust it), then blit the requested clip. """ + assert self.surface is not None with ctx.painting(frame) as pctx: pframe = pctx.frame assert pframe is not None @@ -155,7 +152,7 @@ def do_draw(self, ctx: PaintContext, frame: Box): # 1. Rebuild the cache only on a miss. Virtual containers maintain # their cache via refresh()/scroll() and never rebuild here. if not self.virtual and not self._cache_valid: - full_ctx = PaintContext(self.image, self.draw, local_frame, pctx.pool, frame=local_frame) + full_ctx = PaintContext(self.surface, local_frame, frame=local_frame) self._draw_erase(full_ctx) self._draw(full_ctx) for c in self.children: @@ -165,55 +162,40 @@ def do_draw(self, ctx: PaintContext, frame: Box): self._draw_selection(full_ctx) self._cache_valid = True - # 2. Blit our backing store into pctx.image (possibly a slow-path temp). + # 2. Blit our backing store into pctx.surface. dst_topleft = (pframe.x0 + local_clip.x0, pframe.y0 + local_clip.y0) - self._blit_into(pctx.image, local_clip, dst_topleft) + self._blit_into(pctx.surface, local_clip, dst_topleft) - def _blit_into(self, target_image, local_clip: Box, dst_topleft): - """Copy self.image[local_clip + self.offset] into target_image at dst_topleft. + def _blit_into(self, target_surface: pygame.Surface, local_clip: Box, dst_topleft: Tuple[int, int]): + """Copy self.surface[local_clip + self.offset] into target_surface at dst_topleft. For virtual (tall) containers, local_clip is in viewport coords; we - shift by self.offset to address the correct slice of the tall image. - Honors self.mask (e.g. RoundedPanel) and the target's pixel format.""" + shift by self.offset to address the correct slice of the tall surface. + Per-pixel alpha (SRCALPHA) is honored automatically by pygame's blit.""" + assert self.surface is not None src_box = local_clip.offset(self.offset) - sub = self.image.crop(src_box.rect) - if self.mask is not None: - # Mask describes the viewport shape, so sample at local_clip coords - # (viewport-relative). In non-virtual case offset=(0,0) so the two coincide. - sub_mask = self.mask.crop(local_clip.rect) - else: - sub_mask = None - if self.has_alpha and target_image.mode == 'RGBA': - target_image.alpha_composite(sub, dst_topleft) - else: - target_image.paste(sub, dst_topleft, sub_mask) + target_surface.blit(self.surface, _ipt(dst_topleft), area=_pg_rect(src_box)) def propagate_dirty(self, local_clip: Box): """Bubble a dirty region (in our local coords) up to our parent container. Before bubbling, push our freshly-updated pixels into the parent's cache so it doesn't need to rebuild on its next do_draw. Skipped for PanelStack - parents, whose image is rebuilt by composition on every propagate_dirty.""" + parents, whose surface is rebuilt by composition on every propagate_dirty.""" if not self.visible or self.parent is None: return - # parent_clip is local_clip expressed in parent-local coords parent_clip = local_clip.deoffset(self.offset).offset(self.box) parent = self.parent if (isinstance(parent, ContainerWidget) and not parent._skip_cache_push and parent._cache_valid - and parent.image is not None): - # Parent's cache is current — patch it in place so it stays current. - # If parent._cache_valid is False, the blit would be discarded by the - # next do_draw rebuild, so skip it. - # _blit_into expects viewport-relative coords; convert from content coords + and parent.surface is not None): viewport_clip = local_clip.deoffset(self.offset) - self._blit_into(parent.image, viewport_clip, parent_clip.topleft) + self._blit_into(parent.surface, viewport_clip, parent_clip.topleft) parent.propagate_dirty(parent_clip) def _invalidate_cache(self): - """Mark our cache stale and bubble the invalidation up the container - chain. A no-op if already invalid (caps the bubble cost).""" + """Mark our cache stale and bubble the invalidation up the container chain.""" if not self._cache_valid: return self._cache_valid = False @@ -224,13 +206,11 @@ def scroll(self, offset): if not self.virtual: self.refresh() return - if not self.image: + if self.surface is None: return viewport = self._viewport() - stack = self._get_stack() - pool = stack.pool if stack else _NAIVE_POOL content_frame = self._content_bounds() - ctx = PaintContext(self.image, self.draw, content_frame, pool, frame=content_frame) + ctx = PaintContext(self.surface, content_frame, frame=content_frame) for c in self.children: if c.visible and viewport.intersects(c.box): if not c._painted or c._dirty: @@ -240,7 +220,7 @@ def scroll(self, offset): self._cache_valid = True if self.visible and self.parent is not None: self.propagate_dirty(viewport) - + def __adj_off_step(self, off, step): aoff = abs(off) s = (aoff + (step - 1)) // step @@ -268,10 +248,12 @@ def _scroll_into_view(self, box): ox += self.__adj_off_step(movex, box.width) oy += self.__adj_off_step(movey, box.height) if b0.y0 == 0: - # XXX hack to allow scrolling to reset to original location when box.y0 is 0 (container top) - # TODO would prefer a better way self.scroll((ox, 0)) else: self.scroll((ox, oy)) return True return False + + +def _ipt(p): + return (int(p[0]), int(p[1])) diff --git a/uilib/dialog.py b/uilib/dialog.py index dd705131..cbae5ca5 100644 --- a/uilib/dialog.py +++ b/uilib/dialog.py @@ -57,33 +57,25 @@ def _draw(self, ctx): # The +2 here is magic ... need to figure out what's up, otherwise we get only 1 pixel ctx.draw_line(((0, y), (ctx.width - self.outline, y)), fill=self.fgnd_color, width=self.outline + 2) -class Dialog(Panel): - def __init__(self, width, height, title, title_font = None, **kwargs): +class Dialog(RoundedPanel): + """A pop-up dialog with a title decorator. Rounded corners come from the + backing surface's own alpha channel (pygame border_radius).""" + + def __init__(self, width, height, title, title_font=None, **kwargs): box = Box.xywh(0, 0, width, height) - # Fixed radius for now radius = 10 - if title_font == None: + if title_font is None: title_font = Config().get_font('default_title') - deco = functools.partial(DialogDecorator, title = title, title_font = title_font, outline_radius = radius) - if 'mask_format' not in kwargs: - kwargs['mask_format'] = '1' - super(Dialog,self).__init__(box = box, align = WidgetAlign.CENTRE, radius = radius, - decorator = deco, **kwargs) - # Setup mask - mdraw = ImageDraw.Draw(self.mask) - # Base is a rounded rectangle - b = self.box.norm() - mdraw.rounded_rectangle(b.PIL_rect, radius, 1, None, 0) - # Fill up the top corners - b.height = int(b.height / 2) - mdraw.rectangle(b.PIL_rect, 1, None, 0) + deco = functools.partial(DialogDecorator, title=title, title_font=title_font, outline_radius=radius) + super(Dialog, self).__init__(box=box, align=WidgetAlign.CENTRE, radius=radius, + decorator=deco, **kwargs) class MessageDialog(Dialog): def __init__(self, panelstack, message, title="Error", width=200, height=90): super(MessageDialog, self).__init__(width=width, height=height, title=title, auto_destroy=True) - bbox = Config().get_font('default_title').getbbox("a") - chars_per_line = width // int(bbox[2] - bbox[0]) + char_w = Config().get_font('default_title').get_rect("a").width + chars_per_line = width // max(1, int(char_w)) chunks = textwrap.wrap(message, width=chars_per_line) wrapped = '\n'.join(chunks) diff --git a/uilib/image.py b/uilib/image.py index f5997793..23d53241 100644 --- a/uilib/image.py +++ b/uilib/image.py @@ -13,24 +13,36 @@ # You should have received a copy of the GNU General Public License # along with pi-stomp. If not, see . +import pygame + from uilib.widget import * -from PIL import Image + + +def _load(image_path: str) -> pygame.Surface: + # convert_alpha needs a video surface; under SDL_VIDEODRIVER=dummy a + # display surface exists after pygame.init(), so this is safe. + surf = pygame.image.load(image_path) + try: + return surf.convert_alpha() + except pygame.error: + return surf + class ImageWidget(Widget): - """A simple widget with an image""" + """A simple widget that paints a pygame.Surface centered in its frame.""" + def __init__(self, image_path, **kwargs): self._init_attrs(Widget.INH_ATTRS, kwargs) - super(ImageWidget,self).__init__(**kwargs) - self.image = Image.open(image_path) + super(ImageWidget, self).__init__(**kwargs) + self.image = _load(image_path) def _draw(self, ctx): - width, height = self.image.size + width, height = self.image.get_size() offx = int((ctx.width - width) / 2) offy = int((ctx.height - height) / 2) ctx.paste(self.image, (offx, offy)) def replace_img(self, image_path): - # XXX Note that the new image must be the same size as the original - self.image = Image.open(image_path) + # XXX the new image should be the same size as the original + self.image = _load(image_path) self.refresh() - diff --git a/uilib/lcd_ili9341.py b/uilib/lcd_ili9341.py index 2a8b386f..b3d9959f 100644 --- a/uilib/lcd_ili9341.py +++ b/uilib/lcd_ili9341.py @@ -14,6 +14,8 @@ # along with pi-stomp. If not, see . import adafruit_rgb_display.ili9341 as ili9341 +import pygame +from PIL import Image from uilib.panel import LcdBase, Box from functools import cached_property @@ -25,22 +27,19 @@ class LcdIli9341(LcdBase): - # XXX # TODO: Turn "flip" into all 90deg angle combinations def __init__(self, spi, cs_pin, dc_pin, reset_pin, baudrate, flip=True): rst = reset_pin if not self.has_system_splash else None self.disp = ili9341.ILI9341(spi, cs=cs_pin, dc=dc_pin, rst=rst, baudrate=baudrate) - # Use this to assure we don't have multiple threads trying to change the screen - # All methods which do change the screen (eg. dist. calls) should acquire/release self.lock = threading.Lock() if not self.has_system_splash: self.clear() self._set_stamp() - # Test full screen image + # Portrait dimensions (the panel itself is landscape; we rotate at push). self.width = self.disp.height self.height = self.disp.width self.flip = flip @@ -68,35 +67,39 @@ def clear(self): self.disp.fill(0) self.lock.release() - def update(self, image, box = None): + def update(self, surface: pygame.Surface, box=None): + """Push (a sub-rect of) the composed pygame surface to the LCD. + + Converts surface → packed RGB888 bytes → PIL.Image at the seam and + hands it to adafruit_rgb_display, which handles the SPI bulk write.""" if self.lock.locked(): logging.debug("LCD update was locked by another thread") self.lock.acquire() - # LCD coordinates - # - # portrait mode, connector = bottom - # - # on pi-stomp, X=0 is "bottom" (away from jacks) - # Y=0 is "left" (out jack side) - # - img_width, img_height = image.size - if box is None: - box = Box(0, 0, img_width, img_height) - - # Check if we need to crop the image to the LCD size - x1, y1, x2, y2 = box.rect - if x2 > self.width: - x2 = self.width - if y2 > self.height: - y2 = self.height - if x1 != 0 or y1 != 0 or x2 != img_width or y2 != img_width: - image = image.crop((x1, y1, x2, y2)) - if self.flip: - x = self.height - y2 - y = x1 + try: + img_width, img_height = surface.get_size() + if box is None: + box = Box(0, 0, img_width, img_height) + + x1, y1, x2, y2 = box.rect + if x2 > self.width: + x2 = self.width + if y2 > self.height: + y2 = self.height + + cropped = x1 != 0 or y1 != 0 or x2 != img_width or y2 != img_height + if cropped: + sub_rect = pygame.Rect(x1, y1, x2 - x1, y2 - y1) + sub = surface.subsurface(sub_rect) + if self.flip: + x, y = self.height - y2, x1 + else: + x, y = y1, self.width - x2 else: - x = y1 - y = self.width - x2 - self.disp.image(image, 270 if self.flip else 90, x, y) - self.lock.release() - + sub = surface + x, y = 0, 0 + + rgb_bytes = pygame.image.tobytes(sub, "RGB") + pil_img = Image.frombytes("RGB", sub.get_size(), rgb_bytes) + self.disp.image(pil_img, 270 if self.flip else 90, x, y) + finally: + self.lock.release() diff --git a/uilib/menu.py b/uilib/menu.py index e6e67db6..9de26d11 100644 --- a/uilib/menu.py +++ b/uilib/menu.py @@ -34,7 +34,7 @@ def __init__(self, items, font = None, max_width = None, max_height = None, if font is None: font = Config().get_font('default') self.font = font - self.font_metrics = font.getmetrics() + self.font_metrics = None self.item_h = 0 self.text_halign = text_halign self.default_item = default_item diff --git a/uilib/misc.py b/uilib/misc.py index 4e9ca505..3b1691fe 100644 --- a/uilib/misc.py +++ b/uilib/misc.py @@ -56,19 +56,16 @@ def trace(obj, *args): print(str(type(obj)), n, args) # Utility function (from stack overflow). TODO: Move to a TextUtils -def get_text_size(text_string, font, metrics = None): - # https://stackoverflow.com/a/46220683/9263761 - if metrics is not None: - ascent, descent = metrics - else: - ascent, descent = font.getmetrics() +def get_text_size(text_string, font, metrics=None): + """Return (width, height) of `text_string` rendered with `font`. -# text_width = font.getmask(text_string).getbbox()[2] -# text_height = font.getmask(text_string).getbbox()[3] + descent - bbox = font.getbbox(text_string) - text_width = bbox[2] - bbox[0] - text_height = bbox[3] + descent - - return (text_width, text_height) + Width is the actual glyph width for the given text. Height is the font's + line height (ascender + descender), so a widget sized for one string + stays sized correctly when the text changes — matches the PIL behavior + where `getmetrics()`-derived descent was added regardless of the text.""" + if not text_string: + return (0, font.get_sized_height()) + width = font.get_rect(text_string).width + return (width, font.get_sized_height()) diff --git a/uilib/paint.py b/uilib/paint.py index f52838a8..be2bfa2c 100644 --- a/uilib/paint.py +++ b/uilib/paint.py @@ -14,97 +14,62 @@ # along with pi-stomp. If not, see . from dataclasses import dataclass, replace -from typing import Generator, Optional, Tuple, Protocol +from typing import Generator, Optional, Sequence, Tuple, Union from contextlib import contextmanager -from PIL import Image, ImageDraw -from uilib.box import Box - - -class BufferManager(Protocol): - """Protocol for providing RGBA buffers.""" - - def acquire(self, size: Tuple[int, int]) -> Image.Image: ... - def release(self, buf: Image.Image) -> None: ... - - -class NaiveBufferPool: - """Naive implementation that always allocates a new image.""" - - def acquire(self, size: Tuple[int, int]) -> Image.Image: - return Image.new("RGBA", size, (0, 0, 0, 0)) - - def release(self, buf: Image.Image) -> None: - pass +from uilib._pygame_init import init as _pg_init +_pg_init() -_NAIVE_POOL = NaiveBufferPool() +import pygame +import pygame._freetype as _freetype +import pygame.gfxdraw as gfxdraw +from uilib.box import Box -class BufferPool: - """Stack of reusable RGBA buffers sized up to (max_w, max_h). - Used as a stack to support reentrant slow paths (slow-path widget - contains a slow-path child). Each acquire returns a buffer of at - least the requested size; the buffer is cleared on acquire and - returned to the pool on release. No allocation after warm-up.""" +# Color spec accepted by uilib's PaintContext primitives. +ColorLike = Union[pygame.Color, str, int, Tuple[int, int, int], Tuple[int, int, int, int], Sequence[int]] +Point = Tuple[int, int] +PointSeq = Sequence[Point] +FlatCoords = Sequence[int] - def __init__(self, max_size: Tuple[int, int]): - self.max_size = max_size - self._free: list[Image.Image] = [] - def acquire(self, size: Tuple[int, int]) -> Image.Image: - # 1. Look for the best existing buffer: smallest one that's at least as big as 'size' - # on both dimensions. - best_idx = -1 - best_area = -1 +def _color(c: ColorLike) -> pygame.Color: + """Coerce a non-None color spec to a pygame.Color.""" + if isinstance(c, pygame.Color): + return c + if isinstance(c, str): + return pygame.Color(c) + return pygame.Color(*c) if not isinstance(c, int) else pygame.Color(c) - for i, img in enumerate(self._free): - if img.size[0] >= size[0] and img.size[1] >= size[1]: - area = img.size[0] * img.size[1] - if best_idx == -1 or area < best_area: - best_idx = i - best_area = area - if best_idx != -1: - img = self._free.pop(best_idx) - else: - # 2. No suitable buffer found. Allocate exactly what's needed, - # capped by max_size. - alloc_size = (min(size[0], self.max_size[0]), min(size[1], self.max_size[1])) - img = Image.new("RGBA", alloc_size, (0, 0, 0, 0)) +def _ipt(p: Sequence[int]) -> Point: + return (int(p[0]), int(p[1])) - # Clear the region we will use - img.paste((0, 0, 0, 0), (0, 0, size[0], size[1])) - return img - def release(self, buf: Image.Image) -> None: - self._free.append(buf) +def _pg_rect(box: Box) -> pygame.Rect: + return pygame.Rect(int(box.x0), int(box.y0), max(0, int(box.width)), max(0, int(box.height))) @dataclass(frozen=True) class PaintContext: """Immutable paint state passed down the widget tree. - image : target surface being drawn into - draw : cached ImageDraw for image - clip : dirty rect in image-coordinate space - pool : buffer pool for slow-path clipping (defaults to a naive impl) - frame : the current widget's rect in image-coordinate space; widget-relative - drawing methods translate (0,0) → frame.topleft. None on root - contexts before painting() has been entered. + surface : pygame.Surface being drawn into + clip : dirty rect in surface-coordinate space + frame : the current widget's rect in surface-coordinate space; widget-relative + drawing methods translate (0,0) → frame.topleft. None on root + contexts before painting() has been entered. """ - image: Image.Image - draw: ImageDraw.ImageDraw + surface: pygame.Surface clip: Box - pool: BufferManager = _NAIVE_POOL frame: Optional[Box] = None # --- Widget-relative geometry helpers --- def _f(self) -> Box: - """Return frame, asserting it has been set (drawing requires it).""" assert self.frame is not None, "PaintContext drawing requires a frame; enter via painting()" return self.frame @@ -124,110 +89,150 @@ def bounds(self) -> Box: @property def dirty_bounds(self) -> Box: - """Widget-relative dirty rect: bounds ∩ (clip in widget coords). - - On the fast path this equals `bounds` whenever the clip fully covers - the frame. On the slow path the clip is the temp's own bounds and the - frame is re-anchored, so this still resolves to the widget-visible - sub-rect.""" + """Widget-relative dirty rect: bounds ∩ (clip in widget coords).""" f = self._f() return self.bounds.intersection(self.clip.deoffset(f.topleft)) - def _abs_xy(self, xy): + def _abs_xy(self, xy: Sequence[int]) -> Point: ox, oy = self._f().topleft - return (xy[0] + ox, xy[1] + oy) + return (int(xy[0]) + ox, int(xy[1]) + oy) def _abs_box(self, box: Box) -> Box: return box.offset(self._f().topleft) - def _abs_points(self, xy): - """Translate a sequence of points (2-tuples) or a flat coord tuple.""" + def _abs_points(self, xy: Union[PointSeq, FlatCoords]) -> Sequence[Point]: ox, oy = self._f().topleft if len(xy) == 0: - return xy - if isinstance(xy[0], (tuple, list)): - return [(p[0] + ox, p[1] + oy) for p in xy] - out = [] + return [] + first = xy[0] + if isinstance(first, (tuple, list)): + return [(int(p[0]) + ox, int(p[1]) + oy) for p in xy] # type: ignore[index] + out: list[Point] = [] for i in range(0, len(xy), 2): - out.append(xy[i] + ox) - out.append(xy[i + 1] + oy) - return tuple(out) + out.append((int(xy[i]) + ox, int(xy[i + 1]) + oy)) # type: ignore[arg-type] + return out # --- Widget-relative drawing primitives --- - def fill(self, color): - """Fill the widget's frame with `color`.""" - self.draw.rectangle(self._f().PIL_rect, color, None, 0) - - def draw_rectangle(self, box: Box, fill=None, outline=None, width=0, radius=None): - ab = self._abs_box(box) - if radius is None: - self.draw.rectangle(ab.PIL_rect, fill, outline, width) - else: - self.draw.rounded_rectangle(ab.PIL_rect, radius, fill, outline, width) - - def draw_ellipse(self, box: Box, fill=None, outline=None, width=0): - ab = self._abs_box(box) - self.draw.ellipse(ab.rect, fill=fill, outline=outline, width=width) - - def draw_line(self, xy, fill=None, width=0): - self.draw.line(self._abs_points(xy), fill=fill, width=width) - - def draw_text(self, pos, text, fill=None, font=None, anchor=None): - self.draw.text(self._abs_xy(pos), text, fill=fill, font=font, anchor=anchor) - - def paste(self, src, pos, mask=None): - self.image.paste(src, self._abs_xy(pos), mask) - - def alpha_composite(self, src, pos=(0, 0), src_box=None): + def fill(self, color: ColorLike) -> None: + self.surface.fill(_color(color), _pg_rect(self._abs_box(self.bounds))) + + def draw_rectangle( + self, + box: Box, + fill: Optional[ColorLike] = None, + outline: Optional[ColorLike] = None, + width: int = 0, + radius: Optional[int] = None, + ) -> None: + rect = _pg_rect(self._abs_box(box)) + if rect.width <= 0 or rect.height <= 0: + return + border_radius = int(radius) if radius is not None else 0 + if fill is not None: + pygame.draw.rect(self.surface, _color(fill), rect, 0, border_radius=border_radius) + if outline is not None and int(width) > 0: + pygame.draw.rect(self.surface, _color(outline), rect, int(width), border_radius=border_radius) + + def draw_ellipse( + self, box: Box, fill: Optional[ColorLike] = None, outline: Optional[ColorLike] = None, width: int = 0 + ) -> None: + """Draw a non-AA ellipse matching PIL's ImageDraw.ellipse aesthetic. + + gfxdraw.filled_ellipse for the fill (closest coverage to PIL), + pygame.draw.ellipse with width for the outline (PIL-equivalent jaggy + stroke; handles thick widths natively). AA versions blend edges to + semi-transparent gray which clashes with the design language.""" + rect = _pg_rect(self._abs_box(box)) + if rect.width <= 0 or rect.height <= 0: + return + if fill is not None: + cx = rect.x + rect.width // 2 + cy = rect.y + rect.height // 2 + rx = max(0, rect.width // 2 - 1) + ry = max(0, rect.height // 2 - 1) + gfxdraw.filled_ellipse(self.surface, cx, cy, rx, ry, _color(fill)) + if outline is not None and int(width) > 0: + pygame.draw.ellipse(self.surface, _color(outline), rect, int(width)) + + def draw_line(self, xy: Union[PointSeq, FlatCoords], fill: Optional[ColorLike] = None, width: int = 0) -> None: + if fill is None: + return + color = _color(fill) + w = max(1, int(width)) + pts = self._abs_points(xy) + if len(pts) == 2: + pygame.draw.line(self.surface, color, _ipt(pts[0]), _ipt(pts[1]), w) + elif len(pts) > 2: + pygame.draw.lines(self.surface, color, False, [_ipt(p) for p in pts], w) + + def draw_text( + self, + pos: Sequence[int], + text: str, + fill: Optional[ColorLike] = None, + font: Optional[_freetype.Font] = None, + anchor: Optional[str] = None, + ) -> None: + """Draw text using a pygame._freetype Font. + + Default anchor matches PIL's `la` (left, ascender): `pos` is the + top-left of the line box (ascender line), not of the visible glyph + bbox. This keeps text vertical alignment consistent regardless of + which characters appear (with/without ascenders or descenders). + Also supports anchor='mm' (middle/middle of the glyph bbox). + """ + if not text or font is None or fill is None: + return + color = _color(fill) + x, y = self._abs_xy(pos) + if anchor == "mm": + rect = font.get_rect(text) + font.render_to( + self.surface, + (int(x - rect.width // 2), int(y - rect.height // 2)), + text, + fgcolor=color, + ) + return + # PIL 'la' equivalent: draw with baseline = y + ascender, in origin mode. + ascender = int(font.get_sized_ascender()) + prev_origin = font.origin + font.origin = True + try: + font.render_to(self.surface, (int(x), int(y) + ascender), text, fgcolor=color) + finally: + font.origin = prev_origin + + def paste(self, src: pygame.Surface, pos: Sequence[int], mask: Optional[pygame.Surface] = None) -> None: + """Blit a surface onto self.surface at widget-relative coords.""" + self.surface.blit(src, _ipt(self._abs_xy(pos))) + + def alpha_composite( + self, src: pygame.Surface, pos: Sequence[int] = (0, 0), src_box: Optional[Tuple[int, int, int, int]] = None + ) -> None: + """SRCALPHA blit. Retained for API parity; equivalent to a normal blit + when src has per-pixel alpha (pygame handles compositing automatically).""" + dst = _ipt(self._abs_xy(pos)) if src_box is None: - self.image.alpha_composite(src, self._abs_xy(pos)) + self.surface.blit(src, dst) else: - self.image.alpha_composite(src, self._abs_xy(pos), src_box) + self.surface.blit(src, dst, area=pygame.Rect(*src_box)) @contextmanager def painting(self, frame: Box) -> Generator["PaintContext", None, None]: - """Yield a PaintContext suitable for painting `frame`. + """Yield a PaintContext scoped to `frame`. - Fast path (clip ⊇ frame): yields self with frame set. __exit__ is a no-op. - Slow path (clip ∩ frame is sub-region): yields a temp-backed ctx - sized exactly to the intersection, with origin re-anchored. - __exit__ composites temp into self.image. + Sets an SDL clip rectangle = clip ∩ frame so primitives that draw past + the widget's frame are silently dropped. Pops the previous clip on exit. """ - if self.clip.contains(frame): - yield replace(self, frame=frame) - return - visible = self.clip.intersection(frame) if visible.is_empty(): - # This should have been caught by the caller, but handle it gracefully - yield replace(self, frame=frame) + yield replace(self, frame=frame, clip=visible) return - - # Slow path: allocate only what we can actually see - temp = self.pool.acquire(visible.size) - + old_clip = self.surface.get_clip() + self.surface.set_clip(_pg_rect(visible)) try: - temp_draw = ImageDraw.Draw(temp) - # Re-anchor: we want the widget to draw at 'frame' relative to 'visible.topleft' - # So if visible is at (10, 10) and frame is at (0, 0), the widget - # should draw at (-10, -10) in the temp buffer. - offset = visible.topleft - pframe = frame.deoffset(offset) - pclip = Box(0, 0, visible.width, visible.height) - pctx = PaintContext(temp, temp_draw, pclip, self.pool, frame=pframe) - - yield pctx - - # Composite result back to self.image. The pool may have handed us - # a buffer larger than `visible.size`; only the top-left - # (visible.width, visible.height) region was cleared and painted, - # so restrict the composite source to that region. - src_box = (0, 0, visible.width, visible.height) - if self.image.mode == "RGBA": - self.image.alpha_composite(temp, visible.topleft, src_box) - else: - sub = temp.crop(src_box) - self.image.paste(sub, visible.topleft, sub) + yield replace(self, frame=frame, clip=visible) finally: - self.pool.release(temp) + self.surface.set_clip(old_clip) diff --git a/uilib/panel.py b/uilib/panel.py index 80dc948f..f6a32cdf 100644 --- a/uilib/panel.py +++ b/uilib/panel.py @@ -13,8 +13,12 @@ # You should have received a copy of the GNU General Public License # along with pi-stomp. If not, see . +from typing import Optional + +import pygame + from uilib.container import * -from uilib.paint import PaintContext, BufferPool +from uilib.paint import PaintContext # # Note about coordinates: @@ -25,10 +29,7 @@ # class Panel(ContainerWidget): - """A Panel. This is kind of a 'window' in the traditional sense and holds - a bunch of widgets. It also can track selectable widgets and can be - placed into a PanelStack - """ + """A Panel. Holds widgets, tracks selectable items, can be pushed onto a PanelStack.""" def __init__(self, auto_destroy = False, decorator = None, **kwargs): self.sel_list = [] self.sel = None @@ -52,12 +53,10 @@ def del_sel_widget(self, widget): else: self.sel = None if len(self.sel_list) != 0: - # XXX Maybe be smarter at picking up a new item if previously_selectable: self._select_widget_idx(0) - + def add_sel_widget(self, widget): - """Add a widget to the selectable list""" assert(widget.visible) self.sel_list.append(widget) widget.selectable = True @@ -102,7 +101,7 @@ def sel_next(self): else: new_sel = (self.sel + 1) % len(self.sel_list) self._select_widget_idx(new_sel) - + def sel_prev(self): if len(self.sel_list) == 0: return @@ -136,23 +135,63 @@ def destroy(self): def _get_panel(self): return self - + + class RoundedPanel(Panel): - def __init__(self, radius = 10, **kwargs): - if 'mask_format' not in kwargs: - kwargs['mask_format'] = '1' - super(RoundedPanel,self).__init__(**kwargs) - self.radius = radius + """A panel with rounded corners. - # Setup mask plans - mdraw = ImageDraw.Draw(self.mask) - mdraw.rounded_rectangle(self.box.norm().PIL_rect, radius, 1, None, 0) + The rounded shape is stored as a separate alpha mask surface and applied + at blit time (BLEND_RGBA_MULT), exactly the way the old PIL implementation + used a mode='1' bitmap with paste(mask=…). This means children that happen + to paint into the corner regions don't leak past the rounded edge.""" - def _draw_outline(self, ctx: PaintContext): + def __init__(self, radius: int = 10, **kwargs): + kwargs['image_format'] = 'RGBA' + super(RoundedPanel, self).__init__(**kwargs) + self.radius = radius + self._shape_mask: Optional[pygame.Surface] = None + self._build_shape_mask() + + def _build_shape_mask(self) -> None: + assert self.surface is not None + size = self.surface.get_size() + mask = pygame.Surface(size, pygame.SRCALPHA) + mask.fill((0, 0, 0, 0)) + pygame.draw.rect(mask, (255, 255, 255, 255), + pygame.Rect(0, 0, size[0], size[1]), 0, + border_radius=self.radius) + self._shape_mask = mask + + def _setup(self): + super()._setup() + # Rebuild the mask if the backing surface was just (re)allocated. + if getattr(self, "radius", None) is not None and self.surface is not None: + self._build_shape_mask() + + def _blit_into(self, target_surface: pygame.Surface, local_clip, dst_topleft) -> None: + """Blit the rounded slice into the parent. + + Composite our pixels onto a small SRCALPHA scratch, multiply by the + shape mask's matching sub-rect, then blit the result. Cost scales with + the dirty rect, not the full panel — fast incremental updates remain + fast.""" + assert self.surface is not None + assert self._shape_mask is not None + from uilib.paint import _pg_rect + src_box = local_clip.offset(self.offset) + src_rect = _pg_rect(src_box) + mask_rect = _pg_rect(local_clip) + tmp = pygame.Surface((src_rect.width, src_rect.height), pygame.SRCALPHA) + tmp.blit(self.surface, (0, 0), area=src_rect) + tmp.blit(self._shape_mask, (0, 0), area=mask_rect, special_flags=pygame.BLEND_RGBA_MULT) + target_surface.blit(tmp, (int(dst_topleft[0]), int(dst_topleft[1]))) + + def _draw_outline(self, ctx): if self.outline != 0: color = self.outline_color if self.outline_color is not None else self.fgnd_color ctx.draw_rectangle(ctx.bounds, None, color, self.outline, radius=self.radius) + class LcdBase: def dimensions(self): pass @@ -160,42 +199,40 @@ def dimensions(self): def default_format(self): pass - def update(self, image, box = None): + def update(self, image, box=None): pass @property def has_system_splash(self) -> bool: return False + class PanelStack(ContainerWidget): _skip_cache_push = True - def __init__(self, lcd, box = None, image_format = None, use_dimming = True): + def __init__(self, lcd, box: Optional[Box] = None, image_format: Optional[str] = None, use_dimming: bool = True): # XXX This implementation currently assumes box is at (0,0) in the LCD - # and the offset remains 0,0 (dont' try to scroll) + # and the offset remains 0,0 (don't try to scroll) if box is None: box = Box((0,0), lcd.dimensions()) if image_format is None: image_format = lcd.default_format() - - trace(self, "Panel stack initializing with box=", box) - # Dimming, when enabled, causes panels below the frontmost one to - # be "dimmed" (the further back the more they get dimmed) if use_dimming: image_format = 'RGBA' - super(PanelStack,self).__init__(box = box, image_format = image_format) + + trace(self, "Panel stack initializing with box=", box) + super(PanelStack,self).__init__(box=box, image_format=image_format) self.stack = [] self.current = None self.lcd = lcd self.visible = True if use_dimming: - size = (box.width, box.height) - self.dimmer = Image.new('RGBA', size, (0,0,0,64)) + size = (int(box.width), int(box.height)) + self.dimmer: Optional[pygame.Surface] = pygame.Surface(size, pygame.SRCALPHA) + self.dimmer.fill((0, 0, 0, 64)) else: self.dimmer = None - self.pool = BufferPool(box.size) - # We don't have a parent, establish all the defaults self._setup_act_attrs() self._setup() @@ -210,32 +247,34 @@ def refresh(self): self.propagate_dirty(self.box.norm()) self.lcd_needs_update = False - def propagate_dirty(self, clip: Box): + def propagate_dirty(self, local_clip: Box): """Recompose the dirty clip region from all stacked panels, then push to LCD.""" - # PanelStack acts as its own framing here: erase against clip-as-frame. - erase_ctx = PaintContext(self.image, self.draw, clip, self.pool, frame=clip) + assert self.surface is not None + clip = local_clip + erase_ctx = PaintContext(self.surface, clip, frame=clip) self._draw_erase(erase_ctx) for p in self.stack: if self.dimmer is not None: - self.image.alpha_composite(self.dimmer, clip.topleft, clip.rect) + from uilib.paint import _pg_rect + self.surface.blit(self.dimmer, clip.topleft, area=_pg_rect(clip)) d = p.decorator if d is not None: inter = clip.intersection(d.box) if not inter.is_empty(): - ctx = PaintContext(self.image, self.draw, inter, self.pool) + ctx = PaintContext(self.surface, inter) d.do_draw(ctx, d.box) inter = clip.intersection(p.box) if not inter.is_empty(): - ctx = PaintContext(self.image, self.draw, inter, self.pool) + ctx = PaintContext(self.surface, inter) p.do_draw(ctx, p.box) - trace(self, "updating lcd with image", self.image, "box=", clip) - self.lcd.update(self.image, clip) + trace(self, "updating lcd with surface", self.surface, "box=", clip) + self.lcd.update(self.surface, clip) def do_draw(self, ctx: PaintContext, frame: Box): assert False - + def _get_stack(self): return self @@ -243,33 +282,28 @@ def push_panel(self, panel, refresh=True): assert panel not in self.stack assert isinstance(panel, Panel) - # Check if we haven't been attached yet - if panel.parent == None: + if panel.parent is None: panel.attach(self) self.stack.append(panel) - # Input target self.current = panel - panel.show(refresh = False) + panel.show(refresh=False) if refresh: self.refresh() def pop_panel(self, panel): - # panel == None is a special case meaning just pop the current panel if panel is None: panel = self.current assert panel in self.stack self.stack.remove(panel) - panel.hide(refresh = False) + panel.hide(refresh=False) if panel == self.current: if len(self.stack) == 0: current = None else: current = self.stack[-1] self.current = current - # queue a refresh self.lcd_needs_update = True if panel.auto_destroy: -# panel.detach() panel.destroy() def find_panel_type(self, type): @@ -284,10 +318,9 @@ def input_event(self, event): return self.current.input_event(event) return False + class PanelDecorator(Widget): def __init__(self, panel, **kwargs): self.panel = panel - # Default box, will be updated by subclass kwargs['box'] = Box(0,0,0,0) super(PanelDecorator,self).__init__(**kwargs) - diff --git a/uilib/text.py b/uilib/text.py index 0edf6c74..36e914f8 100644 --- a/uilib/text.py +++ b/uilib/text.py @@ -14,8 +14,8 @@ # along with pi-stomp. If not, see . from math import log -from PIL import ImageFont +from uilib._pygame_init import freetype as _get_freetype from uilib.panel import * from uilib.misc import * from uilib.config import * @@ -42,10 +42,9 @@ def __set_mode(self, mode): cs = self.charsets[mode] mw, mh = 0, 0 for c in cs: - bbox = self.font.getbbox(c) - w, h = bbox[2] - bbox[0], bbox[3] - mw = max(mw,w) - mh = max(mh,h) + rect = self.font.get_rect(c) + mw = max(mw, rect.width) + mh = max(mh, rect.height) self.l_w = mw self.l_h = mh self.l_idx %= len(cs) @@ -128,9 +127,11 @@ def __init__(self, widget): self.set_outline(2, (255,255,255)) self.outline = 2 self.curline = widget.text - self.font = ImageFont.truetype("DejaVuSans.ttf", 18) - bbox = self.font.getbbox(widget.edit_message) - msg_w, msg_h = bbox[2] - bbox[0], bbox[3] + from pathlib import Path + _fonts = Path(__file__).resolve().parent.parent / "fonts" + self.font = _get_freetype().Font(str(_fonts / "DejaVuSans.ttf"), 18) + rect = self.font.get_rect(widget.edit_message) + msg_w, msg_h = rect.width, rect.height msg_box = Box.xywh(10, 10, msg_w, msg_h) self.msg = TextWidget(box = msg_box, text = widget.edit_message, font = self.font, parent = self) edit_box = Box.xywh(10,30,280,20) @@ -179,7 +180,7 @@ def __init__(self, box, text='', font = None, edit_message = None, h_margin = No self.h_margin = h_margin self.v_margin = v_margin self.text_halign = text_halign - self.font_metrics = font.getmetrics() + self.font_metrics = None # legacy field, pygame.freetype encodes size in get_rect self.text_size_valid = False super(TextWidget,self).__init__(box, **kwargs) @@ -234,7 +235,7 @@ def set_edit_message(self, message): def set_font(self, font): self.font = font - self.font_metrics = font.getmetrics() + self.font_metrics = None self.text_size_valid = False self.refresh() diff --git a/uilib/widget.py b/uilib/widget.py index 0e197bc2..cefa9519 100644 --- a/uilib/widget.py +++ b/uilib/widget.py @@ -13,10 +13,10 @@ # You should have received a copy of the GNU General Public License # along with pi-stomp. If not, see . -from typing import TYPE_CHECKING, Tuple +from typing import TYPE_CHECKING, Optional, Tuple from uilib.misc import * from uilib.box import * -from uilib.paint import PaintContext, _NAIVE_POOL +from uilib.paint import PaintContext if TYPE_CHECKING: from uilib.container import ContainerWidget @@ -401,7 +401,12 @@ def _notify_detach(self, widget): self.parent.notify_detach(widget) def refresh(self, box=None): - """Refresh widget (and children)""" + """Refresh widget (and children). + + SDL clipping (set in PaintContext.painting) keeps any out-of-frame + primitives from leaking past the widget's frame, so we draw straight + into the container's surface — no temp buffer. + """ trace(self, "Widget.refresh: vis=", self.visible, "parent=", self.parent) if self.parent is None or not self.visible: return @@ -417,26 +422,8 @@ def refresh(self, box=None): if container.virtual and not container._viewport().intersects(frame): self._dirty = True return - stack = self._get_stack() - pool = stack.pool if stack else _NAIVE_POOL - # Render into a frame-sized temp buffer so any unintentional draw bleed - # (notably PIL's ImageDraw.text, which ignores clips) is naturally - # truncated at the widget's frame. Drawing straight into container.image - # would let anti-aliased glyph edges past frame.right double-composite - # on subsequent refreshes — see PAINT_CLIPPING_PLAN.md. - from PIL import ImageDraw - temp = pool.acquire(frame.size) - temp_draw = ImageDraw.Draw(temp) - local_frame = Box(0, 0, frame.width, frame.height) - temp_ctx = PaintContext(temp, temp_draw, local_frame, pool, frame=local_frame) - self.do_draw(temp_ctx, local_frame) - src_box = (0, 0, frame.width, frame.height) - if container.image.mode == "RGBA": - container.image.alpha_composite(temp, frame.topleft, src_box) - else: - sub = temp.crop(src_box) - container.image.paste(sub, frame.topleft, sub) - pool.release(temp) + ctx = PaintContext(container.surface, clip, frame=frame) + self.do_draw(ctx, frame) self._painted = True self._dirty = False container.propagate_dirty(clip) diff --git a/uv.lock b/uv.lock index 397a9124..4e489915 100644 --- a/uv.lock +++ b/uv.lock @@ -853,7 +853,7 @@ dependencies = [ { name = "jsonschema" }, { name = "pillow" }, { name = "pyalsaaudio", marker = "sys_platform == 'linux'" }, - { name = "pygame" }, + { name = "pygame-ce" }, { name = "python-rtmidi" }, { name = "pyyaml" }, { name = "requests" }, @@ -896,7 +896,7 @@ requires-dist = [ { name = "matplotlib", marker = "extra == 'hardware'", specifier = ">=3.5" }, { name = "pillow", specifier = ">=9.4" }, { name = "pyalsaaudio", marker = "sys_platform == 'linux'", specifier = ">=0.9" }, - { name = "pygame", specifier = ">=2.6.1" }, + { name = "pygame-ce", specifier = ">=2.5.7" }, { name = "python-rtmidi", specifier = ">=1.4" }, { name = "pyyaml", specifier = ">=6.0" }, { name = "requests", specifier = ">=2.28" }, @@ -1033,32 +1033,43 @@ wheels = [ ] [[package]] -name = "pygame" -version = "2.6.1" +name = "pygame-ce" +version = "2.5.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/49/cc/08bba60f00541f62aaa252ce0cfbd60aebd04616c0b9574f755b583e45ae/pygame-2.6.1.tar.gz", hash = "sha256:56fb02ead529cee00d415c3e007f75e0780c655909aaa8e8bf616ee09c9feb1f", size = 14808125, upload-time = "2024-09-29T13:41:34.698Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e9/0d/bb6a6fdf1b227c0bb9a44437a70962a3854bcc541533c261e5021a5ee691/pygame_ce-2.5.7.tar.gz", hash = "sha256:86beb797cd73c141299a29b56f7df2b0543fbdc81d428022458329ff694aaa51", size = 5935870, upload-time = "2026-03-02T09:26:59.005Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c4/ca/8f367cb9fe734c4f6f6400e045593beea2635cd736158f9fabf58ee14e3c/pygame-2.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:20349195326a5e82a16e351ed93465a7845a7e2a9af55b7bc1b2110ea3e344e1", size = 13113753, upload-time = "2024-09-29T14:26:13.751Z" }, - { url = "https://files.pythonhosted.org/packages/83/47/6edf2f890139616b3219be9cfcc8f0cb8f42eb15efd59597927e390538cb/pygame-2.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f3935459109da4bb0b3901da9904f0a3e52028a3332a355d298b1673a334cf21", size = 12378146, upload-time = "2024-09-29T14:26:22.456Z" }, - { url = "https://files.pythonhosted.org/packages/00/9e/0d8aa8cf93db2d2ee38ebaf1c7b61d0df36ded27eb726221719c150c673d/pygame-2.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c31dbdb5d0217f32764797d21c2752e258e5fb7e895326538d82b5f75a0cd856", size = 13611760, upload-time = "2024-09-29T11:10:47.317Z" }, - { url = "https://files.pythonhosted.org/packages/d7/9e/d06adaa5cc65876bcd7a24f59f67e07f7e4194e6298130024ed3fb22c456/pygame-2.6.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:173badf82fa198e6888017bea40f511cb28e69ecdd5a72b214e81e4dcd66c3b1", size = 14298054, upload-time = "2024-09-29T11:39:53.891Z" }, - { url = "https://files.pythonhosted.org/packages/7a/a1/9ae2852ebd3a7cc7d9ae7ff7919ab983e4a5c1b7a14e840732f23b2b48f6/pygame-2.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce8cc108b92de9b149b344ad2e25eedbe773af0dc41dfb24d1f07f679b558c60", size = 13977107, upload-time = "2024-09-29T11:39:56.831Z" }, - { url = "https://files.pythonhosted.org/packages/31/df/6788fd2e9a864d0496a77670e44a7c012184b7a5382866ab0e60c55c0f28/pygame-2.6.1-cp311-cp311-win32.whl", hash = "sha256:811e7b925146d8149d79193652cbb83e0eca0aae66476b1cb310f0f4226b8b5c", size = 10250863, upload-time = "2024-09-29T11:44:48.199Z" }, - { url = "https://files.pythonhosted.org/packages/d2/55/ca3eb851aeef4f6f2e98a360c201f0d00bd1ba2eb98e2c7850d80aabc526/pygame-2.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:91476902426facd4bb0dad4dc3b2573bc82c95c71b135e0daaea072ed528d299", size = 10622016, upload-time = "2024-09-29T12:17:01.545Z" }, - { url = "https://files.pythonhosted.org/packages/92/16/2c602c332f45ff9526d61f6bd764db5096ff9035433e2172e2d2cadae8db/pygame-2.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4ee7f2771f588c966fa2fa8b829be26698c9b4836f82ede5e4edc1a68594942e", size = 13118279, upload-time = "2024-09-29T14:26:30.427Z" }, - { url = "https://files.pythonhosted.org/packages/cd/53/77ccbc384b251c6e34bfd2e734c638233922449a7844e3c7a11ef91cee39/pygame-2.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c8040ea2ab18c6b255af706ec01355c8a6b08dc48d77fd4ee783f8fc46a843bf", size = 12384524, upload-time = "2024-09-29T14:26:49.996Z" }, - { url = "https://files.pythonhosted.org/packages/06/be/3ed337583f010696c3b3435e89a74fb29d0c74d0931e8f33c0a4246307a9/pygame-2.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47a6938de93fa610accd4969e638c2aebcb29b2fca518a84c3a39d91ab47116", size = 13587123, upload-time = "2024-09-29T11:10:50.072Z" }, - { url = "https://files.pythonhosted.org/packages/fd/ca/b015586a450db59313535662991b34d24c1f0c0dc149cc5f496573900f4e/pygame-2.6.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33006f784e1c7d7e466fcb61d5489da59cc5f7eb098712f792a225df1d4e229d", size = 14275532, upload-time = "2024-09-29T11:39:59.356Z" }, - { url = "https://files.pythonhosted.org/packages/b9/f2/d31e6ad42d657af07be2ffd779190353f759a07b51232b9e1d724f2cda46/pygame-2.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1206125f14cae22c44565c9d333607f1d9f59487b1f1432945dfc809aeaa3e88", size = 13952653, upload-time = "2024-09-29T11:40:01.781Z" }, - { url = "https://files.pythonhosted.org/packages/f3/42/8ea2a6979e6fa971702fece1747e862e2256d4a8558fe0da6364dd946c53/pygame-2.6.1-cp312-cp312-win32.whl", hash = "sha256:84fc4054e25262140d09d39e094f6880d730199710829902f0d8ceae0213379e", size = 10252421, upload-time = "2024-09-29T11:14:26.877Z" }, - { url = "https://files.pythonhosted.org/packages/5f/90/7d766d54bb95939725e9a9361f9c06b0cfbe3fe100aa35400f0a461a278a/pygame-2.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:3a9e7396be0d9633831c3f8d5d82dd63ba373ad65599628294b7a4f8a5a01a65", size = 10624591, upload-time = "2024-09-29T11:52:54.489Z" }, - { url = "https://files.pythonhosted.org/packages/e1/91/718acf3e2a9d08a6ddcc96bd02a6f63c99ee7ba14afeaff2a51c987df0b9/pygame-2.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae6039f3a55d800db80e8010f387557b528d34d534435e0871326804df2a62f2", size = 13090765, upload-time = "2024-09-29T14:27:02.377Z" }, - { url = "https://files.pythonhosted.org/packages/0e/c6/9cb315de851a7682d9c7568a41ea042ee98d668cb8deadc1dafcab6116f0/pygame-2.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2a3a1288e2e9b1e5834e425bedd5ba01a3cd4902b5c2bff8ed4a740ccfe98171", size = 12381704, upload-time = "2024-09-29T14:27:10.228Z" }, - { url = "https://files.pythonhosted.org/packages/9f/8f/617a1196e31ae3b46be6949fbaa95b8c93ce15e0544266198c2266cc1b4d/pygame-2.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27eb17e3dc9640e4b4683074f1890e2e879827447770470c2aba9f125f74510b", size = 13581091, upload-time = "2024-09-29T11:30:27.653Z" }, - { url = "https://files.pythonhosted.org/packages/3b/87/2851a564e40a2dad353f1c6e143465d445dab18a95281f9ea458b94f3608/pygame-2.6.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c1623180e70a03c4a734deb9bac50fc9c82942ae84a3a220779062128e75f3b", size = 14273844, upload-time = "2024-09-29T11:40:04.138Z" }, - { url = "https://files.pythonhosted.org/packages/85/b5/aa23aa2e70bcba42c989c02e7228273c30f3b44b9b264abb93eaeff43ad7/pygame-2.6.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef07c0103d79492c21fced9ad68c11c32efa6801ca1920ebfd0f15fb46c78b1c", size = 13951197, upload-time = "2024-09-29T11:40:06.785Z" }, - { url = "https://files.pythonhosted.org/packages/a6/06/29e939b34d3f1354738c7d201c51c250ad7abefefaf6f8332d962ff67c4b/pygame-2.6.1-cp313-cp313-win32.whl", hash = "sha256:3acd8c009317190c2bfd81db681ecef47d5eb108c2151d09596d9c7ea9df5c0e", size = 10249309, upload-time = "2024-09-29T11:10:23.329Z" }, - { url = "https://files.pythonhosted.org/packages/7e/11/17f7f319ca91824b86557e9303e3b7a71991ef17fd45286bf47d7f0a38e6/pygame-2.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:813af4fba5d0b2cb8e58f5d95f7910295c34067dcc290d34f1be59c48bd1ea6a", size = 10620084, upload-time = "2024-09-29T11:48:51.587Z" }, + { url = "https://files.pythonhosted.org/packages/e7/db/4f899c372e114e6f7eab1546c46233fae621594cb0271cd8a967f1b38a06/pygame_ce-2.5.7-cp311-cp311-macosx_10_11_universal2.whl", hash = "sha256:903eab0a59563fd0d134e502a11c9f144d21dc93ee1f5b4b4eec31f8745142b4", size = 17229304, upload-time = "2026-03-02T09:25:33.293Z" }, + { url = "https://files.pythonhosted.org/packages/2b/c7/78d3fc4e27b4372cef878996a3973749bebf553758106dcc0ca7976acf9e/pygame_ce-2.5.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ec2f2d8c95d1a5c9bfc9ffbae4c356fd71bcbc4fde70e59e3d050261bacfe908", size = 12720096, upload-time = "2026-03-02T09:25:36.088Z" }, + { url = "https://files.pythonhosted.org/packages/72/9a/202c2c3f5e0eb8a016ce8bce185992c979866bb73ad7d8ab01d0de39577b/pygame_ce-2.5.7-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:a980109b5aee984b78c884d607d4a406a92b63a8a7044180d0e2f8a26a7276a7", size = 13245692, upload-time = "2026-03-02T09:25:39.14Z" }, + { url = "https://files.pythonhosted.org/packages/4a/de/694c1bffb4c2b1afa5451549b38ae79372552085ec2cac8ec3244691c425/pygame_ce-2.5.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d35105bf5a453ffb64333bc3be685f8c55cbc4695c05733a68849a92345dcb45", size = 12820387, upload-time = "2026-03-02T09:25:41.817Z" }, + { url = "https://files.pythonhosted.org/packages/8c/1f/70b974faa39f3c8d622128eb6554f19b0531792c8fdc8d2575954c320d17/pygame_ce-2.5.7-cp311-cp311-win32.whl", hash = "sha256:ecac266ccd459e354d693f2150a065fc695a6ffcdf15eaca06709620bb837fea", size = 9835598, upload-time = "2026-03-02T09:25:44.387Z" }, + { url = "https://files.pythonhosted.org/packages/12/76/0366387cae2b9f4a2c0ccaa9a84f86db545e835bd933dc14d011765962f9/pygame_ce-2.5.7-cp311-cp311-win_amd64.whl", hash = "sha256:5ca51a671b5b6cfd747399f54fa91259d4b01980f517c9e8043f5c3e795f06ac", size = 10420750, upload-time = "2026-03-02T09:25:46.96Z" }, + { url = "https://files.pythonhosted.org/packages/c3/c1/e69e7ae0f66fc21e8af25d456f396e15c47002bdba86924b1e223d4b7fbd/pygame_ce-2.5.7-cp311-cp311-win_arm64.whl", hash = "sha256:1f5a7e5d08f26dc8e4a899be502e6ef06ac5a2800a442750267141bca7703ba7", size = 10858323, upload-time = "2026-03-02T09:25:49.572Z" }, + { url = "https://files.pythonhosted.org/packages/57/a7/cd305034f505bfa1a1acdafd3d86af54da14b29151a0d99f348306272773/pygame_ce-2.5.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:dca2f8ba56bf3b4b8c73c4863d0603773403f4f66bc2fe25784ea74aee3fffc3", size = 17210332, upload-time = "2026-03-02T09:25:52.18Z" }, + { url = "https://files.pythonhosted.org/packages/e5/94/7f6304a31ccc7d11d4443e590cbfa6fce2bd34077575a7790d4f0a14f440/pygame_ce-2.5.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4dc989462faf2c5947881f708fa406d7ac13c1bc987c1588d630ca62ad369989", size = 12709001, upload-time = "2026-03-02T09:25:54.806Z" }, + { url = "https://files.pythonhosted.org/packages/09/8b/a7886b7bfe874fa381201ee538928af3c1cab2fe3e36927ed08f3f1d0b61/pygame_ce-2.5.7-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:538689d77c44f5dbefc0abeab5b9806d6c90ebc6d64078736c8a4c731f08b37e", size = 13236706, upload-time = "2026-03-02T09:25:57.524Z" }, + { url = "https://files.pythonhosted.org/packages/db/17/70ada4cef84eca48a995cc9e0f2f087e6190b3e4111e9c8ec3c7a8f689bd/pygame_ce-2.5.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0d8fa8822c0f4b5ae6b44ada7be9f2193fd512da1381c37fa3c5bda8971d64cb", size = 12812909, upload-time = "2026-03-02T09:25:59.971Z" }, + { url = "https://files.pythonhosted.org/packages/40/db/1cfcfb7813ce6d2202919ad87c7e1b278a4f820902ba826df43dc8906e34/pygame_ce-2.5.7-cp312-cp312-win32.whl", hash = "sha256:604207c8813a594919bb7e6d3ed3834f79aa099d2d648e8a8fc3d786ad3fa1c8", size = 9837595, upload-time = "2026-03-02T09:26:02.573Z" }, + { url = "https://files.pythonhosted.org/packages/1f/d4/43b006affa13e2f4572aa28a0d1f64c91c330d289c30a022b5416245714c/pygame_ce-2.5.7-cp312-cp312-win_amd64.whl", hash = "sha256:b6b7eec2779fac11ed265a18ab926b3829654120a5c9a07c36eeedeb012b8c3c", size = 10414958, upload-time = "2026-03-02T09:26:05.25Z" }, + { url = "https://files.pythonhosted.org/packages/18/1b/971a432d8bab8c52031ddbd0e681750a57348213ec0f8a0e0d6713e8df46/pygame_ce-2.5.7-cp312-cp312-win_arm64.whl", hash = "sha256:eb99a8a7185057064163610b3ca3e1d3307f0eb3dfff6e19556fa5132c6bca87", size = 10859829, upload-time = "2026-03-02T09:26:08.06Z" }, + { url = "https://files.pythonhosted.org/packages/21/96/d28381210ec2ed5d7a04f77cd8f6949a7734f75a7a7d9a95fe8ed60fe3ba/pygame_ce-2.5.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8766985d802017e150fcfb9adc659967d8548a961d491b8974f0748412cc0427", size = 17203240, upload-time = "2026-03-02T09:26:10.975Z" }, + { url = "https://files.pythonhosted.org/packages/b8/f0/a3e4d0ad2519d106d178652ae7ec692e8acadf3d2260493840c27f8eabb8/pygame_ce-2.5.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58eabfc184dd28c682e5e6ccfce01224bb12653c6648babcd0bb9d9bd662d938", size = 12705532, upload-time = "2026-03-02T09:26:13.795Z" }, + { url = "https://files.pythonhosted.org/packages/13/0d/6d6c29aa5ecf63a66983bdf04066dc019290e7412f64b0ae5133c5e53d47/pygame_ce-2.5.7-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:92d5732cd512c8ec0b47e9a3e6c683fb811bdf2090362580778ce698222a64ab", size = 13233559, upload-time = "2026-03-02T09:26:16.202Z" }, + { url = "https://files.pythonhosted.org/packages/fe/96/e400d3a2c6456e3a334d9fae1f8704d964027b60064935278028dd79293f/pygame_ce-2.5.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:48e9a4ece43b08adc8ffb0bbbe0fe183eef4bb501a7d31552ae7398592ec0a82", size = 12811409, upload-time = "2026-03-02T09:26:19.148Z" }, + { url = "https://files.pythonhosted.org/packages/8f/ed/8e3c6f5d4ac763f6766c2043f842b2c52028b30a4ce2ce2f5dced5961354/pygame_ce-2.5.7-cp313-cp313-win32.whl", hash = "sha256:f6439100bdee81da96f5acffb280f20511c93dd67178d8a8cf29d6cfd1aa46dd", size = 9835553, upload-time = "2026-03-02T09:26:22.123Z" }, + { url = "https://files.pythonhosted.org/packages/06/a0/7acd164b3a206327bf53df5e5399227a5baf858ae2944cba562a0ae77e0a/pygame_ce-2.5.7-cp313-cp313-win_amd64.whl", hash = "sha256:25047c97760fc640a6a8bbfdf3398c5825adfd55986a7523a65c95a1fb61d759", size = 10413012, upload-time = "2026-03-02T09:26:24.747Z" }, + { url = "https://files.pythonhosted.org/packages/47/d5/e4419a340ae24bd0dde5a6861406c24114f59a543aad44f1d2f2ae4752d5/pygame_ce-2.5.7-cp313-cp313-win_arm64.whl", hash = "sha256:f5a7197096ef82d588539f13b0f7ade767f800c7b0b015a94e386f488e1039f6", size = 10856939, upload-time = "2026-03-02T09:26:27.107Z" }, + { url = "https://files.pythonhosted.org/packages/26/08/9fe0003d69077ff8faff242a85260b8a192d3b7111c02332b8b2f515d40c/pygame_ce-2.5.7-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:addfbf7d119647eec157d611f463e5d572836fa74d0d222c59210294ed618b9d", size = 17211017, upload-time = "2026-03-02T09:26:30.243Z" }, + { url = "https://files.pythonhosted.org/packages/40/c7/217c5430c8c612879162beb2d18cb10ad8b1b4db6ce03245289a3de6bc1b/pygame_ce-2.5.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1c92feb289e34ac323a7b62b91d230a4e32b44059c4d7fb95631e504b1d9b365", size = 12710845, upload-time = "2026-03-02T09:26:33.165Z" }, + { url = "https://files.pythonhosted.org/packages/00/a4/6fb0054bfb2522c4ad3ff82ecbc9c1a3c6694c50d24f2451717121636a1d/pygame_ce-2.5.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5c1ed4100311015cc67d24fe4e4d7c2f4cb25c34e043545061271c1d018c02d4", size = 12812020, upload-time = "2026-03-02T09:26:35.953Z" }, + { url = "https://files.pythonhosted.org/packages/a2/9b/0e0996573a9dd4bb34874c10643224a72372818242e07486c9eb4a22eebb/pygame_ce-2.5.7-cp314-cp314-win32.whl", hash = "sha256:1b7e641af3aeac92bb7e4df1402d6802271f4bd09c747d2665f154ef9b07a4e6", size = 9968590, upload-time = "2026-03-02T09:26:38.517Z" }, + { url = "https://files.pythonhosted.org/packages/96/96/c94d0e508954093e37a77b03101a3cf51a242e02cc0ec726edcb117f8885/pygame_ce-2.5.7-cp314-cp314-win_amd64.whl", hash = "sha256:595f4257c15fed11cd816ae0bfabad3d99f8f04a000d7d164a22c0f9afd6cb65", size = 10581240, upload-time = "2026-03-02T09:26:41.139Z" }, + { url = "https://files.pythonhosted.org/packages/81/bb/93c5dadb66ac9733ca52952e063cce117a9312d6f97facd5dc4932f3d777/pygame_ce-2.5.7-cp314-cp314-win_arm64.whl", hash = "sha256:3e6ce74fd5a5f146f1bcf0224ae3e880c733917a9edbb53f790329d235520433", size = 11057480, upload-time = "2026-03-02T09:26:43.871Z" }, + { url = "https://files.pythonhosted.org/packages/69/55/c4397d5c0c0d459d3c0dbda0cb55f7fae778117c6a3d89736968f2978a3e/pygame_ce-2.5.7-pp311-pypy311_pp73-macosx_10_15_universal2.whl", hash = "sha256:8718bc75cd4ec4bd2b0b4862e5c615b119a45038e4572c9030731db3c6740cfe", size = 17126026, upload-time = "2026-03-02T09:26:46.441Z" }, + { url = "https://files.pythonhosted.org/packages/28/7c/dad02bf97b55a71bff3e60e8909ac2be58f27520094e9182ed00ea70e4e4/pygame_ce-2.5.7-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6e4289438b0b530bbfa6e2a9088a5b4a9dc0524b6d60989c846e2c74cd149f77", size = 12670197, upload-time = "2026-03-02T09:26:49.238Z" }, + { url = "https://files.pythonhosted.org/packages/1c/da/1506934539127781ea52bd826ceb620c4a7456c52bd5410d12259a95741c/pygame_ce-2.5.7-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:01c48daf8fccb66e8750d5d26bf20e3f0dc484a5f7748fa98fd7e2ac69a2f7f5", size = 13186464, upload-time = "2026-03-02T09:26:51.784Z" }, + { url = "https://files.pythonhosted.org/packages/a6/6f/4ba6bd545113767ea1fc8204d2d6616fd749bb4f931c5357f90adf45ddd7/pygame_ce-2.5.7-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8ac7120a6c39c042abdc6bd2f5491f7121936c68c425235b52dc451ed9583dbf", size = 12767531, upload-time = "2026-03-02T09:26:54.314Z" }, + { url = "https://files.pythonhosted.org/packages/21/e8/5e3782901f10ce39724797b4ed48138da69ce03332dde7bc21c15475684f/pygame_ce-2.5.7-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:d79c4f961ffa89183380c4284914ed2f693591baec7fb92e42f05857dd8664bd", size = 10376956, upload-time = "2026-03-02T09:26:56.724Z" }, ] [[package]] From 94c55aa8e0ec26fe7d9b029b17117004b71e5d23 Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Wed, 20 May 2026 01:08:33 -0400 Subject: [PATCH 23/46] Nailed most of it --- uilib/misc.py | 30 ++++++++++++++++++++++++------ uilib/paint.py | 31 +++++++++++++++++++++++-------- 2 files changed, 47 insertions(+), 14 deletions(-) diff --git a/uilib/misc.py b/uilib/misc.py index 3b1691fe..235bcda4 100644 --- a/uilib/misc.py +++ b/uilib/misc.py @@ -59,13 +59,31 @@ def trace(obj, *args): def get_text_size(text_string, font, metrics=None): """Return (width, height) of `text_string` rendered with `font`. - Width is the actual glyph width for the given text. Height is the font's - line height (ascender + descender), so a widget sized for one string - stays sized correctly when the text changes — matches the PIL behavior - where `getmetrics()`-derived descent was added regardless of the text.""" + Matches PIL's `(bbox[2]-bbox[0], bbox[3]+descent)`: + height = ascender + max_glyph_descender_in_text + font_descender + For text with no descender glyphs this collapses to the font line height + (ascender + descender). For text containing 'g'/'p'/'y'/etc. we add the + extra glyph-descent so widgets sized to the text don't clip the descender. + """ + asc = int(font.get_sized_ascender()) + desc = abs(int(font.get_sized_descender())) + line_height = asc + desc if not text_string: - return (0, font.get_sized_height()) + return (0, line_height) width = font.get_rect(text_string).width - return (width, font.get_sized_height()) + # pygame.freetype.Font.get_metrics returns per-glyph + # (min_x, max_x, min_y, max_y, advance_x, advance_y); min_y < 0 means + # the glyph dips below the baseline. pygame surfaces these as Python ints + # but the negative values come back as 32-bit unsigned, so wrap them. + glyph_desc = 0 + for m in font.get_metrics(text_string): + if m is None: + continue + min_y = m[2] + if min_y >= 0x80000000: + min_y -= 0x100000000 + if min_y < 0 and -min_y > glyph_desc: + glyph_desc = -min_y + return (width, line_height + glyph_desc) diff --git a/uilib/paint.py b/uilib/paint.py index be2bfa2c..a38f2351 100644 --- a/uilib/paint.py +++ b/uilib/paint.py @@ -147,24 +147,39 @@ def draw_ellipse( if rect.width <= 0 or rect.height <= 0: return if fill is not None: - cx = rect.x + rect.width // 2 - cy = rect.y + rect.height // 2 - rx = max(0, rect.width // 2 - 1) - ry = max(0, rect.height // 2 - 1) + # gfxdraw.filled_ellipse covers [cx-rx, cx+rx] inclusive (2*rx+1 + # pixels). To fill the full Box, use rx = (width-1)//2 and place + # the center on the upper-left of the two center pixels for even + # sizes — matches PIL's coverage exactly. + cx = rect.x + (rect.width - 1) // 2 + cy = rect.y + (rect.height - 1) // 2 + rx = max(0, (rect.width - 1) // 2) + ry = max(0, (rect.height - 1) // 2) gfxdraw.filled_ellipse(self.surface, cx, cy, rx, ry, _color(fill)) if outline is not None and int(width) > 0: pygame.draw.ellipse(self.surface, _color(outline), rect, int(width)) def draw_line(self, xy: Union[PointSeq, FlatCoords], fill: Optional[ColorLike] = None, width: int = 0) -> None: + """Draw a polyline. + + PIL stamps a `width`×`width` box at each step along the bresenham path, + so diagonals end up ~1px thicker than axis-aligned strokes of the same + nominal width. pygame strokes exactly `width` perpendicular to the + segment. To match PIL's visual weight on icon knob pointers / pedal + graphics, bump width by 1 for non-axis-aligned segments when width>=2. + """ if fill is None: return color = _color(fill) w = max(1, int(width)) pts = self._abs_points(xy) - if len(pts) == 2: - pygame.draw.line(self.surface, color, _ipt(pts[0]), _ipt(pts[1]), w) - elif len(pts) > 2: - pygame.draw.lines(self.surface, color, False, [_ipt(p) for p in pts], w) + if len(pts) < 2: + return + ipts = [_ipt(p) for p in pts] + for i in range(len(ipts) - 1): + p0, p1 = ipts[i], ipts[i + 1] + seg_w = w if (p0[0] == p1[0] or p0[1] == p1[1] or w < 2) else w + 1 + pygame.draw.line(self.surface, color, p0, p1, seg_w) def draw_text( self, From 5b500bf1262c8d5a3d2d0126320636444a16f7f9 Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Wed, 20 May 2026 01:12:21 -0400 Subject: [PATCH 24/46] Fix the menu item shape mask --- uilib/dialog.py | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/uilib/dialog.py b/uilib/dialog.py index cbae5ca5..6564af9f 100644 --- a/uilib/dialog.py +++ b/uilib/dialog.py @@ -58,8 +58,12 @@ def _draw(self, ctx): ctx.draw_line(((0, y), (ctx.width - self.outline, y)), fill=self.fgnd_color, width=self.outline + 2) class Dialog(RoundedPanel): - """A pop-up dialog with a title decorator. Rounded corners come from the - backing surface's own alpha channel (pygame border_radius).""" + """A pop-up dialog with a title decorator. + + Only the BOTTOM corners are rounded on the panel itself — the titlebar + decorator sits above with its own rounded top, so the panel's top corners + must stay square (otherwise we'd clip the top of the first content widget). + """ def __init__(self, width, height, title, title_font=None, **kwargs): box = Box.xywh(0, 0, width, height) @@ -70,6 +74,23 @@ def __init__(self, width, height, title, title_font=None, **kwargs): super(Dialog, self).__init__(box=box, align=WidgetAlign.CENTRE, radius=radius, decorator=deco, **kwargs) + def _build_shape_mask(self) -> None: + assert self.surface is not None + import pygame + size = self.surface.get_size() + mask = pygame.Surface(size, pygame.SRCALPHA) + mask.fill((0, 0, 0, 0)) + # Rounded full-panel base + pygame.draw.rect(mask, (255, 255, 255, 255), + pygame.Rect(0, 0, size[0], size[1]), 0, + border_radius=self.radius) + # Square off the top half — the titlebar decorator owns the top + # rounded corners. Without this, the rounded cutout clips the top + # of the first menu item / content widget. + pygame.draw.rect(mask, (255, 255, 255, 255), + pygame.Rect(0, 0, size[0], size[1] // 2), 0) + self._shape_mask = mask + class MessageDialog(Dialog): def __init__(self, panelstack, message, title="Error", width=200, height=90): super(MessageDialog, self).__init__(width=width, height=height, title=title, auto_destroy=True) From 8aabc778e366c1c2daebfa06827cfea03c16649d Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Wed, 20 May 2026 10:00:09 -0400 Subject: [PATCH 25/46] Continued iteration --- pistomp/lcd320x240.py | 3 ++- uilib/misc.py | 6 ++++- uilib/paint.py | 52 +++++++++++++++++++++++++++++++++---------- 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/pistomp/lcd320x240.py b/pistomp/lcd320x240.py index cfc5b696..329f5754 100644 --- a/pistomp/lcd320x240.py +++ b/pistomp/lcd320x240.py @@ -275,7 +275,8 @@ def draw_title(self): def draw_pedalboard(self, pedalboard_name): pedalboard_name += ":" - self.title_split = min(self.title_font.get_rect(pedalboard_name).width, self.title_split_orig) + _r = self.title_font.get_rect(pedalboard_name) + self.title_split = min(_r.x + _r.width, self.title_split_orig) if self.w_pedalboard is not None: self.w_pedalboard.set_text(pedalboard_name) self.w_pedalboard.set_box(box=Box.xywh(0, 20, self.title_split, 36), realign=True, refresh=True) diff --git a/uilib/misc.py b/uilib/misc.py index 235bcda4..36baec66 100644 --- a/uilib/misc.py +++ b/uilib/misc.py @@ -70,7 +70,11 @@ def get_text_size(text_string, font, metrics=None): line_height = asc + desc if not text_string: return (0, line_height) - width = font.get_rect(text_string).width + # PIL's getbbox width = rect.x + rect.width (includes first glyph's left-side + # bearing). pygame.freetype's rect.width is the tight ink width. Match PIL so + # widgets sized from this don't clip text on the right at non-zero x. + _r = font.get_rect(text_string) + width = _r.x + _r.width # pygame.freetype.Font.get_metrics returns per-glyph # (min_x, max_x, min_y, max_y, advance_x, advance_y); min_y < 0 means # the glyph dips below the baseline. pygame surfaces these as Python ints diff --git a/uilib/paint.py b/uilib/paint.py index a38f2351..0e55a322 100644 --- a/uilib/paint.py +++ b/uilib/paint.py @@ -201,23 +201,51 @@ def draw_text( return color = _color(fill) x, y = self._abs_xy(pos) - if anchor == "mm": - rect = font.get_rect(text) - font.render_to( - self.surface, - (int(x - rect.width // 2), int(y - rect.height // 2)), - text, - fgcolor=color, - ) - return - # PIL 'la' equivalent: draw with baseline = y + ascender, in origin mode. - ascender = int(font.get_sized_ascender()) + # IMPORTANT: pygame._freetype.Font.render_to bypasses surface.set_clip + # — confirmed in pygame-ce src_c/freetype/ft_render*.c, where the + # rasterizer locks the destination surface and clamps only against + # full surface bounds, never consulting clip_rect. Surface.blit DOES + # honor the clip. + # + # We render into a line-height-sized temp surface with the baseline + # at the ascender position inside it (origin=True), so the glyph + # vertically lives at the same offset from the temp top that PIL's + # 'la' anchor produced (bbox[1] = ascender - glyph_top). Blitting the + # temp at (x, y) then puts pixels at the same absolute coords PIL + # would have, but the blit IS clip-respecting. + asc = int(font.get_sized_ascender()) + desc = abs(int(font.get_sized_descender())) + rect = font.get_rect(text) + # font.get_rect(text).x is the left-side bearing — render at -rect.x so the + # leftmost visible glyph pixel lands at temp x=0 (PIL `la` semantics). + # Per-glyph descent below the nominal font descender (e.g. 'g','p','y') + # must extend the temp height; matches misc.get_text_size(). + glyph_desc = 0 + for m in font.get_metrics(text): + if m is None: + continue + min_y = m[2] + if min_y >= 0x80000000: + min_y -= 0x100000000 + if min_y < 0 and -min_y > glyph_desc: + glyph_desc = -min_y + # PIL `la` puts the pen (origin) at `pos`, so ink starts at pos.x + lsb. + # Render with origin=True at (0, asc): pen lands at temp x=0, ink lands + # at temp x=rect.x. Temp must be wide enough to hold ink: rect.x + rect.width. + temp_w = max(1, rect.x + rect.width) + temp_h = max(1, asc + desc + glyph_desc) + temp = pygame.Surface((temp_w, temp_h), pygame.SRCALPHA) prev_origin = font.origin font.origin = True try: - font.render_to(self.surface, (int(x), int(y) + ascender), text, fgcolor=color) + font.render_to(temp, (0, asc), text, fgcolor=color) finally: font.origin = prev_origin + if anchor == "mm": + dst = (int(x - temp_w // 2), int(y - temp_h // 2)) + else: + dst = (int(x), int(y)) + self.surface.blit(temp, dst) def paste(self, src: pygame.Surface, pos: Sequence[int], mask: Optional[pygame.Surface] = None) -> None: """Blit a surface onto self.surface at widget-relative coords.""" From 5e658207d6095ed0f28002e6b80af8060b790f0f Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Wed, 20 May 2026 11:11:37 -0400 Subject: [PATCH 26/46] Almost pristine text rendering --- uilib/misc.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/uilib/misc.py b/uilib/misc.py index 36baec66..6b74b2e6 100644 --- a/uilib/misc.py +++ b/uilib/misc.py @@ -59,35 +59,35 @@ def trace(obj, *args): def get_text_size(text_string, font, metrics=None): """Return (width, height) of `text_string` rendered with `font`. - Matches PIL's `(bbox[2]-bbox[0], bbox[3]+descent)`: - height = ascender + max_glyph_descender_in_text + font_descender - For text with no descender glyphs this collapses to the font line height - (ascender + descender). For text containing 'g'/'p'/'y'/etc. we add the - extra glyph-descent so widgets sized to the text don't clip the descender. + Width is the metric advance width — sum of per-glyph advance_x — + matching PIL's ImageFont.getbbox(text)[2]-[0] exactly. Earlier we returned + the tight ink width (`rect.x + rect.width`) which is 1-2px smaller, and + caused centered widgets to compute hoffset 1px right of where PIL + placed them. See PYGAME_SWAP_PLAN.md. + + Height = ascender + font_descender + per-text glyph_descent overflow, + matching PIL's `bbox[3] + descent` for the text. """ asc = int(font.get_sized_ascender()) desc = abs(int(font.get_sized_descender())) line_height = asc + desc if not text_string: return (0, line_height) - # PIL's getbbox width = rect.x + rect.width (includes first glyph's left-side - # bearing). pygame.freetype's rect.width is the tight ink width. Match PIL so - # widgets sized from this don't clip text on the right at non-zero x. - _r = font.get_rect(text_string) - width = _r.x + _r.width # pygame.freetype.Font.get_metrics returns per-glyph - # (min_x, max_x, min_y, max_y, advance_x, advance_y); min_y < 0 means - # the glyph dips below the baseline. pygame surfaces these as Python ints - # but the negative values come back as 32-bit unsigned, so wrap them. + # (min_x, max_x, min_y, max_y, advance_x, advance_y); negative values + # come back as 32-bit unsigned, so wrap them. + advance_sum = 0.0 glyph_desc = 0 for m in font.get_metrics(text_string): if m is None: continue + advance_sum += m[4] min_y = m[2] if min_y >= 0x80000000: min_y -= 0x100000000 if min_y < 0 and -min_y > glyph_desc: glyph_desc = -min_y + width = int(round(advance_sum)) return (width, line_height + glyph_desc) From f2b7327ad1738f8d97ed43ac0e4b8932f4c9b77f Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Wed, 20 May 2026 17:31:57 -0400 Subject: [PATCH 27/46] Fixed rendering --- pistomp/lcd320x240.py | 16 +++++++------ uilib/misc.py | 52 ++++++++++++++++++++++++++++++------------- uilib/paint.py | 28 +++++++++++++++++------ uilib/text.py | 19 +++++++++++----- 4 files changed, 81 insertions(+), 34 deletions(-) diff --git a/pistomp/lcd320x240.py b/pistomp/lcd320x240.py index 329f5754..63cb19d0 100644 --- a/pistomp/lcd320x240.py +++ b/pistomp/lcd320x240.py @@ -275,13 +275,14 @@ def draw_title(self): def draw_pedalboard(self, pedalboard_name): pedalboard_name += ":" - _r = self.title_font.get_rect(pedalboard_name) - self.title_split = min(_r.x + _r.width, self.title_split_orig) + _tw, _ = get_text_size(pedalboard_name, self.title_font) + self.title_split = min(_tw, self.title_split_orig) + box_w = self.title_split + 4 if self.w_pedalboard is not None: self.w_pedalboard.set_text(pedalboard_name) - self.w_pedalboard.set_box(box=Box.xywh(0, 20, self.title_split, 36), realign=True, refresh=True) + self.w_pedalboard.set_box(box=Box.xywh(0, 20, box_w, 36), realign=True, refresh=True) return - self.w_pedalboard = TextWidget(box=Box.xywh(0, 20, self.title_split, 36), text=pedalboard_name, + self.w_pedalboard = TextWidget(box=Box.xywh(0, 20, box_w, 36), text=pedalboard_name, font=self.title_font, parent=self.main_panel, action=self.draw_pedalboard_menu) self.main_panel.add_sel_widget(self.w_pedalboard) @@ -756,12 +757,12 @@ def draw_analog_assignments(self, controllers): text_color = color if control_type == Token.KNOB: - w = Icon(box=Box.xywh(x, y, 0, 0), text=name, text_color=text_color, parent=self.main_panel, outline=0) + w = Icon(box=Box.xywh(x, y, width_per_control, 18), text=name, text_color=text_color, parent=self.main_panel, outline=0) w.set_foreground(color) w.add_knob() self.w_controls.append(w) elif control_type == Token.EXPRESSION: - w = Icon(box=Box.xywh(x, y, 0, 0), text=name, text_color=text_color, parent=self.main_panel, outline=0) + w = Icon(box=Box.xywh(x, y, width_per_control, 18), text=name, text_color=text_color, parent=self.main_panel, outline=0) w.set_foreground(color) w.add_pedal() self.w_controls.append(w) @@ -792,7 +793,8 @@ def shorten_name(self, name, width): text = "" for x in name.lower().replace('_', '').replace('/', '').replace(' ', ''): test = text + x - if self.small_font.get_rect(test).width >= width: + tw, _ = get_text_size(test, self.small_font) + if tw >= width: break text = test return text diff --git a/uilib/misc.py b/uilib/misc.py index 6b74b2e6..1bb889e9 100644 --- a/uilib/misc.py +++ b/uilib/misc.py @@ -59,14 +59,16 @@ def trace(obj, *args): def get_text_size(text_string, font, metrics=None): """Return (width, height) of `text_string` rendered with `font`. - Width is the metric advance width — sum of per-glyph advance_x — - matching PIL's ImageFont.getbbox(text)[2]-[0] exactly. Earlier we returned - the tight ink width (`rect.x + rect.width`) which is 1-2px smaller, and - caused centered widgets to compute hoffset 1px right of where PIL - placed them. See PYGAME_SWAP_PLAN.md. + Width matches PIL's `font.getbbox(text)[2] - getbbox(text)[0]` exactly: + bbox_left = min(0, min_glyph_ink_left_in_pen_coords) + bbox_right = max(pen_after_last_glyph, max_glyph_ink_right_in_pen_coords) + width = bbox_right - bbox_left + Neither pygame's `rect.x + rect.width` nor `sum(advance_x)` alone matches + PIL — the former undercounts when ink overhangs past the advance (e.g. 'j' + LSB<0, '█' max_x>advance), the latter overcounts in the same cases. - Height = ascender + font_descender + per-text glyph_descent overflow, - matching PIL's `bbox[3] + descent` for the text. + Height = font ascender + font descender + per-text glyph descent overflow + (for descender glyphs like g/p/y), matching PIL's `bbox[3] + descent`. """ asc = int(font.get_sized_ascender()) desc = abs(int(font.get_sized_descender())) @@ -74,20 +76,40 @@ def get_text_size(text_string, font, metrics=None): if not text_string: return (0, line_height) # pygame.freetype.Font.get_metrics returns per-glyph - # (min_x, max_x, min_y, max_y, advance_x, advance_y); negative values - # come back as 32-bit unsigned, so wrap them. - advance_sum = 0.0 + # (min_x, max_x, min_y, max_y, advance_x, advance_y). Negative values come + # back as 32-bit unsigned ints — wrap them. + def _signed(v): + return v - 0x100000000 if v >= 0x80000000 else v + + pen = 0.0 + ink_left = 0.0 + ink_right = 0.0 + has_any = False glyph_desc = 0 for m in font.get_metrics(text_string): if m is None: continue - advance_sum += m[4] - min_y = m[2] - if min_y >= 0x80000000: - min_y -= 0x100000000 + min_x = _signed(m[0]) + max_x = _signed(m[1]) + min_y = _signed(m[2]) + adv_x = m[4] + l = pen + min_x + r = pen + max_x + if not has_any: + ink_left, ink_right, has_any = l, r, True + else: + if l < ink_left: + ink_left = l + if r > ink_right: + ink_right = r + pen += adv_x if min_y < 0 and -min_y > glyph_desc: glyph_desc = -min_y - width = int(round(advance_sum)) + if not has_any: + return (0, line_height) + right_edge = max(ink_right, pen) + left_edge = min(0.0, ink_left) + width = int(round(right_edge - left_edge)) return (width, line_height + glyph_desc) diff --git a/uilib/paint.py b/uilib/paint.py index 0e55a322..e27777fc 100644 --- a/uilib/paint.py +++ b/uilib/paint.py @@ -229,22 +229,36 @@ def draw_text( min_y -= 0x100000000 if min_y < 0 and -min_y > glyph_desc: glyph_desc = -min_y - # PIL `la` puts the pen (origin) at `pos`, so ink starts at pos.x + lsb. - # Render with origin=True at (0, asc): pen lands at temp x=0, ink lands - # at temp x=rect.x. Temp must be wide enough to hold ink: rect.x + rect.width. - temp_w = max(1, rect.x + rect.width) + # PIL `la` puts the pen at `pos`; ink lands at pos.x + lsb. When the + # first glyph has negative LSB (e.g. 'j' rect.x=-1), the ink dips left + # of the pen, and our temp surface must include that overhang or the + # leftmost ink column will be clipped. Pad `pad_x` columns on the + # left, render the pen at temp_x=pad_x, and blit with dst.x shifted + # left by pad_x so the final ink lands at the same dst column as the + # PIL output (= base_dst_x + rect.x). + pad_x = max(0, -rect.x) + temp_w = max(1, rect.x + rect.width + pad_x) temp_h = max(1, asc + desc + glyph_desc) temp = pygame.Surface((temp_w, temp_h), pygame.SRCALPHA) prev_origin = font.origin font.origin = True try: - font.render_to(temp, (0, asc), text, fgcolor=color) + font.render_to(temp, (pad_x, asc), text, fgcolor=color) finally: font.origin = prev_origin if anchor == "mm": - dst = (int(x - temp_w // 2), int(y - temp_h // 2)) + # PIL anchor='mm' centers on (PIL.getbbox(text).w / 2, (asc+desc)/2). + # uilib.misc.get_text_size matches PIL getbbox semantics. Use int() + # (floor for positive operands) — not round() — because PIL's BASIC + # layout effectively floors the fractional pen position; Python's + # banker's rounding on .5 boundaries (e.g. 51.5 → 52) would push + # the glyph one pixel right of PIL. + from uilib.misc import get_text_size + tw, _ = get_text_size(text, font) + base_dst = (int(x - tw / 2), int(y - (asc + desc) / 2)) else: - dst = (int(x), int(y)) + base_dst = (int(x), int(y)) + dst = (base_dst[0] - pad_x, base_dst[1]) self.surface.blit(temp, dst) def paste(self, src: pygame.Surface, pos: Sequence[int], mask: Optional[pygame.Surface] = None) -> None: diff --git a/uilib/text.py b/uilib/text.py index 36e914f8..39d464b0 100644 --- a/uilib/text.py +++ b/uilib/text.py @@ -41,10 +41,20 @@ def __set_mode(self, mode): self.mode = mode cs = self.charsets[mode] mw, mh = 0, 0 + # PIL bbox[3] = asc + max(0, -glyph_min_y). PIL's original code used + # `font.getbbox(c)[3]` as the per-char height, which equals this. + # pygame's rect.height alone is 3px too short for non-descender glyphs + # at 18pt — it would put loc.y 1-2px above where PIL placed it. + asc = int(self.font.get_sized_ascender()) for c in cs: - rect = self.font.get_rect(c) - mw = max(mw, rect.width) - mh = max(mh, rect.height) + cw, _ = get_text_size(c, self.font) + mw = max(mw, cw) + m = self.font.get_metrics(c)[0] + min_y = m[2] + if min_y >= 0x80000000: + min_y -= 0x100000000 + ch = asc + max(0, -min_y) + mh = max(mh, ch) self.l_w = mw self.l_h = mh self.l_idx %= len(cs) @@ -130,8 +140,7 @@ def __init__(self, widget): from pathlib import Path _fonts = Path(__file__).resolve().parent.parent / "fonts" self.font = _get_freetype().Font(str(_fonts / "DejaVuSans.ttf"), 18) - rect = self.font.get_rect(widget.edit_message) - msg_w, msg_h = rect.width, rect.height + msg_w, msg_h = get_text_size(widget.edit_message, self.font) msg_box = Box.xywh(10, 10, msg_w, msg_h) self.msg = TextWidget(box = msg_box, text = widget.edit_message, font = self.font, parent = self) edit_box = Box.xywh(10,30,280,20) From 44876e984f3033e5ccf2e34769d820d5dad4ccac Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Wed, 20 May 2026 17:53:27 -0400 Subject: [PATCH 28/46] Okay but still bad snapshots --- .../test_v3_pedalboard_change_via_lcd/0.png | Bin 6360 -> 6728 bytes .../test_v3_pedalboard_change_via_modui/0.png | Bin 6360 -> 6728 bytes .../test_v3_parameter_edit/param_closed.png | Bin 9030 -> 9362 bytes .../test_v3_parameter_edit/param_dialog.png | Bin 6365 -> 6748 bytes .../test_v3_parameter_edit/param_menu.png | Bin 9030 -> 9362 bytes .../test_v3_parameter_edit/param_tweaked.png | Bin 6391 -> 6775 bytes .../test_v3_parameter_midi_change/0.png | Bin 6299 -> 6604 bytes .../test_v3_preset_change_plugin_update/0.png | Bin 6565 -> 6923 bytes .../test_v3_toggle_plugin_bypass_direct/0.png | Bin 6467 -> 6811 bytes .../0.png | Bin 6063 -> 6424 bytes .../test_v3_preset_change_via_lcd/nav_A.png | Bin 6063 -> 6424 bytes .../test_v3_preset_change_via_lcd/nav_B.png | Bin 8749 -> 9073 bytes .../test_v3_preset_change_via_lcd/nav_C.png | Bin 8772 -> 9094 bytes .../test_v3_preset_change_via_lcd/nav_D.png | Bin 5893 -> 6255 bytes .../test_v3_footswitch_press/0.png | Bin 6247 -> 6419 bytes .../test_v3_nav_to_system_menu/0.png | Bin 11971 -> 12310 bytes .../test_v3_startup_snapshot/0.png | Bin 6063 -> 6424 bytes .../test_v3_wifi_ssid_entry/main.png | Bin 6063 -> 6424 bytes .../test_v3_wifi_ssid_entry/ssid_editor.png | Bin 12495 -> 12838 bytes .../test_v3_wifi_ssid_entry/wifi_dialog.png | Bin 9689 -> 9984 bytes .../test_v3_wifi_ssid_entry/wifi_menu.png | Bin 10355 -> 10661 bytes 21 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/snapshots/v3/test_pedalboards/test_v3_pedalboard_change_via_lcd/0.png b/tests/snapshots/v3/test_pedalboards/test_v3_pedalboard_change_via_lcd/0.png index e7e9cdfe0b30ec660ff0544f97b66d18f30b5c87..e711c492f47234db37692db4267998146634cb97 100644 GIT binary patch literal 6728 zcmdUTXEa=2*sq8r(h!6YAqhbclVC(|(FxJJ(V{bn-iC-ybTQF;7)CFn_wvVR(L2G2 zPPAy_-N{|+uJ`Nxc+ZDfGiUZb`#H~ko?qD^@04Wj-lDxlKtOO;PF7NtfZ&Q4_`XX_ z2tM)3Y(fMCw4`#9;_7b6TeI%kl*bo0b`#!Du4oqptZ24Akzsrs75wypP&yPPeb?%3 zupQ+yTBx>746~(41Ff9A35DNx%V3$G18kAJhbrO}ww0D~d8~vIdD77vIS#nI8x#Ra$LR#jC+ zB!1`4orA+eXOd`Hrk?2Jj}an*f`W|wb|=4A*4EaD#Jx^dkT*!^21Qk@W6P3E| z%o*p(5c*jW6Mf#@{ct*wqs~@WTMK42H#hqnD{zjtw1__@i(;~}u%M=-TwYpIGccH) zowZ|rsK`WqjfiNb`lFw&(XGg?u+Y$2*BwJg$8zIx1pZ|8Fp>V|9p;6lC5i_R{#!i9 zkZ7=d9UC9VR8-s{At^gn;v8>lYnz{+@9*!Qn-gJU%P%TY;-E_MN(zz892^|%?36YK z0S z>j)1IZ)|M5a^(sgN!RrB^zu#Y(%xr3zoeuj8yg#quCcK(2fpNmg$1xS9`B8?C|ct( z-uu}Bsoy0ee}I*cl9DnqGJ5mojg}TQw0(BgfR(bgx_a=dHhD<4bFeB3U0jTmWfBn) zxjY&0!7h#mJr1s|6?jWAGCF!QKmrcmVemOunNOInab)4-j5zh$p5e#k*^C$UCA6i| z%NV`%1(%@f_Pex{l$19T5_EKQ>g=UL!opzhKzz^0<;KYzCv>;BxBL3~uoT`X^&TMy z5)u+n6ty)qYe~(+xyq3d5o0_@|3x#}jF;Vb>e~|MFJUYxNyL9(JG8K1WMPr3&i0JB zb#891qaz@{C-ln~G#YJdW5bOfpQce2w6m}n9~o(^9^(-f76xm1^zriZyDxQy z^YZdqchL(tcMN3W@Pxf(`6O8T_q$uJv-~m{p}uyP3Gqo z6in(jtkL)0$Mp>kz9R_&Rf1UlFFK4GlK&!@=(^ha&JF|u!IYLpcblPAZUy{YYzwlp zvva6P)|j-J@@!H?jSLN`obeF)iaCe#B)l@c&h9zyxzq6Tr-?z&PaVsbrM|vbJYdwf z0+dNUIyzR$>`}N)zt|i3-%VeRvZE(G9p&bxh?u>56zHU=9I0 zs_@~%OCMQTSz_a&_BY3+pcJ5Q#a^6)#t2H$aB$$-pD1|8>fqoI8XD>ZdqC%V<$(L; z%XeyOON)#5sHi#xNE~ZsKzF#h9w#Q!j;^Yz7aBHrY)w@rBqXRGHD2P+a+TA@Y>YqL zy%(!$+O_w^ts2v>~=zY#V{v7&F`)nO?3a*XuVrnWXa|?^0fPnB$ zEtY4`5SJInG&D3VEiIjPY_p+v_j$=9yUvyvE@ic$B56BoYY9ES~G~JSt7 zMODiq3W}_pmN=Oxb+(JeAO?}k^Zkj531QEp!L}Ox?H0cqL3WSjsfFkx55pPLR!%a5!$_?n7QOb7f9sv2Nx1j~s;qG6N~KN31HizND^X-0ziM#>p#rL}Q=j z7yNFJTBo7&@`4Y`d*zKZe_AOURq7?n8@=ch@eSf9Y`Qp_c4~rx)aTMJjM)!mO36gh z-@g@*$oyvu?sGP(1$$-Dp%{{#&6GdD&gPqNZOun6#%mpwJ3{sPOK$G!pS`6upUcBy zpEbjyS=V`kS|`-{2a&Ym9jmY$KG$u!@|IkdRJYIWRCdiIMwHK=KX-R`*JXaWuM{Zr z%(u658oy)OjB$+ot( zfCzEhu2}{B3AWlzC^aak3$0WBt*Hvq_~&T>7q}w&3kw!!n$6{9Nis=IO)BA!YHG0&O)H7?%SP+Jeti@5X|&dPn>&a;yqMkb?&5I9 zVQC740+@+^juq-*yG=|@WvZ{1a3Z}=dSUC;%^4XP*v}x)%^G3{ z@rKnOeDk;E<>gHtB@Cnr+o095YHMqst9_>v_0~Ur3RD-?NA&XC5!Zy)rJyR+R=jkG zWvX%B&}?;h*OXlW7~$SFLG3po_un!M2q&QQzJF&H;0DP_82)p5x<2igdpIruV6p~- zL7txX3+`CD>vs+eMB+IpZ>>1+?_)wMeYhD`j18{GGRaw3b(5{{t0@ah#VjAJ4Tn46 zvE-DLPHR7Mbjr=w4BNZ9g77nQb4oj1lrMze>GH_P$lwAsSt)^fVw|~B!6?TCf$V_( z(9zL}Wl^RIkxbkcgP z&`mFI;zNFL2?!+Wh?{)4JC@Av$Vb-?nqc1N65){^7S>y8+C@l6c;{QjI^OuegO)ow zCZ=^$atB~GkR*RY&?__R4!zIrln^sgPvEq|Dy0BTx<7XV6sHv&o-1Ng%lVWzv$4_e zc*k6XV`ydu>(#>og*x}dJs-Jy(Tjv2zkXFgv~_lN_9wlLOhwn$p5iag{4?U@S1!(u z=iQdVl|@ec>3{wFDRHTLw*W|+zj@SQiO=8h)xH8mw0XlLaWc^4k4{L^XB8j~l0Mrz zJFrUYuaS|Y$lhmiG45w#XI9(=w@n*ePck?1}@-a|>E2CH+)Tur4Pj0DnAbk(T2v64{0;)m_4v74@{sNey5 zRatr9c+L|7g?=r$1^kP+xVQq6^94J*>GrWh&3O*eFmoUc^qXbN<~u=NUYEtz03c+6 zEVUU!clY&;sz#ldNl8ewo*r%(7#MVgKh%2n&S>`q0}d`MPS$kN2mdxeoH%R8gqyg} zuF0xVlG-k>tgOXK*|T^K6oe6?($DW|`HwV-ajlN7u5#(SBqTtnKd84x-@YOv(*>Fb zM}!T+SInqCI1+yv))<~G50zvqdBV1^s8nb^5BItc+`nB4QqK zYye=%mxxR6-c78^76t;s)NnRa!_r{K=+1&e3Sw^0AMAL1lhX+ zZ@Q?8|9tJ*HS60|m6cYIJSjD`;qBSFoBQc7LQ)bEd*HDqx+5M5QayN3ZPF1+!J;%% z=UR-xxB`MLEiDDWTV3roU1bL}jPdLTEl+tb(BqAbBBup9)XCEDUuNS)23WPq1a1p1 zhKUhLP9(&j_Mm1p6?hPR(DX1E40yU!VNdU)^0ZeFV$_+U|FxLj6;+fv2NjTIX?!1l zrnt_91P9B?$)V6_o>P+aZeS0&2ZZ*gY>EvUJSs65E#}zS22a;Z{KczRuh1;X8r0s~ zGc`aCHo0u+!r{g0Yz>IBqcr?MF7O9q8x$VhJv|9wGT7A z2wpN88X5wSxCp%a@Vin9unuq=n~mjVN(P1|ivfD`qq%zb;Sq&f1Z>*QD%OVw2LQE^KNC|^F3!%gz$;Ew+OQ}k^Et0m z?r-V*FNI7{P#ezUgZFBn4J#u?A8nxF*BJH=U!0(xF;|8s>jo{t%)g2Hmk8vuOWiH) z`HCPK$1Go3K!hcotBt83hFW7cy-~=8+u%EIp{Z><<61? zEeIlI49`}d|5uNZF^uG!Bl0m>1R*zu)22;1nGd+#%OrSXNJz-N5Xq}ouR@_v?2($( zQx!M2YCr-K8J1R7sJy&%SUW=%y1d*`Qqn&t=tfZ6+U6#ZEiXM7Vrw`1u(!R@#qaIr z$sd(rva|gYjXJ;3>@=R)OG|f>ik^!__H}pPyA`1BY5wu!M@ZATgQev!V1>gUzING} z>)RxXj891s_CEikW#}G2|9eP=!P(VStq_gYui<+3?EPff`(hyZvgKlFA3g-96+o7N zgN($4gtgUGEftkgu*W!@d9B;KckiU7rJbC3BD)GusFTg|0Z_#m8_<&Y&73GE;0JW{ z^gMCc1i+4Yd91YoO3|`$QBi}y1FEa5tEvK)=0==40e~^+0UfQFCSt&e^f}wY0HbAZ zYn#k#msn81{;H>>ajXHM@L;l6eiK+t7gyKZ?Cilezzgf^(~Xu$>g($(DS;AjHFR4H zz+x3e(k{DM(%jtLX-e)e$rb6>IDmR>Ivp*x2b2mht-888J3IUJoSSKP%(JJ_tnBPz zseDXKfBT0kfrFcy`^Af`I*`i+KT-ghfyzcWsiD0m*1fwY=RloTR8^^pmI4HD8cw}; z?;d%`GLV?S#eh3n#fB>%_$Zha2Xi);B1JjB%J=s4_&5*%30+GlyX&^v_V)H5B}HiT z=K6ZizyLKd(Z*Qe*=`#tIP2Kh*odSTPK=5Yb1nSS!(Pk-h1$(GUH}9Fp@l&js}X0s z1ubgOn?jqu!P1Aal9$t?qf(XCy^9}aW@g$=UU7>7qe)LsUmJJ0yGs_F~*4-{Z?h;QafmUbeKK+fH?lkKT@XoMGzg^*N~2+#iyWk%8l) z!%S8(Vm>;Og5qRgn$puBUlje;Um@P}t`<%}?C!H5Qs`=3v@xt?*A{b@nofWB?DzUt! z4*u8YoNw~Eq=tDJpKCs^RAZ$CV%kZobY!RK9qUL=fJ(mna95Ybol}a;-)h4UY4fZ*1&!qm;na}m_l9e;mqLR z!pe%&YDroeL;1L1!@=<}tjQYz{3CWQx0BWP=I1;#8k{~xeE9<28t^mVsccmgUDb1| z9wiDzsn-XAbh}nwk?}a4`i1HrCebUud`~Z*_=Xo+#JasBQ@e z3Zht9n3+W`4u<#k_P}N{-t>3Lud!}!W7CF}&o*|m)#R_3fY#P#B8R?y4Xbkrr*}JC zAALRV#VsUszPs3Va&iJ3bAeW|`Pkx6Vp0;uc9NWd0j8~8?Xor1;CZZytPDgI7UtML z-$aoaMnNFsB@#((Agzqsk_{?4&6*AZJk zgJwmWX9+l(iW8Cf>fi4BJo7|46&2Fh@$%o044s$p?(b9izYsqrtf5N0W}2pgi*Nh) zSEo)h%|*Z!g5lDU*c(g#rib+tDl~Y#rk5nR_aC&EV__Y-F;pb>+VTIc*4S?P;kM^N zCO7%NTSYoA6$uOaZ7LX^a%1SE|3<*wPbjREp#y8vCvJ{yy2+JoXxGWHX@J zk)VLv)a$>Y((ciriE_rqPY!p$4dUUyqa@1*2vyG^Ei(4o~ZiI#=N z^JUQ+F9Tdl!`s{$I)kV}_!-u~lm zBzODt>C^rU9sCnKewD#r{p;#>zfa-*l8?SgAP-6S^&S61d{yJX5C>HNU#kKXqJNBd zw3s?X6>27euCky)F!CwyY@gS3j11>nSq!@d6k^wnH&#+@S|(o2aSsP3xnfuX)wFe1AYF> zE;X4SK2sBm3!or=|cFtWe7 zg!=M@;|#q&eDM@oB)GgQy1*F~Y3_Hm^#&O2VRbUJ#6u~rWrki>zbaOC(oUzuw8}mp z2}GzUe1%WYKf~B-RAiFO92ORa!C+FIsN+63|0X&^&vT&GJ3H&-4`qnAgx&QejFGISOywq4@DALL-)KT! zRBc~~vSJ9m4uRY}JGZ*~4+sF@f`^+ogwwQr*<|!0V-? zT#T$7Bk^%Fo}HmzPM`$^_&-O>ZC_vCUjNPz?iP$=Z+gY^V~XooDbLwcQZq{a#I2z0 zwV);5y?`U&?>CBmHhVS^exfM828@g(S zS42~~&1?c+kzB=6#K0jbN#JVU(+CbG*Sb%jtuH$>g34xL5s>$=di;2nw9o@X5^CDp z+bb(8d1M^x{WXv~_`gwTYs@pbeOh^kZjSZTj{doq4Gj&uQ~rW-%AN2^Ny}R0zisR| zsn?$dWph$eeE)oZl_GBT)is0ty1`ZdDnph1tCuf_3z%40;Y(}wgq0X2lDc$sbVQn~ z0{%YEEC3i|XJ_x}?(U3#7r4lSYpZe^aP+^HS->S}q0Y?fmK+`)UZ9ten41fO!3Kgk z`1p>#F$mU+Uu3_gCv;4n6FeTr;fSfihj$KHw;D%{{Pb5}-LkQ@r(YKr7ik$-%B_DV&3gxGX)*X~{>4`fcncPph}HVL zMcC+9>w%b&~2Ad-^g!T1n( zP0J*u^+qp+eApFlWNh5Ew=_RLK6Mlir2uG8lZpQGor{Z(9+%8Yt@5spo(`OCWAxZ# zfbNBLnl5Vz1b)I`aw_twtCQ0ZTJZu4D&#fTad+%MZ|_y7pyj;C`uI4$+iILcQTm5} zSfAeuc}DmxNBsEiod6C^bF$+h$A{CF9*zjaIuisvB8LyX*BC_>uscp1v^R8^fK$<$YZglPS@DFS&!?&1v#%-bs{Vhr@c+; zfh;X8S;m{$(w6Mr-E3*%_^1uwxLo zq7^_!+_ad@#uN^pN3LT!g5`5^a!{rv(XU@~Lqn9Y=WB!Zy-D@fHa7jtkr5Hsu3fXx zx0P~cKY#vvYimhAQ6xo2&h=L@EA;4wkWeVUy>y06@b<%ms(3*tRSuSm&8t3q{FtKSpswEb{S{LeY@$N|`DToJ5l3g!;0;s^dWaq9OaL0O5WPxX zlS5xjR?B-G6C-mm7T>I|uYcy1+WRx)9vH>wy#*<)`RLW*^6DsRUJDkoFT8th;&ic5 z(fEYdQ$=etGcM#sW$*cW(I29tqwAwAEiE-DsS{rlUW{O|4Q^QJoQkfx4KHzH&+3mAl&+FI`n?8u0^fsDtbf@M`q-~{G* ztr}vYR=;elsuhCSN^BuW1BO_N=y=1^>Nno;hcG=~qKqE4twgx?3Hb$3j`n5sp&Ko< z9!1d2wjV!o?jZdDMb0|$DEUdqPYw=#BXkt=%6r_Wh$tweAAMjrb;`oR!fKNG<)ADE za06Jxg$oz*KYdcy)cpOG$mVvK`O8z8!O^+qw{@dmMJu4eN6jIa5>bAa450!0F4~p! zoA!=4^7=~e`gisRuuZdVQ3&+kQ}W(h%Y%U7GGv_-*_o;* zp`VUCsLkLG4haz9de1-M28BLe3~aS7qhG#%SG#FERLj&N7gtG_i9Om-+yIiKsHiw@ zXSt-op)u7IYK-9kr9)fa7u&El8dWrV`C#WqB>tU%{vLWD!^+= z-khyB7Z2@c=8bLNUK@+&S2E4J|5H}qMun~P76Uzff?yzda`YqPBo@1WuvVtD^=x)$ zXXou(w%@fwLq^^GeCT%%Xys?^9*xq-i0QDE^hMHnz0n-Cb{Gh4xZ{ z#(y9WIoGcNTO9uXJ`Env1kvg^Ep9Y@@gzWuU zUS19j4J|J(2Viz^bW}M$+Ux*)@N}6CVMB6DRZ5u^8<-4jloCoH;xIkPWs`XsZ9tKi zoBM&u$7c|wzO!g#68%kqRldN*1!xOMe`;!~VsKaFQAwf5Y9W*? z8W{h6Ug}ChE+;3aG-rVS>QETpD&dtiio^++j8ZS*bXXP4rO;-EjEi^e#{nUUWih{g3Y7 z7xLEpo0jn5!-s>z!xE`B(oJqw&l$o?Hw5GN;h?=gk$`_^$U0GZV{3s3O9Fwg;4zE> zPIcrIDJ!aOWj%e&yeD;;8{x`4WQ58T=1 z;N%og^24LbnugZ4$z-ymq$D#l^TNV{u&{6p7i7`ev(7?T1-at}g9+BT;1~-hloYWT zq`dhMD_M9faL)6I0(3D@W{Ghr>3gf(wT5&sXwO?F|8tvgut5cghZN9dK=5+hl)8K z#L0%!0-@`|o_FuQ=tOl>8Egzpkd>W(6`Sj(N|@Js+PS&m$1Chx60O|#au@i4H^?na)1`LiiD*}S}s0^)sC`=m{aO1 zT0N0+>Z_!B;iTMv*{I1$t1uRqPl+v)Tw0o)?~R{)XZzv6;T1NFuGV)31Gf9Iy}h`Y7$~f99AjoyRvE0hU!RSK=XUVH z*3X~!BkX?v{(bS{#d;4@e7};*$YeeZzp}p9Jhh)g~+v0 zXDG8k9+l55q`{;_M1+_c>^tH%Ha5b;X=)jAkB*Ltj0-dM3Ut$?Fo(p(dE|xyz-gwe z^H8RoYyHheKf>zDik*^gz-m!pWmVPY=4S45%09Nr$+hOU{B%%NQ+1tXzdTGxNPzn* zCtWwhRXG^~(+Kk7?d{#43vC7g_x1uFFzONeYAen1ji$c(qJT9eM~$v+Tdlv7aqL|t z5}SY-LmP_YANTVTUjg$tq}|t2_5BA0i>)=Io4Z3O)qB zE_jzX^@4#l(`*yd3@a0-(Ol%;*LO=iKPq|8eTti zZba@9K~GjM$}fH6hUec|4ZnKO{Q_YwDvDYg+5%NBo$=;QEdw3hRbk;1P9QH2@|oD`FklkKh~Hg#K6o=sOVjsVx4_f5nZWU45I4Cj?Ttm zAD>&n&=c9(xUc9Wc!XVdPmhncH}2V52_EnE;#*5oWp!bpldWy&n6KB9Cn8vLWv#NY z&5Ja^kxNc<7*?jd1?**OJ2N9BzpLY%hIJz@FVEmObsr=f6`f^e5(OR?cX~d#Gp%;>py-LaKF;L=`Y=<5$nOga}xpci@h@+GjN zCDx6&yu6Kpn~T~>*NRNOjE|24hXEwQJm(RfsX*Pu-Myr!C_^RqnV;V+ zWX?wJ@zM2NKO;M9YwMJh6PTHyMnMBnHda?%U4Q;G_2jlqkMXHUkARjPoz26(BjU5N z1?Ch})Gr4I2heo6ySvX*?^F$_fIA;c;Fbqvs}Nc-7AEgD-h$Ch*&@_UdrZ{26MokK z32}CF3!00SkB*7Skvan24_swdT3Q{rsq+54P>HFfvGL{-^ccI^mWUb%NN>iuJN5v6 zk8Otb{*Sc$KYe>Q-ft`%hyjFb&uWSjUTPzus6qV=b;ZuA~b@}b}3W@jp)*WmM+62O=Rm0!5P=)lh zZZl|)=9>Q-XjFm?Nw=f7lArqZ>c6pUI7RrZiT7dDNz(s*e#H56HfF5?c|Sr{GfoWz zS7vkyqt&v-ol>Y1Rtbj4g80cg5=?H_$}LJbZ5Ybf`bWd)b$U5xKnWzLfolr2AepO9 zNbV+!8n+$Ys$bK-=XV>RV6HttIPx5|x+;MQd`%v;iy{7LRPFkJRQd1OE9R;(#WH8N zPmPOJFZpnvQ>7beN}{h$_ukZjJ|!S(y9pJ1nsjW`HHHqb%lI68gK0zI zQYhoX3jC(~f=+`ncuxNAyxXZlR+X(1Y?pc_nhv%EX7XQD^M z#FGgmMQE9SPxfwpCv2b(Q6ktea;;9=XE5@plDv)hRvg)Ka=P8y3!hRabeSx+wSd_Rpv zIImE`i14M8{3e>K>N-JFZE+T0gQ#ngD_bh)1ftzHqR=%jK{OXecvuo6zB_gAN&CM` k*e)M9`QPFHaOi|nn4&Q5iqi0w;*(+88V2g6YPRA30dC`FVgLXD diff --git a/tests/snapshots/v3/test_pedalboards/test_v3_pedalboard_change_via_modui/0.png b/tests/snapshots/v3/test_pedalboards/test_v3_pedalboard_change_via_modui/0.png index e7e9cdfe0b30ec660ff0544f97b66d18f30b5c87..e711c492f47234db37692db4267998146634cb97 100644 GIT binary patch literal 6728 zcmdUTXEa=2*sq8r(h!6YAqhbclVC(|(FxJJ(V{bn-iC-ybTQF;7)CFn_wvVR(L2G2 zPPAy_-N{|+uJ`Nxc+ZDfGiUZb`#H~ko?qD^@04Wj-lDxlKtOO;PF7NtfZ&Q4_`XX_ z2tM)3Y(fMCw4`#9;_7b6TeI%kl*bo0b`#!Du4oqptZ24Akzsrs75wypP&yPPeb?%3 zupQ+yTBx>746~(41Ff9A35DNx%V3$G18kAJhbrO}ww0D~d8~vIdD77vIS#nI8x#Ra$LR#jC+ zB!1`4orA+eXOd`Hrk?2Jj}an*f`W|wb|=4A*4EaD#Jx^dkT*!^21Qk@W6P3E| z%o*p(5c*jW6Mf#@{ct*wqs~@WTMK42H#hqnD{zjtw1__@i(;~}u%M=-TwYpIGccH) zowZ|rsK`WqjfiNb`lFw&(XGg?u+Y$2*BwJg$8zIx1pZ|8Fp>V|9p;6lC5i_R{#!i9 zkZ7=d9UC9VR8-s{At^gn;v8>lYnz{+@9*!Qn-gJU%P%TY;-E_MN(zz892^|%?36YK z0S z>j)1IZ)|M5a^(sgN!RrB^zu#Y(%xr3zoeuj8yg#quCcK(2fpNmg$1xS9`B8?C|ct( z-uu}Bsoy0ee}I*cl9DnqGJ5mojg}TQw0(BgfR(bgx_a=dHhD<4bFeB3U0jTmWfBn) zxjY&0!7h#mJr1s|6?jWAGCF!QKmrcmVemOunNOInab)4-j5zh$p5e#k*^C$UCA6i| z%NV`%1(%@f_Pex{l$19T5_EKQ>g=UL!opzhKzz^0<;KYzCv>;BxBL3~uoT`X^&TMy z5)u+n6ty)qYe~(+xyq3d5o0_@|3x#}jF;Vb>e~|MFJUYxNyL9(JG8K1WMPr3&i0JB zb#891qaz@{C-ln~G#YJdW5bOfpQce2w6m}n9~o(^9^(-f76xm1^zriZyDxQy z^YZdqchL(tcMN3W@Pxf(`6O8T_q$uJv-~m{p}uyP3Gqo z6in(jtkL)0$Mp>kz9R_&Rf1UlFFK4GlK&!@=(^ha&JF|u!IYLpcblPAZUy{YYzwlp zvva6P)|j-J@@!H?jSLN`obeF)iaCe#B)l@c&h9zyxzq6Tr-?z&PaVsbrM|vbJYdwf z0+dNUIyzR$>`}N)zt|i3-%VeRvZE(G9p&bxh?u>56zHU=9I0 zs_@~%OCMQTSz_a&_BY3+pcJ5Q#a^6)#t2H$aB$$-pD1|8>fqoI8XD>ZdqC%V<$(L; z%XeyOON)#5sHi#xNE~ZsKzF#h9w#Q!j;^Yz7aBHrY)w@rBqXRGHD2P+a+TA@Y>YqL zy%(!$+O_w^ts2v>~=zY#V{v7&F`)nO?3a*XuVrnWXa|?^0fPnB$ zEtY4`5SJInG&D3VEiIjPY_p+v_j$=9yUvyvE@ic$B56BoYY9ES~G~JSt7 zMODiq3W}_pmN=Oxb+(JeAO?}k^Zkj531QEp!L}Ox?H0cqL3WSjsfFkx55pPLR!%a5!$_?n7QOb7f9sv2Nx1j~s;qG6N~KN31HizND^X-0ziM#>p#rL}Q=j z7yNFJTBo7&@`4Y`d*zKZe_AOURq7?n8@=ch@eSf9Y`Qp_c4~rx)aTMJjM)!mO36gh z-@g@*$oyvu?sGP(1$$-Dp%{{#&6GdD&gPqNZOun6#%mpwJ3{sPOK$G!pS`6upUcBy zpEbjyS=V`kS|`-{2a&Ym9jmY$KG$u!@|IkdRJYIWRCdiIMwHK=KX-R`*JXaWuM{Zr z%(u658oy)OjB$+ot( zfCzEhu2}{B3AWlzC^aak3$0WBt*Hvq_~&T>7q}w&3kw!!n$6{9Nis=IO)BA!YHG0&O)H7?%SP+Jeti@5X|&dPn>&a;yqMkb?&5I9 zVQC740+@+^juq-*yG=|@WvZ{1a3Z}=dSUC;%^4XP*v}x)%^G3{ z@rKnOeDk;E<>gHtB@Cnr+o095YHMqst9_>v_0~Ur3RD-?NA&XC5!Zy)rJyR+R=jkG zWvX%B&}?;h*OXlW7~$SFLG3po_un!M2q&QQzJF&H;0DP_82)p5x<2igdpIruV6p~- zL7txX3+`CD>vs+eMB+IpZ>>1+?_)wMeYhD`j18{GGRaw3b(5{{t0@ah#VjAJ4Tn46 zvE-DLPHR7Mbjr=w4BNZ9g77nQb4oj1lrMze>GH_P$lwAsSt)^fVw|~B!6?TCf$V_( z(9zL}Wl^RIkxbkcgP z&`mFI;zNFL2?!+Wh?{)4JC@Av$Vb-?nqc1N65){^7S>y8+C@l6c;{QjI^OuegO)ow zCZ=^$atB~GkR*RY&?__R4!zIrln^sgPvEq|Dy0BTx<7XV6sHv&o-1Ng%lVWzv$4_e zc*k6XV`ydu>(#>og*x}dJs-Jy(Tjv2zkXFgv~_lN_9wlLOhwn$p5iag{4?U@S1!(u z=iQdVl|@ec>3{wFDRHTLw*W|+zj@SQiO=8h)xH8mw0XlLaWc^4k4{L^XB8j~l0Mrz zJFrUYuaS|Y$lhmiG45w#XI9(=w@n*ePck?1}@-a|>E2CH+)Tur4Pj0DnAbk(T2v64{0;)m_4v74@{sNey5 zRatr9c+L|7g?=r$1^kP+xVQq6^94J*>GrWh&3O*eFmoUc^qXbN<~u=NUYEtz03c+6 zEVUU!clY&;sz#ldNl8ewo*r%(7#MVgKh%2n&S>`q0}d`MPS$kN2mdxeoH%R8gqyg} zuF0xVlG-k>tgOXK*|T^K6oe6?($DW|`HwV-ajlN7u5#(SBqTtnKd84x-@YOv(*>Fb zM}!T+SInqCI1+yv))<~G50zvqdBV1^s8nb^5BItc+`nB4QqK zYye=%mxxR6-c78^76t;s)NnRa!_r{K=+1&e3Sw^0AMAL1lhX+ zZ@Q?8|9tJ*HS60|m6cYIJSjD`;qBSFoBQc7LQ)bEd*HDqx+5M5QayN3ZPF1+!J;%% z=UR-xxB`MLEiDDWTV3roU1bL}jPdLTEl+tb(BqAbBBup9)XCEDUuNS)23WPq1a1p1 zhKUhLP9(&j_Mm1p6?hPR(DX1E40yU!VNdU)^0ZeFV$_+U|FxLj6;+fv2NjTIX?!1l zrnt_91P9B?$)V6_o>P+aZeS0&2ZZ*gY>EvUJSs65E#}zS22a;Z{KczRuh1;X8r0s~ zGc`aCHo0u+!r{g0Yz>IBqcr?MF7O9q8x$VhJv|9wGT7A z2wpN88X5wSxCp%a@Vin9unuq=n~mjVN(P1|ivfD`qq%zb;Sq&f1Z>*QD%OVw2LQE^KNC|^F3!%gz$;Ew+OQ}k^Et0m z?r-V*FNI7{P#ezUgZFBn4J#u?A8nxF*BJH=U!0(xF;|8s>jo{t%)g2Hmk8vuOWiH) z`HCPK$1Go3K!hcotBt83hFW7cy-~=8+u%EIp{Z><<61? zEeIlI49`}d|5uNZF^uG!Bl0m>1R*zu)22;1nGd+#%OrSXNJz-N5Xq}ouR@_v?2($( zQx!M2YCr-K8J1R7sJy&%SUW=%y1d*`Qqn&t=tfZ6+U6#ZEiXM7Vrw`1u(!R@#qaIr z$sd(rva|gYjXJ;3>@=R)OG|f>ik^!__H}pPyA`1BY5wu!M@ZATgQev!V1>gUzING} z>)RxXj891s_CEikW#}G2|9eP=!P(VStq_gYui<+3?EPff`(hyZvgKlFA3g-96+o7N zgN($4gtgUGEftkgu*W!@d9B;KckiU7rJbC3BD)GusFTg|0Z_#m8_<&Y&73GE;0JW{ z^gMCc1i+4Yd91YoO3|`$QBi}y1FEa5tEvK)=0==40e~^+0UfQFCSt&e^f}wY0HbAZ zYn#k#msn81{;H>>ajXHM@L;l6eiK+t7gyKZ?Cilezzgf^(~Xu$>g($(DS;AjHFR4H zz+x3e(k{DM(%jtLX-e)e$rb6>IDmR>Ivp*x2b2mht-888J3IUJoSSKP%(JJ_tnBPz zseDXKfBT0kfrFcy`^Af`I*`i+KT-ghfyzcWsiD0m*1fwY=RloTR8^^pmI4HD8cw}; z?;d%`GLV?S#eh3n#fB>%_$Zha2Xi);B1JjB%J=s4_&5*%30+GlyX&^v_V)H5B}HiT z=K6ZizyLKd(Z*Qe*=`#tIP2Kh*odSTPK=5Yb1nSS!(Pk-h1$(GUH}9Fp@l&js}X0s z1ubgOn?jqu!P1Aal9$t?qf(XCy^9}aW@g$=UU7>7qe)LsUmJJ0yGs_F~*4-{Z?h;QafmUbeKK+fH?lkKT@XoMGzg^*N~2+#iyWk%8l) z!%S8(Vm>;Og5qRgn$puBUlje;Um@P}t`<%}?C!H5Qs`=3v@xt?*A{b@nofWB?DzUt! z4*u8YoNw~Eq=tDJpKCs^RAZ$CV%kZobY!RK9qUL=fJ(mna95Ybol}a;-)h4UY4fZ*1&!qm;na}m_l9e;mqLR z!pe%&YDroeL;1L1!@=<}tjQYz{3CWQx0BWP=I1;#8k{~xeE9<28t^mVsccmgUDb1| z9wiDzsn-XAbh}nwk?}a4`i1HrCebUud`~Z*_=Xo+#JasBQ@e z3Zht9n3+W`4u<#k_P}N{-t>3Lud!}!W7CF}&o*|m)#R_3fY#P#B8R?y4Xbkrr*}JC zAALRV#VsUszPs3Va&iJ3bAeW|`Pkx6Vp0;uc9NWd0j8~8?Xor1;CZZytPDgI7UtML z-$aoaMnNFsB@#((Agzqsk_{?4&6*AZJk zgJwmWX9+l(iW8Cf>fi4BJo7|46&2Fh@$%o044s$p?(b9izYsqrtf5N0W}2pgi*Nh) zSEo)h%|*Z!g5lDU*c(g#rib+tDl~Y#rk5nR_aC&EV__Y-F;pb>+VTIc*4S?P;kM^N zCO7%NTSYoA6$uOaZ7LX^a%1SE|3<*wPbjREp#y8vCvJ{yy2+JoXxGWHX@J zk)VLv)a$>Y((ciriE_rqPY!p$4dUUyqa@1*2vyG^Ei(4o~ZiI#=N z^JUQ+F9Tdl!`s{$I)kV}_!-u~lm zBzODt>C^rU9sCnKewD#r{p;#>zfa-*l8?SgAP-6S^&S61d{yJX5C>HNU#kKXqJNBd zw3s?X6>27euCky)F!CwyY@gS3j11>nSq!@d6k^wnH&#+@S|(o2aSsP3xnfuX)wFe1AYF> zE;X4SK2sBm3!or=|cFtWe7 zg!=M@;|#q&eDM@oB)GgQy1*F~Y3_Hm^#&O2VRbUJ#6u~rWrki>zbaOC(oUzuw8}mp z2}GzUe1%WYKf~B-RAiFO92ORa!C+FIsN+63|0X&^&vT&GJ3H&-4`qnAgx&QejFGISOywq4@DALL-)KT! zRBc~~vSJ9m4uRY}JGZ*~4+sF@f`^+ogwwQr*<|!0V-? zT#T$7Bk^%Fo}HmzPM`$^_&-O>ZC_vCUjNPz?iP$=Z+gY^V~XooDbLwcQZq{a#I2z0 zwV);5y?`U&?>CBmHhVS^exfM828@g(S zS42~~&1?c+kzB=6#K0jbN#JVU(+CbG*Sb%jtuH$>g34xL5s>$=di;2nw9o@X5^CDp z+bb(8d1M^x{WXv~_`gwTYs@pbeOh^kZjSZTj{doq4Gj&uQ~rW-%AN2^Ny}R0zisR| zsn?$dWph$eeE)oZl_GBT)is0ty1`ZdDnph1tCuf_3z%40;Y(}wgq0X2lDc$sbVQn~ z0{%YEEC3i|XJ_x}?(U3#7r4lSYpZe^aP+^HS->S}q0Y?fmK+`)UZ9ten41fO!3Kgk z`1p>#F$mU+Uu3_gCv;4n6FeTr;fSfihj$KHw;D%{{Pb5}-LkQ@r(YKr7ik$-%B_DV&3gxGX)*X~{>4`fcncPph}HVL zMcC+9>w%b&~2Ad-^g!T1n( zP0J*u^+qp+eApFlWNh5Ew=_RLK6Mlir2uG8lZpQGor{Z(9+%8Yt@5spo(`OCWAxZ# zfbNBLnl5Vz1b)I`aw_twtCQ0ZTJZu4D&#fTad+%MZ|_y7pyj;C`uI4$+iILcQTm5} zSfAeuc}DmxNBsEiod6C^bF$+h$A{CF9*zjaIuisvB8LyX*BC_>uscp1v^R8^fK$<$YZglPS@DFS&!?&1v#%-bs{Vhr@c+; zfh;X8S;m{$(w6Mr-E3*%_^1uwxLo zq7^_!+_ad@#uN^pN3LT!g5`5^a!{rv(XU@~Lqn9Y=WB!Zy-D@fHa7jtkr5Hsu3fXx zx0P~cKY#vvYimhAQ6xo2&h=L@EA;4wkWeVUy>y06@b<%ms(3*tRSuSm&8t3q{FtKSpswEb{S{LeY@$N|`DToJ5l3g!;0;s^dWaq9OaL0O5WPxX zlS5xjR?B-G6C-mm7T>I|uYcy1+WRx)9vH>wy#*<)`RLW*^6DsRUJDkoFT8th;&ic5 z(fEYdQ$=etGcM#sW$*cW(I29tqwAwAEiE-DsS{rlUW{O|4Q^QJoQkfx4KHzH&+3mAl&+FI`n?8u0^fsDtbf@M`q-~{G* ztr}vYR=;elsuhCSN^BuW1BO_N=y=1^>Nno;hcG=~qKqE4twgx?3Hb$3j`n5sp&Ko< z9!1d2wjV!o?jZdDMb0|$DEUdqPYw=#BXkt=%6r_Wh$tweAAMjrb;`oR!fKNG<)ADE za06Jxg$oz*KYdcy)cpOG$mVvK`O8z8!O^+qw{@dmMJu4eN6jIa5>bAa450!0F4~p! zoA!=4^7=~e`gisRuuZdVQ3&+kQ}W(h%Y%U7GGv_-*_o;* zp`VUCsLkLG4haz9de1-M28BLe3~aS7qhG#%SG#FERLj&N7gtG_i9Om-+yIiKsHiw@ zXSt-op)u7IYK-9kr9)fa7u&El8dWrV`C#WqB>tU%{vLWD!^+= z-khyB7Z2@c=8bLNUK@+&S2E4J|5H}qMun~P76Uzff?yzda`YqPBo@1WuvVtD^=x)$ zXXou(w%@fwLq^^GeCT%%Xys?^9*xq-i0QDE^hMHnz0n-Cb{Gh4xZ{ z#(y9WIoGcNTO9uXJ`Env1kvg^Ep9Y@@gzWuU zUS19j4J|J(2Viz^bW}M$+Ux*)@N}6CVMB6DRZ5u^8<-4jloCoH;xIkPWs`XsZ9tKi zoBM&u$7c|wzO!g#68%kqRldN*1!xOMe`;!~VsKaFQAwf5Y9W*? z8W{h6Ug}ChE+;3aG-rVS>QETpD&dtiio^++j8ZS*bXXP4rO;-EjEi^e#{nUUWih{g3Y7 z7xLEpo0jn5!-s>z!xE`B(oJqw&l$o?Hw5GN;h?=gk$`_^$U0GZV{3s3O9Fwg;4zE> zPIcrIDJ!aOWj%e&yeD;;8{x`4WQ58T=1 z;N%og^24LbnugZ4$z-ymq$D#l^TNV{u&{6p7i7`ev(7?T1-at}g9+BT;1~-hloYWT zq`dhMD_M9faL)6I0(3D@W{Ghr>3gf(wT5&sXwO?F|8tvgut5cghZN9dK=5+hl)8K z#L0%!0-@`|o_FuQ=tOl>8Egzpkd>W(6`Sj(N|@Js+PS&m$1Chx60O|#au@i4H^?na)1`LiiD*}S}s0^)sC`=m{aO1 zT0N0+>Z_!B;iTMv*{I1$t1uRqPl+v)Tw0o)?~R{)XZzv6;T1NFuGV)31Gf9Iy}h`Y7$~f99AjoyRvE0hU!RSK=XUVH z*3X~!BkX?v{(bS{#d;4@e7};*$YeeZzp}p9Jhh)g~+v0 zXDG8k9+l55q`{;_M1+_c>^tH%Ha5b;X=)jAkB*Ltj0-dM3Ut$?Fo(p(dE|xyz-gwe z^H8RoYyHheKf>zDik*^gz-m!pWmVPY=4S45%09Nr$+hOU{B%%NQ+1tXzdTGxNPzn* zCtWwhRXG^~(+Kk7?d{#43vC7g_x1uFFzONeYAen1ji$c(qJT9eM~$v+Tdlv7aqL|t z5}SY-LmP_YANTVTUjg$tq}|t2_5BA0i>)=Io4Z3O)qB zE_jzX^@4#l(`*yd3@a0-(Ol%;*LO=iKPq|8eTti zZba@9K~GjM$}fH6hUec|4ZnKO{Q_YwDvDYg+5%NBo$=;QEdw3hRbk;1P9QH2@|oD`FklkKh~Hg#K6o=sOVjsVx4_f5nZWU45I4Cj?Ttm zAD>&n&=c9(xUc9Wc!XVdPmhncH}2V52_EnE;#*5oWp!bpldWy&n6KB9Cn8vLWv#NY z&5Ja^kxNc<7*?jd1?**OJ2N9BzpLY%hIJz@FVEmObsr=f6`f^e5(OR?cX~d#Gp%;>py-LaKF;L=`Y=<5$nOga}xpci@h@+GjN zCDx6&yu6Kpn~T~>*NRNOjE|24hXEwQJm(RfsX*Pu-Myr!C_^RqnV;V+ zWX?wJ@zM2NKO;M9YwMJh6PTHyMnMBnHda?%U4Q;G_2jlqkMXHUkARjPoz26(BjU5N z1?Ch})Gr4I2heo6ySvX*?^F$_fIA;c;Fbqvs}Nc-7AEgD-h$Ch*&@_UdrZ{26MokK z32}CF3!00SkB*7Skvan24_swdT3Q{rsq+54P>HFfvGL{-^ccI^mWUb%NN>iuJN5v6 zk8Otb{*Sc$KYe>Q-ft`%hyjFb&uWSjUTPzus6qV=b;ZuA~b@}b}3W@jp)*WmM+62O=Rm0!5P=)lh zZZl|)=9>Q-XjFm?Nw=f7lArqZ>c6pUI7RrZiT7dDNz(s*e#H56HfF5?c|Sr{GfoWz zS7vkyqt&v-ol>Y1Rtbj4g80cg5=?H_$}LJbZ5Ybf`bWd)b$U5xKnWzLfolr2AepO9 zNbV+!8n+$Ys$bK-=XV>RV6HttIPx5|x+;MQd`%v;iy{7LRPFkJRQd1OE9R;(#WH8N zPmPOJFZpnvQ>7beN}{h$_ukZjJ|!S(y9pJ1nsjW`HHHqb%lI68gK0zI zQYhoX3jC(~f=+`ncuxNAyxXZlR+X(1Y?pc_nhv%EX7XQD^M z#FGgmMQE9SPxfwpCv2b(Q6ktea;;9=XE5@plDv)hRvg)Ka=P8y3!hRabeSx+wSd_Rpv zIImE`i14M8{3e>K>N-JFZE+T0gQ#ngD_bh)1ftzHqR=%jK{OXecvuo6zB_gAN&CM` k*e)M9`QPFHaOi|nn4&Q5iqi0w;*(+88V2g6YPRA30dC`FVgLXD diff --git a/tests/snapshots/v3/test_plugins/test_v3_parameter_edit/param_closed.png b/tests/snapshots/v3/test_plugins/test_v3_parameter_edit/param_closed.png index 5525c7002a5139baa32cef1995bf366409f37273..63ce03fdfc0743b740ef66714812f36ba4bfa77e 100644 GIT binary patch literal 9362 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 Tsn+KnANpEWRi;YH^uvDvNxSTk literal 9030 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 Tsn+KnANpEWRi;YH^uvDvNxSTk literal 9030 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 literal 6391 zcmai2Wmr_*w;vkm2I-Ja2?3D~DF+1v9cmQ#*6*y?D`K95pAr+$6M#S_PV*>YE9lj?Z z5M7ssilV+x_U;m)3zcUs-htT|#{)WbC06XO7NUpvtiLFyH*dRZW;+>en5*BZ1=)#msr^@vC z{tOva%_0!u_u9*pi|4juzM9t=w|NZOa*^LB!lkE?n`RBskD!@xO_;HhXc5U8Nf>fr z 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 Q`1eD#C)%)bC96081BGOevj6}9 literal 6299 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 diff --git a/tests/snapshots/v3/test_plugins/test_v3_preset_change_plugin_update/0.png b/tests/snapshots/v3/test_plugins/test_v3_preset_change_plugin_update/0.png index 7f848722bac506768dd04a55f6c82cf0747cf8b1..f117f176c900a8b9f9f0aff6b112f2e3fcab4935 100644 GIT binary patch literal 6923 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 literal 6565 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 Xg&kiji{nzR|NHWVx_qgu>HGfy>w{yY literal 6063 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 KsFXdjc=%B%;V-`$EK>pI!1g|3yJ@)ojx1 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 Xg&kiji{nzR|NHWVx_qgu>HGfy>w{yY literal 6063 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 KsFXdjc=SXD()8v?<21m5rCVS-n* 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 literal 8749 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 VLnEZO@ZbMiAiImQ40 literal 8772 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 diff --git a/tests/snapshots/v3/test_presets/test_v3_preset_change_via_lcd/nav_D.png b/tests/snapshots/v3/test_presets/test_v3_preset_change_via_lcd/nav_D.png index fd52b902d9c77413cb465202c1c5661d93a11e12..d67bb934eb3a787f75a732e8309ae32482ee7b4b 100644 GIT binary patch literal 6255 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 G!~PE@O(>%P literal 5893 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 BVbA~o diff --git a/tests/snapshots/v3/test_startup/test_v3_footswitch_press/0.png b/tests/snapshots/v3/test_startup/test_v3_footswitch_press/0.png index 3dd7abc49571e489072ea23ac1eddfd026c3601a..1ed048ddf50c9efe08eceff42681b83a42362d2f 100644 GIT binary patch literal 6419 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 diff --git a/tests/snapshots/v3/test_startup/test_v3_nav_to_system_menu/0.png b/tests/snapshots/v3/test_startup/test_v3_nav_to_system_menu/0.png index c085d109df9067f407184bff4d7e18dfab5d5700..ec4a2b224cbfd208435cef7c3d8ffc98ba802921 100644 GIT binary patch literal 12310 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 literal 11971 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 Xg&kiji{nzR|NHWVx_qgu>HGfy>w{yY literal 6063 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 KsFXdjc=%B%;V-`$EK>pI!1g|3yJ@)ojx1 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 Xg&kiji{nzR|NHWVx_qgu>HGfy>w{yY literal 6063 zcmdT|XH-*Lw?&kT2m%617ZH@IC?LIvG(ia+G$3$kfzW#iRYjT#iu5MEN$-$QM3hJf zy@X%@=@2@Ej&F1CH{SUEz2EQrNX|Lq?7i38Ypprw+L1aC^~;yoE|HOuUDkN4qDMw{ z?jg9}xJV9uPqhW*$jF$zHB^)geA8Bc`ROn&{Gr@%d~{J$hyKc^-=WO#&0?#okD@yV z#;xE&=~;RvOwmKx@&%>p1wV}apB0R3+Bx-G)>?@mw2}pf*rGncYdc@PRMjmR3P~g9 ze*O9cThY3)+|6JgNT-Ph7pqz=E_L$kpKH=Drr)NuXg;_1f!O@(c&{#otRUBun(ZK1n&>w3(>9=Yu-_JdCp z6&34jY|VXj1GE#bs_LR7sxc}l`HTznhYG*K4Y}v?50z+NLOGmuvz8Dl{arNN{ z{@I<$g&$nO)&>0WnpGW3XSb(Z(#`XkL5GnGgJ#AN7yfdwtWNYua=*RoDO1nu8q!6u z$FA-AH?9!TFFU?_W7DJ?=xDZv`}^IF_uWXVT9Ut*=;_;XLstrN20jJ^M@2;uOXDI# zQ0!mrLfca{H8mL+8GCHEMOu%)9z` zh2bCH;F-N+9%d?lXbH~NE83SW?6IxxFkIU8hmiD`Y(x-c<5oi(dxY=+?1R9TKa=g zkpUGI)ziPKPMl^>oWi?YVlE-qPBJ^wUy!v?UXa2)5iTx|KH$9SNBeZJ23mS;VD7uH zfkCd1Ai}9U^g|n&S;!S>P=Nn^&E|ah^7fQjy6*gq49Gzym)Pw5e3klDtwA4xUxA0v ztClbixr(Q^^_`rYG&InMyDNNJDYN;d4z=TN-@cVckPHkAhDJwyyu4~_YYmN!7Zw)E zp|$X@uc@5J%ji7x$wgi?eKK85x^Kl4m=e2ns6y>15~^WTvRgZ97U$h87!TiF9@f&* zI!=XXYwwl%Hk}WGTrA^!s5$pU1jYL|JtYl`>&8@jT3XuFl*OrZEwuDCepmOg#d?yA zm*8%BqsM|^Ks(ZJn?LH(#fwRzHkwLGp|TQLMkRZzc=glUBX;5~r-v*0`A?~6XlO27 zN)fjo_!%!GBq%sh>1F0U`m=IKfhgP)YXH7gG3Q?3AT5utE+~FhO$0u*5AL@FPt8&iwFxlIyw>;7o~jG zCJ^f=W=>9dTMUc4G7g73wuyZI9^2D{^4-ktv=k5)w%&sgkbW+xT_auH{<-c%Ss9t8 zrlypX6bLXsG0|uAg^wFa#n+G1teS$7QgIt2cC@!%UR1QSxOk84UGSfiJ)gYCkCk%zO;P^w6Te?lP+z!fGS8oZy$;11p^o6~cc@HFO_7K_ zXZ-n^oE#nj0S!}f#f`S}moHx?&11T|t2wF7iwxGrDm%Pw9uJG4AVgL3*2a@bi9z7n#wFc{*0Tn`>R zSOqS$zodxc)25}P+uPgYlJj-d(_@hS-TyU=+NELouY#Z5JaTdYDcOSgA}8=c+oY_`&+-AIGE*hHcop8{y;2j;an?(RlbdVG95DZ&46 zsQ{fv%OQ26f+F9394DJR^ZgwUvw4GSmj2wF{e7cyGp)PL?sJ;%Meo=p$MI#0Ak!3F zJv_FL54NxB?H{g`qaP?9Z*+W3yi?7n?G~P}SnQ*Iry-BR+1dFN&@HYW)|+ul(aV=I zW~L7BY-KJfArZ7YY&=^43W>O~IrAfiL;9m1Co{7;mejA#^})r%!-K*ZRZ_B&?n9{D zTLP|42JZa=yE`;Id_N{F$3A6H$~A@7*i}tph6(=TJ?E?m;{3%YCbDuMZ(uzsyFHSV zkE`nD=WWq0+l1T8eIIj|<@Kp=y6^x*GbuG9IjO5t9u%#{jUK3~sa2IzUS?A%!;QSA zV!UhG@L7ld4K3$Sh$9^S+aMU=U|XrNk&%0XjSf?-6Ta@t7vXS+#afeR99tm`{=0Ao z2cd(dgYAXY&Yr;94jvhqLx3VLDlE?79j2m!PY=QaWP^@>b?v+8=HT6i|?i-w;}(k)rB-@Jc__$?-2gLg&>!wCmpcAQ9l`! znl9x!)fRX}(x^Jk&c3--$~!rmr@{&SXn;zEE4`omR$NqcMWH%#@=y8$(?<8ObSaQX zpFiJluhY#@qcY7xb$uMQu&q9b#MGTG-RwDK|g`FgBEwL3Odb@ zM~vl>h&bhZO$Y=6Bt&b_$r~Eht@%`!@u1=M=U!f3#FeGNf-^KcIogYfhj zG#@E7VPDSKA=duM5|v9a;dVdytbXm$zVM~fypDk96K{wS)=A${%p+qrpp(nvgHaA$8aSi9^X-q();pY(gT8 z@_OKoZn%kfYERl9ooom7olSZcmS@JsKLT=NA+E0Xws-CoEZ1OyHdQ&!*5s_6I=R+R zRl2iX@U&@sjYN!Y^OGfb<~!?u=H;sVpfesjI6) zB9R~=`S{K#GVN&IsKg8X@fODE?fm>a7K>e8US7r5Yo|$lK<-zrGB9NWtXOMaH*0jC ztF-#@RxJl@-2|)zLR8LayoOHkxNjE(vDs(6>jO__APM*KCHbrNJ{-=XQ^z%VbMB zhM->n;r>bn#4^jGAp&s(0E@UPPeHc8*nmU^jC^?>!Lehg@F!#)9mh8bgoK8MhOVxz zayTs@gVNGcz)i<9F^XqQ2y9U*=4w9oUmDQVIN(&`V|3R!TrL}416x+VwH%rG6wm(X z%R1i%0PQ0)o9(xGV|$knoC(G*!8PYKMEyXq0=_T{z94c7`TI!k!5*|wVM6AG%iQpv zRFrj@CZ4UEH}pU)k63aQ^QlB6K4Nm$$ShDhn}lYxp;xBlT=ex>gb!k&d0 z{-~alogD#i1Yks_tj}Eu3GcqoN|>FBii(DY29Ta#zkUUADl#YrjatyjA=Pv5skYF1 zf`3V;W&g@9B`rrGz|5GKL{}#FI!_XoH#rhx4q?kdw&=C`r_LvO$n+fB+)nuPsiwX@ zPCNM$6;ernPtL%w!q%ikSuK!+i>)2E!AoXqylwmabt0K4Dbjt5(FAl3XqC2Ob4 z#K*;n1s?90I5*BUE@YS>echftW04*C_$Z4--hT(6Fp&SYwzis@Kl^jkB^}4^IZsF_ zQ9ZrhL#i?c%CRM&F)J(dfZ0Ku4Oc0__cW<*eB6I|NFWY9L?E2vU0Q)}pvo>i_XaJo zTF&PF<_r+Rw$+VQRaHer8Xx;n2Os>Rw@9c%E#9q!4o8WV-9w=3t2(~$-MXdA)JX%Y z^;{a*Ug&ipAR8+yEA#W`hmFm5_x7~4w60dtfhPM*=N1;)IXMA&ISjAuRX8Gkf5*PE zvf==Tw}5N_?Vk7BeSjL{7;{(YCYxVRWDMM7WS)cQIXBcnbP`V;F1kZ`a-yV^r0uetdsM)B0b3}7Bu zEkoMl4X6Gt;84xHkM{Us_->8;pyrb&=;@yTv97SQcl%r>8W@Xhn`)3sJ1zef)F?I5 zXX^BG_J_gvqzeUm&&+b93&VUy1~vqNUdH|&OA?avzU8+Dx0$4ZYw%iVo*vq79-^J8?RjxwJJJ1I*Ma_ zz;+q-dE4x{@U?lgE;$ziAKRc-rw7c$H}lR;!^&=$}S1|0;?*jH5e8aCLkcd zF6sOf0$E#Jw77m_d}L(g*RLMGMHN?9*Ycb&a8LkIe`sgN|L1cuiJ=OGLNzxdjOnyv zH0^7lsVONpZ{8deI6Xbh%F24AwgdXu-QC?QSFSK9z`B0v5L$FwDJUpT4tJkCew-xh zGn!WNd7#s!9}pCTMKBV!4SkDLgzps)`i@juM~&>iqG8 zI^Zz*TgOi$BO}qdAv^KV&`>d3%;MTwS#dE#6%nv{Ep+uQtJuqzFAW6ajY>G>{cAe- zETh{RfBw@>lCm;=#kvSEW#=1rbO+1Zx3DjQH>v%V;xz~2I3z+!2s zsDR)e1Kq53rndGAg=$M33tm8yiERY>bR?X=#`VzT<<1%y()zu{NNq0EZoxmX_eOC^Iv& z-|kCksn;!fxv?WuT_O!6aQfU_JPcThXdNX{$D=Z!%uGyj2eWZtORdi%h+~xtnZXM3 z@+Z~33RY|9VKCU}$jJEJAkdVLnjxHkJ9`9#i>hiTDC3g}kKRbafyV;&j!B)cynNtb zz7_yANfw&CygX1+e&u4_YXRRo4wvhDh>e7wCF?7Sw*N&l|4(oCa&n=%{{Bs|xUH=% zra-2fAs2HIa@71j>keF4m4 z=q0}X&&-Oj(Umn>3->o?&!S+Z{WX80EWh)+57qyfY)XY1BM{Q?aev1r>k61(+xEGI zWT=-6=N}0vS?)ECBv?!`r&Pdx#n&fb#6!L#;m;gvd*C4F^|4Fra$+pTADbcH4cXMB zDj+;3;uaKD|($J`r%Z@V_M*tXG;Rbd&V&{Y=f8h4VaG_Lj>8)&)c=apK~=? z&_8CjUH=_PSsfx0it?o!*+zr`Z)LbJ<0%aO!%`ko*vB`a5f;$?V66LaLCht!zT0G_S~(^nP+eO9H{@X<0tt7 z!x*Q{MkKQKAIDg&L%S|`=kY3}R34v&#OD|6zh&J2U0)%O-kef*6>b=0NtF}NKG#r% KsFXdjc==0#ztZX8(SN6G?mxV|?)yEi>%7i!9LITvDl5t2Vo_ot5D47o&!klm2qX#ke-8s0{@%P`6+s|q z5znQcsJVXLPQ}!EsX2T5;zWYb`2lTR2&uFNnS_p-Ri(L(%hZpC?3o*jgrxE*Ed$HT zs$q($4W7vhXCb9ZXSK=3QQX3;yCl6W2ct+)WgT@`aTviB4h4V?a+;5wT;(N(ni!Y0x?g#)>q4h5X4TNJ$d^~qiAf; zRU|-JM@Prj>LG<#It>xg;^LyCUL;x_E;9OO{FpA2axENmf0=BReCcB4!VwEzN_Dc% z%FID?JcUQ>>^5y7cQG;x3Ru6n*P)@}2omArT*Ts%( zGn{#fX>dqBVHRW;{SS6;U=Q*=vbkY$AhYxujb=(TUEs$C~0Kyjf;zmzx@spic)iHYwOh1J)co? zUbrGtIV#RKQ<=qz|6YnYWjHAT!NBAsYeIK)g;B+Xn3$MD?KDfjcCki|>iOB(vj>Ei zyjCovJd-8-Sg7zU-`2nL`1mwp-<1VM*PR?hsqpT&5Zen<Ex*XoeYo)89_lt*L@!!Ps+i;k)-hED`ABe8-Gf#2{&%47HgawtR+q^AWDJh zC2JfN-s<1h;1Xpoi3`ohS`2uRNyS83TAFJ9pV78&WT6-rgg zR4&tE(?O$x4*`MU&RY0A0Yaj1lqb!;JVx9}-rnA4U`<#IWjH!^V!N>l3o#tW?k)#m z=!FSq=$jY2yx}rD8}d9P7P7K;QhKW%PGm|2!+MhMMHdtlSeTo0;)2=xq>D8yc_~@r zV2h^QNrNgcUc8`=%p0-L%R8)%QcRM#MQGK83#RkO8A>CQ~Wif$q{t{_FK zl9}r$7&wDkBoIZs_vC9e2dv$SKSeS#G0a!CsfbF3TeVc9u)*{ETiga35=u#6b+rKX zK_w^EhSTKnqCR|9=;wP%OR{Bdz|Ia+ML zwAERN@87>)GZW^K)^5y2-B`t%=YCi?y#D+5Z!2{U*!d$hR`r)Ji5%|4%9*}?%@Evb zw8_Ds;-8iVPp%I^){DFX#oxQ4YM*f$T6cxg^5kKelLg=kAl%k$^Y85tSLIP{&i7*$`sjERYP#YXx#N-l?+ z9EXFWw6nAG=;(-uSxHSpBdZ0MjTzPb6rqy;`qxK$LppBqkFP4;gwu%6K5LlyCGAhG zrL;zMvNN;k+)r(zs*m7Sf=(@av8XK}74i02Yq12LwhU*spJCd0LpEbn-l-1PK zBqb#c4QW%A61q$(D=WdP)mY;^Gl%nDXsW4c)sRs~CP4NeCH?i+ZfCA3vW{!r$^F^0 z&Vfv+bI(R_;js2B)qLkyR<6y$tZMa9_jeF=Urj_YJC>( zk=d2xu{ZxjM<>PT9v_ND{s{2+qIzlk4de(jOY=7}OJ6h~5%74TkVwhjdHh7G6beL`Y z$-lX|5&Yb-h<4}B*vJT7K*ajGvlgRDlYCpQVhYY*+s5-ZyE|xz3(Qu>{|GSl9Ch^d zZPH~v^M7<&=}AgXrVN)E9vV_rQHHd(vzJR<=ZK8B#yJmVyhj&o`K1)KNR74B zpvmUUf>$N8an_-L5Xzi4Y2X=sF=<2fy@$dBpP0Q}WO-CooFxU;$uu%)`tQ0)6M2+Ii&Zx-m7Z9eY>{p#Mo8|8g{6f^dD65Q6ZlBg57hiMFX)nq zbZ&i}EpCz-;;VH0Ly%8TXXz=Lvv-E7vg=q{;$W)I6g@tZiZMo}5N75qQcubo>es>M zZ6wSN|NOgCF$6<8jG3O5WZh{^8cj$i&_s^7`Kihi7Oh(+p#VdJwt-u`Roje)r)`x4 zlET;_;$&YMNxIYn#Il2Eu>w1{mBkktf2z}G!o`}XH@hb3XPg}b=6p5 zCQ8u~SWQ*o9&=pN&D&JJb;LeQiIMzDMyICs^ba}LJHmxXg+y_cdmphRbxA+vhsg5Z zVijyB`x<`5+F_S|9^JO6l$}v0_H;1Bka#Vy#_EB3 z#u_{0+|I$Ujb+^Uqk;h$lJ%QBaa5~ie(MtSFhAoTtO3lWN#Ue4A8t4)27gS_i}1^R zl*s-$a1ygNxvRG=o_@aOD94+nJQ(qE^v#>;J=wfFmxMkmYxbJHpG{)PpL<4a6uL45 zXOX-lNR7RXWud>-iOdpybMox#AU65blso2!KbDmTVh0DbvuG+(A*W$2#AAXbc?i1* z-+TA&Rcb#Xnc_ZeNf>_XEzJAOq#nhCSq&>W{mEC&JgK?#Cu2KVHJsmLR!|?bh zZx%v7&$o2Mx#|NWcg0h)`E}xj{^qL1wmL-FryGJeUG^sTV^+$LfC~oO7YnVu=xXj^ zU-R`#);$}&1lxucR>rvh3NR1Dd+ZL&oeeZ?281z)tGi;4W==z?8ySZ5!enLiF zZ>nv)vJZVa#$8cITk$Y{_9wQzw12|xl{@jslkD&_gg44Eu|~P}p4&yqDb}a$h0Eg7 zeQGZ@mb#``W4OpC+U!ZWudGZu0r6M_&Gs963|-@YVyYNM`@_rRg@Kd=Yr#OiU;Xm4P^^KJ&SAaNZN$=;^O_@@6 z^NAqPTr&snMm`7^{wj4X92{FzB%ZR_hHOPzw*0n>G`{Tj@0c_|^w=Prd&nm@P&eek<9>upLtO{893r z3rCf6UHYl799>XpUEp-i_-Neie=Z>#4aa|Yoi#pHEC@Fd+Lk*n6t8waA(C;H;c(;ddOy`u_vPYhb3J(ZJhjrMdwTQt?N_@6 zYSBdLIR|OlsSnVqNFPj z|D6aWbG7bGt$rb+yJg-30-5oc=O432c?lPrU8t(wq|Cqf_Fnjdnnn8PQ`QIJHgXQ? zropwRs^`A0rV1aJg??#ID!;}3fbGQ_|Ju*;bRZ#ka7jh_rq=4g%M7M#LC1YXc{5Qf z=92f8>$t^V^(GWkDbSNZgFhufnTOqr0B2%?hPsvuJ`((8X|&@l z+X&seXf+J9hNlvF47nk?CHBr@2r`tQXhd^35)z8QD=d9}%m zWN3#e$ST)VK#4$96WPt>SKkKL7bA)Epo|(`>g057(O&K{mTvj zG41WSCJu=sJHo=kurV+Io)U&GO;%d2@VjlwG>?+&1KS%N9nH;U0tg9@$WhH#y_@!D z+{)R`&JJKKK2F;1nrIW^im~g*VfiTA|m>Fde~T4 zI30Lr6iJeGtxE=nt!>PClL5X1ph_(P5SN|Z+Fj^qUr<_FDwjhTDh-UXSVMrHUzLUU zfGHMlPGz***WItt_1U=9$xNLKm`l5u6e|!1o#Elb{GuX-Oyy3KZyOsHV(BmPT(pPJ z&RlDC^#N$k&dvg^RaXyem~cutU_hGsvk=!!^Ed_8#i^Up`=;9@vc4P6BS&@puTlGu z1A@E;7M7da$2ZI>3aojoGDLwj4tOvd5mq1}@W1b-_CTL&8)DaT^?F4M#=eRbjaZcX zmd`zBz(1l459%^W7IxVhFYgz>^^}%Ijp-^XE*5>a@dsEzj_TV;S+m~c-9yb?XS{~k)GAt#6dMbrlm z(JSvg5xCF7E#UMgyR6(Pe7Xa8h9mC$`fy&;^~n_Y<@Hj`3*f)MBJS6@A8#}_H$T#; zI&%H4QE3=GS9o}py z>>VGcih7**+#J#fbC-FZ9{>~SP2@tsWfBn)>CEC|7JmukR3KEK2EO*MPd_8oj2Hvq_cn)xc4JBitOO-+un| z=>UGpexjhFqT*aNyZN1(G>p&aXTZ;&k|~4_+1d4L?C8!D(Ab*)+HKkJTU1W2tgOt> zvp1z(vl*6a^_Xy9UtN7wV-1(V#-g7tbe{4EB3N*!l}TMREDrjy zH~lFB{nP4MSy^H?XN&%K@To=Jox0;6Wy`v_)TVnG?;gL^pRX#{CVrb68;J^UU|r_sUzPGIID;M# zW4(O&5?8!RQMUNYmoEWbCK2RZKaU8~`^hj+QD((JDF7DJVHi+RQPH0!Do^bo;=8@d8Qb}q1S&&I5}M}*7Jynh(JKH{iO)f*Naqo{u#Hc{SLF9L@t|YLH-or z#xvF?KZ;)#NxOH_1?}*Cl+5JZkm7OKiGQRs3XIt8aAk5*8*Htip`oUBwD(uaGC~`( z>Tkp(?u_DN`-QgeZ-=XF=XSQYQ{&@LTJF#&vqXAkf@s4a8zFK!?P%b0&9}prDCYG; zHNU67pPBjK`gHC^x|rABpMi6phv6z0rS%7LQc|sX>E0jGCsT!8a=(0Gd-cs^d$Q6z z%08n|b9ZZ^BA0p)mrB_AF!kC+?x{Yd^K%d-K~vo%#`G0jZ*#VA$gAbVxEaz zCMEg}7r`{%K*GybzQ)ZnS5C19TwGj$Mvx>Hff9Ljbp<&Q2yjsmTatqF`VeC_Mljy} zgQFwQEBl`u?17R={MM6QG0fra?AqGeC%bdvAW<32%~==8AZ2 zp2fuxNe~)w-$RXslyU`oONUeXyI$`3UAAnSPXO0CN?B8rnHVciDV36l$Z_M(!{JFi zDJdy?`~Be;;;HHB=|F~wiT_v|wBn0jaXPN_kQsRHgE6>K4_rlrQX7@=AAdW(E@?)* z8kn1$OioDX_-jYcz+f$E5fK|p94Ghg+C712wMEX``{qynOVBjKS%0D9QHvzPuY`o3 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 literal 12495 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 ZkB~hF!WN!@DTRNR%fD8Uu7H{Z{vS}98S(%C diff --git a/tests/snapshots/v3/test_wifi_paint/test_v3_wifi_ssid_entry/wifi_dialog.png b/tests/snapshots/v3/test_wifi_paint/test_v3_wifi_ssid_entry/wifi_dialog.png index 2ba9999c417a3fb7f61410ca03c548d7f699c9b1..9e5a15e0efb47fbc227db4690f07285e44bba940 100644 GIT binary patch literal 9984 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 diff --git a/tests/snapshots/v3/test_wifi_paint/test_v3_wifi_ssid_entry/wifi_menu.png b/tests/snapshots/v3/test_wifi_paint/test_v3_wifi_ssid_entry/wifi_menu.png index 689d9d40b5b649dd1121ba812bef75f35b6d716c..1270735288ee0c5f42015533202141d82f11d018 100644 GIT binary patch literal 10661 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 literal 10355 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 Date: Wed, 20 May 2026 17:58:48 -0400 Subject: [PATCH 29/46] Revert "Okay but still bad snapshots" This reverts commit 44876e984f3033e5ccf2e34769d820d5dad4ccac. --- .../test_v3_pedalboard_change_via_lcd/0.png | Bin 6728 -> 6360 bytes .../test_v3_pedalboard_change_via_modui/0.png | Bin 6728 -> 6360 bytes .../test_v3_parameter_edit/param_closed.png | Bin 9362 -> 9030 bytes .../test_v3_parameter_edit/param_dialog.png | Bin 6748 -> 6365 bytes .../test_v3_parameter_edit/param_menu.png | Bin 9362 -> 9030 bytes .../test_v3_parameter_edit/param_tweaked.png | Bin 6775 -> 6391 bytes .../test_v3_parameter_midi_change/0.png | Bin 6604 -> 6299 bytes .../test_v3_preset_change_plugin_update/0.png | Bin 6923 -> 6565 bytes .../test_v3_toggle_plugin_bypass_direct/0.png | Bin 6811 -> 6467 bytes .../0.png | Bin 6424 -> 6063 bytes .../test_v3_preset_change_via_lcd/nav_A.png | Bin 6424 -> 6063 bytes .../test_v3_preset_change_via_lcd/nav_B.png | Bin 9073 -> 8749 bytes .../test_v3_preset_change_via_lcd/nav_C.png | Bin 9094 -> 8772 bytes .../test_v3_preset_change_via_lcd/nav_D.png | Bin 6255 -> 5893 bytes .../test_v3_footswitch_press/0.png | Bin 6419 -> 6247 bytes .../test_v3_nav_to_system_menu/0.png | Bin 12310 -> 11971 bytes .../test_v3_startup_snapshot/0.png | Bin 6424 -> 6063 bytes .../test_v3_wifi_ssid_entry/main.png | Bin 6424 -> 6063 bytes .../test_v3_wifi_ssid_entry/ssid_editor.png | Bin 12838 -> 12495 bytes .../test_v3_wifi_ssid_entry/wifi_dialog.png | Bin 9984 -> 9689 bytes .../test_v3_wifi_ssid_entry/wifi_menu.png | Bin 10661 -> 10355 bytes 21 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/snapshots/v3/test_pedalboards/test_v3_pedalboard_change_via_lcd/0.png b/tests/snapshots/v3/test_pedalboards/test_v3_pedalboard_change_via_lcd/0.png index e711c492f47234db37692db4267998146634cb97..e7e9cdfe0b30ec660ff0544f97b66d18f30b5c87 100644 GIT binary patch literal 6360 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 literal 6728 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 literal 6728 zcmdUTXEa=2*sq8r(h!6YAqhbclVC(|(FxJJ(V{bn-iC-ybTQF;7)CFn_wvVR(L2G2 zPPAy_-N{|+uJ`Nxc+ZDfGiUZb`#H~ko?qD^@04Wj-lDxlKtOO;PF7NtfZ&Q4_`XX_ z2tM)3Y(fMCw4`#9;_7b6TeI%kl*bo0b`#!Du4oqptZ24Akzsrs75wypP&yPPeb?%3 zupQ+yTBx>746~(41Ff9A35DNx%V3$G18kAJhbrO}ww0D~d8~vIdD77vIS#nI8x#Ra$LR#jC+ zB!1`4orA+eXOd`Hrk?2Jj}an*f`W|wb|=4A*4EaD#Jx^dkT*!^21Qk@W6P3E| z%o*p(5c*jW6Mf#@{ct*wqs~@WTMK42H#hqnD{zjtw1__@i(;~}u%M=-TwYpIGccH) zowZ|rsK`WqjfiNb`lFw&(XGg?u+Y$2*BwJg$8zIx1pZ|8Fp>V|9p;6lC5i_R{#!i9 zkZ7=d9UC9VR8-s{At^gn;v8>lYnz{+@9*!Qn-gJU%P%TY;-E_MN(zz892^|%?36YK z0S z>j)1IZ)|M5a^(sgN!RrB^zu#Y(%xr3zoeuj8yg#quCcK(2fpNmg$1xS9`B8?C|ct( z-uu}Bsoy0ee}I*cl9DnqGJ5mojg}TQw0(BgfR(bgx_a=dHhD<4bFeB3U0jTmWfBn) zxjY&0!7h#mJr1s|6?jWAGCF!QKmrcmVemOunNOInab)4-j5zh$p5e#k*^C$UCA6i| z%NV`%1(%@f_Pex{l$19T5_EKQ>g=UL!opzhKzz^0<;KYzCv>;BxBL3~uoT`X^&TMy z5)u+n6ty)qYe~(+xyq3d5o0_@|3x#}jF;Vb>e~|MFJUYxNyL9(JG8K1WMPr3&i0JB zb#891qaz@{C-ln~G#YJdW5bOfpQce2w6m}n9~o(^9^(-f76xm1^zriZyDxQy z^YZdqchL(tcMN3W@Pxf(`6O8T_q$uJv-~m{p}uyP3Gqo z6in(jtkL)0$Mp>kz9R_&Rf1UlFFK4GlK&!@=(^ha&JF|u!IYLpcblPAZUy{YYzwlp zvva6P)|j-J@@!H?jSLN`obeF)iaCe#B)l@c&h9zyxzq6Tr-?z&PaVsbrM|vbJYdwf z0+dNUIyzR$>`}N)zt|i3-%VeRvZE(G9p&bxh?u>56zHU=9I0 zs_@~%OCMQTSz_a&_BY3+pcJ5Q#a^6)#t2H$aB$$-pD1|8>fqoI8XD>ZdqC%V<$(L; z%XeyOON)#5sHi#xNE~ZsKzF#h9w#Q!j;^Yz7aBHrY)w@rBqXRGHD2P+a+TA@Y>YqL zy%(!$+O_w^ts2v>~=zY#V{v7&F`)nO?3a*XuVrnWXa|?^0fPnB$ zEtY4`5SJInG&D3VEiIjPY_p+v_j$=9yUvyvE@ic$B56BoYY9ES~G~JSt7 zMODiq3W}_pmN=Oxb+(JeAO?}k^Zkj531QEp!L}Ox?H0cqL3WSjsfFkx55pPLR!%a5!$_?n7QOb7f9sv2Nx1j~s;qG6N~KN31HizND^X-0ziM#>p#rL}Q=j z7yNFJTBo7&@`4Y`d*zKZe_AOURq7?n8@=ch@eSf9Y`Qp_c4~rx)aTMJjM)!mO36gh z-@g@*$oyvu?sGP(1$$-Dp%{{#&6GdD&gPqNZOun6#%mpwJ3{sPOK$G!pS`6upUcBy zpEbjyS=V`kS|`-{2a&Ym9jmY$KG$u!@|IkdRJYIWRCdiIMwHK=KX-R`*JXaWuM{Zr z%(u658oy)OjB$+ot( zfCzEhu2}{B3AWlzC^aak3$0WBt*Hvq_~&T>7q}w&3kw!!n$6{9Nis=IO)BA!YHG0&O)H7?%SP+Jeti@5X|&dPn>&a;yqMkb?&5I9 zVQC740+@+^juq-*yG=|@WvZ{1a3Z}=dSUC;%^4XP*v}x)%^G3{ z@rKnOeDk;E<>gHtB@Cnr+o095YHMqst9_>v_0~Ur3RD-?NA&XC5!Zy)rJyR+R=jkG zWvX%B&}?;h*OXlW7~$SFLG3po_un!M2q&QQzJF&H;0DP_82)p5x<2igdpIruV6p~- zL7txX3+`CD>vs+eMB+IpZ>>1+?_)wMeYhD`j18{GGRaw3b(5{{t0@ah#VjAJ4Tn46 zvE-DLPHR7Mbjr=w4BNZ9g77nQb4oj1lrMze>GH_P$lwAsSt)^fVw|~B!6?TCf$V_( z(9zL}Wl^RIkxbkcgP z&`mFI;zNFL2?!+Wh?{)4JC@Av$Vb-?nqc1N65){^7S>y8+C@l6c;{QjI^OuegO)ow zCZ=^$atB~GkR*RY&?__R4!zIrln^sgPvEq|Dy0BTx<7XV6sHv&o-1Ng%lVWzv$4_e zc*k6XV`ydu>(#>og*x}dJs-Jy(Tjv2zkXFgv~_lN_9wlLOhwn$p5iag{4?U@S1!(u z=iQdVl|@ec>3{wFDRHTLw*W|+zj@SQiO=8h)xH8mw0XlLaWc^4k4{L^XB8j~l0Mrz zJFrUYuaS|Y$lhmiG45w#XI9(=w@n*ePck?1}@-a|>E2CH+)Tur4Pj0DnAbk(T2v64{0;)m_4v74@{sNey5 zRatr9c+L|7g?=r$1^kP+xVQq6^94J*>GrWh&3O*eFmoUc^qXbN<~u=NUYEtz03c+6 zEVUU!clY&;sz#ldNl8ewo*r%(7#MVgKh%2n&S>`q0}d`MPS$kN2mdxeoH%R8gqyg} zuF0xVlG-k>tgOXK*|T^K6oe6?($DW|`HwV-ajlN7u5#(SBqTtnKd84x-@YOv(*>Fb zM}!T+SInqCI1+yv))<~G50zvqdBV1^s8nb^5BItc+`nB4QqK zYye=%mxxR6-c78^76t;s)NnRa!_r{K=+1&e3Sw^0AMAL1lhX+ zZ@Q?8|9tJ*HS60|m6cYIJSjD`;qBSFoBQc7LQ)bEd*HDqx+5M5QayN3ZPF1+!J;%% z=UR-xxB`MLEiDDWTV3roU1bL}jPdLTEl+tb(BqAbBBup9)XCEDUuNS)23WPq1a1p1 zhKUhLP9(&j_Mm1p6?hPR(DX1E40yU!VNdU)^0ZeFV$_+U|FxLj6;+fv2NjTIX?!1l zrnt_91P9B?$)V6_o>P+aZeS0&2ZZ*gY>EvUJSs65E#}zS22a;Z{KczRuh1;X8r0s~ zGc`aCHo0u+!r{g0Yz>IBqcr?MF7O9q8x$VhJv|9wGT7A z2wpN88X5wSxCp%a@Vin9unuq=n~mjVN(P1|ivfD`qq%zb;Sq&f1Z>*QD%OVw2LQE^KNC|^F3!%gz$;Ew+OQ}k^Et0m z?r-V*FNI7{P#ezUgZFBn4J#u?A8nxF*BJH=U!0(xF;|8s>jo{t%)g2Hmk8vuOWiH) z`HCPK$1Go3K!hcotBt83hFW7cy-~=8+u%EIp{Z><<61? zEeIlI49`}d|5uNZF^uG!Bl0m>1R*zu)22;1nGd+#%OrSXNJz-N5Xq}ouR@_v?2($( zQx!M2YCr-K8J1R7sJy&%SUW=%y1d*`Qqn&t=tfZ6+U6#ZEiXM7Vrw`1u(!R@#qaIr z$sd(rva|gYjXJ;3>@=R)OG|f>ik^!__H}pPyA`1BY5wu!M@ZATgQev!V1>gUzING} z>)RxXj891s_CEikW#}G2|9eP=!P(VStq_gYui<+3?EPff`(hyZvgKlFA3g-96+o7N zgN($4gtgUGEftkgu*W!@d9B;KckiU7rJbC3BD)GusFTg|0Z_#m8_<&Y&73GE;0JW{ z^gMCc1i+4Yd91YoO3|`$QBi}y1FEa5tEvK)=0==40e~^+0UfQFCSt&e^f}wY0HbAZ zYn#k#msn81{;H>>ajXHM@L;l6eiK+t7gyKZ?Cilezzgf^(~Xu$>g($(DS;AjHFR4H zz+x3e(k{DM(%jtLX-e)e$rb6>IDmR>Ivp*x2b2mht-888J3IUJoSSKP%(JJ_tnBPz zseDXKfBT0kfrFcy`^Af`I*`i+KT-ghfyzcWsiD0m*1fwY=RloTR8^^pmI4HD8cw}; z?;d%`GLV?S#eh3n#fB>%_$Zha2Xi);B1JjB%J=s4_&5*%30+GlyX&^v_V)H5B}HiT z=K6ZizyLKd(Z*Qe*=`#tIP2Kh*odSTPK=5Yb1nSS!(Pk-h1$(GUH}9Fp@l&js}X0s z1ubgOn?jqu!P1Aal9$t?qf(XCy^9}aW@g$=UU7>7qe)LsUmJJ0yGs_F~*4-{Z?h;QafmUbeKK+fH?lkKT@XoMGzg^*N~2+#iyWk%8l) z!%S8(Vm>;Og5qRgn$puBUlje;Um@P}t`<%}?C!H5Qs`=3v@xt?*A{b@nofWB?DzUt! z4*u8YoNw~Eq=tDJpKCs^RAZ$CV%kZobY!RK9qUL=fJ(mna95Ybol}a;-)h4UY4fZ*1&!qm;na}m_l9e;mqLR z!pe%&YDroeL;1L1!@=<}tjQYz{3CWQx0BWP=I1;#8k{~xeE9<28t^mVsccmgUDb1| z9wiDzsn-XAbh}nwk?}a4`i1HrCebUud`~Z*_=Xo+#JasBQ@e z3Zht9n3+W`4u<#k_P}N{-t>3Lud!}!W7CF}&o*|m)#R_3fY#P#B8R?y4Xbkrr*}JC zAALRV#VsUszPs3Va&iJ3bAeW|`Pkx6Vp0;uc9NWd0j8~8?Xor1;CZZytPDgI7UtML z-$aoaMnNFsB@#((Agzqsk_{?4&6*AZJk zgJwmWX9+l(iW8Cf>fi4BJo7|46&2Fh@$%o044s$p?(b9izYsqrtf5N0W}2pgi*Nh) zSEo)h%|*Z!g5lDU*c(g#rib+tDl~Y#rk5nR_aC&EV__Y-F;pb>+VTIc*4S?P;kM^N zCO7%NTSYoA6$uOaZ7LX^a%1SE|3<*wPbjREp#y8vCvJ{yy2+JoXxGWHX@J zk)VLv)a$>Y((ciriE_rqPY!p$4dUUyqa@1*2vyGMcS5sc?s{gJ`N9l_*@8CCkl zO`^gO{=9>ZM7>Us=gz#})h`B5K3gWfmw;aVselW0G&&Q<{@Pg!|YtLM?tOw*x3XDkkQ2MDAQ&3r8v(nS-x-WxQHj~W&i7bk;m+~O8d1`%+W z>)LR0B^%({KWJLzcV$Q{Geivbl#!R;^AHZlNm%!lSQ8xG*_0{YdKJ@ha&p{yDhG^iEo9Wi6E;<*ovP$mK zj;Y6yW@u#Of3~aL^8>1+6dN1cV#Gmj-kLif>K_9mp0R(fMA7S-t&ior)Lc9JS(<drXB+TtoC0YN@aPtbvq-garp( z;TgPBc!(`-V5@#ioQIIX7Qq~;n+g`JQf1VFOHTetrvgi)R^hq4jLh+szr9>A3KHMB z{hW?~&Pby{yI{hF!3qf?BC1{_hpHVJ!GNpVx2D+@TR$oqnr^)%xkQR($}^G*_6v;1 zvWKlnO`verG%?WhH(cCr>L!y11uUI*-@3d$W7%0aC*f}Lt84bay8gn3+_{f_ zfyqBW{$DO#fi!Ty@*$w3q$P}GSn_bN2>nt4xzSYii>m6LpX$@@*r!g`zYPKDH zIaM_?qb99I+(&HR3X%Gx)6~>7J2mz8?c3iQ8`?TL*uBfLG!t)`HTx6DAH4q#YHVyg zZRe?}sp;wIsi>&<;>8PX?PuqwQxrRyR9pL4{sFe*Cbvvr9Vt1>e~?y_$5Q zp`p>x)b!q;tM%N|LG9Uc5wx|nJ>48}cXuzM+;VHFb7D}0bZisi40 z4##}lWAb`~05zV8FcySmQgU)Zsfn}<&C{?8&zC>#>Ab#u`zD!yI$!+j^a=q10h5S> zOd?Qpz3JzPPlawZ1&`HZPnj~U!}<@iV_Ti@NhLV#{QSJfnZ{4Sz@J?Rv4~CZi8|gr{XvvH zC75{L{bAdYYL4(b;a@vDLa+b)R!n91WYDnN9f7G6{*08g&Hu`6vKhapRS^mWlMRoK z&iL)TB5w4*`cqs?w;K(X1YiV(E;Kr3T{U52Vj4C%<+Qbl5U{n>S`4Oyhah6GQd(*SMbFCN>;Vn8oJHzxzKva*fe$)$Ub$B9<|`WI%iV_UiGN_0fd4@y>-_HT(Oy|v zLR#AF0A-Lv;iDm+Lt>hDP_VU6i$Ko!;hjO!9oMuwu^TkANJVr#jjF?hpBH#-Yi3r^ z*?I4G)GqL<7yVCjUY@Ci1>Fvwji*2Wc7;O8q~-8?bwUSw`^C?;KR7#Yy0=cP$8vLW zb5$u4v=>(+Vb-y*$BsSM7&qNytZNp_dsklA4s_U zd%=qT=J?nJN{SKjt28f=g^B57S(&Ya12B&l+ea&(U{nJ`Xz*Vcist8QBiSlBrK^YDHT?sO4+xFplU;-bXWZ@gY)-*ve-UgeZezMs>F zu0y_|SRpUX%y{k3J-5@X4&QM{R!gikAJACDh>)t@cwma5AwWKAq9?t;(~4sY@E_YV z^62D(E?vq9_Pm)#9e+pXs*B_kRTUJXqoaL(#V{Hf8~Yijjt&f*9u9j~^88}&3 zSQyC?z>Me?a^FlsQ}IYQlyP-+RZ_y_OTi~5zTB@LJ9nomTPc^1eOK9J3U-C$y2{M( z7f9bzH(9{HQ&UR#fnphQ)Qa>r+N1;+jy+L!)ng84Gf@9{D1Yv+$vT- z+WtTl8wy~g(dN5~s$XwKDeW*{M=vg(EAFruq{T8_W!y%{ZXiRh-{_#Pq7uJmg#EZD zB_(Cbj&Hih`tcqGdqw?v(>ag+o+=!28HJ5K{SE-o%9 zDJwok`)o5M&ZUpuNN2ok%tj*h_DD&y0w zF-Gs@rKP&MI^sC5z`#I2doAqv7$eR*XBj4Vv;2H~8^3>78nvV>5ybYv(PE{FCMpe^ zM(3z%9KVf>0B)<&VzJ~>j+aZ#$hex2r~F5uzGPB9>TiW)Rr-Fe9QEB|3(3mL>b$@6 z`>{nPj2{Be4h-LMhvu6P#k_Z-+8J#JPl{eijk2A)a9$>|K< z*!OnKBQrBo=aYfuE0z++?cH6HXsPB;pBztq^?~%{=Mhx?E)S+M0xnKVO5$?;)vI14r&yxFkyi1N$-uy1cW+M#e4tSH zX3m~RtLNTK4oGk3`}4mC9-p0^fh4x-e;Qv}S{lRg!hPI^msPha8;BE-3qnIfxgOg) zIIwYWfY9}pmJZt~%iJuUMV3#bU}s~aV_emw&b|JY)BH$<=W-l#KhStl70vbgqJytcf&{5^*;#x6=W!2n0dQz?MAR0b8_ z-Lg{ufPnV)_Sd2&^6~>fia0GbpPY_Ka09zt%N-g*GCIDG}K14_) zjJ+MyWmEji%UeHjk9o#K*Znh8g5I9Fbo63(!#Br^E6`}6x%`d>AmP0sU`@)wOds;G z9@;d)+vqL%0aJ1wl|Gwn7;><6U_|6UdmdJA#g)Nf4NbO1HS~3Fjo5ulV1P^<~W9huaGFnGr(T8VN(Ld;H+uTa!-%>a;s;tM9%Nu z7C}KlpL7gOOzv(kR%d5sNFwuca}T$+(sFWC$X}n12#AP?3|8M;0|W!%2QXDqQW8(X zS6*9tVtRkA3qa-L;{%1hX=?JewA>iY5!vBDv*4bOd&UFm1VA}8==&DM=sO#u#Z_moY(&}?U6V;PEya8w;+aA;fMMXso z1_wZufzcrTXlZGm!KGA7M)g!uL>2C4Q=b>ls{auf$iJMfP))rb3@Dvxf&SkB8vB|mGq}})S`V2ATC#b<^-0{uC>#ar}a^0U3!pyRJ-v(=`c_5m`hQy=kz#7O_t@Yd>0&XSl zuhhizC@CqOWyt`eo0*wuYik2ohajPWqQTB?H&@J0A&u(l>gws!r*9K4LE!}$6o81I zmltsVLlLH}P0zq^P7QO%FaeT%$LX&y*kx}n;CThQ`1p7aq=wI*$BnCq+X#EOo;*qH z@0V*mEr0)>kY~C10#BjZee3Ae`oWs}*63>=pYZVTq_*{eL{3&#dq>BO6Q7Wf5Z!8% zlF|L`?PkwCLeCGf+a9f?0!~Sb2L}h_+M7byckO0uc;OD?b`2H`CqAN&d*Czr+7;6t1FH;G8!m!(%TyvrlY6~ahU)4Q zb92Oac$zvon_F8%I5?6V-#Bn%zC{Y(T0}^h-Gw4}01dWdrCz25Pa4$L{nn5VYQ41K z_@jQZ>NwH%ev=?M%)#$JPR&QRPS414F5c)=^ts-gA1o?=dTaT(E^DawTjNzgW0Hx; z_tn1TWi3Dg{ZQj}IqrmY0DhndRs$}Km6hW(%IJu&_V@Rvc07DzRhwH{&UV?g%CvSp zk(=Avvb-{Fm6Lu4oVM0B$YbZImcC^A^5x4%T2YFzo}M1E#9ZN=s*;kv;o;a%o{^Q1 z$vv_wLoF>je2k*P!v1(t@2fwSlZ*WG(9-H)X2MtyK7O86GvnhxPBY`6e*=o0vb`Z; zM80U^ZCaYVoLr_YQ>5{(macB<&hOJJ4h{~05#gLe5S^PwetR=O*5MNpG7!cJktHb5 zkqCQytSt`;%D>LQvZs8Hogw9Wz!gL!v2Q(-6(>tR!J2JvZ(mVfp6hogq^73UDzZ%( zbfeCYI+DR7Pm}E9=hyjXh}GazEkWz?Yi*&-R%`cgq^ zqI2S+YAGKjar|tCISi*aEDrSbQHO8mtfw-nS+R0MU{52*90LQzU+H!YBrd}H_4Qrf z5=gcN)4GM8L+aUJq!mpfBQixq#h8LoanIlHPKvhrR*%$9Os>afc1VqOQ{s-tex5fH zCTsA@ukaqfC&;g8nvWxfDY=kY%l42hR-|<^$C_eC7FTWWaKZa3Yzq1E66(g{O2=c^ zesOLjmtu6OQko|mOz$c8apqJf77Xg!Y%*>S#P)JTg{`Cyd1XVaDb>s_%_Co!+|YzC zw2sdXs88y>@(bt0{gbQ_PpB$gmg=iIZlkU#(yA5HxKSj6C5FahDtVIJ+dpht_{=Uyc-U_8u{D zCpDLMyo**_v4js-%eeOlrHj6adIju8i}qh$b~d%(j1c(D`j+jH*Fz`ov?n?-GWNvOeR( z#^`J6e{F`|`9a6dKN%EW(!XiQi|#z^fYK2b-d|%GaAnxA3`7)BqF>l160b$AT)tr{ zQb<(TG}Y6H=k_it4W0PgN$a)T*BkM746m*8k!%Nr0!8$wE)K!p4d!rkXMz06pn_fB z!k5PP+-{yP?s>>>PwYRtU{0W#4=j45lAz_>7+q6}bQyMKL=)pA6 z8d>HY2SK!ooBb6dfkB?YPq{OHekOUkKHd!b&Hh>|lsY`u=QmbWRCPk3#sX2@rfKsj zzWP@N*4FUOW^DMfEe*Ey@FN5~**vrp2`xGNb@T#=GyJT3Knndr-k(B))HTt3A_A_( z+gPAVfct1XoeG{GF&^YfpdN%ujDY-|OPGvVc%tFZtT@H#Ld~Dz+Tm-F@Ne^(Qrnc` z^23QnS)!G_yU}d6(bGD`(VaVa9TM{C^WX(~++Cq6&EWiQ^yr7mMpJQ`axWSkQrXz|27 zr2OrYla!+bGw13wKZzI3T_wxyhjnYRvzy6K?`-X5CLLXN_bldhaW^l4kNKaAr*PgW z206ngd64`H9yu-1njnkg!r?ZB)V^?xU$1P^1$@sH3-L#Gbl(0lyU-iQ>D_?K^kifD zMT|+4n!IRHi?T_7j z9CNgcbr%gIZ6blmu)_Jm^ocKKRp~YQvw=`;Um5)ym8~(Q7!f@N??AnX#d-K=B#GA)x>?Ao520g7o z$Kx&JkEqhDM%Gy)@pWbGMjwOQFKxYcBR1i|g+TTeyY7q%2Wnp4&K2TXYl~HUQb%@; z!eKYt@O1A+hIGl%A3GycTWbrPd*^J?9_oqL682lFY+M*85*AQpu*F@!`Mtw`nDuqID(Xcgp>Fx zd$`%#@Luicb4=*CnbDE?5Ub^`AI6s+6g(eyx;4@JRgBiH^@R*+We5y=DKIJ-bu%mw zhwG;UV*kE7vF%UTVg&~TPUO`YYvB_BgFqY}p%X*MOuN=v4CfLa!7%S`wj`PwggSML zz9LxV6#Mj{B>fc{j|ov`9yC71KJ}+K#IoVpLT5vn+7X20U8rJX&8*&B|H?t+%bwoQGnx z1Q{U#>B?tK@RI&>3bW=1AXO_X*+2^v^hexQI|9J4B4p*S>nGr}0h>}BbeJtE5@#!d zDMfv1fc~AE(*ydLfK}(G;N3&rAdw-0{}YohCNR>|t263qX*sNXY3V#6wfI?yK^&P(_V{rRIJxlI9;e<_02)*O z*&26*3=@78=zs&Aj1hr2aAF!nFWQWXhIT=csZ$~5f63M02TGg#{Cosegf2QN7+TNp zuo4sg%=83V6OERsshVT8X=mU=$1;uc;^G3FmE7I+N-_K2(au_WkdTn@X3F2e2rwd| zLYw(C((EiUtNGq!Y*v$mnw?--d?X#K(_( z{|-Mtrx5e?@bWs3z$E&X=R)>SZ2{>B5zt-jLs_jrWzV0UG7&EKRWKp^tr4KZZL)YLzff3l54hu{KC z6XS3}1i7eS5Eqza7vyIbu-FxXfPfT?goKC+K|@8}&km1@8q45`I?#h4VWZDIdi3Op zMBoi**i$Y(MacH%_$6l_bGJ8EEMke0mQ|HX=b`rG=H14u5_RGOA`L4O(~~F4@}HaEWf+-Trlu z!Ezx)ouI*IdrCs$dvUldu;LST5dE0u`0J@ws$zU>thorysIrZX4HSy8SWC>-+t-IB zl}I-J6ie`tpkE>{W{#c~O#u#Sc5ri)=im!o?(6Y-Hmza=#xl`$HooBbXL5y|75QYS zWN!rxBu1%N0+}CvqzN_-o3sUUBWRT($iL+nZS~ZWG;IzzU)HVv6TuK!~55ksY<4yoWBG+Y{;d%J=tr3Ik!z%|Xy6e|1 zVh}TG&l!w`VF)#ng|}tF*0#+^Vu)5_|2_ZB_JRZUQ1HSxjV?r3h>VC% z2nv0T31X#EjPzIpDrPVW_Iw6L90oY0&+3RWp{uMw%8GveEF>ibw-*-}4PH9b4nBK! zWY!azaq0xyRZ`&2&dem)MQ0^>c=&fhK4Rrq6ZSJt(lNvm`Q`I}?_w7se*Z4qBgxpM zSL|4ARs+$KJQQT<`X19{vX54EKce@=@x#A&Uq0LwxFsRIq~YRWh^MaGW0HAm;n;f=$5l)$Fv(lNe2nWVsYUVg^W&A0f2KXqMj`y(`^uFf z0_)J}i7Vt`d4%F2o1+o@eoPuU<_r@evsD@)tTw*M1{a9o}gO_}fiH2f-@pQ4QYCB*MciUS){i z19Qzqran>sIFwz}o^FMdp zv+i2=noTJRI?qD-q4R^CTN;YI)8!8W` zxI7KszMPq#f2f}p^0Zqj5olyDV`Ep=?nAC+LH~gJ=^Gs#f|OM9jh{2SakZI}RC0FM z#mVL6qM!R%%Xa&Apx}1irYIT$umNHkM8YG253vn<8~jk6Y1z+&ibWQM^R=?FK_{%X zwsvS}h?<&uAc0ccYhMrB`&;Fi0;Gln8yh=BVigV_U3;g;N+hLFI%&s~m4+(N?9^gd zMQEX37La_!$FInkK z18#2wChb%#j*!QWdi8}gCdN2Y{unkUCjA~eMz6u!x4fhub;{|V>~C%T*gkoVfs#Ig ziGgu?bkyQ^QKeYymWYTSErW!L#md1kyX&zb%a<+s{&01E-k`mp$X?1465MYdEkh$NF3z4lvVKHELjzyw;z(7r2Ms;v!*JJ3=e|`R?qHbDwi}h@gIcuTi1nt_>h&AWp8gU^kAT=IXN{&KtRxE z{Z>QR>mrlWYWS1gWQk`I$+J8JNWhnG-?*r#KG)VJIpRGFmjYqm-F@w4-cVo9gh3TX zN=j;AVBqiX54KQiJL+g}$B`2KvT=WRBULcIu+UajHM%(XZ@J?IIk^g1wMkdr^Kzx3*qxHV;Pz^nwt0xL!WiZ z&wNFFzE19LxV1=7aq4y-9UUblB`w{}x7=ZX$H`IQgoTH{BDwT`lB+tqxL7e^8x``r zkk8BAJvJ(;*?l`+16qH--ja5z>fU0QsVvuVeDkmC#nR-=3NT~XYy1hw z?$26_fhwc6nJb~GZb)vK7RyJuUhBF&7>xAA3#dsj21@V3f?szqfVjtR{uG3^IvI5`s?sF;}01X(nC zB|J<`O}+VXqFo#vd79wUduMH42Q2LDe4?+^k&uGvjduDBv5I^%`pv^5BGALX!(jHB zq*%|NKhF=kziRc|Q#d0cB+N`DxkN!Bi^|F(Exd-g#fSZ&?2d99KdH^kA4U(CqDgv! ziYhNJ|B?W`FyYs)UmtgT(iG?z8uN$3aY!N#{?rW^o_%+d>Xu#edSy9}Pju#4tH)|$ zViF=D5v5)*^s;2aAJ3;WD#BO~Sg{MwWm+T6EQ?d^YWv-DpZT#` zD<~=X9W=}iPX7G)vr|>u+tE<0iwtXEM8eT=f3d~gdw;Ihb5G~xk1w7Y>}1tNpq$gNZ0m2z#^DCiS*SNxqK> zQF&>|h@6K1ySGp_HnC39U&B=(CowURUMVf^Irk4(f@!VZzmALL!?oU_mrhPjH|Ga0 znV8C;P&2Mf(C=vF<8ws)y!7-krt{%(!NCY8wk|GR0XOF$>$|-F8Dm9S7@b&ITE>y` z#)xP$5sajC^u$CQe0+QY0y+Y8ebzL^;;-f9Z6Ml`l07Z%+hxqJM7ui9vwVGh zOG--OpK~*ah!`>vn3FK1kAT-0u=;doqOq~DGhNjrab(le({sktzjy5&C|;OYdNl9T;&Zq(2#1eBD;Mka(|8=PD zU?4z;5{F`Z0Xen3y}h;7*wmyMWW`BR-EmIZP|Cx}$tfx-%FBCZ@^GELn-Cu#Z`|g^ zc4hlr<&~7}pKn$vjB0$Xe_2aQNPQ`VgM0=j!S@^(pCH z%i^p_Q0`p)Fsp`!#{K<8*Ne=IVX)7#&o+5c>@#BaeYc#@-nI72zp)HrS!3H>H}E!5 zkycc>1d2OYc{NQrmnUq>d)a3|p+l>^qhq#0U)srjzSX03frvn#5LU_|HE1B6!A#Wg zxU=vlsr=3mLiB#nF=Aq3K7@v@1l}AR9=`i~9gKivZedYv*zy6#cTA$XmxU(D_Ud?Z z!{l^pYfB}Y@9ui9nha}uh%uioTRS>Bda_iFQ69@bARymo>p2%*s$yz(_FFx@9XMRf zW;6%+8Bsq&O!2b}-e zoh-$b0`30cc3WKhdWZJ76ojA-4;0lF9Il#I^|lGVF_hAGl*aZ}3c#e~F#>YB0(ij1e^u~ z6;*d{Z_!AgZqe5w4t13f93lTp&a>0;0_iWoPpiKhb&Afg%4m^VQRVxdT_1%G)uY1 z5P*Q{YSB*LZlbDXtJAb&mc@!q%~<7JM0g7t;bZ%5lTD)wG}#n3-t7LGnwl!iQhVnE z2J|d@X;?!qT-smR{r&>l4t%~LwtZ)9?P%HWpFaJ4axxxlcdpjrhJvvdAC*`jaQ;wHn9U$&*%cYUMrdhn7d^XiyMos(3qg#}$(Cnc*?4BTZnbI#XNX9ykS8qY z{)Fd{g)N{e8Wxf z%mX$Bor;$%EH7zjNEIML4}Zbu`2KG+Bd9_>*0j=68wCXgDXH%tke|&|=%1V~xTF-s zlMBnG4ucU0>ZIAQN{=;gw>bS;OtT3JjTWKcvQ#iPr%4z%IX@pA9Q@pANwm>~ibXCY z6VPk?el2_`g|V%r#mCpznuIC{R12f8fL%dDgC_vVItk~X0-8N`@qAba&_TVO5F5Xz z77@uA*=%iT2@ekkv(a&>)w4f_u;dg;|J+{R@U%)FX{Fg!x^yz>AO#sEY8~{ggM}tF zhLnKgAx4*uGom9|TypZegrM7^k+R2Pq2TA?c|-+k-^2T$z&%yfctWsvV`y$p?{CJy zdgguctV5t5+RKz7KF7Jkt!x*(QUC*{h+}2SrvU^_TOR86@$qrr9wm(J*NM|Covbuy zfQ4djBCTPS$^^;#7-Qad0L+IVq55`iUmmRs3JS`3>Q*~0H2$*v9R3;P z7r;uQ7j9>Y#>UH6C)>g%vwLSIL3f^%Cksdb34xq&wzJ!Xqhu;Kx@{`f@fFk~16VP& z%<3?)xR{fh+u^x4L&0h~BXQ(+f#owzN6D$AvH47xtXUWjTrKPt0HeoO_ zzy^$Jc_Pk>%>V=>DfC&_r79L1vb)&YHoLCN+1WuS+TA;hySxtOxot)hW1qwJ_Bafi z5AQBk{Cs@g`~y|JRia-y*>Sa%U1u|v$LD0Ar$>@9^hvRpo}RwV`yUwoqH5DT^j)Hd zBOF}>goL=U&rz@`l$ASmnFuyFH^GqDb$f-xw!hL9wA}6^R{|II?Fd|GbOHoP<@IZ7 z5w|EA8Z|Ywk8-prLv(nrf#;xYt562}tS>*JC+4ZTsn|Agfd& z-$ZLC*ETmBfD5&H%BR-QX?uSDCTi&jk(>QGU?+o1c|}Ei)fh449ZpUg%K7;@n79v1 zC!!#bV3@ZB-nDk%Aw$l4`vc4YTw*inB%6BH%ra_(L>mT}AA@oRr`v`?P*4yhCFOS~ zDex_D`e2s5d6U#Y)b=03{QqF#)0fKRasW}8o0(C&u`#ITD2RG?V4R=aI?vUF_$qo{ z{7GPNQ|1Xaj33RUscN>gzA+2r7x`*@thl|G_6jgP_9YLY8GAZiHX|AnIqk&qdnhdO zYROa``X;rl2ja#ycURLgy|fT#_~|}v1#_v4xP`{(S%yKY95N*Z1$=wk`{-{!a35zR z7(g*7Tve9ljje52X(?kZrLML%Vas9bYz;_g-~vrjRF7$WeZ7{pw&yn2?-Cd8vrx+8 zJ;Tkmo+oFI<~9SOzt*yy_ZBdd4!?^*6JicyR#2Jumlk2_T3S=5yOW`zp`JoUvaZ?a{!=_E=bS@9$6NFkvv91zb||yYKt=7?fg$)w3q89?-Hf1%{OVA3qEx zp80r71RAyZ^Q%ue(Cvfz`l|I6n3baY1W{5;i(u`5j)lb@1Q5(WqYhtBXJ_`v-m5*6 z2m8zmM3m51z~bB6+nk)7g(epcgL)>GgF6oPJayIfWq zgGqhoLSgG8fU>u@ixg}886U54THwQqOaZf@XA&7v667r)@K7y)5H?P(+_!%IY4he- z!`lGx=TUL-F3jL{NKa zK)vSA{`mN~!)#TOH(pQ+4J|F3La=HnE&2C)l4idP_7>Hus;c-QOFTFNK!4z?pzngl zY5eAmq;uR%KYvZjowl4X6y_mRm^kOi7uv&l9J2_9o9FG4wBBDA!LzXztI?gG$j5v0 zo7qe2hc2?R;aV*89>S*G!GN!r|Kk$N2W0T0m##X1DxGI4U%>2RQTQk)?fF}7zg24g z_g|o7nb&GyWSBE~dH04AweJ{I67_Pz;zPpTx)(_uP*(u@Ib4z~s;;M};Lq%lnakeR z+=_I(7rdFBo2!CB>3E_3fA_!3UC;(e<#Sg9Gio zY7%ICUni9(A5@`QEV-(Woapw}-_LKOn^PI8!tY-FP!Ur zI7j*}l69iV0PBils90O};Dr9%_E`S*(R)BNisU}BFf&uPJ2^BMM9WAmAxthUiHeA{ zk1U%)wP2f@vR+$P*Vh`_rbGsnjUZL{_-6W+#wzx8&PRdhQ(L>Xwl+OI4bqT{3$K?G zzp1IJq9QIK0dOV2Z2c20^Cs46$@Zp;^((Ejh$1&$;7Ye718tir)Oh#KhufQvp#^pY*I37w8{OU{>b{o*WHOrYq2aA(toYUDeNA z4TTQ<`jsmdaBXsbOiYo$n5r0bbI^p(sH#Us{XgTN88QAZ@jMpNHN;f*=Tgn6+;~1( zBKvAP=T6!yrvx=cMJcp5!UKT9?kZwHGGw&02lh?_h{{|75D7h7uMH(Sa?Q9B=a58kKk|ts{P1Mu^5pt0SBNio*>xJ3#{xkO z_?UUF%b|bQO7b>Pa!Am2D{|+M{`OP9j8e&XE<^Y9fM!K|MnS%A7h1s<->C|MB6$d9 zarG7;8#d|DG!bvtN4p<>Bc@`e&1o z!!gWRDnY@_s(zFJyu-a?auF1phIe_pl9t!(Gtw6?=U6uw`-*w3Iq%(GQdC|4@S!f2 zPCV8*LF~M;90)x0gL94+m*@I!2V%;Hh7 zxRFHAjmhbIf@9)>W_6D>zU3N|r1;oFXWHREp>&wTRHvc3eo+t zo>cMhl>B{-NaJkq(x&<6X6cRv)k5;pBSirgoQKv3sJ9Nn6GvWSg`S6`omZ#RNAVUx zxCR+vanC4P#zU$MLNT)&h3bhG3N$tB{i#o(*{^k#KEdF8YPMQP63~y3WB-<&D zj!w}qP}u9>PaJh5?Adt?PM5{%c?cieC@3OKdN{TGUvxYm*~9+jYkCpXP?#}JbrIS- z^T4vhG45?u`!K}dl1iMna-*NZ zan?3jP7{KPQ0NsYBHXq-$fI>^%p^3*jPjBPDQve+Jx@oS@!hQ603&duY@Gi-pv1gM zbx}YfOCmHj-RkbS=eRRk6INP zaA-^~M(o7NqWU|%VnKzs4ffQ>2dNe9I+p~suEr! zc0xN$%9z)wbWno!(XimA*KU4Rd0!PmJ)C#e8c7>kOP0QxAYrTdV|(OpyW|65-PM3Q;W0q;pYN1HKVyZ* zL##GqC+Nr81CA7way3ZO7jur>wct{mmfc__)hMWsZZ_41mmgP(dr6Mo)gla|GqL9Z ziJxJ~DQ?24lxNmcp=*%VN`zmdZ^IpDB%S$^@_tUwOCcQYjeNe-EZ-%$6u-O}eE})w zDUF0m{a(cZhKJO7CKnh{4wz-U6fugI~RptH`;cCR` z-sic%hCtd>HZsP7%&9c}N%NzN2{kcXcQWb+~gasDuAFS367@~wpfw$2YUj9oI zNcSjE#JjJM$?6{7q@xGN9yfK}RkpNb!nGhep@O?155(h~5CL+Y{hx=XYACl8}kgsGP9v6_A;D`Udw{So(kvN-q^hLVa3y-O#M zPl4L^XZG}ro6`UpqgO!{CA5bGu!$sE`N5Y>E-Rfr_}-aP-Rnm>Rfbm!E?vy2iWt4a z!|&9radB~tew0k^K1wus#$AB{e7X^c`L|M|}!)s^YYLLw-Kx zSz&c`wIMrWJb;^B;AT=f5(~Gqpdfc~=*ALd*7ki{1ODZuhn4)kD zzF7`sa@(MzqXUKpMDDt}x?NR{RfBHMWY43+!$iemO8>)<)OBQKq#q#&CpghEEB+@c z{{ABQV+qmGf4YK#fEv5n6WSAB4?#rvX${08KraDD1Bg*Rp6ogQXblqj_`?(BQ2992 zt0y*O!7oE5S~7qdU=!9DO;(eL^NyY~%eqej69b}(fkpz!A;AI3`-;jG^3GhM8?xH> znCsC92uQ*BNQho4=H}*HTwFV<$foWR-Rug=%F2?Gnoo&}Adn|2kG}=z0b2czD%xtR zd%=OYL%j)fc4eijv(vah-J{d22tg=$YuJ>hV|o>Tgm*d?=a_r^io(UkMJO3%?uo5b z8-YQkPU+-CE_!#M1m?cRV!IEwpx{+sG(G|X0?7K0A3x^)gH~1+)7k}>k0jc-Sdz&HafEzP^g0Vxcf~m9mzWmanhS5_E@yj-LKZI)Q8)7qc0SB%qoH zGgr@&p#TrXF!&3q(@-D}*L8OtE6*1MVmlFwyA7m_Cp;Je!msaiI-Yzs>-KpK+lJ9o zsX%_&bw4kTov1Xv7H_lTM}X*I9FXgtKFfeuVh9jpv=%@6A3XiP`!2Xx&ne|^MMZ`2 zzpKBo9Ep2~M385ee~geZvP-5L&M+STo2W#L(AIGDrMV_q#DzQyM*c=7hir{Dw*w8( z&7G#L=QTyBkw^=L2Ajbx9I3gp<(%2N5lur_8MP(T5MIhFPHM6uu|kLj-82a2G2)^PG8j~eds@0 zx!n@o-p5^YxXXek99p5!CeMfLH?6zBIrSi{INNkArWwi3MN z%)E7o$#LqzdblX*009Kcj5@vcK& zSb+;z5s*1(R*2gcJIJ+vE1>y!(0_B}kxSUEYp7uCwRRgbkI{>A$0N+B&q46;kx3vEq0jxz5vVrzLwVeB?}FujE9oU>HXa~5pEV=u Tsn+KnANpEWRi;YH^uvDvNxSTk diff --git a/tests/snapshots/v3/test_plugins/test_v3_parameter_edit/param_dialog.png b/tests/snapshots/v3/test_plugins/test_v3_parameter_edit/param_dialog.png index 0aef03c7c8cd2aa61edaf5c1dd0272ad079c7cb3..dea1ea62ed8b1aa99411610dfa1f92dcd70efddf 100644 GIT binary patch literal 6365 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 Tsn+KnANpEWRi;YH^uvDvNxSTk diff --git a/tests/snapshots/v3/test_plugins/test_v3_parameter_edit/param_tweaked.png b/tests/snapshots/v3/test_plugins/test_v3_parameter_edit/param_tweaked.png index b69968d52327b174def7b9ae98ea070c541f9cef..b8913950f463a176e11f9b1051e8828315995282 100644 GIT binary patch literal 6391 zcmai2Wmr_*w;vkm2I-Ja2?3D~DF+1v9cmQ#*6*y?D`K95pAr+$6M#S_PV*>YE9lj?Z z5M7ssilV+x_U;m)3zcUs-htT|#{)WbC06XO7NUpvtiLFyH*dRZW;+>en5*BZ1=)#msr^@vC z{tOva%_0!u_u9*pi|4juzM9t=w|NZOa*^LB!lkE?n`RBskD!@xO_;HhXc5U8Nf>fr z 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 a_b-Es1dLzF45>HBm_h{hfe8qXn}k5 zzt&y%ez+g*`7m>KJ^Qzx-p@&VsilmMON|Qxf$&vTAi5wBiY)Mcij4~VK4^2l0D-8b zRUvZvfzYF6JWtZAJgn1#e5K~PWIMb%d?Q(bR3Z{62nCBKCPXzau~kSaN0x6Sqim=o zFKx+lNTy%t*RtHAlFPg&3A)7%hgb_Y$O z5w*k(tix&T4gRGk4lnX&oSW|ER_`t%uDbY{0XS4aZ^d{?8B;#esD#S|RboKx3=K1t zit87Tpx>t<;o{gE@6z(^n$I zog`?PJ461bCeO`cW1G10yszaW{#-lgc|7ooYj&+Ax()au$BHzqjYrYU&QpC9E^9 z)>2hnUlh&L%F54QnVj746oZ^&sjI6GfB)|6?0g>hV&wyF9J8n>yt;bCzEM$hQSzi+ zuxO9iG9hN7Soy$LB3nZVqE$X+T|e(CvdVh8fYz*MjtzU7u}+vmhQYyRp@^wX=q7X$P`L zepbDz#bl4#ISXuSYpXGBot&Nh<^|PY2WF(+F{l^5v~_SWsWwa>BD<~`vTZP~Mj#Nl zib7I-v;!D)7W(=^9xLtLXO2-!1Ub36eiC{8)@SY{<(CtVLMvLI^YiI*M`o9oH6av9 z{qArFTiZ_~KU*HZ!i>Shah!<=S1nCVI;mh^Wo6|OK@TUVY%wopncs(vW4E1t7yC2a zf7pPQIxw}c@SU){qy&IcHRHUBv*q2|oZ7oCkgd_t(LoU3d-vgb(z(g7Y9=84>z?mz zCo=GbNG@1dSa=eoo&Q3dpWmY{0FVrY7zxUoz)44;&2Pz@@ly1u%kBZKrlAAmtJGC9 z`%6np2XnP}fgk-obxf(1P6C8doIE_Pa=)#6mXww%3N2RXm1kyU5jL-fZ4G`<&*H=2 z(tr$uh%$TEJtgvRa~kUo#FSvT3RU@>@H4D z;^DsoZES4D37NZzwB6x%3r#NGtx%7^dtZNl|A2sy+k~C@+NnL{;u_({v@{YVOC`HFOkpq3|z?T{qp&XpBYdx{+MzJDQ4_<_8Ga&!YMlffqX?{))^-n9- zE@beF{II*rxNLKDsy;SJNfQKzq-1ViWz~r+Osky66}9tp9V$T~)Nyffu}+Bz7LXM( z+cmBh;oumkrOO=N4(^Z!gR7gGgrWHH8yg#Li_LB;?TFkJpPf-feX2vWn1oLn?438b z!6}eF$?h#dqF}Kev+d*KV;WKSt*xz+vNGU2SC^OP9P#H;W1{X$YlIf@F*1bEO|jw$ zDyQJYguG$Q_l_T>Z=NXYhnab|zF=Wt5f;vnDPG+6eqBBLb(9;g@}GbHfx$i|5YS1G zJ%sZE9^ijH2}GlPZ&RCG=6?SCdEN`K2-y0ao*YTvf^GE}%8q=kQN1-_;44{x_G^)G zILP;$nlQAR@?|Z%i)L#iCnv`fGW-z^Z)S~Q)k)hy&7%7ku#Aiapk_kUS;I3kGk$=w zcy!%gPFLuG!QgtM8d%?{^_#E9wOCOr;dgHO>Zo(&pHDE`(r^Td@Q6Mo81)$qg0en- zB>FJnh)h|pg@IJ;zvU*biKS>m+}x^P3T6%b`?)kMHcvc~EaTSpD?Es1k3y`jxVEm& zbD~HQ@F~CTM)*6BY4EE4D; zWrhAm(qa2XKm%@;T7AUD#WgiGd--wSm1N%_C$Cfx0g`=g7Lyhaa&wZLg30XmjTB9} z%bQ%hwGY|%vL!F*QyG&zkti$8Zhy=uVHeQ)-&8_fo!mbsi<69E{HyZ_pf)uBhL@!j zXIxD{RX^4g*3e7LsxbV{qs9^!UC%xle;aq-%O~2jxO=U5YXderS{x6niRM1BLX!!P z?{qpYaGeqq3gTVlet0-=UCS$_i%H^AAdlBtuWhO@2|n)W(~mUvn|?mWcfS2N|9ADRWD z-@EBGw~Fi^cf1wrmWW0z$}Qa4GtwSv`Hzwu>e$-)FB0Nd2|P9E$+I}01kVW=|Q&g^%7cy|~^)g_|ggDFV#jVl`< z7Gut4rZ6ZFE-5%TT(c~q z72ZX4H-=eY6~Ld@0`b9j4eXb{UDZZ(cXf@0KknU_DB?S`#&|6+oqb~iKZ|o_e(@0Qf_yHX@5@hBOe$-H!;0t2PJV>mss^2o(x226_x6jp|MG)1 zhz;5ng!ivx3_Au{q$2Z4;l^D(rq4Tj!e^zYW$dRq9}tEsn%ZESqdNJ~X1eRJ&4f%m zuUHDBKzBm7Tj+)HknLfe+BlB+qH34%*Jkd52v6BZ!=r4*DN&)uj)D58pDnJYC^5}y zn&O?c8XmEKpY@ODX;@ekKCXR-7=|AMy-#7If3WPycqNb>D_)@%JFydo59 zQG@v5BY&J2d8Ah)xw++h+1+9buF4TXx{ciK`Azam+xpZ=4$i7uJ5TyqPE_1%E0hRq>jFy)3K#RHwV{8Ce_Oi3)M_=Y;W&EmSp z@AtxowGXXbXta>Q5RvUu2euziXRtk&41RPpMTFF6gu{rj%+i^==drXnrL-i%;>=g$ zknDKqVsfFkK?**7b3Q-tCqmlB(7(lC()m?`0y^7d+v(W@9 znhF)_llSN-`BEYN@6=I2&*rg|d{IgkP+2-aX|7TCMZ>G8)F4(O%T?s9V!%?1S9W&x zYUnRbbMt(|D!(tw)z#JY{2a1H*+Nc}J#lz~&!5*=beZev*)%S<8&K;Q8qP*z;GLhJ zli@15xVV^^`E;3+A}=-LF#Jh7s5f5 zA&L}+K_J-iJBSs?sO}ozqK6z-DBYT&!3eiEi$G*-Bg8ZUYC0o&F@sR0bLPUPbRP>lRQXdJj$( zrK|j3;WAnQL}Qt{LF>jHZ7~o`Kp~7A!+wMby*D7 z-p$S)a&Jw~eN`(X{xmY>*a8?#<4&m5!{S||>r`iAP|rT8rBT&SuvGfI*u<*n}(`P#R$x4I6 zD~8AU$A+4eOg=j_m$bE$7ULZ7k>wU@3FXFmVf=0nhD1p7W9f|A-6aM>i=bqpPILSI z4l$74=e!4pDY(kBbfgKoPzVb>q0+M$^S2PrVUlhM6D$?T z=znghp^UZIHA3tB%X5Z%|F}%%K9OW>e+#?X5+!`VuyN?J)iW*%8{M3bdK9B1SSoBs z66VL_=f|evR;$$s(81$1aC7_k;hCj|5~dfeOT0oLQb(8D!_PuhKP`Ti5|!7WTzd-U zg!YY$Lf3``aa1UMalPq#^ZejAjW$+<6Wyq?veNN8SYvMfqx(t;0cHfbdBG)aQe;X5}s=L9fr|n+TeNrVw~UxzIp;vjk@r z&u4m9E4KNkIzqH7or1Bs_ z3gT-__Tl^}(P?V&ubHu0vV4XTbnUo0S@dkV*(B$($lDe(NIU(_ZkD`${>qga!*~m|4+wdegjE!|Vlz}QsFUe^XMOQb<8=X?2dkD2qa|=ZI`?fJK3q3Y|oc+a(&)5YaQ*R8@={=fAt)#*9I+H{ za8T%-u))~aDD*hk;67|rS{`ihI}o~&3h*a@9@s);oWO!EMvVmSapHP$>nN(S|{tU@a5(voS zscHoSeJHFHz%*Iw|N9m4_JH(67sP62zR^Ya1f=sPaPhuDnLW5*2tAcEG0B~AuCA%c z7j`k6CRG;ViInwj4c(h8J?XeIcW~es@B%InWNG?_twtC|rMgFmMu+|B3gE()C*+id za226W-W*6xwcbdu#~_;iee-Ls+5{f)_;7JBH}x{jJp*rvD`F#&Lo6ltnGNQnZqU}=6fRy~S65fq;?e&aHZ?F1w);-DnsVLH&;a-oPWBW>Lr`y)ZcPM}q!GVB*>|17T~qhDBRTWe6Y&F(_E-OJ6}1Q32hB(2!41@Mc?) z8n-hMj~Q0M^=UbZbWw~g&(4R306~g+tSn7WPcJTp06=nba+Ddu^h+9g)U@x!w3CAUvlb)iYVtW!M4obN$?yK~B8S|@^ z5TI}oelhdvz6>f85&rr$Vi49XhliP%PB}rY(tzsI0Lc9E@=~W*3ICF~3&d~MhU|_) zTV7tKNCNT}XFwP$aCVJPrxVHy!lI%9etuy$+gUt@pHDl5LoN>imciig#iL7wcml9_ zd*EQS+_Wd3F9{b9kEG|CthTnc7%4y!*4B2rJ5ij@q0Pt54U}%M2Yz=#ri7} ztU4wpUw~o?5k}0qEFRRfXG!X*u=6yKh=taA3FnRgxOlt3DfV9n$NEp_wYP;GQ*5BXH zBvIckAtCXCUK^-0ov3t}dx!u8Zf|d~7(zXP+==kTsVtDE4KPHQ>gZV28!fqC4fA*L z(x~taFnueDq7a*n|6m?|W7oyCGm=XgNL5i&b39*fv*HBU%4fp^6ORt^7RFZ7m8q#- zhP(xUtw3>-99I#75z{x6w2RC7TF&RZvEcs4k$>0OH=3z(?N?PZr0g0-aQD1rcZ<%@ zR*T5t;bAkrxi|PU-vE0FI^Wvg-v`u3HJzP!qA!uOsgJIF>K)${Ef=z0E)ZrWnLsT}{o| z#U);k`gFMNU&fATPA)DS>VJ3Bc#|aBI){JJXM8KPEKC6Rs?@&x-9y4`D32L9_(&RB z57dJuu+g5Bm6Y^33SqkKzd?}2>moRiLMy}Lznh6bk*{=hHSClXn(BUt$>5~`IhQ~osA7kKcO>7*pes=*S2t&PG>KEsCMaW zMBq=~dwE=2h0H}bvi>;cf+wK;`8xm=6>A#mYq9N1p0IbftI?SuTY`UkOVUwaf7-qr zWmdZPSm({LCKQgO7Es~FfTPlG^vd-L{>EdE4qsPEVqyd!bu%`RJ)v6@uwhYo%w=Rt zr2e~`F|O^|$PY`U&KLipOh?K^b7A|5ThS8se!If1qXcG*a~_keb&i8bD7d>7E))B; zXep2I{%n&Vi4pB*jiXYOXN2>T1X${P5NYcA7zLTUyp_lQ2lI)wrd%I~_e)omT}Vow z2~6c}6t%#U9Y~4*k5}DOMTb~QN`k+r^2lOCo+*$u5^$FZQsVvvrGnej1{Fx@^M4Yy zRfzc#Et%L%i!)!?h?NpKK>P<3RX@hPmqntYH#-H;l- diff --git a/tests/snapshots/v3/test_plugins/test_v3_parameter_midi_change/0.png b/tests/snapshots/v3/test_plugins/test_v3_parameter_midi_change/0.png index 7bc2de9bcc4f03a52969582ac99824475f6912e6..a11af361cc5b3ea753aab2d2a9aa5a5952a45060 100644 GIT binary patch literal 6299 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 literal 6604 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 Q`1eD#C)%)bC96081BGOevj6}9 diff --git a/tests/snapshots/v3/test_plugins/test_v3_preset_change_plugin_update/0.png b/tests/snapshots/v3/test_plugins/test_v3_preset_change_plugin_update/0.png index f117f176c900a8b9f9f0aff6b112f2e3fcab4935..7f848722bac506768dd04a55f6c82cf0747cf8b1 100644 GIT binary patch literal 6565 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 diff --git a/tests/snapshots/v3/test_plugins/test_v3_toggle_plugin_bypass_direct/0.png b/tests/snapshots/v3/test_plugins/test_v3_toggle_plugin_bypass_direct/0.png index 07c0b44d206d22043b3ae68f15dad3152ef9bc8a..a775ba5f90945c694ba7e8f1e379ddfca3bf853d 100644 GIT binary patch literal 6467 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 KsFXdjc=%B%;V-`$EK>pI!1g|3yJ@)ojx1 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 Xg&kiji{nzR|NHWVx_qgu>HGfy>w{yY diff --git a/tests/snapshots/v3/test_presets/test_v3_preset_change_via_lcd/nav_A.png b/tests/snapshots/v3/test_presets/test_v3_preset_change_via_lcd/nav_A.png index d46b06a3954cca8da8926aa02ae86377acb68dff..200297525f8478abf4720af572ddbd41b662a9d7 100644 GIT binary patch literal 6063 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 KsFXdjc=%B%;V-`$EK>pI!1g|3yJ@)ojx1 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 Xg&kiji{nzR|NHWVx_qgu>HGfy>w{yY diff --git a/tests/snapshots/v3/test_presets/test_v3_preset_change_via_lcd/nav_B.png b/tests/snapshots/v3/test_presets/test_v3_preset_change_via_lcd/nav_B.png index ea423c5ba546e8befba171f134ce9efe03a2a84f..40db093a8ab409f5adec5949dda0824b511a04ae 100644 GIT binary patch literal 8749 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 diff --git a/tests/snapshots/v3/test_presets/test_v3_preset_change_via_lcd/nav_C.png b/tests/snapshots/v3/test_presets/test_v3_preset_change_via_lcd/nav_C.png index 636204f5974dd676edd3801ea1ff1e6e2726b315..9a8cf268cad36535de0f960d5c8d0588ec33338c 100644 GIT binary patch literal 8772 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 literal 9094 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 VLnEZO@ZbMiAiImQ40 diff --git a/tests/snapshots/v3/test_presets/test_v3_preset_change_via_lcd/nav_D.png b/tests/snapshots/v3/test_presets/test_v3_preset_change_via_lcd/nav_D.png index d67bb934eb3a787f75a732e8309ae32482ee7b4b..fd52b902d9c77413cb465202c1c5661d93a11e12 100644 GIT binary patch literal 5893 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 BVbA~o literal 6255 zcmdUTX*iT`_%zl%=tcWh_aulYI+G2%)j0v82dOXfS5% zyFvDKytm)`9>@Fn|MCBPm}BNX?&q27x}Nhquk*U2?i=dR(Qwg_kdV;n-qkWDAt6-* z-#4kqz$ej2RGEZ?LsnNy-PA9efJ2&^ES^$sW~ni^Y>F|Gg$X`pG7ncAfAkW;SYAf( zaglJ%Q5{#5KylXgW`$% zmUSIJ-e^YdEDZ|jr~2WgCnB9FrquWue}b!{qvPk#H^1x??`ko=8gU`4uFCAlaK#!H z$D8!k2?`1Z`h9iE^@j}>+#y#FJX$W!3*3rYj7@A|lp+gNlT3@}x-BX#om3?%E-nss z%gUzmQ`L+G9`Cu9o2`1t%je!GP(AA<3)|n?-tJrzqO$LZ;|X_*Cx6|NpjV`zpfDVe zHnhC9vLc<;YgV?~=)=j&%gQR0qDMiduBD{~gTeIl^n!wde0}ANL=7abu+UJ4No5$^yLZpk)m1htc1*FY z?egWzLx28&AO){p_4M?-%@u1_M(3B)Ilr~Gww9X8hS*~!e^O1W>*h+^6~!lR~q?k(*w@8?1FYv%*wobZNvCq$Yz<9p*^O5)J+D1 zq+e+~fy3b~V*282PEVgMdnuwU3E#{>J-ohs{w!W)(K9`@-XtvksCurXI2Udc=lhr{ zWPE%)CMITKVWFZz60WPE5oRD99UEJuSQVq~5TIH-G&Vf!c#F%#*tqF*4;x~hu944A zrBOIok5wxi{OwphH#c`h&do1i^Eswsettd?nJ51;tZ8NDS9AsTYN!CoXR}q*bIk8% z2YdVWIG!u4tn=ehDevA5W3gpsWwF{0=Bg^gX5e29iwlvCpm00BhFQIT@pxW7z71Eh z{`8v;Ge4u&|E^CqPkIY5bCBr@C&%)s+VUS%AV*;}oU|8{JGB_K9335BybvEtDKZtU zv_+Rp1Fp+m9a?ts8we@Scl( z4U#%!n*83rzFEDnDvQ9`_Sl65*wHb^VXPb!inFiUEZ!b7qPcWQUthmu4TUA#zI}Ua zY)m8nOH)(u8S&JqKbOZt=b99G(l7gxiVFHmmt?YfV;<5+&h8Pg2sGZUPDU}{Lcj*b zQ9736=8tVzWvqLOQ^f#Y0Y zK-=aeBrx)>@AX2Im92%7t4@0CEG+6_y>u?YxJ>eke~#=MpG z0eR5I7sm@-+1=U4x0q-{GYq1c}pxKBLnM_&BIGNt3t5m!_?y6lzu?%e@2w7aWosW@;dl=9@I9u-^6p4!c< zUI_^a@M3XapAF%BC!yI-)v{w7K!&~fIlyueI@sj!LWzevL@FC~00^V$J^ZLB8hv6Sz+H9YrK)MXLG?tsDp z12f0>Aq>Xc#s=*?C>Z@KY?Q);tkEZ%I47cdxN3J+I^rV17Hw9BYet@Z&`n-yT*KD& zFMARH#UnpJUN}3ykMo@GVm&HdT3SjGGv`%+&;2d8LZi`8D3p$lPRVy2sBmUv7W19rq6>0x(Ti3W8(H@HUyLU$EY>2%pgMc5-C;P~WlyRe`@*f1NEPt)$ULpyDy zTiNenuQgceqvB zQS#hz-m8COxo+!;ru5}P1Av6h!K`Xu+<-vxRFO@_B?fwW%u!m@)YKqbyTE@Gs7joh zk-q-+3IclVi$?y^%1VLVFp%vc<7a_^CtWFG zPH3~NvPo}pAM7sPK>2UOd>7}fmAHd{t7FE-6x{L3#A};k+2hQ0-}X)f4mYRUc>mJ# zaC*j}2Xb<9j`s+Kw$km4G11Z6E6yP2;YkFVIMo`ygVKrP&L{H9xlMrP^1FF^dwV(S zblC`5&;O|p5a;+|okty*0MDqzZ)~jdx@e&{_1jyji4ei`eFzHS}A>_#n(p}IqIdr2^962_qNIR_n~D`Sbd9pIk+FPiU_cuLdbT1H7j+NE;`lDxL}#){ zNi!CUEix`?LEAL?Bw9%eTU%EdHeP) zuz1NyNqEGn1SU_>FIpvPn*n*Cxm95Rhi?H=LA?-F4YmwEYomihLz-yo=HSzUJJH%P z98B!&=6~WX0f!~D8G1dWxneiIZ_~G`D*Xo~G!VBV^1DDfM64d$+t0WokFoyS3ruY> zr>@u9-5HXSlb4k$9@V^VlD%;wD!4JmZKU+!oNP3k1lP_&aL0f4&O*4b;5`n5YikfF7*T)78J_4inA-fF~)bsnyFH z{~m*tj(9#_8@Ds4ww08?blKK>2o&lkR}>Y^7ptB=YssTrSzgZHhyClY-M}(0 zezR@#0g@bGleWLR>yN+rTd~U4Z<-=S&wG7BA-r`;GL4>FJ|Qu&%Kq2ewnzp!S=qh4 zJJ&vtcn(Or@4$x%xCmrUJ=BSzbu%na)AL0`^jIXOAm+2v^$9xfHe2XBV+ z4K!bB@ad_3g0kd8EafleA&EeeLGy&w93Jhi0z;cDVgysJXdxh=2WvI`?J=C&pe27R zD9|Vy+1uUC=w0~u@#9sUxKE~~pFe*Nae_Pp`R*{}oxE)6uKn3i;VO#-JjnB#i83iR z1a1{^>EvX)KXTqub2wGPYKiZ0-~m5<{nn(8Gu3>$7|YwrrX!c$%-dk|J$?PlQCdI> zOg23qt}3(!z2pGYYQs139!Nga?hkx@9fBc zj!LWFl-Q2sCVex$^eo7B9LH!cK;-eWRTZ48w`FO#b`7#e{~a%yHc0NoSIf zPCTy=nQMYNK?CK}xoZENB4P#k(06LrY}e_=tVCTYACu*ejh1+;bxRqhg7vSfkmddfl_l$%)af{v?&9z7Z=`za<>OP^3u_EK+yaoN%>GmU^{W>cYx`A>#Zhyh zORTQ13sb84uQx2NH=hybyVK4cVY2W&muJuXL0c#*D=Rk4v9z|%&djv5vN~?R;=bgi z=(69_)AO`D^|n<{qndk3^HU=T^%&hy3lJ5AKT3>T3))gR0czOa5Z@va;0+XxDpMT#EW8+&jwh!8{Y=!~5q&0ts(WlBv%?xuXT0Nzh<(txsO_^E{0Eo_Av3P#G9!;A7z~S7|925ID&^fN3!A1U%!A(V%mV9|4}0QEl{$&ZQ1bp zm(BZcjg17K0Dpgl?uNm@L#gn#X)y8JH8lK~`bJAI!=N1&VpOd!BP8^c1NKf}dkA-C zz2=@ijW~SNOmTX+ydKG25oPn>0bq&(0Pk3hQ=Uo?s8}+e5HO-k+YIeLe;TAqJ!!#D z0XGw&p+4{7;vyP^m#MT6Pt{M8yq6^#JFmQ^63lfD8=xwBMaF`OT6gZ?0yfYw>UGe1 z`21T_(cbQE;DW#bK(byDNb|C=0sl!xn-{m6@9ck(OfE|0G{z4B*qt1$Rz^ohv(iwE zof(WbcsgloYwPMp83%YKRVw#ze@yOb`M_Ty8(PkTi zPAu0$OUumMTrf3j$Mf2ln$EeIIq`{nF)TjDG!t3b+2sJtGGv?-x#J*B2L*L?X}wJs z!$V`X;*lq_lzf36UGHurCMIf9zjCT*=$h^jt+&Phbr03AKpaS0KYDZ{t=n4>_bZyc zBx12Y4|zDB<_U)b@iR9wgVl_Iqk*L$Kb9QBIzZ?fCLg(#{XBr903z_%V0ncVWqA*8 z9DH`Ve@5JIuC!~ml}y{1Y|h&zB|YyS|GTes3o<*NyG6!y-+F6Zv2O+rbAy$KP$TcbA8-$6+?@TguL?0A>}YxP)QRrTaxQX@B2&!lL}dl1Y!G4=O=SvjcY~-sL-^uekSs^w26J?smjTdqj8A-L&e$|LGeu4ax zn)tD2=k=QG{BeQ3Vd~7IyB0(u6XzuSzkg8fBZH`D$QWuu$m@KOM8^_yaPQ+Q?$s>> zr7y-M*Ur*af)ulc4(8NFxA+0J1nm9}4>N{_gN*g?AY;!4wCE}0%`To%Zfy|6Qz^&L z#{=*o{f!NxoOZ*7l(zFq&?bRUZpanx1g{{ke3@v=`@gHXU{zesn@V-Jxk};oH1fZ# zrQ!!?(n5?T3P-%?3tRf|3=aIdlIs%X<6liGZLA!ROhJBCfgr4-h{xftIj><)bgdA zfu$RDToeqUx*jfaX;h`BWqRPk)@o}I#d%QbNfe)XMQHh(aGHFJSJAtIQT{_o!B5Ytn68tO~E zw*8zc_5UsKI+AvfF9Zs;W>w{$r?M5-|DQekpU~?^8j;~aXAL`Qa*gHuKHWQpS``|P G!~PE@O(>%P diff --git a/tests/snapshots/v3/test_startup/test_v3_footswitch_press/0.png b/tests/snapshots/v3/test_startup/test_v3_footswitch_press/0.png index 1ed048ddf50c9efe08eceff42681b83a42362d2f..3dd7abc49571e489072ea23ac1eddfd026c3601a 100644 GIT binary patch literal 6247 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 literal 6419 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 diff --git a/tests/snapshots/v3/test_startup/test_v3_startup_snapshot/0.png b/tests/snapshots/v3/test_startup/test_v3_startup_snapshot/0.png index d46b06a3954cca8da8926aa02ae86377acb68dff..200297525f8478abf4720af572ddbd41b662a9d7 100644 GIT binary patch literal 6063 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 KsFXdjc=%B%;V-`$EK>pI!1g|3yJ@)ojx1 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 Xg&kiji{nzR|NHWVx_qgu>HGfy>w{yY diff --git a/tests/snapshots/v3/test_wifi_paint/test_v3_wifi_ssid_entry/main.png b/tests/snapshots/v3/test_wifi_paint/test_v3_wifi_ssid_entry/main.png index d46b06a3954cca8da8926aa02ae86377acb68dff..200297525f8478abf4720af572ddbd41b662a9d7 100644 GIT binary patch literal 6063 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 KsFXdjc=%B%;V-`$EK>pI!1g|3yJ@)ojx1 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 Xg&kiji{nzR|NHWVx_qgu>HGfy>w{yY diff --git a/tests/snapshots/v3/test_wifi_paint/test_v3_wifi_ssid_entry/ssid_editor.png b/tests/snapshots/v3/test_wifi_paint/test_v3_wifi_ssid_entry/ssid_editor.png index 70874cf4574656eaa7faf834257855803ae97bf8..e7db2f4c76575e6cfdabd33dbba72c911d4ff978 100644 GIT binary patch literal 12495 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 ZkB~hF!WN!@DTRNR%fD8Uu7H{Z{vS}98S(%C literal 12838 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%0D9QHvzPuY`o3 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 diff --git a/tests/snapshots/v3/test_wifi_paint/test_v3_wifi_ssid_entry/wifi_dialog.png b/tests/snapshots/v3/test_wifi_paint/test_v3_wifi_ssid_entry/wifi_dialog.png index 9e5a15e0efb47fbc227db4690f07285e44bba940..2ba9999c417a3fb7f61410ca03c548d7f699c9b1 100644 GIT binary patch literal 9689 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 literal 9984 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 From 547fe9bb7c25e868ceb39d352c8650929e259a00 Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Wed, 20 May 2026 18:04:21 -0400 Subject: [PATCH 30/46] Override pygame colours with Pillow ones --- uilib/_pygame_init.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/uilib/_pygame_init.py b/uilib/_pygame_init.py index fe3f6bfc..b634b3b8 100644 --- a/uilib/_pygame_init.py +++ b/uilib/_pygame_init.py @@ -28,11 +28,29 @@ def init(headless: bool = True): pygame.init() _freetype.init() + _apply_css_color_overrides(pygame) _initialized = True +# Pillow colours +_CSS_OVERRIDES = { + "gray": (128, 128, 128, 255), + "grey": (128, 128, 128, 255), + "green": (0, 128, 0, 255), + "purple": (128, 0, 128, 255), + "maroon": (128, 0, 0, 255), +} + + +def _apply_css_color_overrides(pygame): + table = pygame.color.THECOLORS + for name, rgba in _CSS_OVERRIDES.items(): + table[name] = rgba + + def freetype(): """Return the pygame._freetype module, initializing if needed.""" init() import pygame._freetype as _freetype + return _freetype From 639ffa1e771955253efa63094bb2137c13f897c6 Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Wed, 20 May 2026 18:32:02 -0400 Subject: [PATCH 31/46] Better parity --- uilib/footswitch.py | 5 ++++- uilib/paint.py | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/uilib/footswitch.py b/uilib/footswitch.py index ce6e40c5..dee5d11a 100644 --- a/uilib/footswitch.py +++ b/uilib/footswitch.py @@ -61,7 +61,10 @@ def _draw(self, ctx): ctx.draw_text((0, h), self.label, self.foreground, self.font) def _draw_halo(self, ctx): - color = self.color_plugin_bypassed if self.is_bypassed else self.color + # When an unbound footswitch toggles active, self.color is None. PIL's + # ImageDraw silently fell back to its default ink (white); pygame skips + # the draw entirely. Fall back to foreground to preserve the look. + color = self.color_plugin_bypassed if self.is_bypassed else (self.color or self.foreground) ctx.draw_ellipse( Box(self.HALO_INSET, self.HALO_TOP, ctx.width - self.HALO_INSET, ctx.height - self.HALO_INSET), diff --git a/uilib/paint.py b/uilib/paint.py index e27777fc..576deb0c 100644 --- a/uilib/paint.py +++ b/uilib/paint.py @@ -144,6 +144,9 @@ def draw_ellipse( stroke; handles thick widths natively). AA versions blend edges to semi-transparent gray which clashes with the design language.""" rect = _pg_rect(self._abs_box(box)) + # XXX: adding 1 to width/height gave us parity with Pillow... + rect.width += 1 + rect.height += 1 if rect.width <= 0 or rect.height <= 0: return if fill is not None: From d64640f7c0f573ac0742fb8798e5e9f469881616 Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Wed, 20 May 2026 18:43:32 -0400 Subject: [PATCH 32/46] Add new tests --- tests/test_cache_valid.py | 105 +++++-------- tests/test_paint_context.py | 254 ++++++++---------------------- tests/test_virtual_container.py | 266 ++++++++++---------------------- 3 files changed, 187 insertions(+), 438 deletions(-) diff --git a/tests/test_cache_valid.py b/tests/test_cache_valid.py index f592719e..5b5f4206 100644 --- a/tests/test_cache_valid.py +++ b/tests/test_cache_valid.py @@ -7,25 +7,20 @@ 3. Push-up pixel parity — cached blit produces identical pixels to a full rebuild """ -import pytest -from PIL import Image, ImageDraw +import pygame from uilib.box import Box -from uilib.paint import PaintContext, BufferPool +from uilib.paint import PaintContext from uilib.container import ContainerWidget from uilib.widget import Widget -# --------------------------------------------------------------------------- -# Helpers -# --------------------------------------------------------------------------- - W, H = 100, 60 class _ColorWidget(Widget): def __init__(self, color, **kwargs): - self.color = color + self.color: tuple[int, int, int] = color super().__init__(**kwargs) def _draw(self, ctx): @@ -37,12 +32,16 @@ def _container(w=W, h=H): def _render(container, w=W, h=H): - """Blit container into a fresh image and return it.""" - img = Image.new("RGB", (w, h), (128, 128, 128)) - pool = BufferPool((w, h)) - ctx = PaintContext(img, ImageDraw.Draw(img), Box.xywh(0, 0, w, h), pool) + """Blit container into a fresh surface and return it.""" + surf = pygame.Surface((w, h)) + surf.fill((128, 128, 128)) + ctx = PaintContext(surf, Box.xywh(0, 0, w, h)) container.do_draw(ctx, Box.xywh(0, 0, w, h)) - return img + return surf + + +def _bytes(surf): + return pygame.image.tobytes(surf, "RGB") # --------------------------------------------------------------------------- @@ -81,17 +80,15 @@ def test_false_after_child_detach(self): assert c._cache_valid is False def test_false_after_setup_realloc(self): - """_setup() resets the flag when a new image is allocated.""" + """_setup() resets the flag when a new surface is allocated.""" c = _container(W, H) c.refresh() assert c._cache_valid is True - # Trigger reallocation by changing the box size c.set_box(Box.xywh(0, 0, W + 10, H + 10), refresh=False) c._setup() assert c._cache_valid is False def test_invalidation_bubbles_to_ancestor(self): - """attach() on an inner container should bubble up to outer.""" outer = _container() inner = ContainerWidget(box=Box.xywh(0, 0, W, H), parent=outer) outer.refresh() @@ -104,8 +101,6 @@ def test_invalidation_bubbles_to_ancestor(self): assert outer._cache_valid is False def test_invalidation_stops_at_panelstack(self): - """PanelStack._skip_cache_push=True; its own _cache_valid follows the normal - bubble but PanelStack has no parent so the chain terminates there.""" from uilib.panel import PanelStack from tests.conftest import FakeLcd @@ -113,15 +108,12 @@ def test_invalidation_stops_at_panelstack(self): stack = PanelStack(lcd) assert stack._skip_cache_push is True - # Attach a child container; invalidation must reach stack but no further - # (stack has no parent, so there is nothing above it to corrupt). child = ContainerWidget(box=Box.xywh(0, 0, 50, 50), parent=stack) child.refresh() assert child._cache_valid is True _ColorWidget(color=(0, 0, 255), box=Box.xywh(0, 0, 10, 10), parent=child) assert child._cache_valid is False - # stack itself gets invalidated too (it's a ContainerWidget) assert stack._cache_valid is False @@ -132,7 +124,6 @@ def test_invalidation_stops_at_panelstack(self): class TestCacheHitSkipsRebuild: def _spy_container(self): - """Return (container, [leaf_widgets], draw_counts_dict).""" c = _container() COLORS = [(255, 0, 0), (0, 255, 0), (0, 0, 255)] leaves = [] @@ -145,41 +136,41 @@ def _spy_container(self): counts = {i: 0 for i in range(len(leaves))} for i, w in enumerate(leaves): orig = w._draw + def make_spy(orig, idx): def _spy(ctx): counts[idx] += 1 orig(ctx) + return _spy + w._draw = make_spy(orig, i) return c, leaves, counts def test_full_clip_no_child_draw(self): c, _, counts = self._spy_container() - _render(c) # full clip + _render(c) assert all(v == 0 for v in counts.values()), ( f"Expected no child _draw calls on cache hit (full clip), got {counts}" ) def test_partial_clip_no_child_draw(self): c, _, counts = self._spy_container() - img = Image.new("RGB", (W, H), (128, 128, 128)) - pool = BufferPool((W, H)) + surf = pygame.Surface((W, H)) + surf.fill((128, 128, 128)) partial_clip = Box.xywh(0, 0, W // 2, H) - ctx = PaintContext(img, ImageDraw.Draw(img), partial_clip, pool) + ctx = PaintContext(surface=surf, clip=partial_clip) c.do_draw(ctx, Box.xywh(0, 0, W, H)) assert all(v == 0 for v in counts.values()), ( f"Expected no child _draw calls on cache hit (partial clip), got {counts}" ) def test_cache_miss_does_invoke_child_draw(self): - """Sanity check: if cache is invalid, children must be redrawn.""" c, _, counts = self._spy_container() - c._cache_valid = False # force miss + c._cache_valid = False _render(c) - assert all(v == 1 for v in counts.values()), ( - f"Expected one _draw per child on cache miss, got {counts}" - ) + assert all(v == 1 for v in counts.values()), f"Expected one _draw per child on cache miss, got {counts}" # --------------------------------------------------------------------------- @@ -188,28 +179,19 @@ def test_cache_miss_does_invoke_child_draw(self): class TestPushUpPixelParity: - """The pixels produced by a cache-blit must match those from a full rebuild, - both after initial render and after a leaf update pushed up via propagate_dirty.""" - def test_initial_render_blit_equals_rebuild(self): - """After refresh(), a cache-blit and a forced rebuild must be identical.""" c = _container() _ColorWidget(color=(200, 100, 50), box=Box.xywh(0, 0, 50, 30), parent=c) _ColorWidget(color=(50, 150, 200), box=Box.xywh(50, 30, 50, 30), parent=c) c.refresh() - cached = _render(c) # cache hit → pure blit + cached = _render(c) c._cache_valid = False - rebuilt = _render(c) # cache miss → full rebuild + rebuilt = _render(c) - assert cached.tobytes() == rebuilt.tobytes(), ( - "Cache blit diverged from rebuild on initial render" - ) + assert _bytes(cached) == _bytes(rebuilt), "Cache blit diverged from rebuild on initial render" def test_leaf_color_change_push_up_parity(self): - """After a leaf widget changes color and calls refresh(), the push-up - should update the parent cache so a blit produces the same result as - a full rebuild.""" outer = _container() inner = ContainerWidget(box=Box.xywh(0, 0, W, H), parent=outer) leaf = _ColorWidget(color=(255, 0, 0), box=Box.xywh(10, 10, 40, 20), parent=inner) @@ -217,36 +199,27 @@ def test_leaf_color_change_push_up_parity(self): outer.refresh() assert outer._cache_valid is True - # Change leaf and trigger push-up leaf.color = (0, 0, 255) leaf.refresh() - # Optimized path: outer._cache_valid is still True; do_draw blits outer.image assert outer._cache_valid is True, ( - "Push-up must not invalidate the outer cache; it updates outer.image in place" + "Push-up must not invalidate the outer cache; it updates outer.surface in place" ) optimized = _render(outer) - # Baseline path: force rebuild of everything outer._cache_valid = False inner._cache_valid = False rebuilt = _render(outer) - assert optimized.tobytes() == rebuilt.tobytes(), ( - "Push-up result diverged from full rebuild after leaf color change" - ) + assert _bytes(optimized) == _bytes(rebuilt), "Push-up result diverged from full rebuild after leaf color change" def test_leaf_hide_push_up_parity(self): - """Hiding a leaf triggers parent.refresh() which re-renders the container. - The resulting outer cache should match a forced rebuild.""" outer = _container() inner = ContainerWidget(box=Box.xywh(0, 0, W, H), parent=outer) leaf = _ColorWidget(color=(0, 200, 0), box=Box.xywh(5, 5, 30, 20), parent=inner) _ColorWidget(color=(200, 0, 0), box=Box.xywh(40, 5, 30, 20), parent=inner) outer.refresh() - - # hide() calls parent.refresh() → inner.refresh() → propagate_dirty into outer leaf.hide() optimized = _render(outer) @@ -255,13 +228,9 @@ def test_leaf_hide_push_up_parity(self): inner._cache_valid = False rebuilt = _render(outer) - assert optimized.tobytes() == rebuilt.tobytes(), ( - "Push-up result diverged from full rebuild after leaf hide" - ) + assert _bytes(optimized) == _bytes(rebuilt), "Push-up result diverged from full rebuild after leaf hide" def test_partial_scroll_push_up_parity(self): - """A virtual child's scroll() pushes up into the outer cache. - The blitted result must match a forced rebuild.""" outer = _container() virtual = ContainerWidget( box=Box.xywh(0, 0, W, H), @@ -270,15 +239,21 @@ def test_partial_scroll_push_up_parity(self): parent=outer, ) ITEM_H = H // 3 - COLORS = [(255, 0, 0), (0, 255, 0), (0, 0, 255), - (255, 255, 0), (0, 255, 255), (255, 0, 255), - (128, 128, 0), (0, 128, 128), (128, 0, 128)] + COLORS = [ + (255, 0, 0), + (0, 255, 0), + (0, 0, 255), + (255, 255, 0), + (0, 255, 255), + (255, 0, 255), + (128, 128, 0), + (0, 128, 128), + (128, 0, 128), + ] for i, color in enumerate(COLORS): _ColorWidget(color=color, box=Box.xywh(0, i * ITEM_H, W, ITEM_H), parent=virtual) outer.refresh() - - # Scroll virtual child; scroll() calls propagate_dirty → push-up into outer virtual.scroll((0, H)) optimized = _render(outer) @@ -286,6 +261,6 @@ def test_partial_scroll_push_up_parity(self): outer._cache_valid = False rebuilt = _render(outer) - assert optimized.tobytes() == rebuilt.tobytes(), ( + assert _bytes(optimized) == _bytes(rebuilt), ( "Push-up result diverged from full rebuild after virtual child scroll" ) diff --git a/tests/test_paint_context.py b/tests/test_paint_context.py index c84e4e95..e3bf7add 100644 --- a/tests/test_paint_context.py +++ b/tests/test_paint_context.py @@ -3,13 +3,15 @@ - Box.contains - Widget._draw_erase (safe-interior vs full-frame erase) - ContainerWidget.propagate_dirty scroll-offset translation + - Relative-coord API contract + - SDL clip containment (formerly slow-path scissor) """ import pytest -from PIL import Image, ImageDraw +import pygame from uilib.box import Box -from uilib.paint import PaintContext, BufferPool +from uilib.paint import PaintContext from uilib.container import ContainerWidget from uilib.widget import Widget @@ -21,19 +23,14 @@ def _container(w=100, h=100, outline_radius=None, **kwargs): box = Box(0, 0, w, h) - c = ContainerWidget(box=box, outline_radius=outline_radius, **kwargs) - return c + return ContainerWidget(box=box, outline_radius=outline_radius, **kwargs) -def _ctx(container, clip=None): - if clip is None: - clip = container.box.norm() - return PaintContext(container.image, container.draw, clip) - - -def _painted_colors(image): - """Return the set of distinct RGB tuples present in the image.""" - return set(image.getdata()) +def _surface(w, h, color=(255, 255, 255), alpha=False): + flags = pygame.SRCALPHA if alpha else 0 + surf = pygame.Surface((w, h), flags) + surf.fill(color) + return surf # --------------------------------------------------------------------------- @@ -53,7 +50,7 @@ def test_inner_fully_inside(self): def test_touching_edge_is_contained(self): outer = Box(0, 0, 100, 100) - edge = Box(0, 0, 100, 50) # shares top/left/right edge + edge = Box(0, 0, 100, 50) assert outer.contains(edge) def test_partial_overlap_is_not_contained(self): @@ -68,7 +65,7 @@ def test_larger_box_not_contained(self): def test_empty_box_contained(self): outer = Box(0, 0, 100, 100) - empty = Box(50, 50, 50, 50) # zero-area + empty = Box(50, 50, 50, 50) assert outer.contains(empty) @@ -79,140 +76,55 @@ def test_empty_box_contained(self): class TestDrawErase: """_draw_erase erases with a plain rect when the dirty region fits in the - safe interior; falls back to a full rounded_rectangle when it touches a - corner.""" + safe interior; falls back to a rounded rect when clip == bounds.""" def _erase_and_read(self, clip, frame, outline_radius=None): - """Erase `frame` in a white 100×100 image using `clip` as the dirty - region. Returns the image so the caller can inspect pixels.""" - img = Image.new("RGB", (100, 100), (255, 255, 255)) - draw = ImageDraw.Draw(img) - ctx = PaintContext(img, draw, clip, frame=frame) + surf = _surface(100, 100, (255, 255, 255)) + ctx = PaintContext(surf, clip, frame=frame) w = Widget(box=frame) w.outline_radius = outline_radius w.bkgnd_color = (0, 0, 0) w._draw_erase(ctx) - return img + return surf def test_no_radius_erases_only_clip(self): frame = Box(0, 0, 100, 100) clip = Box(10, 10, 50, 50) - img = self._erase_and_read(clip, frame, outline_radius=None) - # Clipped region is black - assert img.getpixel((20, 20)) == (0, 0, 0) - # Outside clip stays white - assert img.getpixel((80, 80)) == (255, 255, 255) + surf = self._erase_and_read(clip, frame, outline_radius=None) + assert surf.get_at((20, 20))[:3] == (0, 0, 0) + assert surf.get_at((80, 80))[:3] == (255, 255, 255) def test_radius_safe_interior_erases_only_clip(self): - """Dirty region inside the safe interior → plain rect erase.""" frame = Box(0, 0, 100, 100) - r = 10 - # clip well inside the safe zone (r..100-r on each axis) clip = Box(20, 20, 80, 80) - img = self._erase_and_read(clip, frame, outline_radius=r) - assert img.getpixel((50, 50)) == (0, 0, 0) # inside clip → erased - assert img.getpixel((5, 5)) == (255, 255, 255) # corner → untouched + surf = self._erase_and_read(clip, frame, outline_radius=10) + assert surf.get_at((50, 50))[:3] == (0, 0, 0) + assert surf.get_at((5, 5))[:3] == (255, 255, 255) def test_radius_partial_clip_erases_only_intersection(self): - """Partial clip on a rounded widget → plain rect erase of the intersection. - Full-frame expansion for rounded shapes is ContainerWidget.do_draw's job, - not _draw_erase's. A leaf widget with outline_radius still gets a rect - erase when the clip is smaller than the frame.""" frame = Box(0, 0, 100, 100) - r = 10 clip = Box(0, 0, 20, 20) - img = self._erase_and_read(clip, frame, outline_radius=r) - # Only the clipped region is erased - assert img.getpixel((10, 10)) == (0, 0, 0) - # Centre untouched — no full-frame expansion at this level - assert img.getpixel((50, 50)) == (255, 255, 255) + surf = self._erase_and_read(clip, frame, outline_radius=10) + assert surf.get_at((10, 10))[:3] == (0, 0, 0) + assert surf.get_at((50, 50))[:3] == (255, 255, 255) def test_radius_full_frame_uses_rounded_rectangle(self): - """When clip == frame, always use rounded_rectangle (corners preserved).""" frame = Box(0, 0, 100, 100) - r = 10 - img = self._erase_and_read(frame, frame, outline_radius=r) - # Centre erased - assert img.getpixel((50, 50)) == (0, 0, 0) - # Absolute corner pixels NOT erased (rounded rect leaves them) - assert img.getpixel((0, 0)) == (255, 255, 255) + surf = self._erase_and_read(frame, frame, outline_radius=10) + assert surf.get_at((50, 50))[:3] == (0, 0, 0) + # Absolute corner pixel NOT erased (rounded rect leaves it) + assert surf.get_at((0, 0))[:3] == (255, 255, 255) # --------------------------------------------------------------------------- -# BufferPool +# propagate_dirty scroll offset # --------------------------------------------------------------------------- -class TestBufferPool: - def test_best_fit_allocation(self): - pool = BufferPool((320, 240)) - - # 1. First allocation - img1 = pool.acquire((100, 100)) - assert img1.size == (100, 100) - pool.release(img1) - - # 2. Exact match reuse - img2 = pool.acquire((100, 100)) - assert img2 is img1 - pool.release(img2) - - # 3. New allocation for larger request - img3 = pool.acquire((150, 150)) - assert img3.size == (150, 150) - assert img3 is not img1 - pool.release(img3) - - # 4. Best fit reuse: img1(100x100) and img3(150x150) are free. - # Request for 120x120 should take img3. - img4 = pool.acquire((120, 120)) - assert img4 is img3 - pool.release(img4) - - # Request for 80x80 should take img1. - img5 = pool.acquire((80, 80)) - assert img5 is img1 - pool.release(img5) - - def test_max_size_cap(self): - pool = BufferPool((100, 100)) - img = pool.acquire((200, 200)) - assert img.size == (100, 100) - - def test_pool_lifecycle_and_nesting(self): - """Verify that pool size is bounded by nesting depth, not operation count.""" - pool = BufferPool((320, 240)) - img = Image.new("RGBA", (320, 240)) - draw = ImageDraw.Draw(img) - - # Force slow path with a small clip - ctx = PaintContext(img, draw, Box(0, 0, 5, 5), pool) - - # 1. Serial draws (should reuse same buffer) - for _ in range(100): - with ctx.painting(Box(0, 0, 100, 100)): - pass - assert len(pool._free) == 1 - - # 2. Nested draws (should grow to depth) - with ctx.painting(Box(0, 0, 100, 100)) as ctx2: - # Inner clip must also be 'slow path' relative to ctx2.clip - # ctx2.clip is (0,0,5,5) re-anchored. - with ctx2.painting(Box(0, 0, 100, 100)): - assert len(pool._free) == 0 # 2 are currently active - assert len(pool._free) == 1 # Inner released - assert len(pool._free) == 2 # Both released - - class TestPropagateDirtyScrollOffset: - """propagate_dirty must account for self.offset (scroll) when translating - a local dirty region into parent coordinates.""" - def test_no_scroll_translates_by_box_position(self): - """Without scrolling, dirty clip should be offset by the container's - position in the parent.""" received = [] class CapturingParent(Widget): @@ -221,20 +133,15 @@ def propagate_dirty(self, clip): parent = CapturingParent(box=Box(0, 0, 200, 200)) c = _container(w=100, h=100) - c.box = Box(20, 30, 120, 130) # container positioned at (20,30) + c.box = Box(20, 30, 120, 130) c.parent = parent - local_clip = Box(10, 10, 50, 50) - c.propagate_dirty(local_clip) + c.propagate_dirty(Box(10, 10, 50, 50)) assert len(received) == 1 - result = received[0] - # Expected: local_clip shifted by container position = (30,40,70,80) - assert result == Box(30, 40, 70, 80) + assert received[0] == Box(30, 40, 70, 80) def test_scroll_offset_shifts_propagated_clip(self): - """With a scroll offset of (dx, dy), the propagated clip should be - shifted by -offset before being translated to parent coords.""" received = [] class CapturingParent(Widget): @@ -245,15 +152,12 @@ def propagate_dirty(self, clip): c = _container(w=100, h=100) c.box = Box(20, 30, 120, 130) c.parent = parent - c.offset = (5, 10) # scrolled: content shifted by (5,10) + c.offset = (5, 10) - local_clip = Box(10, 10, 50, 50) - c.propagate_dirty(local_clip) + c.propagate_dirty(Box(10, 10, 50, 50)) assert len(received) == 1 - result = received[0] - # deoffset(5,10) → (5,0,45,40), then offset by (20,30) → (25,30,65,70) - assert result == Box(25, 30, 65, 70) + assert received[0] == Box(25, 30, 65, 70) # --------------------------------------------------------------------------- @@ -262,61 +166,48 @@ def propagate_dirty(self, clip): class _RelDrawWidget(Widget): - """Test widget that draws via the relative-coord PaintContext API. - - Fills its own background, draws a 1-pixel marker at relative (0,0), and a - single-pixel rectangle at the opposite corner. Any frame translation bug - surfaces as a marker landing at the wrong absolute coordinate. - """ - def _draw(self, ctx): ctx.fill((255, 255, 255)) ctx.draw_rectangle(Box(0, 0, 1, 1), fill=(255, 0, 0)) - ctx.draw_rectangle(Box(ctx.width - 1, ctx.height - 1, ctx.width, ctx.height), - fill=(0, 255, 0)) + ctx.draw_rectangle(Box(ctx.width - 1, ctx.height - 1, ctx.width, ctx.height), fill=(0, 255, 0)) class TestRelativeCoords: - """The wrappers must translate (0,0) → frame.topleft for any frame placement.""" - - @pytest.mark.parametrize("frame", [ - Box(0, 0, 20, 20), # at origin - Box(50, 30, 70, 50), # offset into image - Box(99, 99, 119, 119), # straddling beyond image (rest clipped naturally) - ]) + @pytest.mark.parametrize( + "frame", + [ + Box(0, 0, 20, 20), + Box(50, 30, 70, 50), + Box(99, 99, 119, 119), + ], + ) def test_origin_marker_lands_at_frame_topleft(self, frame): - img = Image.new("RGB", (200, 200), (0, 0, 0)) - draw = ImageDraw.Draw(img) - ctx = PaintContext(img, draw, Box(0, 0, 200, 200)) + surf = _surface(200, 200, (0, 0, 0)) + ctx = PaintContext(surf, Box(0, 0, 200, 200)) w = _RelDrawWidget(box=frame) w.bkgnd_color = (0, 0, 0) w.fgnd_color = (255, 255, 255) w.do_draw(ctx, frame) - # (0,0) marker lands at frame.topleft. - assert img.getpixel(frame.topleft) == (255, 0, 0) - # (width-1, height-1) marker lands at frame's botright minus 1. + assert surf.get_at(frame.topleft)[:3] == (255, 0, 0) far = (frame.x1 - 1, frame.y1 - 1) if 0 <= far[0] < 200 and 0 <= far[1] < 200: - assert img.getpixel(far) == (0, 255, 0) - # Pixel just outside top-left is still untouched. + assert surf.get_at(far)[:3] == (0, 255, 0) if frame.x0 > 0: - assert img.getpixel((frame.x0 - 1, frame.y0)) == (0, 0, 0) + assert surf.get_at((frame.x0 - 1, frame.y0))[:3] == (0, 0, 0) # --------------------------------------------------------------------------- -# Slow-path scissor containment +# SDL clip containment (replaces former slow-path BufferPool scissor) # --------------------------------------------------------------------------- class _SloppyWidget(Widget): - """Intentionally draws well outside its own frame to test the slow-path - scissor. A correctly-clipping PaintContext must discard any pixels that - fall outside clip ∩ frame.""" + """Intentionally draws past its own frame to test that the SDL clip + (set by PaintContext.painting()) discards out-of-clip pixels.""" def _draw(self, ctx): - # Try to bleed 10px past every edge. ctx.draw_rectangle( Box(-10, -10, ctx.width + 10, ctx.height + 10), fill=(255, 0, 0), @@ -324,37 +215,26 @@ def _draw(self, ctx): class TestSloppyDrawContainment: - """A widget that paints outside its frame must NOT leak onto the parent - surface beyond clip ∩ frame when the slow path is engaged.""" - - def test_slow_path_scissors_oversized_draw(self): - from uilib.paint import BufferPool - - img = Image.new("RGBA", (200, 200), (0, 0, 0, 255)) - draw = ImageDraw.Draw(img) - - # Force slow path: clip is a strict sub-rect of frame. + def test_sdl_clip_scissors_oversized_draw(self): + surf = _surface(200, 200, (0, 0, 0), alpha=True) + # Clip strictly smaller than frame: anything outside clip must drop. frame = Box(50, 50, 150, 150) clip = Box(60, 60, 140, 140) - pool = BufferPool((200, 200)) - ctx = PaintContext(img, draw, clip, pool) + ctx = PaintContext(surf, clip) w = _SloppyWidget(box=frame) - w.bkgnd_color = (0, 0, 0, 0) # transparent erase so we see leaks clearly + w.bkgnd_color = (0, 0, 0, 0) w.fgnd_color = (255, 255, 255) w.do_draw(ctx, frame) - # Inside clip: should be red (widget drew there). - assert img.getpixel((100, 100))[:3] == (255, 0, 0) + # Inside clip: red + assert surf.get_at((100, 100))[:3] == (255, 0, 0) - # Outside clip but inside frame: widget *tried* to paint here via the - # oversized rect, but the slow-path scissor must have dropped it. - # frame extends [50,150)×[50,150); clip is [60,140)×[60,140). - # Pixel (55, 100) is inside frame, outside clip. - assert img.getpixel((55, 100))[:3] == (0, 0, 0) - assert img.getpixel((145, 100))[:3] == (0, 0, 0) - assert img.getpixel((100, 55))[:3] == (0, 0, 0) + # Inside frame, outside clip: SDL clip dropped it + assert surf.get_at((55, 100))[:3] == (0, 0, 0) + assert surf.get_at((145, 100))[:3] == (0, 0, 0) + assert surf.get_at((100, 55))[:3] == (0, 0, 0) - # Well outside frame: definitely untouched. - assert img.getpixel((10, 10))[:3] == (0, 0, 0) - assert img.getpixel((190, 190))[:3] == (0, 0, 0) + # Well outside frame: untouched + assert surf.get_at((10, 10))[:3] == (0, 0, 0) + assert surf.get_at((190, 190))[:3] == (0, 0, 0) diff --git a/tests/test_virtual_container.py b/tests/test_virtual_container.py index 57b739a7..83cfa4f7 100644 --- a/tests/test_virtual_container.py +++ b/tests/test_virtual_container.py @@ -1,22 +1,22 @@ """ Unit tests for virtual container (JIT paint) behavior. -A ContainerWidget(virtual=True, content_height=N) keeps a "tall" backing image +A ContainerWidget(virtual=True, content_height=N) keeps a "tall" backing surface sized to N pixels. Only children whose boxes intersect the current viewport are painted; others are marked dirty and deferred until they scroll into view. Contracts verified here: - - Tall image creation + - Tall surface creation - refresh() gates on viewport: visible → painted, off-screen → dirty - Widget.refresh() marks dirty when off-screen; paints when on-screen - scroll() paints dirty/unpainted children that scroll into view - - scroll() blits the correct tall-image slice (pixel-level check) + - scroll() blits the correct tall-surface slice (pixel-level check) - set_selected + scroll_into_view ordering (mutation before blit) - Dirty-state transitions: never-painted → clean → dirty → clean """ import pytest -from PIL import Image, ImageDraw +import pygame from uilib.box import Box from uilib.paint import PaintContext @@ -35,15 +35,16 @@ def _virtual_container(n=N_ITEMS, item_h=ITEM_H, viewport_h=VIEWPORT_H): - """Return a virtual container (no parent) ready to hold items.""" content_h = n * item_h box = Box.xywh(0, 0, VIEWPORT_W, viewport_h) return ContainerWidget(box=box, virtual=True, content_height=content_h) -class _ColorWidget(Widget): - """Fills its frame with a solid color so we can verify pixel placement.""" +def _pix(surf, xy): + return tuple(surf.get_at(xy))[:3] + +class _ColorWidget(Widget): def __init__(self, color, **kwargs): self.color = color super().__init__(**kwargs) @@ -53,7 +54,6 @@ def _draw(self, ctx): def _attach_items(container, n=N_ITEMS, item_h=ITEM_H): - """Attach n items with distinct colors. Returns list of (widget, color).""" items = [] for i in range(n): color = (i * 40, 0, 255 - i * 40) @@ -63,23 +63,26 @@ def _attach_items(container, n=N_ITEMS, item_h=ITEM_H): # --------------------------------------------------------------------------- -# 1. Tall image creation +# 1. Tall surface creation # --------------------------------------------------------------------------- class TestVirtualImageSize: - def test_image_height_is_content_height(self): + def test_surface_height_is_content_height(self): c = _virtual_container() - assert c.image.height == N_ITEMS * ITEM_H + assert c.surface is not None + assert c.surface.get_height() == N_ITEMS * ITEM_H - def test_image_width_matches_box(self): + def test_surface_width_matches_box(self): c = _virtual_container() - assert c.image.width == VIEWPORT_W + assert c.surface is not None + assert c.surface.get_width() == VIEWPORT_W - def test_non_virtual_image_matches_box(self): + def test_non_virtual_surface_matches_box(self): box = Box.xywh(0, 0, VIEWPORT_W, VIEWPORT_H) c = ContainerWidget(box=box) - assert c.image.height == VIEWPORT_H + assert c.surface is not None + assert c.surface.get_height() == VIEWPORT_H # --------------------------------------------------------------------------- @@ -93,7 +96,6 @@ def test_visible_items_painted_after_refresh(self): items = _attach_items(c) c.refresh() - # Initial viewport is y=0..VIEWPORT_H: items 0..2 (rows 0,1,2) visible_count = VIEWPORT_H // ITEM_H for i, (w, _) in enumerate(items): if i < visible_count: @@ -103,31 +105,28 @@ def test_visible_items_painted_after_refresh(self): assert w._dirty, f"item {i} should be marked dirty" assert not w._painted, f"item {i} should not be painted yet" - def test_visible_item_pixels_land_in_tall_image(self): + def test_visible_item_pixels_land_in_tall_surface(self): c = _virtual_container() items = _attach_items(c) c.refresh() - # Each visible item should have its color in the tall image visible_count = VIEWPORT_H // ITEM_H for i, (w, color) in enumerate(items[:visible_count]): sample_y = i * ITEM_H + ITEM_H // 2 - pixel = c.image.getpixel((VIEWPORT_W // 2, sample_y)) - assert pixel[:3] == color[:3], f"item {i} color {color} not found at tall-image y={sample_y}" + assert _pix(c.surface, (VIEWPORT_W // 2, sample_y)) == color, ( + f"item {i} color {color} not found at tall-surface y={sample_y}" + ) - def test_off_screen_item_pixels_not_in_image_background(self): - """Off-screen items are never painted; their rows stay at the container - background color (default black) until they scroll into view.""" + def test_off_screen_item_pixels_not_in_surface_background(self): c = _virtual_container() items = _attach_items(c) c.refresh() - # Items beyond viewport_h are unpainted → black background for i, (w, color) in enumerate(items[VIEWPORT_H // ITEM_H :], start=VIEWPORT_H // ITEM_H): sample_y = i * ITEM_H + ITEM_H // 2 - pixel = c.image.getpixel((VIEWPORT_W // 2, sample_y)) - # Should still be default background, not the item's color - assert pixel[:3] != color[:3], f"item {i} color leaked into tall image before scroll" + assert _pix(c.surface, (VIEWPORT_W // 2, sample_y)) != color, ( + f"item {i} color leaked into tall surface before scroll" + ) # --------------------------------------------------------------------------- @@ -139,23 +138,23 @@ class TestWidgetRefreshJIT: def test_off_screen_widget_refresh_marks_dirty(self): c = _virtual_container() items = _attach_items(c) - c.refresh() # initial paint of visible items + c.refresh() - off_screen = items[N_ITEMS - 1][0] # last item, far off-screen + off_screen = items[N_ITEMS - 1][0] assert not off_screen._painted off_screen.refresh() assert off_screen._dirty - assert not off_screen._painted # still not painted + assert not off_screen._painted def test_on_screen_widget_refresh_paints(self): c = _virtual_container() items = _attach_items(c) - c.refresh() # initial paint + c.refresh() on_screen = items[0][0] - on_screen._painted = False # simulate needing a redraw + on_screen._painted = False on_screen._dirty = True on_screen.refresh() @@ -164,7 +163,6 @@ def test_on_screen_widget_refresh_paints(self): assert not on_screen._dirty def test_off_screen_refresh_does_not_paint_pixels(self): - """An off-screen widget.refresh() must not change tall-image pixels.""" c = _virtual_container() items = _attach_items(c) c.refresh() @@ -173,12 +171,11 @@ def test_off_screen_refresh_does_not_paint_pixels(self): w, color = items[idx] sample_y = idx * ITEM_H + ITEM_H // 2 - # Record pixel before the off-screen refresh - before = c.image.getpixel((VIEWPORT_W // 2, sample_y)) + before = _pix(c.surface, (VIEWPORT_W // 2, sample_y)) w.refresh() - after = c.image.getpixel((VIEWPORT_W // 2, sample_y)) + after = _pix(c.surface, (VIEWPORT_W // 2, sample_y)) - assert before == after, "off-screen refresh must not write pixels" + assert before == after # --------------------------------------------------------------------------- @@ -192,7 +189,6 @@ def test_scroll_paints_dirty_children(self): items = _attach_items(c) c.refresh() - # Scroll down by VIEWPORT_H: items 3..5 enter the viewport c.scroll((0, VIEWPORT_H)) newly_visible_start = VIEWPORT_H // ITEM_H @@ -201,30 +197,26 @@ def test_scroll_paints_dirty_children(self): assert w._painted, f"item {i} should be painted after scroll" assert not w._dirty, f"item {i} should be clean after scroll" - def test_scroll_paints_correct_pixels_in_tall_image(self): + def test_scroll_paints_correct_pixels_in_tall_surface(self): c = _virtual_container() items = _attach_items(c) c.refresh() c.scroll((0, VIEWPORT_H)) - # Items 3..5 should now have their colors in the tall image for i, (w, color) in enumerate(items[VIEWPORT_H // ITEM_H :], start=VIEWPORT_H // ITEM_H): sample_y = i * ITEM_H + ITEM_H // 2 - pixel = c.image.getpixel((VIEWPORT_W // 2, sample_y)) - assert pixel[:3] == color[:3], f"item {i} color {color} not found at tall-image y={sample_y} after scroll" + assert _pix(c.surface, (VIEWPORT_W // 2, sample_y)) == color, ( + f"item {i} color {color} not found at tall-surface y={sample_y} after scroll" + ) def test_scroll_skips_already_clean_children(self): - """Children that are painted and clean must not be redrawn on scroll.""" c = _virtual_container() items = _attach_items(c) c.refresh() draw_counts = {i: 0 for i in range(N_ITEMS)} - originals = {} for i, (w, _) in enumerate(items): - originals[i] = w._draw - idx = i def make_counter(orig, item_i): def _draw_counted(ctx): @@ -235,170 +227,118 @@ def _draw_counted(ctx): w._draw = make_counter(w._draw, i) - # Scroll to show items 3..5 (items 0..2 are still technically overlapping - # the prior viewport's bottom row, but items 0..2 are clean → skip) c.scroll((0, VIEWPORT_H)) - # Dirty items (3..5) should have been drawn exactly once newly_visible_start = VIEWPORT_H // ITEM_H for i in range(newly_visible_start, N_ITEMS): assert draw_counts[i] == 1, f"item {i} should have been drawn once" - # Clean items (0..2) must not have been redrawn for i in range(newly_visible_start): assert draw_counts[i] == 0, f"item {i} should not have been redrawn" # --------------------------------------------------------------------------- -# 5. do_draw blits the correct tall-image slice into the parent +# 5. do_draw blits the correct tall-surface slice into the parent # --------------------------------------------------------------------------- -class TestDoDrawBlit: - """After scroll(y=N), do_draw must composite the slice starting at y=N in - the tall image into the parent surface — not the slice at y=0.""" +def _parent_ctx(w=VIEWPORT_W, h=VIEWPORT_H, fill=(128, 128, 128)): + surf = pygame.Surface((w, h)) + surf.fill(fill) + ctx = PaintContext(surf, Box.xywh(0, 0, w, h)) + return surf, ctx - def test_do_draw_shows_scrolled_content_in_parent(self): - from uilib.paint import BufferPool +class TestDoDrawBlit: + def test_do_draw_shows_scrolled_content_in_parent(self): c = _virtual_container() items = _attach_items(c) c.refresh() - c.scroll((0, VIEWPORT_H)) # items 3..5 now in viewport - - # Build a parent image and call do_draw on the container - parent_img = Image.new("RGB", (VIEWPORT_W, VIEWPORT_H), (128, 128, 128)) - pool = BufferPool((VIEWPORT_W, VIEWPORT_H)) - ctx = PaintContext(parent_img, ImageDraw.Draw(parent_img), Box.xywh(0, 0, VIEWPORT_W, VIEWPORT_H), pool) - container_frame = Box.xywh(0, 0, VIEWPORT_W, VIEWPORT_H) + c.scroll((0, VIEWPORT_H)) - c.do_draw(ctx, container_frame) + parent_surf, ctx = _parent_ctx() + c.do_draw(ctx, Box.xywh(0, 0, VIEWPORT_W, VIEWPORT_H)) - # Item 3 occupies row 0 of the viewport after scroll(VIEWPORT_H). - # Its color must appear at the top of the parent image. _, item3_color = items[VIEWPORT_H // ITEM_H] - top_pixel = parent_img.getpixel((VIEWPORT_W // 2, ITEM_H // 2)) - assert top_pixel[:3] == item3_color[:3], f"Expected item3 color {item3_color} at top of parent, got {top_pixel}" + top_pixel = _pix(parent_surf, (VIEWPORT_W // 2, ITEM_H // 2)) + assert top_pixel == item3_color, f"Expected item3 color {item3_color} at top of parent, got {top_pixel}" - # Item 0 must NOT appear at the top of the parent image. _, item0_color = items[0] - assert top_pixel[:3] != item0_color[:3], "Item 0 must not appear at top of parent after scroll" + assert top_pixel != item0_color def test_do_draw_no_scroll_shows_first_items(self): - from uilib.paint import BufferPool - c = _virtual_container() items = _attach_items(c) - c.refresh() # no scroll — viewport is at y=0 - - parent_img = Image.new("RGB", (VIEWPORT_W, VIEWPORT_H), (128, 128, 128)) - pool = BufferPool((VIEWPORT_W, VIEWPORT_H)) - ctx = PaintContext(parent_img, ImageDraw.Draw(parent_img), Box.xywh(0, 0, VIEWPORT_W, VIEWPORT_H), pool) + c.refresh() + parent_surf, ctx = _parent_ctx() c.do_draw(ctx, Box.xywh(0, 0, VIEWPORT_W, VIEWPORT_H)) _, item0_color = items[0] - top_pixel = parent_img.getpixel((VIEWPORT_W // 2, ITEM_H // 2)) - assert top_pixel[:3] == item0_color[:3], ( - f"Expected item0 color {item0_color} at top of parent (no scroll), got {top_pixel}" - ) + top_pixel = _pix(parent_surf, (VIEWPORT_W // 2, ITEM_H // 2)) + assert top_pixel == item0_color # --------------------------------------------------------------------------- -# 5b. Scroll-by-blit: scrolling back over already-painted children -# must not re-invoke child _draw — neither in scroll() nor in the -# subsequent do_draw on a parent surface. do_draw on a virtual -# container is pure cache-blit. +# 5b. Scroll-by-blit: scrolling back over already-painted children must not +# re-invoke child _draw, and do_draw on a virtual container is pure blit. # --------------------------------------------------------------------------- class TestScrollByBlitNoRebuild: def _paint_all_and_spy(self, c, items): - """Paint every item into the cache, then install per-item _draw spies - and return the counters dict. After this, all items are _painted and - not _dirty, so subsequent paints would be redundant.""" - c.refresh() # paints items 0..2 - c.scroll((0, (N_ITEMS - VIEWPORT_H // ITEM_H) * ITEM_H)) # paints items 3..5 - c.scroll((0, 0)) # back to top; everything cached - - # Sanity: every item must be painted and clean before the spy goes in. + c.refresh() + c.scroll((0, (N_ITEMS - VIEWPORT_H // ITEM_H) * ITEM_H)) + c.scroll((0, 0)) + for w, _ in items: assert w._painted and not w._dirty counts = {i: 0 for i in range(len(items))} for i, (w, _) in enumerate(items): - orig = w._draw def make_spy(orig, idx): def _spy(ctx): counts[idx] += 1 orig(ctx) + return _spy - w._draw = make_spy(orig, i) + w._draw = make_spy(w._draw, i) return counts def test_scroll_over_painted_children_does_no_child_draw(self): - """scroll() to a region whose children are all cached+clean must not - invoke any child _draw.""" c = _virtual_container() items = _attach_items(c) counts = self._paint_all_and_spy(c, items) - c.scroll((0, VIEWPORT_H)) # items 3..5 — all already painted+clean + c.scroll((0, VIEWPORT_H)) - assert all(v == 0 for v in counts.values()), ( - f"expected zero child redraws on scroll-over-painted, got {counts}" - ) + assert all(v == 0 for v in counts.values()), f"expected zero child redraws on scroll-over-painted, got {counts}" def test_do_draw_after_scroll_is_pure_blit(self): - """After scroll, do_draw on a parent surface must be a pure cache blit: - no child _draw invocations. Pixels must still match the cached state.""" - from uilib.paint import BufferPool - c = _virtual_container() items = _attach_items(c) counts = self._paint_all_and_spy(c, items) - # Scroll to a previously-painted region, then have a "parent" composite us. c.scroll((0, VIEWPORT_H)) - parent_img = Image.new("RGB", (VIEWPORT_W, VIEWPORT_H), (128, 128, 128)) - pool = BufferPool((VIEWPORT_W, VIEWPORT_H)) - ctx = PaintContext( - parent_img, - ImageDraw.Draw(parent_img), - Box.xywh(0, 0, VIEWPORT_W, VIEWPORT_H), - pool, - ) + parent_surf, ctx = _parent_ctx() c.do_draw(ctx, Box.xywh(0, 0, VIEWPORT_W, VIEWPORT_H)) - assert all(v == 0 for v in counts.values()), ( - f"do_draw on virtual must not invoke child _draw; got {counts}" - ) + assert all(v == 0 for v in counts.values()), f"do_draw on virtual must not invoke child _draw; got {counts}" - # Item 3 (first visible row after scroll) should appear at the top. _, item3_color = items[VIEWPORT_H // ITEM_H] - top_pixel = parent_img.getpixel((VIEWPORT_W // 2, ITEM_H // 2)) - assert top_pixel[:3] == item3_color[:3] + top_pixel = _pix(parent_surf, (VIEWPORT_W // 2, ITEM_H // 2)) + assert top_pixel == item3_color # --------------------------------------------------------------------------- -# 6. Pixel-level blit: scroll shows the right slice +# 6. Pixel-level blit: scroll emits the right slice via propagate_dirty # --------------------------------------------------------------------------- class TestScrollBlit: - def _setup_and_scroll(self, scroll_y): - """Return (container, items) after refresh + scroll.""" - c = _virtual_container() - items = _attach_items(c) - c.refresh() - c.scroll((0, scroll_y)) - return c, items - def test_viewport_slice_corresponds_to_scroll_offset(self): - """After scroll(y=VIEWPORT_H), the visible viewport starts at VIEWPORT_H - in the tall image. The propagate_dirty call must emit the correct slice.""" received = [] class CapturingParent(Widget): @@ -409,38 +349,29 @@ def propagate_dirty(self, clip): _attach_items(c) c.refresh() - # Attach a capturing parent and scroll c.box = Box.xywh(10, 5, VIEWPORT_W, VIEWPORT_H) c.parent = CapturingParent(box=Box.xywh(0, 0, 200, 200)) c.scroll((0, VIEWPORT_H)) - assert received, "scroll() must call propagate_dirty" + assert received last = received[-1] - # propagate_dirty converts viewport content coords → parent-space coords: - # content viewport Box(0, VIEWPORT_H, W, 2*VIEWPORT_H) - # deoffset((0, VIEWPORT_H)) → Box(0, 0, W, VIEWPORT_H) (viewport-relative) - # offset(box.topleft=(10,5)) → Box(10, 5, W+10, VIEWPORT_H+5) (parent-space) expected = Box.xywh(10, 5, VIEWPORT_W, VIEWPORT_H) - assert last == expected, f"Expected parent-space clip {expected}, got {last}" + assert last == expected # --------------------------------------------------------------------------- -# 6. set_selected + scroll_into_view ordering +# 7. set_selected + scroll_into_view ordering # --------------------------------------------------------------------------- class TestSelectionScrollOrdering: def test_selected_state_visible_after_scroll(self): - """Mutate state → mark dirty → scroll → on-scroll paint must capture - the post-mutation state (selected=True visually).""" c = _virtual_container() items = _attach_items(c) c.refresh() - # Track what color each draw sees for item[N_ITEMS-1] last_w, _ = items[N_ITEMS - 1] drawn_selected = [] - orig_draw = last_w._draw def _spy_draw(ctx): @@ -449,19 +380,16 @@ def _spy_draw(ctx): last_w._draw = _spy_draw last_w.selectable = True - last_w.selected = True # mutate state + last_w.selected = True - # scroll_into_view triggers scroll(), which should paint the dirty widget scrolled = last_w.scroll_into_view() - if scrolled: - # Widget was off-screen and scroll happened → paint occurred via scroll() - assert drawn_selected, "widget must have been painted during scroll" - assert drawn_selected[-1] is True, "widget must be painted with selected=True (post-mutation state)" + assert drawn_selected + assert drawn_selected[-1] is True # --------------------------------------------------------------------------- -# 7. Dirty-state transitions +# 8. Dirty-state transitions # --------------------------------------------------------------------------- @@ -469,7 +397,6 @@ class TestDirtyStateTransitions: def test_initial_state_never_painted(self): c = _virtual_container() items = _attach_items(c) - for w, _ in items: assert not w._painted assert not w._dirty @@ -478,7 +405,6 @@ def test_after_refresh_visible_clean(self): c = _virtual_container() items = _attach_items(c) c.refresh() - visible_count = VIEWPORT_H // ITEM_H for w, _ in items[:visible_count]: assert w._painted and not w._dirty @@ -487,7 +413,6 @@ def test_after_refresh_off_screen_dirty(self): c = _virtual_container() items = _attach_items(c) c.refresh() - visible_count = VIEWPORT_H // ITEM_H for w, _ in items[visible_count:]: assert w._dirty and not w._painted @@ -496,12 +421,9 @@ def test_widget_refresh_on_screen_clears_dirty(self): c = _virtual_container() items = _attach_items(c) c.refresh() - w = items[0][0] - w._dirty = True # simulate state change - + w._dirty = True w.refresh() - assert w._painted assert not w._dirty @@ -509,12 +431,9 @@ def test_widget_refresh_off_screen_sets_dirty(self): c = _virtual_container() items = _attach_items(c) c.refresh() - w = items[N_ITEMS - 1][0] assert not w._painted - w.refresh() - assert w._dirty assert not w._painted @@ -522,12 +441,9 @@ def test_scroll_into_view_clears_dirty(self): c = _virtual_container() items = _attach_items(c) c.refresh() - w, _ = items[N_ITEMS - 1] assert w._dirty - - c.scroll((0, (N_ITEMS - 1) * ITEM_H)) # scroll last item into view - + c.scroll((0, (N_ITEMS - 1) * ITEM_H)) assert w._painted assert not w._dirty @@ -539,24 +455,15 @@ def test_scroll_into_view_clears_dirty(self): @pytest.fixture def ui_config(): - """Initialize the uilib Config singleton with the project's ui/config.json.""" import os from uilib.config import Config - # Reset singleton so it reinitialises cleanly for each test Config._instance = None project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) Config(os.path.join(project_root, "ui", "config.json")) class TestMenuSnapshot: - """Snapshot tests for a real Menu with virtual scrolling. - - These go through PanelStack → do_draw → LCD.update, so they cover the - tall-image blit path that pixel-unit tests above can only approximate. - Running with --snapshot-update regenerates the baselines. - """ - _ITEM_NAMES = [f"Item {i}" for i in range(8)] def _make_stack(self, fake_lcd): @@ -567,8 +474,6 @@ def _make_stack(self, fake_lcd): def _make_menu(self, stack): from uilib.menu import Menu - # max_height forces virtual mode when total content exceeds it. - # dismiss_option=True adds the back-arrow item (matches real-world usage). menu = Menu( items=[(name, None, None) for name in self._ITEM_NAMES], max_height=100, @@ -588,7 +493,6 @@ def test_scroll_shows_later_items(self, fake_lcd, snapshot, ui_config): menu = self._make_menu(stack) snapshot("initial") - # Advance to the last selectable item (includes the back arrow) for _ in range(len(menu.sel_list) - 1): menu.sel_next() @@ -598,24 +502,14 @@ def test_scroll_back_and_forth(self, fake_lcd, snapshot, ui_config): stack = self._make_stack(fake_lcd) menu = self._make_menu(stack) - # 0 -> 4 for _ in range(4): menu.sel_next() - print(f"at 4: offset={menu.offset}") snapshot() - # -> 5 menu.sel_next() - print(f"at 5: offset={menu.offset}") snapshot() - # -> 6 menu.sel_next() - print(f"at 6: offset={menu.offset}") snapshot() - # -> 5 menu.sel_prev() - print(f"back to 5: offset={menu.offset}") snapshot() - # -> 4 menu.sel_prev() - print(f"back to 4: offset={menu.offset}") snapshot() From fba4ded0aca60438823ed15cf3a27d8179c45e1a Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Wed, 20 May 2026 18:52:06 -0400 Subject: [PATCH 33/46] Fix final parity bugs --- pistomp/lcd320x240.py | 2 +- uilib/dialog.py | 5 +++-- uilib/footswitch.py | 36 ++++++++++++++++++------------------ uilib/panel.py | 7 +++++-- 4 files changed, 27 insertions(+), 23 deletions(-) diff --git a/pistomp/lcd320x240.py b/pistomp/lcd320x240.py index 63cb19d0..94bf6066 100644 --- a/pistomp/lcd320x240.py +++ b/pistomp/lcd320x240.py @@ -85,7 +85,7 @@ def __init__(self, cwd, handler=None, flip=False): self.plugin_width = 78 self.plugin_height = 29 self.plugin_label_length = 7 - self.footswitch_height = 40 + self.footswitch_height = 64 self.footswitch_width = 60 # space between footswitch icons where index is the footswitch count # 0 1 2 3 4 5 6 7 diff --git a/uilib/dialog.py b/uilib/dialog.py index 6564af9f..a0de42c8 100644 --- a/uilib/dialog.py +++ b/uilib/dialog.py @@ -75,9 +75,10 @@ def __init__(self, width, height, title, title_font=None, **kwargs): decorator=deco, **kwargs) def _build_shape_mask(self) -> None: - assert self.surface is not None + # Viewport-sized (not surface-sized) so virtual content_height surfaces + # still get rounded corners at the viewport's bottom edge. import pygame - size = self.surface.get_size() + size = (int(self.box.width), int(self.box.height)) mask = pygame.Surface(size, pygame.SRCALPHA) mask.fill((0, 0, 0, 0)) # Rounded full-panel base diff --git a/uilib/footswitch.py b/uilib/footswitch.py index dee5d11a..0456300d 100644 --- a/uilib/footswitch.py +++ b/uilib/footswitch.py @@ -30,35 +30,35 @@ def __init__(self, box, font, label, color, is_bypassed, **kwargs): self.foreground = (255, 255, 255) self.color_plugin_bypassed = (80, 80, 80) - # Visual constants (in pixels). - CAP_INSET_X = 10 # horizontal inset of the cap ellipse from each side - CAP_HEIGHT = 16 # height of each cap ellipse - CAP_STACK_OFFSET = 6 # how much the top cap sits above the bottom cap - CAP_BOTTOM_MARGIN = 18 # gap between bottom of cap and bottom of cap area - HALO_INSET = 2 # halo inset from frame edges - HALO_TOP = 10 # halo top relative to frame top + # Visual constants, top-anchored so the label area lives inside the frame + # (SDL clips to the widget frame; the old PIL renderer let text bleed past). + CAP_INSET_X = 10 + CAP_HEIGHT = 16 + CAP_STACK_OFFSET = 6 + CAP_TOP_Y = 0 # top edge of upper cap + CAP_BOTTOM_Y = 6 # top edge of lower cap (= CAP_TOP_Y + CAP_STACK_OFFSET) + HALO_INSET_X = 2 + HALO_TOP = 10 + HALO_BOTTOM = 38 # bottom of halo, just under the lower cap + LABEL_Y = 40 # baseline-area for the label, below the cap def _draw(self, ctx): - w, h = ctx.width, ctx.height + w = ctx.width self._draw_halo(ctx) - # Cap is a stack of two ellipses near the top of the frame, leaving - # room below for the label. cap_x0 = self.CAP_INSET_X cap_x1 = w - self.CAP_INSET_X - cap_bottom_y = h - self.CAP_BOTTOM_MARGIN - self.CAP_HEIGHT - cap_top_y = cap_bottom_y - self.CAP_STACK_OFFSET # cap bottom - ctx.draw_ellipse(Box(cap_x0, cap_bottom_y, cap_x1, cap_bottom_y + self.CAP_HEIGHT), + ctx.draw_ellipse(Box(cap_x0, self.CAP_BOTTOM_Y, cap_x1, self.CAP_BOTTOM_Y + self.CAP_HEIGHT), fill=self.background, outline="gray", width=2) # cap top - ctx.draw_ellipse(Box(cap_x0, cap_top_y, cap_x1, cap_top_y + self.CAP_HEIGHT), + ctx.draw_ellipse(Box(cap_x0, self.CAP_TOP_Y, cap_x1, self.CAP_TOP_Y + self.CAP_HEIGHT), fill=self.background, outline="gray", width=2) - # label sits at the bottom of the frame - ctx.draw_text((0, h), self.label, self.foreground, self.font) + # Label sits below the cap, inside the frame. + ctx.draw_text((0, self.LABEL_Y), self.label, self.foreground, self.font) def _draw_halo(self, ctx): # When an unbound footswitch toggles active, self.color is None. PIL's @@ -66,8 +66,8 @@ def _draw_halo(self, ctx): # the draw entirely. Fall back to foreground to preserve the look. color = self.color_plugin_bypassed if self.is_bypassed else (self.color or self.foreground) ctx.draw_ellipse( - Box(self.HALO_INSET, self.HALO_TOP, - ctx.width - self.HALO_INSET, ctx.height - self.HALO_INSET), + Box(self.HALO_INSET_X, self.HALO_TOP, + ctx.width - self.HALO_INSET_X, self.HALO_BOTTOM), fill=None, outline=color, width=self.footswitch_ring_width, ) diff --git a/uilib/panel.py b/uilib/panel.py index f6a32cdf..59136a85 100644 --- a/uilib/panel.py +++ b/uilib/panel.py @@ -153,8 +153,11 @@ def __init__(self, radius: int = 10, **kwargs): self._build_shape_mask() def _build_shape_mask(self) -> None: - assert self.surface is not None - size = self.surface.get_size() + # Mask is viewport-sized, not surface-sized. For virtual containers the + # surface is content_height tall, but the rounded corners must appear + # at the viewport edges (which is what _blit_into addresses via + # viewport-relative local_clip). + size = (int(self.box.width), int(self.box.height)) mask = pygame.Surface(size, pygame.SRCALPHA) mask.fill((0, 0, 0, 0)) pygame.draw.rect(mask, (255, 255, 255, 255), From 41375aeac4aa8ec879ba4e5d6019f817f3bf241f Mon Sep 17 00:00:00 2001 From: Cam Gorrie Date: Wed, 20 May 2026 19:02:59 -0400 Subject: [PATCH 34/46] Accepted snapshots --- .../test_splash_snapshot/0.png | Bin 3934 -> 3834 bytes .../test_initial_render/initial.png | Bin 3722 -> 3702 bytes .../test_scroll_back_and_forth/0.png | Bin 3718 -> 3704 bytes .../test_scroll_back_and_forth/1.png | Bin 3725 -> 3708 bytes .../test_scroll_back_and_forth/2.png | Bin 3945 -> 3929 bytes .../test_scroll_back_and_forth/3.png | Bin 4021 -> 4006 bytes .../test_scroll_back_and_forth/4.png | Bin 3886 -> 3873 bytes .../test_scroll_shows_later_items/initial.png | Bin 3722 -> 3702 bytes .../test_v3_parameter_edit/param_closed.png | Bin 9030 -> 9467 bytes .../test_v3_parameter_edit/param_dialog.png | Bin 6365 -> 6747 bytes .../test_v3_parameter_edit/param_menu.png | Bin 9030 -> 9467 bytes .../test_v3_parameter_edit/param_tweaked.png | Bin 6391 -> 6771 bytes .../test_v3_parameter_midi_change/0.png | Bin 6299 -> 6602 bytes .../test_v3_preset_change_plugin_update/0.png | Bin 6565 -> 6948 bytes .../test_v3_toggle_plugin_bypass_direct/0.png | Bin 6467 -> 6836 bytes .../0.png | Bin 6063 -> 6448 bytes .../test_v3_preset_change_via_lcd/nav_A.png | Bin 6063 -> 6448 bytes .../test_v3_preset_change_via_lcd/nav_B.png | Bin 8749 -> 9154 bytes .../test_v3_preset_change_via_lcd/nav_C.png | Bin 8772 -> 9180 bytes .../test_v3_preset_change_via_lcd/nav_D.png | Bin 5893 -> 6288 bytes .../test_v3_footswitch_press/0.png | Bin 6247 -> 6615 bytes .../test_v3_nav_to_system_menu/0.png | Bin 11971 -> 12289 bytes .../test_v3_startup_snapshot/0.png | Bin 6063 -> 6448 bytes .../test_v3_wifi_ssid_entry/main.png | Bin 6063 -> 6448 bytes .../test_v3_wifi_ssid_entry/ssid_editor.png | Bin 12495 -> 12825 bytes .../test_v3_wifi_ssid_entry/wifi_dialog.png | Bin 9689 -> 9974 bytes .../test_v3_wifi_ssid_entry/wifi_menu.png | Bin 10355 -> 10748 bytes 27 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/snapshots/test_lcd320x240/test_splash_snapshot/0.png b/tests/snapshots/test_lcd320x240/test_splash_snapshot/0.png index 363989f6957b1f41b0abc136e0af95c9859057a2..6e1901a51e575888d6f940cfdaf5e835a274c39c 100644 GIT binary patch delta 3576 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 delta 3676 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 z z7V7_6be%*B4GpCp_(XDDpEcGKl#p=SS?+I-U_vY=sZC8!`={WU_`OqYHDR2woz+(D z5g$K(r0%Skl^g0Po%aKEzexi^*(f-Y`XiDXx!ofu>oT>N7t!9%P{k1^Ub53CHE3&R zr$FDRah|ByEYh0m`cE?3Le4fcG&qlAO=_Le)VMAkh5Ze*21?BPkc2$^6Yde5z$QP3 zkk(!V4Vhic`!BBiLmhEDS6FsiC`8=!;|pSQps1)Q6BE;PoeOS%7NO;M9(f&X7~00~ zy$omva0-5n^tkJiyz=tYL+TDDU^{vN&+2!zIX=wUZ=c|6{egBUCs}P1ZQjSE$N&vYxIb#oPky8PI&Dj7#HY-Sp@7 zb|b8@`|+W_5iA>z$1ijzUSnt1&Uq*=BC=8bX%^7U+S(dvqB1cqE-pU4yrM!(Sh&$u zN`zg*%gf8k%1TA0eRcRfeH+Pg5e+NSLtBCr3_3N|HzsSkx9smrOV9Wc19OluimD6G zU-+59vKJQ@gM)*CME;y<*jY$a(uTo)C~V90y%`fLSvdA?S^A2KjEqE7^iVwcrzP*dk64nXq%r18HUz}-k+Ki?5eH#+>G08r>6aEp7sKW9=? zuT1!6%(*Z~G+t$8-I{W)6g8{E*3_h+dZ4V9XEO}+1eKIdreC#~e{wZfQc@BMe|9HL zs6+~}_Yy}?bo_R^8x{HI>60ojrG)E|j=^N|1E8FG1_mBY)jD$;o&V+SE+&mH&L3DG zD}yj`q^6{_p04y0Ec1m%^Ny8zN+kF^5|B^U9Q z>zTiC%e`<4doEOC9YpZZEGxduj7dsPwjQ^-9lMq3rJxhr8CHI}nUW-9#jyE0+3WK! z@EsJ=-5%tvUa`Ptd%aoGZ~WX;Pq^*%QjHr`Yu>-L>l*cfbSgvXi6qIa2#?{hKJ7~C zi0cUaRPLZA(cKOi%o!y)YAp$E{Qv%{{^#tis-V-*ahmF4K+(Lia|eROB87=S+bk46j{e0S<4m~`;vVfN>N0SrHIHf*=5aGW@HOl z#~y}aMs{Wx1~YfMzkC0=f86`WJ%60nIp;aw*Lj}r=ks|#uk*shNEdjP?<@cS0P5@A zHU$6}Zql!}PM@Hksm9`}007$^{oA+9Lf)^>0!_}lczL3s8qBCZ3sUg51lkQI7l4;&>~jq(puan6WCW5 zxRb}UQ)F*-y-ER;@|PszA}1lp2kZ6XzEK#p-lH0ufcJAw9$Z=F6vA0g+ zi)J+NR&*j4 zwc&`U8Yz@1V_{$Ew$o!-y`rY_V}!g;U3#v1z{xvzZdk5==TTt+h*a?)hk;uE*?(bY zEbTFaElx2vYj^AH2~YXp)8xp!SDH;`c7;)i%`l-j{TZHvvFrNHP%h**kEo5qp!?E& zy1L*&)#JejZozwn54?zOP%gOU;GAMU2ZJ{tnscj9ovJzWshv)2{L} z)^Wn??d0l*Ne_eg&-%fxyTDQb3F;wKk3bi3p?1h-UU8lOm9VGk#5I+Pr`Fhl#hO<6 zGSE!^G6|jb`c_KvOy^_okaKEP!|yF0_8;yDMpeF2nI$~7*%QE`@87KlTDC!tdPJRrSvg3!lIL;X^zKA5Ruo!qc&# zBjMA5h1K;=Pa_&_)2SIp2Xe>CTT4NWlSRy%Ohv#`!pQaYR!-$G7q@=LQ8@2 zdHYvlSdE8qk04d(0xqmEdF$cVv8?7q25PtW$bG)$#|+QTIoy13lE>t&o4*5wX7!el z(d4IU)dABDhRqu;Ha-0GkseFOcedu-U##&0BYDiH&g(?~sS?~JVU0a9gUGYNS!2;Z ze9$eqxtIlCc_pQc^mL=QGHqq)^UNF$3S~BpJ8M%lv0hT5qRZ{<8ZTeGc&8e=Gx^!+ z;>C;WL5Iu3`9Kdq*mFQW3k$cDp`KpI+UM?8DrL2+tE*cuN>y1|SwbR#nT3*Ob;(dY z0y)G1mX@TzPppGaLU~75}0`d}CuH5C|03O}Z{7=H~6K z9!6Sz$ty>4uOt#I&CF`+>o?|FAVNYPo63D~tt}`DO0(|Svu6ql3dfDzB_m+Fp6p7u z_F+be%W`u5Vl}Y*!IdDQ zq(mOGv~T&91lilf*_)ZArl;=>X|Wd~k;a+wVzRP3{Ytns?*z_khM!7SM6X1eJ3B9Z zdGyOu@xI2UM1+8vuOOS_tTMBdq@-HVnw7(Ro!o)5voj=U%~z6u$Gc}LhVOY!ylRhQ zNBb@HX4oTm`T5uG5f|SWgR=*QhK8gX5G$j_!MMl?|9<~LHKZFKcK+fpWB$aGn3%hF z??Md>rhinX#b1|@fEu7E)^H&sr2k-!TE!9;X$;{{GS)aI?JNz9K+Mg}ElL%{S7LkB zW^Gb^C?M;6=xB$jsg;$LiHV5?^Wbg{wyLX32T8m)oQ=oh-++w6sG>r%yBM~(U*YJp zK;W2s|2N@<zeq4 zghQwMUwBVi0qrBUpY_9`Fjye@b6>h-LSo`+9=P{PClsqx|X-Un(lR_qP_r#Kb^G@3(rh+cgYUe9btixAP0w z0NO^vkM5nL-j@4~a=>Gvzn+%Kl{vvG`Vzo+Rv4q+JCg#YcUe->>sMDIVerF*yd)Sr zoeH1VJ?EgnV`J(_4a5`>3g?+!kF^hJDpZ%>bk-=ZEA3Jnb0U9Ch52ncu^ zK({S4Iy&O%6}`Pzv|@S20ZXp$nPWF6>pUzS9Ua}= z+@R3DJgvB#ke@FmCnw_s5tC~{ZOlWAWFIO~#dk z*_uiL`x6E(Bv-al;t8io81b~xN3(k!FE|4O0~NCpGkk)VA1@@(_wFZ8>b-s_I(9tQ z6^yK{t4jm*O#JClSL*0ztLs^cUIs9jZLMqatT%bj2*aYxUUt>VV5Q8qX)jqJ5voZLc7SDg?%$ffF{`(EyEyMvx9Pr}a&je{ZR6vidDTofg#hy1zOib7!7z+za z_~ClPB{toA_oick7lr7obaX5!DLKo+5>?AfN2R!UNp5a#YwI5)M25C9pXx7wios-} zgUq*6z=!0`U^VOA-Cg?f&<(-Em991{KzoVeH>s)Td3cl&NBgr)!BM1P-JYHvRo&KD zm8xlxKvmpEgJWm>gZ9|a&jm@V=$mx0b#!#JwAv*qn@2RlV_JnV2C_v3N%zCU!|7NJ z2q5*>@y+Sd9Uq~8$vEZ|FjM)Fqq%t+!w=2MzjFc7(1=?2`s~h~JBnHBIpG_R%+sAu zugB2UW|b;_^X845KmNN~_?|L<5_vAXvbgy7T=?ek{;yXpegurn36nrF@hL0wzdI_SznXXnrgGXFHGvB1d2W+p`h zDl02%sIrl0w{STpZgwUPr)OlOxGJC0xer5; zv5q$$tVV0J6u@{in}Sn}co3HlRzL%+xoka=h$pP=8m9&`^|`q-{WZLO&m_2Ivs-o82-OM ft^Za1)0xIz^%$RjjoY5@&%65CMz^x0ViSZHWy*dYeD z&1q<8b%6fQ^K`)T)KpTFhK2(Sxvgs%n)73d)z|Vt-p4J}a@0RmGew0lT^E!^?-Jtm z2>$et^Y@WV>uQqJVnJKaKS9SH+ zCD$+3Uc6YuCH_=w;2QH&(SfPfz>#+b${0%caUec_t?m_hzuSHXDCU1_ zgdpj8L1kkl9J3C{T3S2#>W-jpV1aDhH-($tJ02b$B2JAqw(u__BLkjn!xG?=NhlQB z=fGOK{y@0(e)8B4dd(HO4N`!3+s{b0NB2nSH{B|bIn!TCMG@{8l((u_+_ZeP0%joP zT>0Qq$gf^;tjYWgQtV81tmWjpetl58U)8n})I#Zs@b|6uU4ezu@UElx$UhwnXDF9L z_onbStX*f8-i))Wua+R=Bjaa^QJ~;F?0Cxs0TEF3Ft0jpDZQdQ5c`}s8e0B#EZxoI zrQ@y4DdF}akF2fST4vf{zQrk@lk112t0|gLB#&ej@6!E9ZdBo>gGSfwPxB8I6`*J9 zXSwN*jm@{-Y}6zZv)*sX`MbsMxSpNDsUjk#)Q6|g{m0o2jgUq8!vSYEG)ifS)TgcD zHTFl?!5wGs@?z6rpDTRA`D4TiP+tq{(b0z)qTKv$l>HfmB#ZPJm_)3uaJRqA%cCG+ zVYM52oHiBh_ zLG7YS6VkcBBNpl0GFjhY-;SeO!aehl3%!mKBkgHVw ztX5YD3aP_>3<-a`WEHZ`iWwT0`*}0W;gaQ8UkcVGq;Yy7i2UZwgH4YKE7koZ4V=p- zRG&S57(*WtOzf7`3iYw2(Ur&hKJF44SkO^xLH2FkEy;|GU zoHS@|$WXZiPcmIZ=hxX~_Bx*2lMZvxab)1T&qvG1?MmX~`w8ahA<%HEa(acSfeDF(~nnOz06!a}DH&zW5t z8NknIDjfIL#@vSTRJ;N@IyyiRyJiT)iPrw4Qt-ytv^1WIG4-%r_f7${od}`%={Z&& zQ3(m~(Mr(_V#nCXi1-+z#dGmuN_I9e?i@9qKeg`Y9jmRibyPMK z!1sIl`X5iJ$8P-@bFJaJy1D@YJH5%*h(scpL`uA(rWkP)*!KRIx^HD=6%rV@G2N!2 zuHIT&h9vqQMvxKZ^)zsAB+2cXQxl|o<*ri z+u7+c1)hgI@-QCZW88l(#20Y^Si0n7GdsKKsfa2|XBQV2&$Y1`#Y=VMAK||?{G{`> zBS@|d5vPaCxw(U1G#VQlX=!Qe>cC}_Bb~RcO7KVGo=!Jzh=_=&s;cg@?C()JYXQk{ zRGZJaO-)Uy5~i*8my`3t9I^+3r}95^cB&XFZ5ybDMJm*$4CZRMVafU76gA@hIR;qx zAE?lKZ}#;c0%D{jCC%c+6%^_U3JQuAJn!5)V5F;zX62P_j;;~$-|Ix(?;p+S{X6h6{Rn zdgeM~N=r-gRsB9(Q{|nVGv+rr6%;(Sd_V*)} zb3+F6!8IN>Fj&rw0fMOr!Bf7uc<`Oa2(;3=E@acr)&5YGE?%(g?c2WoerZWbb=0Y* zT$0>10?T!2>3$+H08ucMk)nS894!>RB^HDhQs5=+8?7}jE-w0BsJNBE$_|n&r+;wY zTpuzm3v}cep($9SHJ!^0*6fVwqfaHz*9x%x9=PD3!Ur>#xPHCY&wB5bl^s`dbTp&! zNFR}?wLN=ZurzrVrEIuHvmzB-@LzLb#1vcAyj%F3+qw#v&tLA8&IUfD&F@p*i}?*8M-^{f}q9>SsPOcLR)O zlqRj_JF5eS!!0aE60d4d+V<@%Y@UJi|Mknmon?&Rtta2=U5f4|7#bV51+IRP$Vbd) z+@j0>fKB$L-^3qR!&~rpBv2GUVcTZkxsFJtKid#2TD5d6tgJiR+dyy!B+DOT$tuP; z-??WYd7zgcEDbT1iv}hpPvCHJy$jJBJH^A#-{Lv;)+k-J#c++An>$DI&-&)((6!NW zE-o&gw!O3gS7LwvWV7Gnz`#HR0^#lL4S{?zz1ith*VWU*!^?Y1MJ3^?MiY2*fA)2z z@~bZlkt^krcIIvXF%xf9l$WpKk10F57Q0dc0R?k#u^@8`i^ylsdN82&@O=sfe5xuV zld#`A0hk$AoOnDzg;vA(`T18nQq&XA&aJJj)i*R`XJ^}o&Yj!T6x;>T{;eLY6^Da+ zdd|fcfA03$LPfx@o#ks3k!km2dFhVI(j;2!Zxw5enanA zn68pB(r9gQd3gwM-cX*_&FmkMoZ9Z*-fhPe9GJRm0Wf5=$3qlQbHsq=WhU!@C5OW- zAFx|09g+=r;#$Z|qtofdO#hvlt07`yVp%0EsBREGlBS|#Hbq@_XL-of$S5Eph8Z7C zQ=|`ssHW`~>95ODt*x!0nTSh3)*p%m0gAN)JOoG>dU&XN!>S$M2jj?>EmsPmz;ILA zE`8h|(_{GQ_q(W<@eb92k~pA?MHTf$upFVVu&}H#&!Cfw32Z4e*^NO2)*O(>0=*Z< z$2w!=TY99hjEwgM<4%9y+Kk zsM0V3Kh;$lv8Q`Ia}T`Xg+yPCRTy JTF>FxKLL)!`d0t| delta 3538 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%0D37hN`87lXW)J9!~0`GkTq{a-=iD)sq|QOe)jT z`qs&INDUN21(n#n@atk|cN7e{8{3{3KdB&Pt6;#*^Web*qYxvtc(~PIt(C&YM$0{d z%2lWnUiu=qNNhD=!u$#}ebeE4XPz(ozdt?x$Ft|R&Pxt^O1QsiGPwO;6SdX#)yh?D GL;eSrP-;;C literal 3945 zcmbtXXEW-_N_^|Fkf^%)rY40)Z}@niyDv zKvcJZ`%OA(U_7&w)C7T8o?ST5he1PD8Wm;3LikRAxkRT;R4LdKO!?`p|1}&k56-#GvxGu5Bbloh`b^Ck%@ zNRsC*lU8+oO|7>9sMGVfoLK%bsr14d81buntP_t9C^;EPbi?-KUiNtuLMn;x%N_{& zD=QW`uAWVHuXs4`Pvs_)ySLx$I_J51-_{Gg`9N)c2-kYC~-T+l< zEckQCTzV|Gf6{`(TXlcfR=9rs-qf-PZ#AYPT&_XjPYDuNjIhfLhk~rZsqcVgeyiEq zu@S!{I|XBNuAwmc_0aWP8+^*DCw*3@Y6ojvl2wV1(4A}iD~IZga*(BgBG#(pS#`@r z+x#Wsf|fC2;m#GzU#Pb^#UHF-n$f%bYzo%XuMex9wj&9-D;fEV&3>k}wY3esxM_C= zN`rX9l~uIdT(}H1Exnv2+xPOKIi2v?j5|3NC&H#Z3HSF=$hgN*Bb3E+Q9+*3V=kR@ zr`_#>f)8JhiE-EwM#Gh<@l))$-AUn5H&qnzB099`pfRISX{B#iS|Wd(ZmmI6vnO97 zy0N&Vf)je0u4-Q(F1eaFqDGOTpIb~MKiYptMYi;n;y`PcV541)N(c^wKG(BLaHW=? z^l;Sus)GfBuaX_YF(vQehR2eKr|NT7C$wC6#j0(ucTN=-MB{m5y3MwnCrhI1NQctW zUY5>RiwJ>dAdQLFPNm&%Sg!}ikyOvqpr<*yi3SeI>LWWV#eg!l+=n+*TB|l*lLJ~==5r_R@cAA!xbyxdt8Ta_^oR2W($J-2#Gy=% z#Q??fp}`UQ1v;ln)<8sW