From 0aba35ccf342baa9c5f262a93cb542e56f3ff409 Mon Sep 17 00:00:00 2001 From: Yoshman29 Date: Fri, 28 Oct 2022 00:36:19 +0200 Subject: [PATCH] you can maximize windows now + messageboxes --- assets/images/desktop/ui.xml | 4 +- assets/images/desktop/ui/captionButtons.png | Bin 11114 -> 19413 bytes buildnumber.txt | 2 +- .../windows/bin/assets/images/desktop/ui.xml | 4 +- .../images/desktop/ui/captionButtons.png | Bin 11114 -> 19413 bytes latest/windows/bin/manifest/default.json | 2 +- source/funkin/desktop/DesktopMain.hx | 12 +++ source/funkin/desktop/editors/HelloWorld.hx | 12 +-- source/funkin/desktop/editors/MessageBox.hx | 73 ++++++++++++++++++ source/funkin/desktop/editors/import.hx | 3 +- source/funkin/desktop/sprites/Button.hx | 18 ++++- source/funkin/desktop/sprites/WindowText.hx | 25 ++++++ source/funkin/desktop/theme/Theme.hx | 12 ++- source/funkin/desktop/windows/Window.hx | 60 ++++++++++++-- .../desktop/windows/WindowCaptionButton.hx | 70 ++++++++++------- .../funkin/desktop/windows/WindowContent.hx | 6 ++ source/funkin/game/PlayState.hx | 8 +- 17 files changed, 250 insertions(+), 61 deletions(-) create mode 100644 source/funkin/desktop/editors/MessageBox.hx create mode 100644 source/funkin/desktop/sprites/WindowText.hx diff --git a/assets/images/desktop/ui.xml b/assets/images/desktop/ui.xml index 041e07ab..4e5aaa3e 100644 --- a/assets/images/desktop/ui.xml +++ b/assets/images/desktop/ui.xml @@ -3,13 +3,11 @@ + - - - \ No newline at end of file diff --git a/assets/images/desktop/ui/captionButtons.png b/assets/images/desktop/ui/captionButtons.png index d5e2dff2ad5ff018312d1642b15c54212cac0b11..65fead0bf12fae265aef3f44f8040c6db1e363a4 100644 GIT binary patch literal 19413 zcmb@tRZv`C810#a5ZpDmH16&YoW?DYCG0}4<^LiPP=^?nt>e|f)ead$GjKM)*c zv|T=YK<)YO`Z(ZFWcJ~MTqsaNRNZrN#}Cd|{rm0Pox)H)52ow~EN|(w2x6o|oez@w zgt+P&urF23ve-DsDw?>O82b8d-z)!y8R7Y`*y!e`eEvj^u1Yh#*Y?JDw|ZwmJsO8F zbhw5FbHlH zz5xp|jA!XVUi(XP?h#DBoJeXHl(ghr7dX(bn&CK|hPWzn_T1fRC@ zab@MFqnZ%L22Je;eI zhuFC^G&ng4iyXe}HvqrEAb*7xD1Q8Bx3&(dR_e!wxCrC;l;K|@pW%Yo1S^dhVwz`@#>%h-$ zN$A(hKCSo*^USry@j}@UrsMe^WsVz9 z1s^qjmW6~NJ_OT;SynHQM0N!E^kL4tY$-mnnPmHW=_|mD-}^?QyIv9-An#k5HYoXj z1@nw0xrXvtOVucc#dRQ{2+SLeTyAZec>6*n!;m_Kv$I~VNAZ4TyNNgBy1$gw4Vj?s zmv3AqWX@dJXtjI~P4UmO%tgtp=5p5ma;kGY04EZ<6l68rbPt&cIwA3MbJ3F*Rh_*? zaJ)UH;#d70hv;BnSOEq<)9l{T;qzTS6b?CDe2C&4F&uBQK+p`&WvuOm_YI{R= z3_~i{>vB5fX}ay($Y4W}Yqv&bjpcm?*Qn*y##8nH)K=ghcUj=T{F7)OYjVTO2b^>Nye3=HiMbWh z?nEr8m7sA9Lf1l=Gizb}nKo5!4^>WVrtpZeM;H=Sv1m4I#GE#6)nN0Kre2TofYI1P z@0D&r&o~$~{f+L}bk_`*iV6kr-=U_?&5e+V6E zP$e3hv*=IOO)Mnu4Tpr6(|r=KA5&N4`|__5y!pv-W(JYEMd+|+Dcb9CLvh*F9kG2W zXDjyZ3Dmz`PjgMcAt*LJE1^nCO@|60E57We+&G3N=xm~^a7#N%@sb4w{s}c)g7IAX zY9`u@I5HIBN-<1q23iJR&$?fvQdZdD`Y(5N$bu)9<03d5?jpujet=NDFnD?3M-(~o zZT?k~q4<@X89)5CZ!DcRdO8~D?b{v<6WE$#0AUIQ>BEPhK^Rv_FQ_p5T|F*-m= ze8?3O_gM-njjp@c{|ej)wk0Q`stXwk?Uy)#fs7Pv?7C#|7G)E~-_H+_FE=p4H;8zR zO4z-XF%tKbUq!gs>=ovEhVU@IFGfe&c|$91zsHiOWuUyI?A?Jy_GnB?zh8(g(JH$g z=CJ2xARlx=a9ABnOu`t(sb1W;8@<6D+-MI05h^m_C;WrB&c;ZSF#^xc9#dt3$! zsh)%z#X6BI4$+a3R$*)0I(^8ONqguHq^xhw7Kkx~_5;+29S#9pVJtlOcKz}*w@PQS zJ?Gj6&%O?6_XZQGtBvokJySwRx4}0+0VGl{{BIAdtE-PAFbHfVoqHrAj1fSXC3W2T zBM6y#aHneC<_|+n`*`ehdj($h*GC$#BEIo{+A;+4y43*YHDd~1Qy=_asOyWgEgC!#hReu=ECY+#@Vb`buS4^ zVfhQ~8f>sYoWk4CHZ{$EPDfniPn4Gf@0kQt;*YH#KECY!-2{xgZz;ym! zb#))*@0+w+=igL$ns==RWoF|xXU-QhIOPEeXpu-C=!$qbJ$qD-7GQ0egXOjdOF+hNWkN?Dkv0sn&;8hB@r*+9WJ?TDIpqX^bcJLbd z=3;Xue0Jme#d9V-ynB;HmcqKwaCpM8rC!&h@Z0ZO(`wZqjL#+t%?)b95kG@nFk7e?F-jdkN%% z6^@30oPw5C1{wyaFY4|)+VI)?$~oRaKyHX0orONf9mM7oO+}+s5sP8f`?|txSWH2X&g=^$t~x<4O+r;kB?r zVo~xQObB#Bjo2?lcO*ew*Z@2JYV_L-!5>zs*n;^HQ;zYE1geE#+A&t(B@##?h~|qi zOs`<kAJFC@Sq5ziXJVLKjNKV{F5&BGJ5Q-{XXW%1B!C!J*b*x2fvb(SL)RM1<-FqaicvFA8?E_|DO;UYEEl1=<999cS|iSEE2Dmd8lf96AQNKR}vZp*h0XjzXD zjOmGmJ*+AB=Q9m-n{Lu02hJbwG6*`O)T)<)hj6`CYB1Hd#1g&K*c~szA5Q2q&Xs*1 zw=eY@Z@Xkw!r0GZiyJ+C?Vs4ziU;Z-TG98%4oOJ~u&uq+ zW9*4+{1R$Fe*Dytm=y(mXbw?IpG{L;Fx;`+vBY#@C|1`Ek{3ZbPE4X-;9A z@e=C!0l+bPU|bqEo{E7M@$(`eBJz9Kq@xQ50U=@4*oN4UNJ@Cw%Up`>{?d0(x<=rn zR7Kh+_#sN7?{OIF6)&QxlTJO$i5^^>Gn5>9F=)H7kNQUbGT_CxPYL3Vqb(@=B0AwcNM8!f-c!g10fCvP$VPKaDPAR2H$mH={VmcbQT$O7xkj?c;+X2 z{xw175+jcJq4sTTr*gNc$pq4l+tN@Wy2BuSIu8crx5)kS{|%qSuSU9LSwqoP$Vi_< ztGQjdgr$Lt32-KtO&ItcE#P5%E#Pc>1`Y1~WtLH__|T&utgW`IM$p5NXhJXA^l>GO zzJGmU5=kYh%8zTzS4yu@gUnx72PaYL zMm?zEYng+?6Nws5Yc`z&9knRaiC0r2SPf5M>073x5OXblN zK<(MUJ<2mf{}7pRg8kvd`Q!dUo^9+W?W><3B>_eHF>)(zikARl=Y))V#OfS@Ig_5N z(7wKFI_K61{C4yyf|34;Blg`5Jr-?wlIm@jv)9jpufGHbDB%jQezCcxwl91b^{lo7 zLo(i4DV$o++UbNL0IRv|!E!!FN7*{l$W$-6?Ij-luT_5@CL}Oin=^z9SF6KqJ*O3^ z4>&I7dY^s@>lbiWp|uCdUIL<1QP_fsAZ0D>)+pSJ!i>xik$lwYh#5X76>K0mpDZkD zNJ3wRUr1E_ZacC%k0h(~9mG8Y?zt7V@xH3wxSo2C$3s4`*o>zeS~7wX5pF>Kx_EoNZaw~wZ=pNbW1y8}8tHy*Q5naNm# z*UEs(SO&hL0U2_5zc=wo0ug-(CY6DUwfmEeU{NmZIRa`jB$dTTuSJ>l=7gVT3_pvN zsA7lgl&*P?73uaoTz+D>{5L1%P3ZeN02nwn((JKa)-9H4lyd8!^i5z6Eh#dDKTJ0;}k z&YMoxg!c9!rw3F1H98ELnY=a1azl5#{XsS@$sE_b0-H@8+vMo*GAT&6*D#L-yz3uG z1SrrDG9Oa_H>;W1rbz3hx|~K@;SV!4!)3`+*M~2aGrcX965w`{X7Nj82zWHz>ltbH zD3#(^+V3&EJ~nNbut!J2ad}~kB3%l(#Zne;)m=n6h+`d&%;#>V{@yaFjtEm-(O~TZ zr?xwQi?Idus@#+BkA_x}B>wc2h*49izf zDayk_Gp6!p6y4qWRr=kT5Oj4hW8*`2yii?$_&ZtFV*o=310gM$0tqXdnj9in#!S$L zn$UsDpI_;ZndV@>A#>bPjNLAbm^+-y&qKgnF1^EHx@mIxo2!FsG%llInP#+9>2u66 zlKKqHRaizv=~7H;(a8uiY>XGd{kh3Q3uRVVEFG}f^HaQplcjZ9)OiqBJhsa#F8MAw zqELCe?(0e6u84o$A$g<5h=u;Lf$KrE1u^)Etq4Y0;(zI0&)^4fb!Qc4I=pD`=Y8Sg$g7oYq)$J=MxkU zT!XU@?p!$_nZpKo>YAR4JS~9cE&=2I2=-9+RZfQVl#FNQc<6ngv-Pg}qLP?DSGa1e zVDMf+!obHSFAxBgWE=u^I#yv9F-hOK zKoQn+2ZEx}S(=fwB+F060%SoYN6OmTzuO)BS^Qgh9yS7Pixr+{8|=lPv8xmD7F@D+ zmk!HekUq-AC@)4E+7>}^?yQ06gf32-Gh}~=OGAQr>^^G7b#-+3hLatfReLQO1r8AH$6!}?F>ua(QQA+*2U?5=Qw0`!_nt%wRsE?|DMhY;n z*(|Z=%Wz;fvjRyml&2=g_E9*UaS*-EPMGe8Q7B>87~zJ$@wP)qQ{ta7PJW)#rZq)H zQPp!Z#H+@PNE!AFy6T9e-*EMQqA>}bC*57v+&B}5^cy$cxja7W#a7+Phu+8!=Xm5l z=8Hd?71#iZsLAkEr#b0p5q?bOmZEa@Vx;P8jE9Y8yuvpYU*)@sNHhiB&5GaJ$p0O} z;!Z2f`ebRENj4}I+SNuA-`hx_ogjsqk74Xivo>x#xEyXnd_Rs@4N^qBW-45$e&xI_6V~2_^0wURLOI}AEe{@s0F-rhO(T!cm|1^FNhVr#%)9j;)Rg_Aj zsc(h`5M79LZ8L72uYH8vPF728K|dz_bDZWn*U%hF6R4-)w_RUi1@MhVPD2nt5@6Yf z_=MM8UAUKavS+W%si!PhPYVSPwpqU!GD6656XKFPcaNgP(t{7t0tY?N*5!OXRJ5C) zjbZmLK07LdNB3!@p|-fqaZzWeY&n1wNjjIo^O&;AZm3blQ^WwE0o%L?+cy) zKeih7pV4%p&KWHB_^jqLmrFg~i|ZDJ##_2{T8UJTG(5G~i60`nh&<(fT$1uG?)bY; zV~y@!1azq}l6yXm-J%O8-L}-DckMR44@wC%f8g&gYF@yOKQuy(tq&}d30cNRyV&v; zHKV$6Nd4EsM8;Poge)~%Jte&djD?S-m^TFdz4&8Dru;`^18jSDVtphqA8g@_oTmn* zML11{MQFo@4}$i_Z#Vbji79DJtw%&kIlh=_uD8og1Y1fM;0K%U?XE8;@l&Nlzs>b_ zlD>@zD`=fTaBsmC*4|;H2k|vX3FVDQIJ5Sr|I9p1O*MyyWFnr^ z{lF_!6HY>DUNPAy#C?*Pm9@w6>ZkG;r+;Wmw^$qI2SMei1Nk;8i7Qp$wDeD*snTe{ zE_d$RlQ>FMz)z|NB@$Rv6wV5m)FIPcT%uI=t?Uxlo5xU?f%fyHAJ1_YYAPzyB3U3N z*o~}&V5q#YepR;%8-$)H(X`7ssI74_*f5LtC?IgC5RUXsATB}t{L0%R576`LQ-lQc zGZ2JN0=wCfNzKOXwU?%V@mV4(H)kM#+QD}2Q30}i^nty@_t8X0;+qpMMfa64LQ%0L zmi8!BkLOF&3&Avn)i(%MCLNyaY`&bFiUuWf6)77MPNVeljb?yp|^`WJxvq z=%$@;*HgyDM&DeKqxBNvod)4}F(ee79 zP1(Hu(-wJLRupeIR5d&?P#9+NY9FiWAT>02_8%-;HMQPmJe>h6F;{j6oYF({J>W)! zaPUMa5EoHYjzx(2K(Xd{r|yDq?NfruH0_CcbbYE$F+q9V%;X%~bXX4E))R#Y4T^|e zd12)u*?hvU@&~J;0wRm4fg}})I)!m4l5_*~^fN$#X{ZaGqL?E=;tZ{6n_#3MNu;Ke zLaJU<909{jm>!p@^05FP^d(Cv5LJ0GF#;-w>OcrgOY@Dg_eGLFkRpm7UjWcOp6yG6 zz*|zd#>ea9T9*slWlN`3tOF=V@_SbovuQfMway;ttO|T`g+%}OflREhz-ezbAhW9z z5X7ss?=giu;!U5WYlP8@Yev7D+!re|Z&j_>i3|MAqOmxmtpk;Wqfvq~5XygRVh1nW zT}kV#^jMhvYozMN8cB%L&)-Cq-(XnQz|yFk|r zcNx5G3*L)oO95q-EjfaOrL4I8f^_p1n&cc?ZOL~}8H)09#U^tDL`@n+To@JpG3*+d zc*4S5t7lk?!zSALZ&ihq4kV>VjFISf;nkyj`%DjO9oYtU_X)~Z^UgWG`Kz2`60z!e zv)u^RFqlHLsI@pn+HKr`#TOtm%<$Pc%G5GENiqNc-`zdDxfs>_HDB!Y6<=yHz$utJus!v=bJ|1|Mb$_OoD_4KH% zd@U2(bpP6~A`AtikM%cnCepmm#<02KwO@CJuP4T%+XO(f);yaHtFG<3)&wZe@NOlx zgktBgP}O*ihf#&I>Nd67u`puen$cALajC#QjeFC4dr}dNV-A}~P>YRoJs*>u)SJRc z$r4fyo|_7kBBllo;N;l$m51fD_U<##Q1#01AEoX~M6V%1%7$kd`37Q-qp~umFScoB zeQ1ht__pfw8yf-J*nky*+7E5T;-ffN>f4*++4iv9M12b<+>)5ESnen*6-m1g)~_S-9e8G0KubI@t=GsXeci;8Ejr)_~?*b|k(FjX2rc>d;?Ve)+J>HK>c zo+wPkAR%%HB_O&j^D~pi?BXs1l3Wv zfwK^5wz`CbynX?5DAI{i!+tj(X?V4Gw+eSrSR}%&fGPm;2!OvGC_mLkpomtzQGkLT zJK`__wM{MNbHfZZ)=WfiV%!w9Lr4xJ$0D>f+a%&4A5TdH-s|Q&Te6w3geswA;ut_i ztB{&0{5KpwQLrTbWquhfsdJZ@dSi`g9bNxg1Mi)gU@X@SI#>hgrj7qPMd7UaXvX^LbW z_`&h2^V+~@`NN{oy|9^1K1HAn+=I0%Z;xD=b`)oG8)><+`%PAbEv<*{isxRBBlOmB z~#f)%V+71 zz1uJQ=DWSO>GAX7x5ndOGJjh$d&+!M0=%)xIW4>z8SZo#wG7WdQ14#PbsL%ad}i4$H{=0^|Ji^=RXNnE&`sJ} zl$#&hMJ)DlMp2uXVejqB^rXE`<1GC5@87nPqP#+8msy6wsv(}qfaHSYcz712F_HDc zN;Z#mM>99s0no(n{VWzNLl%c??8MUfNF2wR+7M&f+#Ys*?7)chH7}PqR$o9-VHE+7 z;d1C@Owy|*s!Qzu{oP^i8dj*h5VNzc8zhHu-f)LgF)$#l!as`3wE+TS275Kjm+1l| z7*lOQiNE%Q;s3De#(b|vP$D3h{(XAGcBW8F+Zvxdp&t!J@(%BB=*4E(3(8~pSsWkY z=F&R2A+MAPu&^)rW%|WRMv1M`JY{+OFWEG@his$Jm(^#{fjRHL3h&mCT0eC=>eVXZ zKwl!jZUugUW(Ynn-x4A@Y$2H_i7vz;3PECIafrJDeo4s30*Z&{%L`r^pnGX!g8bgY zwrjI{jM$F$+>v%>`9SVdGEr^u>Dx|DLi_mqesqPu$kGSNUns3c^Bxar={~m`p!v3F zV}bQF0*;Mx40%v&8VI#+#h2cd3yZMegfXYTbuvrOSE-=LRoaZEwAT7Qb z4nh>cE?_Rhz&;V#C^Zbrrj#PMTMRdx^)l;VcmA1jPr&jk?;R^jdg-r}b~{1~8)t)n z>R&#Fv9ZN6I%s3@mCqrWcr%ft0Wm26@l-+&?msDrqCY3Oq3^{Y zY#p%J&Xw3E=lq$TDU)Qg7wr4CK)6kRZ!easAmFr>Xkd~QnG80@sjd$h%Eq~}JLx@E zlldGo)B8u6b!*I9o>+hQ4^Nm@;*2nklv863V_p<`l1YUatB;<%LiIhVq`asqdOl}S#D2>Z@DS=M7W^8o5tf2qnt z4*!6}nyU%EN4q)Jh~5>hn~g{49GM(BmvZ9r=kq@<48S=J2%ydqVAdMr z**6twakf)I@DEs{G}zqq>1KqDNLG2GHsF5zQ(QS)Vz4W+hAu|En>!pah?^Cp{1+*v z+iCS4tw&++LI=@Sr+^WNnx3w&HuQ0Uo{?1|&Iq%=?}?D-G={)0PB{Ip2n&F-ZTt%Q z0LSl~gb~=bZ6uQQxJY$G{%@kEvNocjEZzoW4fZP|ZD>oUn906tM&UZ`CYrrZ1`~`v zl(m^glo_O|>#|MY|BKqnz7YQbq zE;b;OTrZ#Od%_yq9X28zkK2_B$#OM?KK!speQ5Djs|&pq?ajXnRxHr9WLhvC^QSX` z^v@7T>fe=?47)DdiVRTx%^S{>+K&=XhyBS^jSc4qeoy!P^ge^Lx4;K1MLNc zKm)00n&5jT))AEBiwS>O!)ij$3IqJO>?U7GS8O4nL5hMHwLFicX8Z`rFrp@l)#XlFo{b~j7;V&5(;k;_N<0ZY{Q-n)u8>v<2^&f~ zLpaT#8x+jp5j38EMxjkx=uktS=xBk7wimGi>7$ovr+)8!b_=J!!^N!Wj-3L(uFe*ZC5ZH0*Eft?gPHtP3Hog&l>@1TdZ708Jt=@Q!vM2qlf)EJ0z#{#6AZEZ&atE=V?wRjb`~wHFj6l8a|cQl_lqKU`p}CvHi#&gD~M03 z%9w`c3%2ECaOKHEfsjAtu=nWvVV+2tZD+Zi|G$ovV=*Uk+8XEmSoCZ_&L z=8yN9{%}1<@yslMJ@1{>-L%DATx*TFxVtfUpV>a)18>%_Z?gQ(G3jBmOR7U$O_K?n zhf8kFVBuYbRoMKraEZ@QQ0AWPsC`UB-7eEUl-OUMUl2#&P|Sp`A*Q#CLSDB-f0=D6 z-g%KjZBl4$w#qKxtW>Axsjp>{y;{Px@W~Hb`+jCyT5C>l-#duxs!nI@A6XzT1{@e+Bb6{c*c|1^{sW=3c)VMk7i=L~jNB-Vv z2YAuP@RU1EL=RQkn8%olze0UfHz7isUK^peGi~v@i$cLpd1Au56D@mQ8gkILK2j0N zv=Xyp7~DGtwG9&%Vew|<@rz~ZXDw_T8`k+Ag|TabOjlIsgje2?Gx5%<0loKd{vovt zH<355`@(+`J8V~|ifbtuz^b<{a)Cm@$^m3yX%-X*)kir63m0cf`8k4x-C~cwG3-=* zxTO>jWLkLEuuOIJ0;GmF?G}SOGS;5n$uzBuKsD3}iP&+}Qly1?jv!6pAKf0M&mH9% zXMWl?jceW*?gnFEak2MvhoC=lg!JtIRQE0Sk$T#>+gV$QgxKE^mpkAUrafSTDfjEg z$5DG()GrDzHR#uUv4OOM@!~hfDQ6wc93a08?Pl?~imTofAG}vz`?E%HR}q~RTQj3n z@fbpjOmzD9^F)Bf8;q*s)KIm&r<%Dk_8(UUM>3X?5QqhFEVETFPsjb@e>7Sp=Y<<@ z=Pf zz;+*LP?1W8%TV!t#~7o0T0V!x_sDP-l_>JhCpdU&xH*F{3#0$UH83J_Ei67V?8#xe zJf`yDYk>lB);uqk(-l4?Af)@dqlVlmbSWLdG@gVva~r2QznZ%5wbcudKLT=Uu*e91$9Bn*xd=pN@#MmEvS3~;&+&HQ?)TtGZFo20 zyVP3T2J&YDG5he#6u261TMeAp#^`gEc};|-o^~W6LS~X4R8w+OqYoNfKBi+nV&Wo#Xs`0Woy>ME+F)k}5tIIo>X9eqDM*|$a46)!3$w!cM1IP&@^#&vKmn<`&< zPr_Wy@~u5DUMvKk>|Oq+2D86ayhxWjJBU)VJc){J+8p7}yI6}=+yAkeL~V0sR$NsE z5PHe7VVo@BIE&~7m82yNlglLKpsHm2!)_(%?9pwk5_t46+f>cSQ-22Oo< z9t2(b;2p2m50bp|HQaq&wHhW?uxe4l>1s@Nz4C5We_{#dbeZ9rpOIKzZ(?+}g@;V2 zt)DjeGT9#H^r4_r#@=F{(}>uIS4}smp2*nvmXSoY{W)jGX4=JU*MY3$>&3SfjN-4F zQwfGzs^~C|RU}6PAN9meR*Kaz@)r$8!QYoan!36Hb_Q=Y#ErBgL_cD)(gY=ohxZn@5y@Ud;D{Q*3o|3j5U+SB!>x_E4?xfB#+ zvioTIj^1^Y^AKbONPx`7#|fNA-8b#xg%9co_l!4%oYRxYsLCCZlIc=tq#gK3|DB*1 zcj6Ruv#@9}!*VsWctydsHBhrNIv6Osv5A*_9IG{UHj%^k9?V2G{mhrbm|Wa_eaOgJ!UAj`8>79qmt)gT z9N=BaEj3~z@1BNdkB zlpy2Ix3P4BWZHSHo5RQTY=?j#i=h~yQ?j02km;x1Wm58l5T_yfLSHS)ZVBL|u|DUATinIT@exAzPwIQ9_cn+zNob!5T z_`n~}QFO+R8)LrjeUkBi-i$%p@DIgzD^W~_zLD8@Eaa1{O#;MR!Z0wF%k;O}k4Fq2 ztB%6KV${ajtC2ZOq%_Mq43Ic4fe*hioB04g-o-IvX*At=oOtwK)5V#f!d&>~*H~?Q zoy}gpySY;p&gu#{aol_;ToVNHyE^KeC&Pb0^$&!Cv^=2u%Z32N6m6e&xp zHJA{jHqi?25ZT%e{t}uF2}DL=2~duvX6~_|XwTph&G_KubDDLL>URukhdGBEk0*-D7eFz27Em^GAl$EGc! z+j;?hP#fbmU?s3`-z>rWTOrzf!RJSoRF+yl1zCu~B3Q4kJ zGvozsZ>D67Mubbc0^ZbU5LHkKz`wVo_Q(YC{J>`cx}j$pb3Kj=Z23Xkf@Lqx%x|_l z{>6@wVu@W;2fRCzt*Bjkb$yhGDzeVR_dQ)r#398(cN%q0udJk%+k927DgUzK@1{6; zit&=L$X(`;t*btU_ag00Sq5TH^O%`YzVx?T443Gc?eeqvexnh*WL|4RQ2`vNTs;fQ z4P|i_z5n-IW)oPZ$D$7$&%`3ZIhlHOp2sEfWlP7uQ%q*7;BeoQ$XJ`SK3q@YXsbNr z+c;xbVg}3K0%m3+ZlsfKTBqoP0In7)(aqJ{9Gsycr}q{KT2!p?{~OCSF<^k@G;mV! zZ>pj6-#27?%-Si2VC0}}454gH^@<0-Ro^(m-P@qaN#)p4M?MWfR@Hr3X_Izo@ZuS) znyoSa8F$Vbdeb~4R>rx7>Z7f8Ahyfl@@VvSpx34mDC}QI$QRp^)nK->k+Gi@{+Rf) za@4NRJt!o_RIOD$liN$J3EvP#P>hVVua>h|2@Y+le4Yr@+nu-nlXT53*!w&(_Mb;* zpR+6^1C_MZzp0cDV%)iwmH#U7rNpML$pwtBWj-S@4aDV|Lx>rj7U|%7p>>7=MRg9 zn(t@OWswB+7YU(;%ADUo$}eberyW!#D$hiTesPWvG!@d@1H|=(f!=i^%7>{jE-w5V z$a2nWE8MSKp?7?VtcHeW&5DGZkb)G+^GL<8j)2gBmx39xRPleuxpwIVhfHn{kuw5< zmYq^lV2qwmB{cjYwGmGSFv70||4~%223d_O(#u4oY9LOZFUrf(x4`37h~&w$|5BX_ zfUZ>M+;{tBWCH!dA4Wg*GHnI_p?`1l`hU<|&Iy)THqA#F?|NyQI_ngbaxm~zD-vab z6c=y0aPWfOS0T&%IuJ4 zh*3xKJt2R!8}s{GWFKJ^bEKbcpsf!=`U z_9{l_9gFzP)hEyGn`@5m!J!IKK&~kkdq}5ouQL!D(d)CM<1W8m;{oB?ER>keH3_Ze2A^-nOU-afWgOku*t$LBe9{DIE6Vzn zC83Q?)ivg#UfA~tmwk956f8N7vso!$^Rf|tTvCAXwtWssq*VuO@)&Tee~9@#@T&{D zIO@r>fyx?U=t_dG{d(jJ);Dyjv*Lx!uMBhi54%{*-$0D-I;BH2<+3PPb-bbw3y9YD zA7n;3|9vu8&XnRvt90js2|PO~nx5V2I^B$7p}~@z@kBDycl=uQW`UT=2pQ$}u9VQD z{{?i#lJno+D$tc>2kqi~<;8rmrw^`(6)SQs8jlW%K2muYeQ#BGHX3t4Q7el@f48pw zC(w1Siu?ZwbQOZ{)d**5l13kNgTSG**Nu<%4?JsL7x&R6n#kQ`ntOk3y5}P3k+tZ> z&!@KQo8xm1nEB>A_6ZOb-kA4PT~C#ZKN>@8$@V6$+m)J%9q15=Zdo3qq@^8G2o(tD z@(xp{oY?xfMWv3wn}5FCpU1KVQaq zc;}OS0IS&K?|gz*S5DIZQ=V%d`u{i2bzdIwzw=xMqdy(Aw*^F*BPb3X0s^PjL$YNS zb=qNGR^xiaVBXO7Ghmv0k&q;ax6CdxzO-Ot&XD;{>SKTcXYg4N9>=V{b@W{~tNg#x zT+{aB9`zLOT?k7Ig#fEdUNRmfP;Xby0yamCknFCsZH-`iSLg^cuo`1i(&J<4U|rjT z5>VBRn4ZCA@^0*`FZPaFL@$o1F1+J$PC@2z>WL3pCRMEP8cjG=>nV}W7Hf`To?^GJJ$0`>##s54V4#sa^AY^zUC)S@Z?nF`WT_kalbm?8G5Qiw_wSANkl=89!u6!XPKnIIYM+I<0C;uX&bZyR?LN#Db%s*2kF|% z+S1d3nZ5wVCvfUf0th z`MV+mD_t76(`Q7x1(FdGht!Ru{{nGYnTZODT6mQFK~#Cfq^`ijl=RKDU?HIUycVAp z**;N@9!TQWgF3@05WmSPlkQ2#FD`LsqL_UL-04EWjNw^_$8gt5C>08!&Adv`fn5>Z zce~mDCF|RAe*QwB=HuUIZ)!4OZQFQ2;8|KKv69(T5v#!XjdsY`z;lU&8W>cZNXp0M zbr-yb7bH@_;k{P#!6DH@)VrCutyzF=XZ-uW`kJrqa1Q%FiVl_AvxiXAdzj~Zr%x0S z6?VFr$qno~lPS)E&fz9GMnY5UNdm`~2B{{Sx~R%gd-U|lL&^CuUA{Ld%KkNWbb>Q= zCLiuRWzO*Z@pOnmux#A=pe>}~aNd>t*VwGWm577B)Q<~w%-Hu_pVEI>h8(Ra=9fNj zyo#7?PxD5rg_2BAEY#Q^2wwU`QAzOcuPNJGVK6NXQR336P|)g22{#1Y92%dw7~OQe zm9}O{KD<+y{dpormJM-aJbJ`5bB3O1g7hX*9Nr|1cC9}^vdi8zb6tve1IX@&4A>@yU%Wl+_=cL+2Ux!i}Ryo*bv*i1S_4_@lf^}U->DPRZ;Y(A`2AOMIQ`{`m$ zF#$h)*}lKb?hD0)^5m9CY2x0KLb8BF^W{OL6~@QDjWBqY(@=KUC5* zp%C>%182`A8K~{tUmlJ3k!5){!(7Lyfl~p}BA{L(o@#hgIFEkNM7{Bfdu%YDy_O|^ zc5KDm%w}Fv%YO~1+Wb46b3p4~bTVmkkwE9%NV)f=RIDS?LTgU#V);`fSv{E=TLYs% zpnf;wCllz4VOec)O>KT8s$y2YCO7z}bJM4q3no^|Xa{31Hp1h6YYTR;Wh?^*K8xS* zi%l<8K?_l%g_y&$*6PoOjtVQR_xLh7Yk>uNiu+E+9QZj0Q&qKKO%a>DP49Jo#Sp_4 z!W38Dxr&wG60YX_H%00YABg(DlUSw=sr4rZ333zrzpJSTO=0~`W*WiJiY48?+S_1j z8Vk{Kq?Blu{s8W|t+s5N{~99CzLTc{?C(m`H%$;hugffG;_Pb5G5|gtU|PhcEJVIR zk9g+6jz#c~f%I}lIc|NW41vFS;*fxf_bYrN(<_z6$d)aWK7TI0c|{T>B6dGiZPR2J zLr%98tdY0$YoU#dxR4kM+w@gY@NEHAedhjubcX`04lEWMR>H8Akh;#|ewe34cC zK;l$2V%#-oY3wT$=1-AGruFmOe`Pd%4v25!DXe;DF+>;evU!lrCn{8Pm~LO|mnZ?5 zP#E(Hhv>3@0}a0I-p=p*Q^h;~q{DFs>#}_QDT+9bWxVb3MzO5oR+a?>c$ZU1N80U@ z^-nWdv_5(4?;Vy0yT2axv*Rhm99@2U{|^jn=qUro=~`+wGFB&7s6v2@-nO?bi$CUB zIiB;7A5r{CCV{3)c7iyf8c%}`rB0jSF>>z*NbxYFx}jd0KH0Nvo+= z>5w9##s4Heas&{47FF$0Iy)vnuEJ--)eZ|0w6eibD;I{GVeM}BL{3)tP&fTydipOZ zEhxm1GtqhP$XgN0|KLZLI_4t92n<>n-m&vB&aEVC2R7_4GXx84zs6iuj*VWMF;=DuYCYD~)po zx2S|SFaVo`jYO9YZPR~KC`N0pv4uNd^-5^&OlYp~Hn z^bY;`_lim&h`Y_#B%SSVzqI?64B|9&99Q%=yoEeyG5l-FeVdUEpo+?z130`Qi3Yg_tct$^}^!fKhJO5qM+)@{Gx z`M&~M38nUvQ;;-ocp*wmONt^1Q6%welO)Y12{dy=UF|3t3Ptrvhu$eif?H~n32H@R zO2}xFH$zZUP_skcPcg-O(!VDkjJ*1)7)vrABB_lc%4QNItWzy&#K8j{j=~}geBx6< z=8y{(qQadWt4%TfzQqweToRQh6z4nf%lxCo*E$+g%qLy=Xoq3`Jnty+wT{NL3Q^v_ z{vx<`ZxM=vMgt4X1I2zx+zTUNns98m@~QNubAfnwe7ZCdRn(R zkWy5P=5WgV1G?IfVz3c!St}}ZNtS>3FJBGfy+jT~82!mRqIC07R~y$omKdVTT{X`)1Xr)95Ofu_H5^`ipl9kVYW>KDYBUc zn%z2f)aeKWe_c5RNx{lZu(|l23^DhByzEqTDa^p?H9H~}V;$154jxd19XlFPTi+x) zIkES76iKTpbfi&4rYSS-p4TE2-OFR;Ccpem@)Mze2L}zJ#%DS9zzkb1B%)KgskKH6 zjWzqwBrw@c^(e5x>9C=`Nf*|To}$4;2N%>=>u7|Bx&nL z$UaH-YJ>V0z+8HF)tc?G1kv-L0doF>KfY>BrCO1mNz#d=p+u5R#P@t_lc^;=^BqX` zv2s%Y=2i@$Kr;>=oC{lqV-L(|gO~0iGDB?cn-m>UC5xF)DMVhT9ouVy6beT$yX4vE zJv(+cgu#J9TQE&Idv{HI9ae4*#Kn{(ZP@^g*A=poDV>PwVzqMBs%@479n1u&#;;nl zRkdFe7s+Q@5;bNe3#x9OVj&MGNIqv^l0=BAv`LtJx?>Ma-7qY-pjXC*A(s1_E2 zQo505-viUMpw=+WM|&~(!uKw6qLxUitkILkEZ&QPt}G9V&kXA&+Z_*6l2pDnVo5+u zKQwqiw>`q|RjVo@=QPdQ+rcN?-7w+qe%_>uyWG@7Zwr!OZJDzNNxd9WSWRk^uCxj1 z_B}Ao+KSdNSw68Pcsnrp*2-?&PuXmuPpbDOkGWTpD&%&s!%7_ZX>%wpW`rb%6DbNj`tXfazax#z&a7iN-%qd4D=A2x<9LHQ#kOw!I!jJZpnEm!q5HFr1( z`*XRuk1c(k!qBn8jqHhOMqRC88fqwbUopGnQXiEi`;x8HhT5jKVJ2$(z#<2JsSJzr z!w#_Hr}A)oOhMA-)#Pwf)Zl4!6_9};gNx*v{i-9<1W}tMiB|5US%E{&zynDr2fkk) z7A9|w*Y+YU+_WnkDTax8)|AE)Nj*u}3c2ME#P+COj2)6Kwgzp9DP=&bn1*gOsm++V z89-+WdYYQU*j6Lg9BM0OqP7p{X2+^+)X#U9W09iWaWDl*flaHFCCOoPvuheQq`OLL znV78@GN`9`Cm0A}-MTGNqYrZU!%v|qlhmuT6W^`V#XX~DxpFT`a5vW&$~77>0_$># zB5C#{@K2R0Nft}ucyZ{^Y}l#sEipCIa$3P;%Q7_V6J`&Rn{%aKD#H7WnW*jkyHFIo zU2hdrlC<%c7?SuHHmrx`&{wWB3DJqD1C*^9Soz;g$}L8bG-w3n0x9@*ozy0=w;6q* zS3a=0)`<9h1C~pYf=kUGR;1yl?L6M4{4$yRVZ$i2r3)1gGtpz!4&A~umrhRx(_CcT zl(S2oCiXDjP^HJn*%r)1ZSP;GB_*dMX~RmnEP%RKX4uFBEVKLXj}>Za&#;IZI;@u! zIIR3}y&TRkphy~tUfo>yc1>8U<|`&2S)1|k$LM|32GX_Zea7u1CUw%jZ`e%Tt13Gds3X^|i0{`QI~NLu%^ zHSeyOF3;-0B5Gw36-}6Kj@?moM=x`Uq&_`U@zts@99&ssj}p{~LbQCpW<@*EBgGLx zJ)}+KM$)z41hZd}EOT2aNcwH$6eRiA{wU_+O-tI7B>A@%Ly%z&6A6+GxwdHDkWuJ+ zKpMVS6_T1{i@kl*gf#<3Q=<&E z-F-gtgKZ}+pGV*cfPPdPpzlB_Ug5EjHPA zA3l8Q|F6IdJC|F2_`pmG0!nE5ET04-nQCg?zTTBuPRr30HX&0=XQ^u*>#FLMe2iu= zmjGgU=&``3*rT>JQd3jLqN{3RMjQPKjg81Z`iU3MVLwwmLa`wU4rvq)|ON_xpTz|F0 z%p_BB2qaG7qR&S8mt{2B9(LdJsuDzI)$IpzlMH8RgBe5t`3eBmr2MoP(`1s#^M?ZZm7>OKdX>eDEbap(D8cO{Ahu0fnknu8!?>>*Bh)&jGfh6tOPUDg;({u-0G zH*Use*2!?VcD%_x@Js`ZofuDZ*0#LyhinT0#$|*NyjrQrb6)ef6-th`so$lO@fOx)is3|Q}Yh7nqB zo0grW6x7;lQmn*CJrG0L*dg26n1c%t4lAN1&AiX@p|_G=sM4PUIx#3!|tK-stvqNSS={@bqOQp(dT zU8&cNUrFcWBt-mXoBZvl1=q}?KxRlvq2y~ZeXXBA#WAvdkX7ASLYYo4t?ZPgJ|Ffqe`JxJ24(C))ZEMPH;hoUWIJy7tH`+Vw!$7{rI8bn zmplTM9si=CogcCuuBj(mtzInhzz!iYGY(qN!d)0+>JVs;-*w8@vE<=8I&s9l<@&{x zf~PWyboJ4aflZhpFbcG+XWu{R96R{$@nxK@nQ@}zW0Q#pD|x>s*fO8$34LCj-bk)h z#r|cz3_F=CB^;qg4UR;bfAGv07eAFXytw2i`-3W^9OqZFF0L^D?|3f3-$XGPqBrKR zG8omh`y4baFISzw>$YL4iIV_Mn59%wGY$k$RPBM(X)P^UI=lq9Z<}hIKH9$BcDrs- zOt8_N^4VI+OsU4TiFS#@(m(TFks@|d-H$TB%nhElS+VJ;3kWep!7%#5PnkY7 zOI5DNr88FS5^PCb#^^?wYj|vEkG1LnrB5g7lfXDq-@4qCuV#R99StCyuXT8YXQld) z(R+kOicUb7OQacnu@`8Hh zbAL^^@gcsM;+%Q@oQuUjKml*z4P@duLcV>avb+>^g`q^ii-L_(u@~w1`r>aUpntU6FmEF_$?`w&90^u&r^)hA|qFV{Pbwx|T{V4ANs2UgWmiv3%$_?V!N4$bEcn5I3UTZK=musOO}zg6;PPKbZHi`k6gB) z0b6`DQA$bX#D~(4bo;|ay*m}8c=EY!^GHpFZYbbelUeMcYio7@7RdENuIGRpVC+I0 zJ9Nd3gu&ejOqNY9!2~&~=~a36KlF~32VJuH)b_9v6Mm3HplXmcyjN`RKO zNBNv5;#l@Cl4d&$&-pvg!3CnRE&=)1b$r&XL~KNvt`tx+9u){MWb`x!sfWn`m+Z>< zM}adE+~fJ+Y#PLr^MZUW4j9HLx9lB+A762xiVbG;i6&^;G~cfR<(e1aj;nwbk^$7h z9LPs>d%mZMt40Ztg+jZ}{_`!`CG<}S5oodz1^VK;7@i+k$`xi>=Eg#qB(qm{L<4!| zCKFG-J}yZI6YiC^BNsUzaEw1hjlM6n^cinx2lp^_5zG<_kmk3^r;ICOT-+rZ$qHY& zIt2LcaHnJ-_8gyj>4!Mnja;wJ6OQ4d1;{MlpaxuWPnN^`8u91R^*Tub{EqlW zl<4VXS|iH*@o*$;Z!@O)AiY0rG(RA}@2z-Q&z{#7z3vz^@yO^@ak%p)RCjPwrV3P) zIYC*5I-HnxqKUg&qGhp+I4#n=Y`QT+tPA;~8S*!??A= zTVts$jPNJuBfnhx6L*bmc0yWsQ7)UZ{py2)OjwqFv+2e#?oEHTvLtj6@Nd4}d{)+n zvWsn4m71Q)M0qKQeNI=BOZ;hpamTN|*Po-~8|1JS>O!*vSIXK%gd*ed=JCp;|_HY@G zNUOZaC~A~q63U2*D*gW2VcYfUYjdPUkZKHL)d@8gtu=%KdykkNY7M8oMw|o_sF6G? z4#nuH8QTAM%wB4>xm4(dcDPW|3n6KpGhHR7wwp4bT`u9;r>-_&BoHILUOq@JW@T>&e4yfbRLGy3}V+O1W{8pnKKr5^Mu$ z$GI7i6RF?()4kY}1Kn^{8(5rGPqgx;+fIEOY0#yGp`mi;ka!y@Xz z0tP+U@l$^K{i<+*C$C)<2yEFTA9`)&j|@uDVt@)H>jAf z5FC;PZs^F;R8jJ-ThnHV3cXLC~7P`8FkLaF9r+qYUw+`Po zYU<%sTlP6tc;IAaRzMfO@`|y0cv8Nlu+*5pBL1DpKa4uaa6fQLSqWSZ+kB@EGxTb} zd5K%l@%oSoa*+E(8YbAIO8?pZ{ADFFrdJQoC=>3x)&5PQp?Qxr%w#(rvVGc>dQ$v5 z8Eqm@Ml~VFzus3q_PxoehbZTgMk%A2M5`uPZR=q7H+;OLPCDHAc&fCrm zTcr{=`Kh>Z3`18_PEl$y@$W2p^^}X^V-h1M%TH*D2kDb_g_k2osttV4%dhYPJdp>t zj}kg#yY7dq4kM9wWENmi0%!D03=dnXmYBfvZHprMiZhRBT1$$ApUiPyrhg9I`^4LRrvmH083pO9g(BOM5?DPA2w>{iWU^cXzG~C z*b<|3Ut#dob58JC_W9rucLETmpDJHojU4Et@wK1cgW3i&@_mfclRRQ^COA4Smg8XqjH{^&1>>Zl{2t10_c zj0w%Zbp|b9YGSx=%W^IQgJ2{%$&c71G@p;Q*^F!OQfyR-!)#OTc><>e?!u2)GuK(2 zgq;kxYcC~gvvP1Msk)#^sg8!TZ%uvXkIykQo~D&qvy+jg#_ovhjTp&}R0MKsr&~2s z7HkhSLAD`jS1V7^CBFad4xG`*rYr?8e~kjm^%HERc}bs;(dRradB zrUWR)qFgL=Rnc;DHE#oSYTQn)()A;(FE0!!&gIbW;FMp| zK{}LfV02)B02Ixkazv2udYjU73n{5*!_IR4vMJ~Iq>EybAz9wo+80~d)uDFpwowmx zHvNyTF)y&He7ve13%OE(L179(08T6n-VDdj-X^rd5_EkG2xxjskb-XcsU9pw*WWd~hFNW|@eveM|E@Nf&S{D?yDs9NX1@JfL7 z@qwqx4o2=kc{ZPl)k1Z+fD$`$a11vS&8jD0RIygY1X``crgsjlj{(#UOyKLpgx?;*ce{)F6a(A9zf`V}!i3XV4ni3s0>ktqV5oCJWM=5~{ z;(;RiuJY3R1dVPC{?(z;`NvWrNtH6|T1*PP?Tj){;TD)TmDnhd3!0T|Pb^A4XUe_1 zMA$9N)LRI`zN{+b1{z48EorvJI@X`9CxE|oy)#HZG+l~;oey7SF{ez4J!Q8t+&>}I zv#Nh3S+8aN9|HNZzrT|PNFe@Df&)U1akIBwZ!~qF=#X8miO{4>ob(YnFU2f+^%ZJn zVm1U$7sAO-U62W|&h9#kH)$T)Zu@S=!51aE^7|?$7@;6nrihlOQ-a9t^r zK48-7M!%>(4S+5}U<+niGs=1 zBO=8yPn~S%hZnF8{hR`*QAyyz^d`p^$w`336FzC3iFc8v5LxZT6K2k!wtf>-AwKoD ztN!bARQ*mDD;l1-R~AFqb#y+4qIuY^`eTFQtCD#bEhSK}thujFNV7{{@K(9@@0vC5*A92~MK% zm!XY8r^|bul+)#kD3#%ezV_?lPK?I6yDn$rTjq7$xBGiBy(KUlE3IiS7 z-$@XK7Vy+?!BGRs9xPy)9K(Pb*}-w!XbBj~zt8HF%ek*d)G%g`2Bsl|krMjbsrPg6 z>2d7V@Haq-xS->_ilZu&v>FZe&14z5DbtjSBxXU)UBtyE02LtC`DF?lnrH_ojN__x z?(cj?c@>D%Ros9}0FU72i!LW(SkSW(Pi<~@lHUZruDh)HF?;?G>I9ecjr3?#6=(jv zvJIW>AG=;0(E+rGkR0yI(Vj|15txv@%HOt8lJ=@9)y?OFjTqhv@35T%ctK?4 zt>kr}90&T%@-bA_$OvxQD5P{Ii)4F^G;-gW$!(J12WGU8Y2|@Cu>eKIGUi9vZ*3Ry zI8$-$z9fdv%Q{6DYl!jE5(qCohOxNe{>u3B7pM*utitpbhcRJpY`PQmHa2?aGwut| zI_wV~3kq-WZf+lg0#|T%0GY|46uD4J5O#l)`1A5H{Sf7uA=f@UOs~!UB%EjlA1^am z)Xd`1XUia>>%s7XuUqU05&vi?3yQ>^QU>)on_HvaHBK0?Abs{!{E*~DtcRWJ&pElV z6aXmH^0FPfPnkjOMNFs!RS;HABtnrhwYxmKMS{;W?8~~Ocv!7g`RYd8U;Wt39$x-9n(1$m zFStw=Qqmw$u`dJQu>kMCd}&=JbFo7*HYTN%`Jp5632P@9w_2ZcKf^v{)`}Z>S#P1# zXJ_5*%Zr@)_2BU25JeQ@S~TOLz!L~1knAxUyD7L%dw-#YXg)BAup@C14)Ws9U3^7! zZ!aq#`p{5q3<(l&AI{O{0}Y#@fQMQwz$~_3QUI>?lNY5Rm?K8rc7Ab8gJcs9jM^ZX zpUPrK@T8O#N8>+vc~a9oW-_Nzo4t}KR8P_NoS$7Gy+af>Jdu+<4i47b5SpidALAEV z-QI{jKr#3@r{t^T8x-YzPaEInQJdHV++{t`emwCjN=y%Yvg-pcuEp$sYJ59z*)E}^ zs>-X7R^6=n6V7dXWwF(#vb!!Rf9Lv>*9ti}N2nCzQu~Fz?UIDaGFoMVY#zq<=yo38 zqhHI6schUu{L7psM4-SkPAyuBkfr zNdDH_Ba20&<78uiJXFq!U_Lci^~Y1?j}iYec9wT_xtEP-KMj{&(xrHvA&lIuDUOQ} zAfaA?i(8{d{PBcG>q{lQm(+Cy|C>c_$@-lt;j%=QFmk%Tk@rs5ZBuRGqx7{2R25un z8`F802+x)7lV9u^j2=fsXfPY17gyqEetQZD8S}G3Hoxqt!}R8vC*V?FagX{TwcZhx z;&0_(r*-x&tKtI21zH#d!5t1vETB&%&uTdv_KTs*hQVbyFs%y(*K2cbgOaJhhiKo= z5taX(7?VS9$7v;2X1>-|;Cg84?9?n3Hr1H`8=N5=KCYQ1FyqO0W(`4Ci8^1x_y605 zmnDVDitXbuev**>KTZ*eHL0U`WWr|ec>EztV~weR(@4IyZB@*X3|sPWp9BLTH65M( zb*xzUmVkQg1trYWTcksWi>ulQqg>X4 z2+m1`lp+qQ=FXOk3K~2w=^#-8VlDuME*?ccF$Xi+F{!&dO^#aO5*y@^)1gOyP^~8} zpNN|VKh{;+gga|`?*wN165Bcc{bvDr``vnWhU`GR+_da4HTP>P2V9ciPBn(L)GjXI zrC1h!nKmoMp7$d)w!0wJQ6~&PaGUZp!-qLT6?|_Pm*QP;m_6=-e~d2ycQ$f#aUTk} z$yNxpK1z-6VcoBT-%!V=X0V$f$ygxan)Gpn@#rB%uof3eLL~;WZ_`(VK+Iy^(BI7g zM-ZbT`1Dk=ECf>U0rUtX0wnOQ^_x^315e~Jw~Vfq{3uZE`&j8vQ*?*)8sO10`owdM z@hgX$9cdI-b9a~GvHxAzWZln6THm#)KgW zD(cltIz>Pc&b<1uadkE99W+>jgIBQxjj%bDM<&>}%jiEpYnZ-vo=dti&AY{ZTWZR} z-#V(WFk=*=wkEYt#ci(KHhH3mCt2u3|0#OSBFdP~5u9z!hL(H9h{AMplWGz+FDm)x z$Rgqx>QnvaB%zO{(lB#8o@_6r*bQH357Nn*jVA@A#*^Pt;&mE#I$hkQ5tbkv-)gXq z7x98HZzZP}m_OJ$AG?uiXa3bh_pyp6dGY5F#){w=u4a$nuF>Lavq;}|S!=Rpn881p zY0S!+5)eYZNXJxtBURs*LVc#$xP7Y$zBUolF5Ia{9ZJWy{61Ldz5*N==0UrP646f6 zekw>&A40j>@JF6Gq&?!M;u;TEcEToR`zK0b_BaXP3i*j%V3dx4-!x4LH9;XOFRcan zn(s=~_`CBNihYUNtB(UC70qA^xjvL2KPp__r}+Go^pY|6xBn(HblL_iG3JEtAx(^` zs6cSarr%mIVj@*mI<8@*)Y998ml*kaOxpKk1N7lDTYq4l0)E+E^&zb}k40P7HOI#) zrCMh|tZYb|fsjVc6QwVj&EFRUTx+%O-Cs&EfRqM4JuxjPyNxE;55ngM^UkXzzd66q zajvJBc(%(?(%Yi}{?=c}$tU&8Zuq8vDW9av475e2sNkA#D?c%M^%4k$-wzvfW`v;7 zo9Q<*t#a4%V9zM4L#y<0Kr6qwSB4*OGh1-Ai!ag5J84Q5<)prSGyW((b=HEBTzZB& z@uzYHp{yUYcPhTHavDZ875!Y-X)bHR3skF;*uXS8{#yLmAzbFbPSl9)G+*l`RHt$ATj_>I)dAa|-P?j$89+h@ zl6)wZa}XWEu4zidPDlI8a*6XddUy>_)~%>Fk$i~t78!1?%WT@;^{JEp+}9;nLZ2_3 z(iOea9#KiY4PFZ9Ki-ZX19zWo4ce^(ozde1aEOxp%T)wVrn^T@=a7$VM62$Ug2paJ zI~YIuEcR6_z76)AuQ{9{kGss+{B~5%5xhNWIKMkujvBo7xf$}evIsP0nPANcff=FCDdX@Y%KPK%OY~g!ww!?F%cH zlAN=-c!JX4wCCLY9{szQ_~OPknh-!%yXp1r4g&#moi9xB6?W#sa;Lk9{}8>0d>od| zbN%$PLz6aDb`jT2gf7hVN@BQ+XW2kopL}odKl8*|1S@^K`!lMimdfpD->|5zd6hzf z7y9Gf#Jw%L98Fv*BN2G=?2)PTHl0`bxy_QLmJ_jL9B&uVpF>)a#s3wHHU z6a&ed;{;X;w=E4NM}5J-=G=8fGr;V8a9;~wnoe?o!46wZ$N(K;OJeKDZ4#k;62@Q4 zj#!~!#zGB)snM}=63REx_3LsCaz~>wLk}o^zui@pdTmQ_yaaW!DK-EHWZ^hI3o&DD zBl7jCJgtowsblfbwTetz+&7zF2pz?gNUXl&aeP|2Q1g|FQA>H`VOT66j8MenWhA!; zHppRmHMyR&Pe~rUy5AQ9haRibc_txWlyheR9lWzLdoCV^MJEtSD(|)FnRkXdL`rDH z4GuMS*0f|dALJdqi-CwmMS|>u)+Ae}1vtZ`ZW7ptxfu-dB-Klf{mc~0|BstGlN7UI z_@>Kc$aACX165jKYCh!4(AeM4M@zes%{ok44`_RA=zuFYq8G!Cr{xiN8}vuz0DTWF zc?vHW+xXTBAil8z)865LlE_eP+f+8FWo%i`j;o?dNhoN|+`rdTrh03HyHhx55JJUa z70Do-b6mmq@1Hc**!^O^<_vGMo#2CC3KY77i}d>Ml)*%#iYW3AOG^5+3w~{uHa5BY zl@6Z%T$a_&DY)<)eLRGPP)jq2=y9@+)vkYo90l{Eh@Ts>!eznOeFdOA^!r)z=290kLaLS5Tms?>ZzL3$QCgGRZ~3b@pbRPv%% z$aYl8-{Vt!+;pFYV<+a{$9ICKqf8IpOP^0@-_2&KahuZ+1X)vqN+r?r$N;w6VJZlH=e<{nK%bfo}iK~Si4Zla2>YX35%2b_kg zhm3|kj_gphanMs+mkdWoDZoLF9|t@XaUrBBc0sMO!?RNrwkc)am^2_x>tvI+O0aRDq2 z8j)JxW|pr9GhrdN?7QeA|6`N(x_wzPuF>kg#~@~O4`KcRz)>b~<7j;Hl6r-fMXccP zFazKE0i#5hReNI5VJ1Ow6xww(sub-)c;A)Ljp)X4S5}@aY788CdpqbGor5m;;6+|t zm!NJbfdk%V4%`LV(xLMN?m%PTf?yP=JTS!WyiDZ?e$Cqn$Kwx&#cZdW*-gVQwB$N} z@K5${Nj+8bOnLdAd6)m@s=~ftV;b&ETB@a}fn8+Vh` zq6p|$$#eqL(vp2NlfNH+Gw~>TCc!_P0UDx7wF#jpbgYYH*W(J`R>I-e`kAX=!?yYj zfkmZ@nW*|uB){x&gz<#z;A7IQ#wPLh^xl2<8> zkDmCdL<5`maTtx11syN!_&tv;+bXV%@=VY>6ma$?GV9Fg@x;#LUFgK;r9ueDqAz0T zT2ZZzcGTA^O6?W9Pt)FYGhe?Kjv6U-yiZ+sbcQ^0)COAH3{onw=bxFFVKT}NX_c+Y z`v9>-|8}@7F-Rl2v<%tDzCr;A&W?;S33JjGmKI-K7|VcoeZ3oM%xM>7efpu~?8)dWelnT&KE&IEFr+^<^k7GEuBx#O_b z+~g+QiP>yk|5@Ev{9?jZ`?&`&|GRX+(fj;RU<4@IDakxv;F=+he>nZ&c3hljtoLBt z!22_b%lf0MDEOKMLFKQSjebZBkhw1qTWIH5&){^0*A8G`(Y!l}ERclnzOQ#2BnnsD>3eo8 z<1@NhWewaa7It|<)57n41I7Q}7V-Z(EbM=J|EG<0l>0t%@_*0#^JW4u7a8R^t%Q8r z6WINxBsqzCDn{IN$-TiQa91*+B7YEMrxZl0Hj$SY}^?)b9>io9TI81 zXq{1ZxPdGj!J-9Vb$7cwLJK!)`HXpdLtn4{ORP#CrPnL@=f+`Vsn}5CleR;J)W}`_ z#el`eF5-=|@5xbyvKjaQn;ycE2Q6AJa!=GGOfINXxbGq>Y!w@;MYQk8&4v=N{W!iE z(RuB1Q)jmYTP-qgqq!GyB*yyUPFJ+*b%Te_HqK=~RVhv_-%+~D!K~7BRv-Z=@^CPE z7b_{e9YTO<3Nov!rqEW3o(64dc_{l!48xt_EX{j@*mTxxH|0f~;|Jlb1SLc4y z+5Law_3ZN4{y5=TzSd<-nY~}dJhrDHX0P>sVJ}*AEfBHQcsIN?!W6DNGP{J6qrq#` zUb}XmaPNWd=>Euqn4K;jMTlWpokP8eGNaw>HX<|19`>^<^ + - - - \ No newline at end of file diff --git a/latest/windows/bin/assets/images/desktop/ui/captionButtons.png b/latest/windows/bin/assets/images/desktop/ui/captionButtons.png index d5e2dff2ad5ff018312d1642b15c54212cac0b11..65fead0bf12fae265aef3f44f8040c6db1e363a4 100644 GIT binary patch literal 19413 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 rect.x) && (pos.x < rect.x + rect.width)) && ((pos.y > rect.y) && (pos.y < rect.y + rect.height)); diff --git a/source/funkin/desktop/editors/HelloWorld.hx b/source/funkin/desktop/editors/HelloWorld.hx index a07eb6ea..69105f6a 100644 --- a/source/funkin/desktop/editors/HelloWorld.hx +++ b/source/funkin/desktop/editors/HelloWorld.hx @@ -3,7 +3,6 @@ package funkin.desktop.editors; import flixel.util.FlxDestroyUtil.IFlxDestroyable; import flixel.addons.ui.FlxUIText; import flixel.FlxG; -import funkin.desktop.sprites.*; class HelloWorld extends WindowContent { public override function new() { @@ -13,26 +12,23 @@ class HelloWorld extends WindowContent { public override function create() { super.create(); - var helloWorldText = new FlxUIText(0, 0, 0, "Hello, World!"); - helloWorldText.color = 0xFF000000; + var helloWorldText = new WindowText(0, 0, 0, "Hello, World!"); helloWorldText.scrollFactor.set(0.5, 0.5); helloWorldText.cameraCenter(camera); add(helloWorldText); - var t = new FlxUIText(0, 0, 0, "Bottom right text!"); - t.color = 0xFF000000; + var t = new WindowText(0, 0, 0, "Bottom right text!"); t.setPosition(630 - t.width, 470 - t.height); t.scrollFactor.set(1, 1); add(t); - var t = new FlxUIText(0, 0, 0, "Top right text!"); - t.color = 0xFF000000; + var t = new WindowText(0, 0, 0, "Top right text!"); t.setPosition(630 - t.width, 10); t.scrollFactor.set(1, 0); add(t); var butt = new Button(10, 10, "Test", function() { - trace("help"); + parent.showMessage("Test", "Test", ERROR); }); butt.scrollFactor.set(); add(butt); diff --git a/source/funkin/desktop/editors/MessageBox.hx b/source/funkin/desktop/editors/MessageBox.hx new file mode 100644 index 00000000..f9840990 --- /dev/null +++ b/source/funkin/desktop/editors/MessageBox.hx @@ -0,0 +1,73 @@ +package funkin.desktop.editors; + +import flixel.util.typeLimit.OneOfTwo; +import flixel.util.FlxDestroyUtil.IFlxDestroyable; +import flixel.addons.ui.FlxUIText; +import flixel.FlxG; + +class MessageBox extends WindowContent { + public var caption:String; + public var message:String; + public var msgIcon:MessageBoxIcon; + public var callback:Int->Void = null; + private var __buttons:Array> = null; + + public override function new(caption:String, message:String, icon:MessageBoxIcon, ?buttons:Array>, ?callback:Int->Void) { + super(caption, 100, 100, 500, 500); + this.caption = caption; + this.message = message; + this.msgIcon = icon; + this.callback = callback; + this.__buttons = buttons; + } + + public override function create() { + super.create(); + parent.canMinimize = parent.resizeable = false; + var text = new WindowText(10, 10, 0, message); + if (text.width > 500) + text.fieldWidth = 500; + add(text); + setSize(Std.int(Math.max(text.width + 20, 240)), Std.int(text.height + 20)); + + + if (__buttons == null) __buttons = ["OK"]; + else if (__buttons.length <= 0) __buttons.push("OK"); + + var firstButt:Button = null; + for(k=>b in __buttons) { + var label:String = null; + var callback:Void->Void = null; + if (b is String) { + label = cast(b, String); + } else if (b is Dynamic) { + label = Reflect.field(b, "label"); + callback = Reflect.field(b, "callback"); + } + var button = new Button(490, 490, label, function() { + parent.close(); + if (callback != null) callback(); + if (this.callback != null) this.callback(k); + }); + button.x -= button.width; + button.y -= button.height; + add(button); + if (firstButt == null) firstButt = button; + } + setSize(Std.int(width), Std.int(height + firstButt.height + 10)); + } +} + +@:enum +abstract MessageBoxIcon(Int) { + var ERROR = 0; + var ALERT = 1; + var INFORMATION = 2; + var QUESTION = 3; +} + +// HAHA BUTT!! *minion laugh* +typedef Butt = { + var label:String; + @:optional var callback:Void->Void; +} \ No newline at end of file diff --git a/source/funkin/desktop/editors/import.hx b/source/funkin/desktop/editors/import.hx index 23162a24..cc04c4bb 100644 --- a/source/funkin/desktop/editors/import.hx +++ b/source/funkin/desktop/editors/import.hx @@ -1,3 +1,4 @@ package funkin.desktop.editors; -import funkin.desktop.windows.*; \ No newline at end of file +import funkin.desktop.windows.*; +import funkin.desktop.sprites.*; \ No newline at end of file diff --git a/source/funkin/desktop/sprites/Button.hx b/source/funkin/desktop/sprites/Button.hx index 836f1528..a2b5ab54 100644 --- a/source/funkin/desktop/sprites/Button.hx +++ b/source/funkin/desktop/sprites/Button.hx @@ -1,5 +1,6 @@ package funkin.desktop.sprites; +import funkin.desktop.theme.Theme; import flixel.FlxObject; import flixel.addons.ui.FlxUIText; import flixel.FlxSprite; @@ -18,7 +19,15 @@ class Button extends FlxObject { public var pressedSprite:SpliceSprite; public var disabledSprite:SpliceSprite; - public var label:FlxUIText; + public var label:WindowText; + + private override function get_width() { + return normalSprite.width; + } + + private override function get_height() { + return normalSprite.height; + } public function new(x:Float, y:Float, text:String = "", callback:Void->Void) { super(); @@ -38,7 +47,8 @@ class Button extends FlxObject { pressedSprite = new SpliceSprite(Paths.image(pressedButton.sprite), x, y, 75, 24, pressedButton.left, pressedButton.top, pressedButton.bottom, pressedButton.right); disabledSprite = new SpliceSprite(Paths.image(disabledButton.sprite), x, y, 75, 24, disabledButton.left, disabledButton.top, disabledButton.bottom, disabledButton.right); - label = new FlxUIText(0, 0, 75, text); + label = new WindowText(0, 0, 75, text); + label.alignment = CENTER; } public override function update(elapsed:Float) { @@ -97,7 +107,9 @@ class Button extends FlxObject { sprite.cameras = cameras; sprite.setPosition(x, y); sprite.scrollFactor.set(scrollFactor.x, scrollFactor.y); - sprite.draw(); } + spr.draw(); + label.y += (height - label.height) / 2; + label.draw(); } } \ No newline at end of file diff --git a/source/funkin/desktop/sprites/WindowText.hx b/source/funkin/desktop/sprites/WindowText.hx new file mode 100644 index 00000000..30758494 --- /dev/null +++ b/source/funkin/desktop/sprites/WindowText.hx @@ -0,0 +1,25 @@ +package funkin.desktop.sprites; + +import flixel.text.FlxText; +import flixel.addons.ui.FlxUIText; +import funkin.desktop.theme.Theme.ThemeData; + +class WindowText extends FlxText { + // TODO: VISUAL STYLES SHIT + public function new(x:Float, y:Float, w:Float, t:String) { + super(x, y, w, t); + color = 0xFF000000; + scrollFactor.set(); + applyFontSettings(DesktopMain.theme.window); + // setFormat(Paths.font(.font)) + } + + public function applyFontSettings(data:ThemeData) { + var fontPath = Paths.font(data.font); + if (data.font.startsWith("file://")) { + fontPath = data.font.substr(7); + while(fontPath.charAt(0) == "/") fontPath = fontPath.substr(1); + } + setFormat(fontPath, Std.int(data.fontSize), data.textColor); + } +} \ No newline at end of file diff --git a/source/funkin/desktop/theme/Theme.hx b/source/funkin/desktop/theme/Theme.hx index e1b91456..d52bc15d 100644 --- a/source/funkin/desktop/theme/Theme.hx +++ b/source/funkin/desktop/theme/Theme.hx @@ -24,8 +24,9 @@ class Theme { } /** - * CAPTION + * CAPTION & WINDOW */ + public var window:ThemeData = new ThemeData(); public var captionActive:ThemeData = new ThemeData(); public var captionInactive:ThemeData = new ThemeData(); public var captionButtons:ThemeData = new ThemeData(); @@ -52,6 +53,9 @@ class Theme { if (element.has.path) data.sprite = '$prefix${element.att.path.trim()}'; if (element.has.textColor) data.textColor = element.att.textColor.getColorFromDynamic(); + if (element.has.font) data.font = element.att.font; + if (element.has.color) data.color = element.att.color.getColorFromDynamic(); + if (element.has.fontSize) data.fontSize = Std.parseFloat(element.att.fontSize).getDefault(0); if (element.has.left) data.left = Std.parseFloat(element.att.left).getDefault(0); if (element.has.right) data.right = Std.parseFloat(element.att.right).getDefault(0); if (element.has.top) data.top = Std.parseFloat(element.att.top).getDefault(0); @@ -86,7 +90,11 @@ class Theme { class ThemeData implements IFlxDestroyable { public var sprite:String = ""; - public var textColor:FlxColor = FlxColor.WHITE; + public var font:String = ""; + public var fontSize:Float = 12; + + public var textColor:FlxColor = FlxColor.BLACK; + public var color:FlxColor = FlxColor.WHITE; public var left:Float = 4; public var bottom:Float = 4; diff --git a/source/funkin/desktop/windows/Window.hx b/source/funkin/desktop/windows/Window.hx index 784d221a..9e1171cf 100644 --- a/source/funkin/desktop/windows/Window.hx +++ b/source/funkin/desktop/windows/Window.hx @@ -14,6 +14,8 @@ import flixel.tweens.FlxTween; import flixel.tweens.FlxEase; import flixel.group.FlxSpriteGroup.FlxTypedSpriteGroup; import funkin.desktop.sprites.*; +import funkin.desktop.editors.MessageBox.MessageBoxIcon; +import funkin.desktop.editors.MessageBox; typedef WindowCam = { @@ -44,6 +46,11 @@ class Window extends FlxTypedGroup { public var moveable:Bool = true; public var resizeable:Bool = true; + public var canClose:Bool = true; + public var canMinimize:Bool = true; + public var canHelp:Bool = false; + + public var maximized:Bool = false; public var focused(get, null):Bool; @@ -57,6 +64,14 @@ class Window extends FlxTypedGroup { return DesktopMain.instance.windows.members.last() == this; } + public function showMessage(caption:String, message:String, icon:MessageBoxIcon) { + var win = DesktopMain.instance.openWindow(new MessageBox(caption, message, icon)); + curDialog = win; + win.move( + windowCaptionCamera.x + ((windowCaptionCamera.width - win.windowCaptionCamera.width) / 2), + windowCaptionCamera.y + ((windowCaptionCamera.height - win.windowCaptionCamera.height) / 2)); + } + public function loadIcon(path:String) { icon.loadGraphic(path); icon.setUnstretchedGraphicSize(16, 16, false); @@ -112,7 +127,7 @@ class Window extends FlxTypedGroup { if (content.windowCamera == null) { content.windowCamera = new FlxCamera(Std.int(content.winX + 4), Std.int(content.winY + 23), Std.int(content.width), Std.int(content.height), 1); content.windowCamera.pixelPerfectRender = true; - content.windowCamera.bgColor = -1; // walter white + content.windowCamera.bgColor = DesktopMain.theme.window.color; } content.cameras = [content.windowCamera]; content.parent = this; @@ -140,6 +155,41 @@ class Window extends FlxTypedGroup { }); } + public function onDesktopSizeChange(width:Int, height:Int) { + if (maximized) { + resize(width, height); + } + content.onDesktopSizeChange(width, height); + } + + public function maximize() { + if (maximized != (maximized = true)) { + // maximizing!! + captionButtons.members[1].animation.play("restore", true); + move(-DesktopMain.theme.window.left, -DesktopMain.theme.window.left); + resize(FlxG.width, FlxG.height); // TODO: taskbar stuff + } + } + + public function minimize() { + + } + + public function restore() { + if (maximized != (maximized = false)) { + // maximizing!! + captionButtons.members[1].animation.play("maximize", true); + move(100, 100); + var w:Int = 320; + var h:Int = 320; + if (windowCameras[0] != null) { + w = windowCameras[0].width; + h = windowCameras[0].height; + } + resize(w, h); // TODO: taskbar stuff + } + } + public function changeCaption(text:String) { caption.text = text; } @@ -197,19 +247,19 @@ class Window extends FlxTypedGroup { var shouldCancel = DesktopMain.instance.mouseInput.overlapsRect(this, new Rectangle(0, 0, windowCaptionCamera.width, windowCaptionCamera.height), windowCaptionCamera); - if (shouldCancel && DesktopMain.instance.mouseInput.justPressed) - DesktopMain.instance.focusWindow(this); + if (curDialog != null && curDialog.exists) { if (shouldCancel) { - DesktopMain.instance.mouseInput.cancel(); if (DesktopMain.instance.mouseInput.justPressed) { // TODO: sounds DesktopMain.instance.focusWindow(curDialog); } + DesktopMain.instance.mouseInput.cancel(); } return; - } + } else if (shouldCancel && DesktopMain.instance.mouseInput.justPressed) + DesktopMain.instance.focusWindow(this); // updates them backwards!! while(i > 0) { i--; diff --git a/source/funkin/desktop/windows/WindowCaptionButton.hx b/source/funkin/desktop/windows/WindowCaptionButton.hx index bc4a95d5..c498b01e 100644 --- a/source/funkin/desktop/windows/WindowCaptionButton.hx +++ b/source/funkin/desktop/windows/WindowCaptionButton.hx @@ -6,15 +6,9 @@ class WindowCaptionButton extends FlxSprite { public var icon:FlxSprite; public var window:Window; - public static var anims:Array = ["minimize", "maximize", "close", "restore", "help"]; + public static var anims:Array = ["close", "maximize", "minimize", "help", "restore"]; public function new(window:Window, i:Int) { - // super(0, 0, "", function() { - // switch(i) { - // case 0: - // window.close(); - // } - // }); super(0, 0); this.window = window; ID = i; @@ -22,12 +16,9 @@ class WindowCaptionButton extends FlxSprite { loadGraphic(Paths.image(DesktopMain.theme.captionButtons.sprite), true, Std.int(DesktopMain.theme.captionButtons.size.x), Std.int(DesktopMain.theme.captionButtons.size.y)); for(k=>e in anims) { - animation.add(e, [for(l in 0...6) k + (l * anims.length)], 0, true); + animation.add(e, [for(l in 0...8) k + (l * anims.length)], 0, true); } animation.play(anims[ID]); - - // resize(18, 18); - // color = (i > 0) ? 0xFF8888FF : 0xFFFF0000; } public override function draw() { @@ -40,26 +31,45 @@ class WindowCaptionButton extends FlxSprite { return; } var mouseInput = DesktopMain.instance.mouseInput; - if (DesktopMain.instance.mouseInput.overlaps(this, camera)) { - if (mouseInput.justReleased) { - switch(ID) { - case 0: - window.close(); - case 1: - + + visible = switch(ID) { + case 1 | 2: window.resizeable || window.canMinimize; + case 3: window.canHelp; + default: true; + }; + + if(switch(ID) { + case 0: window.canClose; + case 1: window.resizeable; + case 2: window.canMinimize; + case 3: window.canHelp; + default: true; + }) { + if (DesktopMain.instance.mouseInput.overlaps(this, camera)) { + if (mouseInput.justReleased) { + switch(ID) { + case 0: + if (window.canClose) window.close(); + case 1: + if (window.resizeable) (window.maximized ? window.restore : window.maximize)(); + case 2: + if (window.canMinimize) window.minimize(); + } + mouseInput.cancel(); + return; } - mouseInput.cancel(); - return; - } - if (mouseInput.pressed || mouseInput.justPressed) { - animation.curAnim.curFrame = 2; - } else { - animation.curAnim.curFrame = 1; - } - mouseInput.cancel(); // prevents controls behind this one from updating input - } else - animation.curAnim.curFrame = 0; - if (!window.focused) animation.curAnim.curFrame += 3; + if (mouseInput.pressed || mouseInput.justPressed) { + animation.curAnim.curFrame = 2; + } else { + animation.curAnim.curFrame = 1; + } + mouseInput.cancel(); // prevents controls behind this one from updating input + } else + animation.curAnim.curFrame = 0; + } else { + animation.curAnim.curFrame = 3; + } + if (!window.focused) animation.curAnim.curFrame += 4; super.update(elapsed); } diff --git a/source/funkin/desktop/windows/WindowContent.hx b/source/funkin/desktop/windows/WindowContent.hx index fb448aab..e022098c 100644 --- a/source/funkin/desktop/windows/WindowContent.hx +++ b/source/funkin/desktop/windows/WindowContent.hx @@ -69,6 +69,7 @@ class WindowContent extends WindowGroup { public function new(caption:String, x:Float, y:Float, width:Int, height:Int) { super(); + this.title = caption; this.width = width; this.height = height; this.winX = x; @@ -78,4 +79,9 @@ class WindowContent extends WindowGroup { public function create() { } + + + public function onDesktopSizeChange(width:Int, height:Int) { + + } } \ No newline at end of file diff --git a/source/funkin/game/PlayState.hx b/source/funkin/game/PlayState.hx index c398592d..74c2639a 100644 --- a/source/funkin/game/PlayState.hx +++ b/source/funkin/game/PlayState.hx @@ -767,14 +767,14 @@ class PlayState extends MusicBeatState var iconOffset:Int = 26; - iconP1.x = healthBar.x + (healthBar.width * (FlxMath.remapToRange(healthBar.percent, 0, 100, 100, 0) * 0.01) - iconOffset); - iconP2.x = healthBar.x + (healthBar.width * (FlxMath.remapToRange(healthBar.percent, 0, 100, 100, 0) * 0.01)) - (iconP2.width - iconOffset); + iconP1.x = healthBar.x + (healthBar.width * (FlxMath.remapToRange(healthBar.percent, 0, 100, 1, 0)) - iconOffset); + iconP2.x = healthBar.x + (healthBar.width * (FlxMath.remapToRange(healthBar.percent, 0, 100, 1, 0))) - (iconP2.width - iconOffset); if (health > 2) health = 2; - iconP1.health = healthBar.percent; - iconP2.health = 1 - (healthBar.percent); + iconP1.health = healthBar.percent / 100; + iconP2.health = 1 - (healthBar.percent / 100); /* if (FlxG.keys.justPressed.NINE) FlxG.switchState(new Charting()); */