From 758a02c379bce15389d2c17ed7ac847a450f5ccd Mon Sep 17 00:00:00 2001 From: Yoshman29 <81191621+YoshiCrafter29@users.noreply.github.com> Date: Tue, 14 Mar 2023 19:26:08 +0100 Subject: [PATCH] removed desktop (new ui framework) --- art/flashFiles/RECOVER_teaser animated.fla | Bin 112257 -> 0 bytes assets/images/desktop/cursor.png | Bin 171 -> 0 bytes assets/images/desktop/icons/command.png | Bin 173 -> 0 bytes assets/images/desktop/ui.xml | 36 -- assets/images/desktop/ui/button.png | Bin 161 -> 0 bytes assets/images/desktop/ui/buttonDisabled.png | Bin 264 -> 0 bytes assets/images/desktop/ui/buttonHover.png | Bin 244 -> 0 bytes assets/images/desktop/ui/buttonPressed.png | Bin 488 -> 0 bytes assets/images/desktop/ui/caption.png | Bin 481 -> 0 bytes assets/images/desktop/ui/captionButtons.png | Bin 3863 -> 0 bytes assets/images/desktop/ui/captionInactive.png | Bin 494 -> 0 bytes assets/images/desktop/ui/checkbox.png | Bin 1490 -> 0 bytes assets/images/desktop/ui/context.png | Bin 162 -> 0 bytes assets/images/desktop/ui/contextOption.png | Bin 308 -> 0 bytes assets/images/desktop/ui/menuBar.png | Bin 116 -> 0 bytes assets/images/desktop/ui/tab.png | Bin 152 -> 0 bytes assets/images/desktop/ui/tabBody.png | Bin 141 -> 0 bytes assets/images/desktop/ui/tabHover.png | Bin 233 -> 0 bytes assets/images/desktop/ui/tabNonSelected.png | Bin 160 -> 0 bytes assets/images/desktop/ui/tabPressed.png | Bin 439 -> 0 bytes assets/images/desktop/ui/taskbar.png | Bin 151 -> 0 bytes assets/images/desktop/ui/textbox.png | Bin 234 -> 0 bytes assets/images/desktop/ui/textboxFocus.png | Bin 258 -> 0 bytes assets/images/desktop/ui/textboxHover.png | Bin 251 -> 0 bytes assets/images/desktop/ui/textboxPressed.png | Bin 253 -> 0 bytes assets/images/editors/ui/checkbox.png | Bin 0 -> 1597 bytes buildnumber.txt | 2 +- source/funkin/desktop/DesktopMain.hx | 222 ------------ source/funkin/desktop/DesktopScreen.hx | 53 --- source/funkin/desktop/DesktopUtils.hx | 10 - .../funkin/desktop/editors/CharacterEditor.hx | 341 ------------------ .../funkin/desktop/editors/CommandPrompt.hx | 12 - .../funkin/desktop/editors/EditorPlayState.hx | 94 ----- source/funkin/desktop/editors/HelloWorld.hx | 58 --- source/funkin/desktop/editors/MessageBox.hx | 72 ---- source/funkin/desktop/editors/import.hx | 4 - source/funkin/desktop/import.hx | 3 - source/funkin/desktop/sprites/Button.hx | 126 ------- source/funkin/desktop/sprites/Checkbox.hx | 70 ---- source/funkin/desktop/sprites/DropDown.hx | 40 -- source/funkin/desktop/sprites/InputBox.hx | 105 ------ source/funkin/desktop/sprites/MenuBar.hx | 52 --- .../funkin/desktop/sprites/NumericStepper.hx | 76 ---- source/funkin/desktop/sprites/SpliceSprite.hx | 133 ------- source/funkin/desktop/sprites/TabView.hx | 90 ----- source/funkin/desktop/sprites/WindowText.hx | 34 -- source/funkin/desktop/theme/Theme.hx | 156 -------- source/funkin/desktop/windows/ContextMenu.hx | 102 ------ source/funkin/desktop/windows/Window.hx | 297 --------------- .../desktop/windows/WindowCaptionButton.hx | 75 ---- .../funkin/desktop/windows/WindowContent.hx | 87 ----- .../desktop/windows/WindowDragHitbox.hx | 77 ---- source/funkin/desktop/windows/WindowGroup.hx | 72 ---- source/funkin/editors/EditorPicker.hx | 5 + source/funkin/editors/UIDebugState.hx | 11 + source/funkin/editors/charter/Charter.hx | 5 + source/funkin/editors/ui/UICheckbox.hx | 74 ++++ source/funkin/editors/ui/UISprite.hx | 61 ++++ source/funkin/editors/ui/UIState.hx | 63 ++++ source/funkin/system/Main.hx | 2 - 60 files changed, 220 insertions(+), 2500 deletions(-) delete mode 100644 art/flashFiles/RECOVER_teaser animated.fla delete mode 100644 assets/images/desktop/cursor.png delete mode 100644 assets/images/desktop/icons/command.png delete mode 100644 assets/images/desktop/ui.xml delete mode 100644 assets/images/desktop/ui/button.png delete mode 100644 assets/images/desktop/ui/buttonDisabled.png delete mode 100644 assets/images/desktop/ui/buttonHover.png delete mode 100644 assets/images/desktop/ui/buttonPressed.png delete mode 100644 assets/images/desktop/ui/caption.png delete mode 100644 assets/images/desktop/ui/captionButtons.png delete mode 100644 assets/images/desktop/ui/captionInactive.png delete mode 100644 assets/images/desktop/ui/checkbox.png delete mode 100644 assets/images/desktop/ui/context.png delete mode 100644 assets/images/desktop/ui/contextOption.png delete mode 100644 assets/images/desktop/ui/menuBar.png delete mode 100644 assets/images/desktop/ui/tab.png delete mode 100644 assets/images/desktop/ui/tabBody.png delete mode 100644 assets/images/desktop/ui/tabHover.png delete mode 100644 assets/images/desktop/ui/tabNonSelected.png delete mode 100644 assets/images/desktop/ui/tabPressed.png delete mode 100644 assets/images/desktop/ui/taskbar.png delete mode 100644 assets/images/desktop/ui/textbox.png delete mode 100644 assets/images/desktop/ui/textboxFocus.png delete mode 100644 assets/images/desktop/ui/textboxHover.png delete mode 100644 assets/images/desktop/ui/textboxPressed.png create mode 100644 assets/images/editors/ui/checkbox.png delete mode 100644 source/funkin/desktop/DesktopMain.hx delete mode 100644 source/funkin/desktop/DesktopScreen.hx delete mode 100644 source/funkin/desktop/DesktopUtils.hx delete mode 100644 source/funkin/desktop/editors/CharacterEditor.hx delete mode 100644 source/funkin/desktop/editors/CommandPrompt.hx delete mode 100644 source/funkin/desktop/editors/EditorPlayState.hx delete mode 100644 source/funkin/desktop/editors/HelloWorld.hx delete mode 100644 source/funkin/desktop/editors/MessageBox.hx delete mode 100644 source/funkin/desktop/editors/import.hx delete mode 100644 source/funkin/desktop/import.hx delete mode 100644 source/funkin/desktop/sprites/Button.hx delete mode 100644 source/funkin/desktop/sprites/Checkbox.hx delete mode 100644 source/funkin/desktop/sprites/DropDown.hx delete mode 100644 source/funkin/desktop/sprites/InputBox.hx delete mode 100644 source/funkin/desktop/sprites/MenuBar.hx delete mode 100644 source/funkin/desktop/sprites/NumericStepper.hx delete mode 100644 source/funkin/desktop/sprites/SpliceSprite.hx delete mode 100644 source/funkin/desktop/sprites/TabView.hx delete mode 100644 source/funkin/desktop/sprites/WindowText.hx delete mode 100644 source/funkin/desktop/theme/Theme.hx delete mode 100644 source/funkin/desktop/windows/ContextMenu.hx delete mode 100644 source/funkin/desktop/windows/Window.hx delete mode 100644 source/funkin/desktop/windows/WindowCaptionButton.hx delete mode 100644 source/funkin/desktop/windows/WindowContent.hx delete mode 100644 source/funkin/desktop/windows/WindowDragHitbox.hx delete mode 100644 source/funkin/desktop/windows/WindowGroup.hx create mode 100644 source/funkin/editors/UIDebugState.hx create mode 100644 source/funkin/editors/charter/Charter.hx create mode 100644 source/funkin/editors/ui/UICheckbox.hx create mode 100644 source/funkin/editors/ui/UISprite.hx create mode 100644 source/funkin/editors/ui/UIState.hx diff --git a/art/flashFiles/RECOVER_teaser animated.fla b/art/flashFiles/RECOVER_teaser animated.fla deleted file mode 100644 index a96f8195079dc779c4442744af6ac69ac58e8fb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112257 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�t~LoK`F#q)X!+gKfEgyw|FRR#4bZkK+1ZjfqLH5B5n&?><6^a0Jx z5lPZC>a0W+DAsX^_4(%thp*X6Pp2A3_}5PA>+KMKNMf>*%cIQ^JAGo@;oP!~A;ZY~ z2)HBLFgqpfbgPQ{Q1|HhBF+o!G%-*``7^W;&|VjbF3E?jT+rF23hE%xo!6%ViGsBw zWOA2#({HuE7*V1PGY$`oD9Mi$lYiECTt&c`&8Zh&jp>|}Wk*fRIfEy!a%uU9G)nMi9shMiG;_HW?tZSQDHG1@PJwF;B%DcUV!yO#-5Qvcb|0o=5F))H z)x}Shq*F{8HRAqEcD@{9M+O~(PN`Ilr$6G`#?eOdEG=0x5G{WB*jCmLIxDc2(xrfE#IB z|D0bIphJi4nI|zl#?aGI8?rhRxNZ^@o4B28@WE(KKi+FEq-DvI-`&~k0-x=tc8y%c zC%5@#y;KTwi1YI(>^oW6Uz)Am@qf6fpstB?CJL2*fok+1sf)=x0Q1@8tF1{j+qWq+ z*^Y4Eb9D|=4`4~O^o=)2sHwL|xv&Axory&jsc{6|p0xGimN*Io{g7j|!c&O=dgk>& z5+N)SGnPG>?^vgHK8CMwQpzz$vU8BVwDsluagL=Iwj`<;G$XF&KJY4sg#M1$U)PsH zrt)KmIu7k)ge}CHxKFV;m~g!nXwh-EHY9$L_&2`ca1*Sn%;+y2nz8Q-iw3h+6eB12 z0yKI5P|{Bb68d!02AZCAD~-2HrPzI|gRYzVp5IS@MCaq!YE3&VJL0c83Rz_=FBiVh z<<}sct=0yb5wx*Ll*fTz|Mg9PMv_s>;=#WU634DS`F($_jF^8_J9s=icLa) zR+0cjKkpLw9!ZSm$5aAkLtb$VYL7%8XP2D0+*^lM&9*eKu)HsN_LfBMyi*u)XWR&Okdhe z$dgJRT7BQni2}@}v=fR{bC96ZOASBn)Vr`7xq80BPzJWKsn+Fl@WET=n^6Y8Z9Pd7I5S~qFnacPe_?ob0g%&z zxJwgXQNCTi+MvA3Ry%Yqz-}Sh2X-67vX+*v29_;yArtm+K*#o{dXSyun5yWPa~QOz z;+BfVeB5+>3J z%w|Js<+wQ6OJFZ9_U=MiSQmYE?D9-S9~>4NVL?589V$*EFk}+~ttUtQcs4K5M~Dj4{sE36Lo&dO(eSO{udM@{a^@w3CiZ_&}Ou7OQfx{PVG(NY0Wmin~){X7(qDdLK5FzBcO6@3+lq>l5T@bD6 zkBQa~??*skLtvC)rPQeNL3i2lXZ0(O?X1T@HtAifVc$h&#Uo_u_FpFJ4f8Obx6qgv z=z%WkJ2izp<6Z(#ztj?_EX*h8uv{`St0LmMP)*cQZ%lSr^|O)nh*D-4?Xwzvzw3zV zHWv6g9MszJF08=ja_s}4w*#~cq(dRSQ=6y%FyzWA{}2zkh|}l`+dYmo#%O->dv;ne z?A@^2g#7*0HQs-KwrgGE0=Z}6gLjo$4U+c6A1P0WcG7Wj;oB?UCQlbmrc8qUQSQSR zijo!bp>;1$@oNXgGzJKcaE~9#qUx&bW2mP2J@8vz-J)(;5ca4q;bVA}XK=5~5R@x+ zS~&AwU)l?GcdlAZ0YnPOB!Vt_gctR}nC9)F5bCW>pRRLc(D_Aee||Hga7F>S^fLJ@axT-|L5p{*7D5THm_c1-WZWirmUY!`>-aSlJ~v&3FA2(3 zCc|zKf9a-q?y1lfjsY8Xedw2T;l(0kRaUB6>98ebSGJfcw`7rPh2m!YIdYY zslTF^t%r)L-L{_zkVO3CE+Y(A<{}1iB{VX!O`yH`ga&K(jQJ*?m9?pIBNu-l)h;>g zx8tqXT`lybIo-rSTzbvhP>dC920{yZaI4D@*x>1{d=L=8p@V3>m|xm$+Y-pZ{>eX? zwu8(cbfv_FsuF`gxp^#P`v)RNc;1)lz_h0=t(AB{R}hxKFkN#ilF=#NmANOTZE;W-oqBQG?}ft@0S4+fcq0dBUo=<& zy5dzN#)GCK{u<(OC2Zzf_4DO>qD7moU7p@>SX5*t$p&>rR@)|Wn-}^d>idSmT3#D? z{$I<#yX+L5j9##HO7&`~Ooq^eiG(ESNtjctzgCW}aj}y|n`8~uwv|qjtbPWu@UiG3 z%yW_3Qn)c6EO=-5haNC??cF=lW%2*wKXOby8o3~GY93HUgZ_XB&3a*6MdaU&P{mIA zxCUXsPSqt*P0nEx@O(!hWhI++otQ<&&ot%v#Q(|8txd0@y{b}0Ze%NZb^;ObMdfyk zYxXp=-+4&VZ~1lxo-~67FwIx$GJw33NdSJ&X<=R;16KMU2h(X&LVmMdsL08RMc=09 z29w0CmaEG&)hud)zMM@e3X_~ZtXuh(*(`on_>9u9C}_$WZ9F{Ib~BuaEiy_spmzFA zCppU;grNzggqO=Lx8M&aq-$XDliegg_CiOL5DX{Qoa$b%(BRdh`$EUNmvDopR|E=Z zt5iHqVUW z^M}aYgG%&nnVT?{h4Onguc_Y<&F8kr9yH!;8z#w$*EFH8Cw$&;h2yy()$mB~I%^Cj zNR%pt%pDi#H&q?UGW|UatZL+CfQQIptECKELPd@4^CMu{lQWgG6-+>NK48Djg0iBA zcztR)EuK%ZvN*Ki+^ivXk!-Uv;zKy9M&(`x3C3|3;JnJZfXhotujuLXq;W-jpFt=c zpO9VYS?2uo-T)GphiEQ_FU)H0pF$O9{AwtkbmR}LRC_Ofn0Fx(&dncVxTG*|#HF?j zjZKTz7s__S!|qu&rEJz+G-8;4S+PjBPX7Ec|>1@-@hq zJ(RnD&{nb5LOCmaoZ11CnvI7?Nq*3qN1R#- zxvBle)TE|=i<8}Wx$-49)Y|{#JN{~{&o_w4EDkDFW}YBl3PH!w%@!An&_?9}%%{Tn zS`wjUof7)?UBhO86)F-y``h7QO`?bfMF?n{{$bBIn*8UMv9UMTP!X7T_N0m)}Oa@RW}3&^&XswZNs6mU z;SHjNvkzH^ge&YF;wa2um|_F+=ULsge)KaSl#ry&wwnwrXU<~k@*R_0x8RlcSiNtE z5}?`*ews0xqXhUMBp)Yc@Kfv24;%t@X@EuSi;_YI39Y$BhVPa0*kfuDaMy8}z_647 zpAeQWX%yqPmikc#6=0HK-E?Lf3iZ5hMZ zNmFCuav8Ns9U^RrPI-q}TQvc+_viKBr6Ou zXlg3Ku7xF3McbGbhgt~tTn=}HEC1+gP`8_meaTVChu5mDDuY^ES_|zx?CxI_wQ8cY zZ3*G`mZ~AJ9h|Z<;g(*3?YZHi{1PBDF-_6_)jXFpki7Kki`G_lQemefQw&wc*pGVR_kG0cenfvJblL= z)S5noI12~kUrVnlozl6Ii4m6ub(xZ&P^(@^aN)aN^cmAIFojVzMV_L=zP#^pRU#gl zQ_)=l%-{R@Gh)=}6L_u4eo{}mSrdZiX;hRdm&nBE0jyye?n?Mk8EUc|b)J)e9I9pN zoL{21OiV={(vQC-FefsTK(2B02ivCP;<$@15bm-IT!hDxT$>$}{R({~sF!c;Lpk@r zs=uja=zB7Dg}7lz-{9SqbhTpuY)r=6RbG!O6eG`BC{>Z{{)kE1A2Xx37048TwV{O4 zxJtd^au%;=d#YFa_9${{#krXwXg@8;?e+X*w=*+}uOeu~3CZtc={Q|5HT^OKW3PUg z%vw4*;kBM0=O)!zF#$UP@s%$e>QM8cbC6EyJvFqsQuLkQh?Tz**j=XC$Kj_VkA@{Os)Ce9U3~GU$UP$;vxyNF)ILR zD-D~C4SQ)HmdP2{wg#pznEC!No3eb+)oas>_aL`h)Tlqv!QY`V8|X>%NG#IKKGRU` zya}Rf(8E!wh*8=J43Ye0XoPM!R6DCVZ+gW83f>i*psnG9dH7Z*Jj^ zGA`kJ?X04dDv^&q$(dE*Et@@y&HGfSJsIx=GP5l8tX~8uMg$%VPQs|E;4Zl z>cQUFCdkRayN4FVM+k=w0VUGzd#3XZU3*dPBeob*a~3w5!f-3Vm2k+`nSM;Cn8vC* zNELD^jzl#of3^SH6xh#lfS6g|aPQ|wr)^NgA$R4h|8Vn?wsq5Z`-OMUrTQ%{iohpQ z2l#CQ?5EP_d_NPejc?=YhJhg`$PJsMFGN1qL5jrzu*vLi!4BR;Is$(98xmYLjF1<|5+(~#4Zif^ z0YL_u$V+9ppN(3J{_rV{*^VIfzvy`G_o4cZ4eesGDobdf8$BW<`Ifpnp21c|P(o@R z^{at?A?nwhZfRg&*Pp@nUhjVCCc`Nz(Kwg*@!T9mE2$W;gy@3J8Gu{vL#1o;oO=~` zK7RYs9gF;PsQ@l`2N!%4bw043$jC_jBxuPtD7WlW{8GCD=;5u2e17FMID8Z)|Ax^3 z=%gphlm1+L+{U7>nj;DY-Zju5gkMR?F6|?=tqitla;5 zTbdR!CtZB48w3=clb9(~hpk48XP^$p$J?x!MEuhw7W373^UieWgb0ytxfC9y2X}R+ z(f}1q0WYQRGl#UkC6uAXx5*ERQ(%ZaY?BxCXQWr;k=s9bZ|*n4UjsTje1Ok-g$Df% zYyzPa~~qzx_+i-JuFPz^~6ceW46a9KJY?qn=4s5woL|o%)K*^#hTI4>yTb- zAu9(bCPd9n;{ap8FPF#~!3wf+i?;d~>Z2>8TskJ=A{BckRN1WDb_3N~<}G`A)|#Ro z3kfQt8myBvc{NbapiU*<#@NVi2CzQb@nNlmUP^lqd=ZoexsSKR8KItzY;%jv-1+fIETd(GRsvZ|%AMLDx2+OuRLAcpWlFZ^z7i zjn3%Pl+0lSDiX9pB^osMfthj*N-~AVN}n^m2G9NH1Fo+I0E?o+T)#%?0S8E7TS_Cs zZxv-pu;K{R>KCAW1Ty~7iKY#Q4$9Cj`)O+O_<%!4)|cvjo^))KUR~psr59~>$v_vP zOy4GA+S~av`&?}42Z?zH-^H{(-b#Xk?~&4D8r8E4nKrneKs2F<5#hhd+F8+%Yr#h3 z_dFYr5ZMcb6xhsxil3|2-kWV=K~AMnXP*p|efs;)X=B^f{dQoAGP>N?H6yf@v59<4 ze>s@$wu4Z+!bBKs#W#9%!3G2Tma|jr=bUo{eRq*2BU79hfl?@Y99@oGC}pD$94sif zSl5k{xsa4xMtM zFSj&|1&q2R&vX0zUyRzOQ_)wieF$Rv#T-ifN5z(^tykU-%is+es37D)y-}^mo zen!Amv;5fZ;nBJN36MR#uv5o8_jAjOea1$?u#Ul$#@7wH6E}P(9MT9!wgP64_+o_c zhnGrb9{tRXf2xh@pLUDv@%HH?yZiXc&+A@MwIVpeeELU#U0+E~vY+{#-zg(_^9^tY zy=M!3^Un&n85-khM`n^S3cenXsT80i<(Fl!%+®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 J6+d0~{{xRKjG6!d diff --git a/assets/images/desktop/cursor.png b/assets/images/desktop/cursor.png deleted file mode 100644 index 178f0e4247b4bc077a7c9f945d44e6d895edc09d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^JU}eU#0(_)4?R~0Qk(@Ik;M!Qe1}1p@p%4<6p&zm zPl)S(FaYxUz8ro7q!>$r{DK)Ap4~_Ta;!aF978H@@gCmD+hD-Ma8O*f*+3}JtN)Q| z&eD>zQ~r3mGd+G>w)F7r)A?3=R(=iSefwGE@gC+gTXUbWn+gb9b9L=A1scQP>FVdQ I&MBb@0Fqcb8UO$Q diff --git a/assets/images/desktop/icons/command.png b/assets/images/desktop/icons/command.png deleted file mode 100644 index 6686a2e660f90af0e86363944b032d63be77313f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHVEbxddW?4Wt-Lg8YIR9G=}s19D6}T^vIyZY3XJ@d`MwAcu!d zjc3)u1c9a_93s4;ti}x{J%Uml=NOz;JPHU*d8?%-(2!}#kgYDh^K!0jJy1V`r>mdK II;Vst0MrXLoB#j- diff --git a/assets/images/desktop/ui.xml b/assets/images/desktop/ui.xml deleted file mode 100644 index 8473c099..00000000 --- a/assets/images/desktop/ui.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/assets/images/desktop/ui/button.png b/assets/images/desktop/ui/button.png deleted file mode 100644 index a4013c75f8b62c704b2dc76bc55b33bd76d0b746..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz8#0(_MirWo<6lZ})WHAE+-(e7DJf6QI1t`c9 z;1lBd|NsBnw{L&=@Bt{`zIOk9AjMn~G?9Zwg>kcwN$PyQb`@L}S` zRSk`eogc3SOS9^>bP0l+XkK D(SS7- diff --git a/assets/images/desktop/ui/buttonDisabled.png b/assets/images/desktop/ui/buttonDisabled.png deleted file mode 100644 index ac9679dd532027c4178b299f82db65f7f3becd70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz8!3-pA4$q$mq&N#aB8wRq_zr_GbR3&^{`cjL{c!X1=}dNpAIvPmVyvCjrw?i?dZ+TFh59&j9$n8I zUsZDYz}bG0w+ffO+?aHC%VMvZbtPKWj%+L6hGpf~o5xT3FEGp1T=zN95(ZCKKbLh* G2~7ZcifI)9 diff --git a/assets/images/desktop/ui/buttonHover.png b/assets/images/desktop/ui/buttonHover.png deleted file mode 100644 index eb5a668e05d4189ec5ff4644b94a64f8bb6c382c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz8!3-pA4$q$mq&N#aB8wRq_zr_G>41&SQ6wH%;50sMjDXg=jq}YQgN&FqB&oS z1H%D__;ZXO{@?F%*(nyh%k%-mf!hbxZmr__C{_JY;*s(Z?~ZnX_lonJ|Fr(#`Y8QK r{YZMpdx7Ty(*>3b{NZo8*CM*@i}1tN-3mbGGcb6%`njxgN@xNAxG8g` diff --git a/assets/images/desktop/ui/buttonPressed.png b/assets/images/desktop/ui/buttonPressed.png deleted file mode 100644 index 9a9a7bf64a1c8c0d3b1f470a3afa5493c5f06ef7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 488 zcmVP)pGnn^@KRCwC0)xA!_P#6Z_w-iMr^v6xYEf5zcH?Bkn2L(-BFqS`& zUxSN@0^SW96PIDYI7nMWf}zx}^fb;r?Ma$+>65qTyg8p>+cumf2!i{Zo>J8zP=iv7b0VBqI6(HyaB-i!Uq}GxR!HY{8q# z2#T79tfnZfKhU-<7_$lV**l&aCoWj1jUmg2kdzeH{+ap&hB3uc?brox@52GR4-CAk zjv)~!bAkqeCV`K225J>bs1PV~f(9kjr|2{oSS*JFwwnwrm)$)K1kx`zJ+M+5LkS4# z1U6a>tQOsb3MZ(ug!MK93)cinRGTDcZRP};)Wa9Ahgac%-B+)N1WHNTLr%~j(412b zJy6S2!hoPbV5i5xQZ5{@)%SXMNwoI60iUTrSigbF99vxN0GFX8zJs+5MB^nV{Z z%l!U;x%fn7aKujeY>333ibUN1jUAx?%aw_>wL+<%`JXAJQ<^Daj2?e8MHF}F`v|l_ e#+@l)PrX0E@9X&hDYAY50000I-JrNiWph^aQB#FVdQ&MBb@01$oOw*UYD diff --git a/assets/images/desktop/ui/captionButtons.png b/assets/images/desktop/ui/captionButtons.png deleted file mode 100644 index f689dfcc20e2e93c1d1f956dcd101b0b617382f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3863 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 X@Q9$iV64hsx&X{c3*!fd?lJ!X3Y;|) diff --git a/assets/images/desktop/ui/captionInactive.png b/assets/images/desktop/ui/captionInactive.png deleted file mode 100644 index f65197b418c3f76a58eda09e2752bd5f961f9cc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 494 zcmeAS@N?(olHy`uVBq!ia0vp^PC#tM!3-pgf7h1*Db50q$YKTtzQZ8Qcszea3Q%xb zfKQ0)|NsA|EV!6gd!VrTKz_}E+}Z;L)d$MU4-{7(s3<#7QgNWD@<3(jfzt8=O$GZK z3isC)?XN1?-&nA}x_Ey}-u{}R{jItCoAdT}Wbbdw+3)F}VP&0QVUu8Hn_y|3U~ZFO zYMbC_9`9lr?_?J5U>22 z(vF$u`+zPqED7=pW_U^>C|-~>1*rL;r;B4q#jUp&9k~t}2(&(YZqXRBOYG&UlKW2Y z>lMr|F&|-jdq(hHN5_-f`{(;Hn@>nM!dyPdeN6$E#3I)GBf@bUW>Je&>nseHE!e0E zWbK<0;W=+YmcuGH#RosbRA&h|ei6tx`ylmnhs%B^gLppeliN1urGLoTo%x?(J;RHw z-F8{atG`T$^=3N1?WuD65uv&h!Zx?XeDy!%%--S>za-=C!Ogi>?=+_0UbD0*{dUvS qstC_*u_phl4evHBv-fJ*%Q)Nm0{`pzrFKBiFnGH9xvXB-~+wySGAzhs%J9lvSoxwVB zKTZt9Bi8TKbcpKPL<86zAZk~=s0uIauN5^k3me*Ly){BSPFUH-Z)oDT;`q4MMPe1d zyoCoeYO3Qk;CS5?yxMm(pj|nRT3S0_T02`*Irpk!wy2zfc{7z;GM!yGnSq%==TF7t zijmo(nCGGrlsGzDP=XW{p+u-mK~&Z@CQeWsBZxz9=f-UpMQ=xBauZUx1yS5g6gMG> zjX<;0P;5*D8lo}cu z0;hd3w)#3C8liU_ok7U|Us{XK{UFfZ3|mVxmk0{s%Zjs-nd;D{4aD3$3-#=jl@3fN z&PHjESqcGRnHqoW4XSc$ZlCy%VUAQd{m{sGbY?^y8o@H&?D_|2f%xpd2>0{2f7d9s@wB#Oa^0li0g~*m+xf5E5dzfkG2lMWB zrv~MHm0=k@nzbC)oCkOpw}qPhc-;VfCpQ^?wfx@v)100sx60`dQQVmp&#=|Ss``P~ zXP`Bz=Q(6Q@j`uk!I)CFdMdQb5{ID4%;IBM!yj9-*OLN~n-ZrH(cT|NG@?nK- zUW}$NIQhcOAmr+;HbPl@dzs0O*Q%*6no4ioNH2Hq?rx#qVdfXw>t0 zk9%~kQS&z8r1zH`H<@Md9Jl3bBrfL#baS$0tE*HAp7>7wto6pZ83sFPU#k1T=3_Z*35}?=||~Ch^N2b!!S5J z?4h6k(kZ%sDbzYy)Nw8A{U}qi@Y#T*N?cm_%QGSf1`E2}h`4O4emvhKC7Q(oCtekH zTPt{{UenXeRa^$EAd*EEaY;!xDv=S0to+j3yH^48@~J-_gson4FM$X7Bs!v%NqRjR zL^sbPU!B6Zey$dOA8EAu*|ETQO6Rg3y8VLUB}nb&87xF2U9LYiN02vpP@iLApcHMK zUZ5SRM$|xJLv-|$X7o@Hdyb-^L+@SUrxox?ens(-bO<_QY{UQ?7>G0YG=|R19+a}L zt0Ik&3(mH~x>dg6QSN?rPe{5JJ_T8!uc`NAi$3PQK-N*svtOT!Uy5(4n<->43h$G@ z#d})7Wp!5`_%xn>H9AsjSjW+oL)c$EsXYRDyS(CkMN>^p!N)BiwwkDsX1n_kegC1j+>tS~e($#B}sh&H&#OSvb{%w9FbOY3fcu1ZLX zxJSjK@#@y5%M@)q59j(TM)0Uv60}<=6`KCk0NP6y89hOX^&MqC@PHo-vbA!wtTTtj F{|g^kQLq32 diff --git a/assets/images/desktop/ui/context.png b/assets/images/desktop/ui/context.png deleted file mode 100644 index 0991f2c46b3a808f7b16df2c793911b33490fb49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoQ!3HEH;(vt$Db50q$YKTtzQZ8Qcszea3Q#b_ z)5S5Q;?~<~8+jQNd6;AW{4-9Kyw?*acjl% z(-*|v>r+$=3Mz`Rn}lp0$XV{u);6*epDE$?}l%@ursY zf8u8Td64yD;*|3f&6fZ5ds4IG+tdEvoBj9Avd^2mH}t)YKz+qqssFpJl2=$U-&}ps z#zV8+md8Bg@Yk&D6@I7gh51jtpLcDgb`y_8gATip@*)N%4uu9>#DB(4X}uNGSWk+F i#5}Zej{U&(oi|=X;@y+;^ELo|%;4$j=d#Wzp$Py`YIhO< diff --git a/assets/images/desktop/ui/menuBar.png b/assets/images/desktop/ui/menuBar.png deleted file mode 100644 index 7e33f3238904f535ada21a2a2bcff2524c5e604d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F#`kNVGw3Kp1&dmD5&P? z;uunKE7_*t!GT~lEv93E%)7(7Obf0YNK97{kYBK@k)f^E>g1zC)53r{7(8A5 KT-G@yGywp!G?WltB!kcwN$PyQb`@L}S` uRSk`eogc3hpoO7apnwEKa|89ZJ6T-G@yGywnxQZl~) diff --git a/assets/images/desktop/ui/tabBody.png b/assets/images/desktop/ui/tabBody.png deleted file mode 100644 index ced1caa0b05c1d6e590dce88a785f4c1a7c8b221..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz8!3HF`W%CyUDb50q$YKTtzQZ8Qcszea3Q*AA z)5S5Q;?~%>^e+E-8XS0-530I! z9SQvT-`}Pv?CFQEndtKR+sw6iv;Lx-4UH e*UixVAp6_tJRh#{F1rIXl)=;0&t;ucLK6VS?`t^# diff --git a/assets/images/desktop/ui/tabNonSelected.png b/assets/images/desktop/ui/tabNonSelected.png deleted file mode 100644 index b644b3f531349a5be73f43fad2c9274bdcc80fed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz8!3HF`W%CyUDb50q$YKTtzQZ8Qcszea3Q#b} z)5S5Q;#TsX|NrfoO&OKX@}#7sEIE;~z_O=+*|AO5uI7iBD%-7Fw^lXsu+H?_n0TVC zPs$?e!2&}Ad;5BBQ=T~%g^SLwXk5(3C&j!nQG$noAt|uv=UMC5dO*_|JYD@<);T3K F0RVz8F_-`V diff --git a/assets/images/desktop/ui/tabPressed.png b/assets/images/desktop/ui/tabPressed.png deleted file mode 100644 index 707ebfff2f8e08b4f00c0de38b7574415ea8072d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 439 zcmV;o0Z9IdP)pFz)(z7MgRZ*lAr&Op#PVg|COEplb-*ang5!a|CpQqotXcRpZt=D z|DA&Wn}h$Eg#VX?|CNUSlZXGGfd8I<{D_U^gpcKbk>!nw<%^5uiHzlij^&1p<&BBu zfR5sRkK&PZ=Y)IZg?i(z~(2a89b%4xqg3Nq;%y@pxc7M!$ zd(3%#%zk>zdVI`qea3En#%g-MYk9weY0-FW%zJ9gd27sdZOndX%zSCgc5KXiWX1ph z0CRb&hX4Qo0d!JMQvg8b*k%9#0FX&UK~#9!ZOkza!Y~j8(ee5l0X>w64nYglzW-gQ zBgIj)6f|p-*UtcT08n4gNAP@AsPEh599(YiYOK?zGp$hXr_?#!t56Y95r!x4BuC`g ziRO%9WndW12Mr_p;Fsr4F~m_uq$47y9Z|}NCMQzc8|DMU@IMH-6S)vRKAn6`)0{hp hBHFSL$+n-=4PQ)kiEDlxcmDtY002ovPDHLkV1kcO*Jc0! diff --git a/assets/images/desktop/ui/taskbar.png b/assets/images/desktop/ui/taskbar.png deleted file mode 100644 index 8d67514c673e24fcf18851d545275085d9710c11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^7CqhP(_4JPeMny64I&tK@_>p8Dl*+`OJo@7XR>sqUK831<}MI$AZCu)XBD nB)R0Z{GHgTe~DWM4f7V)fxkG{E!6qF6rv>kS z>lDO>TRb=5ac1O>IKU+KL4M1%rsBSJuQwgYy5ZTkCu&eH38Jk&I8CzUj-6o!2e|{<-UO(SnQtGjd zyA>unAk(APMjprq$Etua4tU($~s|7@L8cQ7A0;CcI;k%x!3VaqGe38@cWdFxBW z+0-7J@I2Kf>%oe~#cX|27Fi0L8hyRX4LLeH3_3hLCZ#@DEq-3|-rmZ?0pf4j3^&v~ zi(<>mi(_L{Ox(ot=fgYQ!`Ii(m$bUvEGe-v_BA8Jy1x5=ecIB`0^QHx>FVdQ&MBb@ E0NqMt00000 diff --git a/assets/images/desktop/ui/textboxHover.png b/assets/images/desktop/ui/textboxHover.png deleted file mode 100644 index 49688263398c767dc43c52b7251f54fe1f14834c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz8!3HF`W%CyUDb50q$YKTtzQZ8Qcszea3Q%yZ zr;B4q#jUqj7xFbZFtmUC&uZ2$t6px?e071@-8sEk1!nT+p7DgtD!#moZT0yBjqJ?k zO?(>9q(AOs|8cc{!Rziir6mXXmP^YVZ}g5;Ub@EXN@?%gtTwS8J%58^248jx{y1mS zwdg>V;kyGr{x$KiEaB;KSSqwa#nnPK@=c$Z4 zwwSF?$|CE*ipIrkO42vBl!!M^=-_Cc(V`N`wy)~roQHR3oAZ=j%oAWfoxU#h!Lw(n z0s=y6rw{PIzh_kQ_t(sY#pK?@2^KRCwCum`zL_RTRh1%$=E6Kmt@WVPU9k8j?1xpF0;MjnR#| z(}a&lDNQ2=YBkoTB~{aC#NbyEsw7HF`P79QH8C*_i3?5aN~#Su#A2eDkgCvDDDTae z=bU@*aNp}IvS6cc9)~kCZ|1ynfAc@*&WzR7)fK}AE{lsB8V;tXf7{S_las^NIuEth zun3I?8e0Ugp`l^*EXyirw8U{-(DX7fF~I;ko_TRKo=xZ5U{f5M;@COyD3>^jA>vqa zT`#9Tc#{F{ZGPU!4`X2*A@EFG2M}P#GG1iSxgl;x5QexN$(VXMJNoW=0cudT@ibYZ3=@DFlx^EN{#F2^D9Z6H8$;_28bUZmq;j4+Bgr!b5XkS0J4&T=F) z2hFna96+WJq)ll{XzoI zjxm-efIjLkH=g1(Q2qDz#983tLI3VF4B);M2H4cp#7WU$O$CxKRKgmV_B3c( z9~&EEfCoE|;<*kE+GTi-pb`cKNNrGyki>qgt$0S#v&Sei>F|Hk)M?et4PzI(embv~6dZu?OHgM&Q;Q1>!X0HCelc^cl*JluZia~QyjU5D^4Z+#f{Rc?Xb@w>m# zZZN=>mX-vZhG_P~LI5>1?a79RhZVr%tY*)38JcONJ{1n=E+$q0P0OO9N!2HNUsC{& zart_jQ%ZrfRDLc`STbHD`yZ7pDG|Yu3bU$=2M4w6S3h3GS6nvG}15?wV!lTQ7!b`NXqzX>#coIHSsv}$GrmAmaimZe;Q*ZnJ40MM+ zq)A;>+o0p_J@AtPC}t;N=fcnM4$ZiD%QAFN3%qZXEy3e^K(wG3ClLndFTv&?KZZW6 zfO;I>!d(x+vv=%(zph+_>R-Qw_i(5c_>+^n8sTMxcvS&hR;8N-^*C3Iw=q=0G?A2F zpM#p2FX1E1V>{+Fv!x!ofB71YD20T(9J;p@|z#_YmE?1KT zO(x~@Q?PyRJVK123WvFfz7qW(sK|CyN+@3TMttO`ko1ouUav_Oh_5GF$9r-mf@sw0wp{gI@%-2=g+X|AefN6h|@^S#e v1}^`BSNi&GjQPS;n^s_GnC^Es!K39L#Tu2dk)Bm#00000NkvXXu0mjftZC3X literal 0 HcmV?d00001 diff --git a/buildnumber.txt b/buildnumber.txt index 5b18ee08..09397688 100644 --- a/buildnumber.txt +++ b/buildnumber.txt @@ -1 +1 @@ -2492 \ No newline at end of file +2495 \ No newline at end of file diff --git a/source/funkin/desktop/DesktopMain.hx b/source/funkin/desktop/DesktopMain.hx deleted file mode 100644 index 38c429d6..00000000 --- a/source/funkin/desktop/DesktopMain.hx +++ /dev/null @@ -1,222 +0,0 @@ -package funkin.desktop; - -import flixel.math.FlxRect; -import openfl.geom.Rectangle; -import lime.app.Application; -import openfl.display.BitmapData; -import flixel.system.scaleModes.BaseScaleMode; -import flixel.system.scaleModes.FixedScaleAdjustSizeScaleMode; -import flixel.math.FlxPoint; -import flixel.util.FlxDestroyUtil; -import funkin.desktop.editors.*; -import funkin.desktop.windows.*; -import funkin.desktop.theme.Theme; - -class DesktopMain extends MusicBeatState { - public var oldScaleMode:BaseScaleMode; - public var wallpaper:FlxSprite; - public var screenSize:FlxPoint; - - public var windows:WindowGroup; - - public static var instance:DesktopMain; - - public static var currentFocus:IDesktopFocusableObject; - - public static var mouseInput:MouseInput; - - public static var theme:Theme = null; - - public static var contextMenu:ContextMenu = null; - - public static function init() { - theme = Theme.loadFromAssets(Paths.getPath('images/desktop/ui.xml', TEXT, null)); - mouseInput = new MouseInput(); - - FlxG.signals.preUpdate.add(function() { - updateMouseInput(); - }); - } - - public override function create() { - super.create(); - - instance = this; - - FlxG.mouse.useSystemCursor = FlxG.mouse.visible = true; - oldScaleMode = FlxG.scaleMode; - FlxG.scaleMode = new FixedScaleAdjustSizeScaleMode(false, false); - - wallpaper = new FlxSprite(); - #if windows - try { - wallpaper.loadGraphic(BitmapData.fromFile('${Sys.getEnv("AppData")}\\Microsoft\\Windows\\Themes\\TranscodedWallpaper')); - } catch(e) #end wallpaper.loadGraphic(Paths.image("menus/menuBG")); - wallpaper.scrollFactor.set(0, 0); // anchor at top left - wallpaper.antialiasing = true; - add(wallpaper); - - screenSize = new FlxPoint(-1, -1); - - windows = new WindowGroup(); - add(windows); - } - - private static function updateMouseInput() { - mouseInput.set(FlxG.mouse.pressed, FlxG.mouse.justPressed, FlxG.mouse.justReleased, FlxG.mouse.pressedRight, FlxG.mouse.justPressedRight, FlxG.mouse.justReleasedRight); - } - - public override function update(elapsed:Float) { - updateMouseInput(); - - if (contextMenu != null) - contextMenu.update(elapsed); - - super.update(elapsed); - - - if (screenSize.x != FlxG.width || screenSize.y != FlxG.height) { - screenSize.set(FlxG.width, FlxG.height); - updateScreenRes(); - } - - // debug window - if (FlxG.keys.justPressed.SPACE) - windows.add(new Window(new HelloWorld())); - if (FlxG.keys.justPressed.F1) - windows.add(new Window(new CharacterEditor('dad'))); - if (FlxG.keys.justPressed.F2) - windows.add(new Window(new EditorPlayState())); - - FlxG.sound.enableVolumeChanges = !(currentFocus is IDesktopInputObject); - - // TEMPORARY ESCAPE KEY UNTIL TASKBAR IS ADDED - if (FlxG.keys.justPressed.ESCAPE) FlxG.switchState(new funkin.menus.MainMenuState()); - } - - public function openWindow(content:WindowContent) { - return windows.add(new Window(content)); - } - - public override function draw() { - super.draw(); - if (contextMenu != null) - contextMenu.draw(); - } - - public function updateScreenRes() { - // update wallpaper - wallpaper.setUnstretchedGraphicSize(FlxG.width, FlxG.height); - for(e in windows) { - e.onDesktopSizeChange(FlxG.width, FlxG.height); - } - } - - public override function destroy() { - super.destroy(); - - FlxG.sound.enableVolumeChanges = true; - contextMenu = FlxDestroyUtil.destroy(contextMenu); - - FlxG.scaleMode = oldScaleMode; - FlxG.mouse.useSystemCursor = FlxG.mouse.visible = false; - - // TODO: switch back while using config - FlxG.resizeGame(1280, 720); - - if (screenSize != null) - screenSize.put(); - } - - public function focusWindow(window:Window) { - windows.remove(window, true); - windows.add(window); - layerCameras(); - } - - public function layerCameras() { - for(win in windows.members) { - FlxG.cameras.remove(win.windowCaptionCamera, false); - for(e in win.windowCameras) FlxG.cameras.remove(e.camera, false); - } - for(win in windows.members) { - FlxG.cameras.add(win.windowCaptionCamera, false); - for(e in win.windowCameras) FlxG.cameras.add(e.camera, false); - } - } - - public static function loseFocus(obj:IDesktopFocusableObject) { - if (currentFocus == obj) { - currentFocus.onFocusLost(); - currentFocus = null; - } - } - - public static function setFocus(obj:IDesktopFocusableObject) { - if (currentFocus == obj) return; - if (currentFocus != null) - currentFocus.onFocusLost(); - (currentFocus = obj).onFocus(); - } - - public static function hasFocus(obj:IDesktopFocusableObject) { - return currentFocus == obj; - } -} - -class MouseInput { - public var pressed:Bool = false; - public var justPressed:Bool = false; - public var justReleased:Bool = false; - public var pressedRight:Bool = false; - public var justPressedRight:Bool = false; - public var justReleasedRight:Bool = false; - public var screenPos:FlxPoint = null; - private var __cancelled:Bool = false; - - public function cancel() { - pressed = justPressed = justReleased = pressedRight = justPressedRight = justReleasedRight = false; - __cancelled = true; - } - - public function new() {} - - public function set(pressed:Bool, justPressed:Bool, justReleased:Bool, pressedRight:Bool, justPressedRight:Bool, justReleasedRight:Bool) { - this.pressed = pressed; - this.justPressed = justPressed; - this.justReleased = justReleased; - this.pressedRight = pressedRight; - this.justPressedRight = justPressedRight; - this.justReleasedRight = justReleasedRight; - this.screenPos = FlxG.mouse.getScreenPosition(FlxG.camera); - this.__cancelled = false; - } - - public function overlaps(spr:FlxObject, ?camera:FlxCamera) { - return overlapsRect(spr, new FlxRect(spr.x, spr.y, spr.width, spr.height), camera); - // return FlxG.mouse.overlaps(spr, camera); - } - - public function overlapsRect(spr:FlxBasic, rect:FlxRect, ?camera:FlxCamera) { - if (__cancelled) return false; - if (camera == null) camera = FlxG.camera; - if (spr is FlxObject && camera != null) { - var obj = cast(spr, FlxObject); - rect.x -= camera.scroll.x * obj.scrollFactor.x; - rect.y -= camera.scroll.y * obj.scrollFactor.y; - } - var pos = FlxG.mouse.getScreenPosition(camera); - - return ((pos.x > rect.x) && (pos.x < rect.x + rect.width)) && ((pos.y > rect.y) && (pos.y < rect.y + rect.height)); - } -} - -interface IDesktopFocusableObject { - public function onFocus():Void; - public function onFocusLost():Void; -} - -// useless, only here for -interface IDesktopInputObject { - -} \ No newline at end of file diff --git a/source/funkin/desktop/DesktopScreen.hx b/source/funkin/desktop/DesktopScreen.hx deleted file mode 100644 index a94b1bf3..00000000 --- a/source/funkin/desktop/DesktopScreen.hx +++ /dev/null @@ -1,53 +0,0 @@ -package funkin.desktop; - -import flixel.util.FlxDestroyUtil.IFlxDestroyable; -import openfl.events.Event; -import lime.app.Application; -import lime.ui.Window; - -class DesktopScreen implements IFlxDestroyable { - public var cameras:Array = []; - public var window:Window; - - public function new() { - window = Application.current.createWindow({ - x: 0, - y: 0, - width: FlxG.width, - height: FlxG.height - }); - @:privateAccess - Application.current.__addWindow(window); - - window.stage.addEventListener(Event.ENTER_FRAME, onFrameEnter); - - FlxG.signals.preDraw.add(__onPreDraw); - FlxG.signals.postDraw.add(__onPostDraw); - - window.onClose.add(destroy); - } - - public function addCamera(cam:FlxCamera) { - cameras.push(cam); - window.stage.addChild(cam.flashSprite); - } - - private inline function __onPreDraw() {} - private inline function __onPostDraw() {} - - private function onFrameEnter(event:Event) { - try { - @:privateAccess - for(c in cameras) - c.render(); - } catch(e) { - trace(e.toString()); - } - } - - public function destroy() { - for(c in cameras) - c.destroy(); - window.close(); - } -} \ No newline at end of file diff --git a/source/funkin/desktop/DesktopUtils.hx b/source/funkin/desktop/DesktopUtils.hx deleted file mode 100644 index 92fa8fe6..00000000 --- a/source/funkin/desktop/DesktopUtils.hx +++ /dev/null @@ -1,10 +0,0 @@ -package funkin.desktop; - - -class DesktopUtils { - public static inline function copyProperties(spr1:FlxObject, spr2:FlxObject) { - spr1.cameras = spr2.cameras; - spr1.setPosition(spr2.x, spr2.y); - spr1.scrollFactor.set(spr2.scrollFactor.x, spr2.scrollFactor.y); - } -} \ No newline at end of file diff --git a/source/funkin/desktop/editors/CharacterEditor.hx b/source/funkin/desktop/editors/CharacterEditor.hx deleted file mode 100644 index 9d6a479a..00000000 --- a/source/funkin/desktop/editors/CharacterEditor.hx +++ /dev/null @@ -1,341 +0,0 @@ -package funkin.desktop.editors; - -import funkin.game.Character; - -using funkin.utils.XMLUtil; - -class CharacterEditor extends WindowContent { - public function new(curCharacter:String) { - super('Character Editor - Loading...', 0, 0, 1200, 600); - } - - public var camHUD:FlxCamera; - public var char:Character; - public var curCharacter:String; - public var camFollow:FlxObject; - public var tabView:TabView; - - public var animList:Array = []; - public var animListNames:Array = []; - - public var curAnim:AnimData; - - public var menuBar:MenuBar; - - /** - * SILHOUETTES - */ - public var silhouetteDad:Character; - public var silhouetteGf:Character; - public var silhouetteBf:Character; - - /** - * ANIMATION TAB - */ - public var animsDropDown:DropDown; - public var animNameInput:InputBox; - public var animPrefixInput:InputBox; - public var animLoopCheckbox:Checkbox; - public var animFpsStepper:NumericStepper; - public var animOffsetX:NumericStepper; - public var animOffsetY:NumericStepper; - - /** - * CHARACTER SETTINGS TAB - */ - public var charSpriteInput:InputBox; - public var charIconInput:InputBox; - public var charIsPlayerCheckbox:Checkbox; - public var charIsGFCheckbox:Checkbox; - public var charOffsetXStepper:NumericStepper; - public var charOffsetYStepper:NumericStepper; - public var charHoldTimeStepper:NumericStepper; - public var charFlipXCheckbox:Checkbox; - public var charScaleStepper:NumericStepper; - public var charAntialiasingCheckbox:Checkbox; - - public override function create() { - super.create(); - - // camera stuff - parent.windowCameras[0].resizeScroll = false; - camHUD = new FlxCamera(0, 0, 1200, 600, 1); - camHUD.pixelPerfectRender = true; - camHUD.bgColor = 0; - parent.addCamera(camHUD); - - // stage - var bg = new FlxSprite(-600, -200).loadAnimatedGraphic(Paths.image('stages/default/stageback')); - bg.scrollFactor.set(0.9, 0.9); - var stageFront = new FlxSprite(-600, 600).loadAnimatedGraphic(Paths.image('stages/default/stagefront')); - silhouetteDad = new Character(100, 100, "dad", false); - silhouetteGf = new Character(400, 130, "gf", false); - silhouetteGf.scrollFactor.set(0.95, 0.95); - silhouetteBf = new Character(770, 100, "bf", true); - - for (e in [silhouetteDad, silhouetteGf, silhouetteBf]) { - e.color = 0xFF000000; - e.visible = false; - e.alpha = 0.25; - } - - for (e in [bg, stageFront, silhouetteDad, silhouetteGf, silhouetteBf]) { - e.antialiasing = true; - add(e); - } - - char = new Character(100, 100, curCharacter, false, false); - add(char); - - title = 'Character Editor - ${char.curCharacter}.xml'; - - // character setup & following - var charMidpoint = char.getGraphicMidpoint(); - camFollow = new FlxObject(0, 0, 2, 2); - camFollow.setPosition(charMidpoint.x, charMidpoint.y); - add(camFollow); - charMidpoint.put(); - windowCamera.follow(camFollow, LOCKON, 999); - - // loading animations from character - animList = []; - if (char.xml != null) - for(anim in char.xml.nodes.anim) - animList.push(anim.extractAnimFromXML()); - - // interface setup - setupTabView(); - - // todo: menu bar handlers - menuBar = new MenuBar([ - { - name: "File", - options: [ - { - name: "New" - }, - { - name: "Open" - }, - { - name: "Save" - }, - { - name: "Save As..." - }, - { - name: "Exit" - } - ] - }, - { - name: "Edit", - options: [ - { - name: "Add Animation..." - }, - { - name: "Delete Animation" - } - ] - }, - { - name: "View", - options: [ - { - name: "Lock Camera on Character" - }, - { - name: "Reset Camera Position", - callback: resetCamPos - }, - { - name: "Reset Camera Zoom", - callback: resetCamZoom - }, - { - name: "Toggle Boyfriend Silhouette", - callback: toggleSilBF - }, - { - name: "Toggle Dad Silhouette", - callback: toggleSilDad - }, - { - name: "Toggle Girlfriend Silhouette", - callback: toggleSilGF - } - ] - }, - { - name: "Help", - options: [ - { - name: "Open Editor Documentation" - }, - { - name: "Open Engine Documentation" - } - ] - } - ]); - menuBar.cameras = [camHUD]; - add(menuBar); - } - - public function setupTabView() { - tabView = new TabView(800, 20, 400, 580, ["Animation Settings", "Character Settings"]); - tabView.updateAnchor(1, 0, [camHUD]); - add(tabView); - - addAnimTab(); - addCharTab(); - - refreshAnims(); - changeAnim(0); - } - - public function addAnimTab() { - var content:Array = []; - var label:WindowText = null; - - content.push(label = new WindowText(10, 10, 0, "Animations")); - content.push(animsDropDown = new DropDown(10, label.y + label.height, 380, [], function(id) { - changeAnim(id); - })); - - content.push(label = new WindowText(10, animsDropDown.y + animsDropDown.height + 10, 0, "Animation Name")); - content.push(animNameInput = new InputBox(10, label.y + label.height, 380, "")); - - content.push(label = new WindowText(10, animNameInput.y + animNameInput.height + 10, 0, "Animation Prefix")); - content.push(animPrefixInput = new InputBox(10, label.y + label.height, 380, "")); - - content.push(animLoopCheckbox = new Checkbox(10, animPrefixInput.y + animPrefixInput.height + 10, 380, "Loop")); - - content.push(label = new WindowText(10, animLoopCheckbox.y + animLoopCheckbox.height + 10, 0, "Animation FPS (Frames per second)")); - content.push(animFpsStepper = new NumericStepper(10, label.y + label.height, 380, 0)); - - content.push(label = new WindowText(10, animFpsStepper.y + animFpsStepper.height + 10, 0, "Animation Offset (Relative to scale)")); - content.push(animOffsetX = new NumericStepper(10, label.y + label.height, 180, 0)); - content.push(animOffsetY = new NumericStepper(200, label.y + label.height, 180, 0)); - - for(e in [animOffsetX, animOffsetY]) - e.increment = 10; - - for(spr in content) - tabView.tabs[0].add(spr); - } - - public function addCharTab() { - var content:Array = []; - var label:WindowText = null; - - content.push(label = new WindowText(10, 10, 0, "Sprite Name (images/characters/)")); - content.push(charSpriteInput = new InputBox(10, label.y + label.height, 380, char.xml.has.sprite ? char.xml.att.sprite : "")); - - content.push(label = new WindowText(10, content.last().y + content.last().height, 0, "Icon Name (images/icons/)")); - content.push(charIconInput = new InputBox(10, label.y + label.height, 380, char.icon.getDefault(""))); - - content.push(charIsPlayerCheckbox = new Checkbox(10, content.last().y + content.last().height + 10, 380, "Playable character")); - content.push(label = new WindowText(10, content.last().y + content.last().height, 380, "(Offsets are automatically fixed when playing as a non-playable character and vice versa)")); - charIsPlayerCheckbox.checked = char.xml.getAtt("isPlayer") == "true"; - - content.push(charIsGFCheckbox = new Checkbox(10, content.last().y + content.last().height + 10, 380, "Is Girlfriend")); - content.push(label = new WindowText(10, content.last().y + content.last().height, 380, "(Characters marked as Girlfriend will replace GF when used as opponent)")); - charIsGFCheckbox.checked = char.isGF; - - content.push(charFlipXCheckbox = new Checkbox(10, content.last().y + content.last().height + 10, 380, "Flip Horizontally")); - charFlipXCheckbox.checked = char.__baseFlipped != char.isPlayer; - - for(spr in content) - tabView.tabs[1].add(spr); - } - - public function changeAnim(id:Int) { - curAnim = animList[id]; - if (curAnim == null) return; - char.playAnim(curAnim.name, true); - - animNameInput.text = curAnim.name; - animPrefixInput.text = curAnim.anim; - animLoopCheckbox.setChecked(curAnim.loop); - animFpsStepper.value = curAnim.fps; - animOffsetX.value = curAnim.x; - animOffsetY.value = curAnim.y; - } - - public function refreshAnims() { - animListNames = [for(e in animList) e.name]; - animsDropDown.options = animListNames; - animsDropDown.onSelectionChange(0); - } - - public override function update(elapsed:Float) { - super.update(elapsed); - if (parent.focused) { - if (FlxG.keys.pressed.RIGHT) camFollow.x += elapsed * 500; - if (FlxG.keys.pressed.LEFT) camFollow.x -= elapsed * 500; - if (FlxG.keys.pressed.DOWN) camFollow.y += elapsed * 500; - if (FlxG.keys.pressed.UP) camFollow.y -= elapsed * 500; - } - - if (curAnim != null) { - // animation updating - var shouldUpdate = false; - var oldName:String = curAnim.name; - - var updateListAsWell = shouldUpdate = (curAnim.name != (curAnim.name = animNameInput.text)); - shouldUpdate = (curAnim.anim != (curAnim.anim = animPrefixInput.text)) || shouldUpdate; - shouldUpdate = (curAnim.fps != (curAnim.fps = Std.int(animFpsStepper.value))) || shouldUpdate; - shouldUpdate = (curAnim.loop != (curAnim.loop = animLoopCheckbox.checked)) || shouldUpdate; - shouldUpdate = (curAnim.x != (curAnim.x = animOffsetX.value)) || shouldUpdate; - shouldUpdate = (curAnim.y != (curAnim.y = animOffsetY.value)) || shouldUpdate; - - if (shouldUpdate) - updateCurAnim(oldName, updateListAsWell); - } - - char.isPlayer = char.playerOffsets = charIsPlayerCheckbox.checked; - char.isGF = charIsPlayerCheckbox.checked; - char.flipX = char.__baseFlipped = (charFlipXCheckbox.checked != char.isPlayer); - char.x = charIsPlayerCheckbox.checked ? 770 : 100; - } - - public function updateCurAnim(?oldName:String, updateListAsWell:Bool = false) { - if (oldName == null) - oldName = char.animation.curAnim != null ? char.animation.curAnim.name : curAnim.name; - - char.animation.remove(oldName); - char.animation.curAnim = null; - - XMLUtil.addAnimToSprite(char, curAnim); - - char.playAnim(curAnim.name, true); - } - - public override function onWindowResize(width:Int, height:Int) { - tabView.resize(400, height - 20); - } - - /** - * =========== CONTEXT MENU OPTIONS =========== - */ - - /** - * View - */ - public function resetCamPos() { - var pos = char.getCameraPosition(); - camFollow.setPosition(pos.x, pos.y); - } - public function resetCamZoom() { - windowCamera.zoom = 1; - } - - /** - * Silhouettes - */ - public function toggleSilBF() silhouetteBf.visible = !silhouetteBf.visible; - public function toggleSilDad() silhouetteDad.visible = !silhouetteDad.visible; - public function toggleSilGF() silhouetteGf.visible = !silhouetteGf.visible; -} \ No newline at end of file diff --git a/source/funkin/desktop/editors/CommandPrompt.hx b/source/funkin/desktop/editors/CommandPrompt.hx deleted file mode 100644 index 362ab6f8..00000000 --- a/source/funkin/desktop/editors/CommandPrompt.hx +++ /dev/null @@ -1,12 +0,0 @@ -package funkin.desktop.editors; - -class CommandPrompt extends WindowContent { - public function new() { - super("Command Prompt", 100, 100, 960, 480); - } - - public override function create() { - super.create(); - windowCamera.bgColor = 0xFF000000; - } -} \ No newline at end of file diff --git a/source/funkin/desktop/editors/EditorPlayState.hx b/source/funkin/desktop/editors/EditorPlayState.hx deleted file mode 100644 index e80f7614..00000000 --- a/source/funkin/desktop/editors/EditorPlayState.hx +++ /dev/null @@ -1,94 +0,0 @@ -package funkin.desktop.editors; - -import flixel.math.FlxPoint; - -class EditorPlayState extends WindowContent { - var state:PlayState; - - public function new() { - super("PlayState", 120, 120, 1280, 720); - state = new PlayState(); - } - public override function create() { - super.create(); - - beforeStateShit(); - state.camera = parent.windowCameras[0].camera; - state.create(); - afterStateShit(); - - parent.windowCameras[0].resizeScroll = false; - parent.windowCameras.push( - { - camera: state.camHUD, - width: 1280, - height: 720, - resizeScroll: true - } - ); - parent.move(winX, winY); - parent.resize(1280, 720); - beforeStateShit(); - state.createPost(); - afterStateShit(); - } - var oldSize = FlxPoint.get(FlxG.width, FlxG.height); - var oldCamList:Array; - var oldCam:FlxCamera; - - public function beforeStateShit() { - oldSize.set(FlxG.width, FlxG.height); - @:privateAccess - FlxG.width = 1280; - @:privateAccess - FlxG.height = 720; - - oldCamList = FlxG.cameras.list; - oldCam = FlxG.camera; - @:privateAccess - FlxG.cameras.list = [for(e in parent.windowCameras) e.camera]; - FlxG.camera = parent.windowCameras[0].camera; - } - public function afterStateShit() { - @:privateAccess - FlxG.width = Std.int(oldSize.x); - @:privateAccess - FlxG.height = Std.int(oldSize.y); - - parent.windowCameras = [for(e in FlxG.cameras.list) { - camera: e, - width: 1280, - height: 720, - resizeScroll: false - }]; - @:privateAccess - FlxG.cameras.list = oldCamList; - FlxG.camera = oldCam; - - oldCamList = null; - oldCam = null; - } - - public override function update(elapsed:Float) { - beforeStateShit(); - super.update(elapsed); - @:privateAccess - FlxG.cameras.update(elapsed); - state.tryUpdate(elapsed); - afterStateShit(); - } - - public override function destroy() { - beforeStateShit(); - super.destroy(); - state.destroy(); - afterStateShit(); - } - - public override function draw() { - beforeStateShit(); - super.draw(); - state.draw(); - afterStateShit(); - } -} \ No newline at end of file diff --git a/source/funkin/desktop/editors/HelloWorld.hx b/source/funkin/desktop/editors/HelloWorld.hx deleted file mode 100644 index 0c89a99a..00000000 --- a/source/funkin/desktop/editors/HelloWorld.hx +++ /dev/null @@ -1,58 +0,0 @@ -package funkin.desktop.editors; - -import flixel.util.FlxDestroyUtil.IFlxDestroyable; -import flixel.addons.ui.FlxUIText; - -class HelloWorld extends WindowContent { - public override function new() { - super("Test Window", 100, 100, 640, 480); - } - - public override function create() { - super.create(); - - var helloWorldText = new WindowText(0, 0, 0, "Hello, World!"); - helloWorldText.scrollFactor.set(0.5, 0.5); - helloWorldText.cameraCenter(camera); - add(helloWorldText); - - 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 tabs = new TabView(330, 10, 300, 500, ["Tab 1", "Tab 2", "Tab 3"]); - tabs.updateAnchor(1, 0); - add(tabs); - - - var checkbox = new Checkbox(10, 40, 0, "Test Checkbox", CHECKED); - var text = new WindowText(10, 10, 180, "Stuff in page 1"); - tabs.tabs[0].add(text); - tabs.tabs[0].add(checkbox); - - var text2 = new WindowText(10, 10, 180, "Stuff in page 2"); - tabs.tabs[1].add(text2); - - var butt = new Button(10, 10, "Test", function() { - parent.showMessage("Test", "Test", ERROR); - }); - butt.scrollFactor.set(); - add(butt); - } - - public var time:Float = 0; - public var coolAssMode:Bool = false; - public override function update(elapsed:Float) { - super.update(elapsed); - time += elapsed; - - if (FlxG.keys.justPressed.M) coolAssMode = !coolAssMode; - - if (coolAssMode) { - width = 500 + Std.int(Math.cos(time * Math.PI) * 250); - height = 500 + Std.int(Math.sin(time * Math.PI) * 250); - } - parent.updateWindowFrame(); - } -} \ No newline at end of file diff --git a/source/funkin/desktop/editors/MessageBox.hx b/source/funkin/desktop/editors/MessageBox.hx deleted file mode 100644 index 34dc27bf..00000000 --- a/source/funkin/desktop/editors/MessageBox.hx +++ /dev/null @@ -1,72 +0,0 @@ -package funkin.desktop.editors; - -import flixel.util.typeLimit.OneOfTwo; -import flixel.util.FlxDestroyUtil.IFlxDestroyable; -import flixel.addons.ui.FlxUIText; - -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.length <= 0) __buttons = ["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; - button.scrollFactor.set(1, 1); - 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 deleted file mode 100644 index cc04c4bb..00000000 --- a/source/funkin/desktop/editors/import.hx +++ /dev/null @@ -1,4 +0,0 @@ -package funkin.desktop.editors; - -import funkin.desktop.windows.*; -import funkin.desktop.sprites.*; \ No newline at end of file diff --git a/source/funkin/desktop/import.hx b/source/funkin/desktop/import.hx deleted file mode 100644 index f5d0ee4e..00000000 --- a/source/funkin/desktop/import.hx +++ /dev/null @@ -1,3 +0,0 @@ -using funkin.desktop.DesktopUtils; -using funkin.desktop.windows.ContextMenu; -using funkin.desktop.DesktopMain; \ No newline at end of file diff --git a/source/funkin/desktop/sprites/Button.hx b/source/funkin/desktop/sprites/Button.hx deleted file mode 100644 index 8a4cb844..00000000 --- a/source/funkin/desktop/sprites/Button.hx +++ /dev/null @@ -1,126 +0,0 @@ -package funkin.desktop.sprites; - -import funkin.desktop.DesktopMain.IDesktopFocusableObject; -import funkin.desktop.theme.Theme; -import flixel.addons.ui.FlxUIText; -import flixel.math.FlxPoint; -import funkin.desktop.windows.WindowGroup; - -using funkin.desktop.DesktopMain; - -class Button extends FlxObject implements IDesktopFocusableObject { - public var callback:Void->Void; - - public var disabled:Bool = false; - - public var frame:Int = 0; - - public var normalSprite:SpliceSprite; - public var hoverSprite:SpliceSprite; - public var pressedSprite:SpliceSprite; - public var disabledSprite:SpliceSprite; - - 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, ?normalButton:ThemeData, ?hoverButton:ThemeData, ?pressedButton:ThemeData, ?disabledButton:ThemeData) { - super(); - this.x = x; - this.y = y; - this.width = 75; - this.height = 24; - this.callback = callback; - - scrollFactor.set(); - - if (normalButton == null) normalButton = DesktopMain.theme.normalButton; - if (hoverButton == null) hoverButton = DesktopMain.theme.hoverButton; - if (pressedButton == null) pressedButton = DesktopMain.theme.pressedButton; - if (disabledButton == null) disabledButton = DesktopMain.theme.disabledButton; - - normalSprite = new SpliceSprite(Paths.image(normalButton.sprite), x, y, 75, 24, normalButton.left, normalButton.top, normalButton.bottom, normalButton.right); - hoverSprite = new SpliceSprite(Paths.image(hoverButton.sprite), x, y, 75, 24, hoverButton.left, hoverButton.top, hoverButton.bottom, hoverButton.right); - 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 WindowText(0, 0, 75, text); - label.alignment = CENTER; - } - - public override function update(elapsed:Float) { - super.update(elapsed); - var mouseInput = DesktopMain.mouseInput; - if (mouseInput.overlaps(normalSprite, camera)) { - if (mouseInput.justReleased) { - callback(); - return; - } - - if (mouseInput.justPressed || mouseInput.pressed) { - this.setFocus(); - frame = 2; - } - else - frame = 1; - mouseInput.cancel(); - } else - frame = 0; - - if (disabled) frame = 3; - - for(e in [normalSprite, hoverSprite, pressedSprite, disabledSprite]) - e.update(elapsed); - - label.color = switch(frame) { - case 1: DesktopMain.theme.hoverButton.textColor; - case 2: DesktopMain.theme.pressedButton.textColor; - case 3: DesktopMain.theme.disabledButton.textColor; - default: DesktopMain.theme.normalButton.textColor; - } - } - - public override function destroy() { - DesktopMain.loseFocus(this); - - for(e in [normalSprite, hoverSprite, pressedSprite, disabledSprite]) - e.destroy(); - scrollFactor.put(); - super.destroy(); - } - - public function resize(width:Float, height:Float) { - this.width = width; - this.height = height; - normalSprite.resize(width, height); - label.fieldWidth = width; - } - public override function draw() { - super.draw(); - var spr = switch(frame) { - case 1: hoverSprite; - case 2: pressedSprite; - case 3: disabledSprite; - default: normalSprite; - }; - spr.resize(width, height); - for(sprite in [spr, label]) - sprite.copyProperties(this); - spr.draw(); - label.y += (height - label.height) / 2; - label.draw(); - additionalDraw(); - } - - public function additionalDraw() {} - - - public function onFocus() {} - public function onFocusLost() {} -} \ No newline at end of file diff --git a/source/funkin/desktop/sprites/Checkbox.hx b/source/funkin/desktop/sprites/Checkbox.hx deleted file mode 100644 index cca044e5..00000000 --- a/source/funkin/desktop/sprites/Checkbox.hx +++ /dev/null @@ -1,70 +0,0 @@ -package funkin.desktop.sprites; - -import flixel.math.FlxRect; -import flixel.text.FlxText; - -class Checkbox extends WindowText { - public var checked:CheckState = UNCHECKED; - public var disabled:Bool = false; - public var checkboxSprite:FlxSprite; - - public function new(x:Float, y:Float, w:Float, t:String, checked:CheckState = UNCHECKED) { - super(x, y, w, t); - this.checked = checked; - offset.x -= 20; - - var t = DesktopMain.theme.checkbox; - - checkboxSprite = new FlxSprite(0, (20 - t.height) / 2); - checkboxSprite.loadGraphic(Paths.image(t.sprite), true, Std.int(t.width), Std.int(t.height)); - checkboxSprite.animation.add("checkbox", [for(i in 0...checkboxSprite.frames.frames.length) i], 0, true); - checkboxSprite.animation.play("checkbox"); - - scrollFactor.set(); - } - - public function setChecked(checked:Bool) { - this.checked = cast checked; - } - - public override function update(elapsed:Float) { - super.update(elapsed); - checkboxSprite.update(elapsed); - - var overlaps = DesktopMain.mouseInput.overlapsRect(this, new FlxRect(x, y, width + 20, height), camera); - var pressed = DesktopMain.mouseInput.pressed; - - if (overlaps) { - // cancel so that sprites in the bg dont get hovered as well - if (!disabled && DesktopMain.mouseInput.justPressed) { - checked = switch(checked) { - case CHECKED | BOTH: - UNCHECKED; - case UNCHECKED: - CHECKED; - } - } - DesktopMain.mouseInput.cancel(); - } - - checkboxSprite.animation.curAnim.curFrame = (switch(checked) { - case UNCHECKED: 0; - case CHECKED: 1; - case BOTH: 2; - }) + (disabled ? 9 : (overlaps ? (pressed ? 6 : 3) : 0)); - } - - public override function draw() { - checkboxSprite.copyProperties(this); - rotOffset.y = (this.height - checkboxSprite.height) / 2; - super.draw(); - checkboxSprite.draw(); - } -} - -@:enum -abstract CheckState(Null) from Null to Null from Bool to Bool { - var CHECKED:CheckState = true; - var UNCHECKED:CheckState = false; - var BOTH:CheckState = null; -} \ No newline at end of file diff --git a/source/funkin/desktop/sprites/DropDown.hx b/source/funkin/desktop/sprites/DropDown.hx deleted file mode 100644 index d4d5c82f..00000000 --- a/source/funkin/desktop/sprites/DropDown.hx +++ /dev/null @@ -1,40 +0,0 @@ -package funkin.desktop.sprites; - -import funkin.desktop.theme.Theme.ThemeData; -import flixel.math.FlxPoint; - -class DropDown extends Button { - public var selectedIndex:Int = -1; - public var onChange:Int->Void; - public var options:Array; - - public function new(x:Float, y:Float, w:Float, options:Array, onChange:Int->Void, curId:Int = 0, ?normalButton:ThemeData, ?hoverButton:ThemeData, ?pressedButton:ThemeData, ?disabledButton:ThemeData) { - super(x, y, "", onClick, normalButton, hoverButton, pressedButton, disabledButton); - this.options = options; - onSelectionChange(curId); - this.onChange = onChange; - } - - public function onClick() { - var pos:FlxPoint = getScreenPosition(null, camera); - pos.y += height; - - var camPos = camera != null ? FlxPoint.get(camera.x, camera.y) : FlxPoint.get(); - - ContextMenu.open(pos.x + camPos.x, pos.y + camPos.y, [for(o in options) { - { - name: o - } - }], onSelectionChange); - - pos.put(); - camPos.put(); - } - - public function onSelectionChange(id:Int) { - selectedIndex = id; - label.text = options[id]; - if (onChange != null) - onChange(id); - } -} \ No newline at end of file diff --git a/source/funkin/desktop/sprites/InputBox.hx b/source/funkin/desktop/sprites/InputBox.hx deleted file mode 100644 index 48d861c1..00000000 --- a/source/funkin/desktop/sprites/InputBox.hx +++ /dev/null @@ -1,105 +0,0 @@ -package funkin.desktop.sprites; - -import openfl.ui.Keyboard; -import openfl.events.KeyboardEvent; -import lime.app.Application; - -class InputBox extends Button implements IDesktopInputObject { - public var index:Int = 0; - public static var insertMode:Bool = false; - - public var text(get, set):String; - private inline function set_text(t:String):String - return label.text = t; - private inline function get_text():String - return label.text; - - public var onChange:Void->Void; - public var onConfirm:Void->Void; - - public function new(x:Float, y:Float, w:Float, t:String, ?onChange:Void->Void) { - super(x, y, t, function() { - setIndex(label.text.length); - disabled = true; - }, DesktopMain.theme.textbox, DesktopMain.theme.textboxHover, DesktopMain.theme.textboxPressed, DesktopMain.theme.textboxFocused); - this.resize(w, height); - this.label.alignment = LEFT; - FlxG.stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); - Application.current.window.onTextInput.add(onTextInput); - } - - - private function onKeyDown(event:KeyboardEvent) { - if (!this.hasFocus()) return; - switch(event.keyCode) { - case Keyboard.ESCAPE: - this.loseFocus(); - case Keyboard.INSERT: - insertMode = !insertMode; - case Keyboard.LEFT: - changeIndex(-1); - case Keyboard.RIGHT: - changeIndex(1); - case Keyboard.HOME: - setIndex(0); - case Keyboard.END: - setIndex(text.length); - case Keyboard.DELETE: - text = text.substr(0, index) + text.substring(index + 1, text.length); - onTextInput(""); - case Keyboard.BACKSPACE: - text = text.substr(0, index <= 0 ? 0 : index - 1) + text.substring(index, text.length); - changeIndex(-1); - onTextInput(""); - case Keyboard.ENTER | Keyboard.NUMPAD_ENTER: - if (onChange != null) - onChange(); - if (onConfirm != null) - onConfirm(); - default: - // nothing - } - } - - private function onTextInput(input:String) { - if (!this.hasFocus()) return; - - if (input.length > 0) { - text = text.substr(0, index) + input + text.substring(index, text.length); - - if (!insertMode) - index += input.length; - } - - if (onChange != null) - onChange(); - } - - public override function update(elapsed:Float) { - if (DesktopMain.mouseInput.justPressed && !DesktopMain.mouseInput.overlaps(this, camera)) - this.loseFocus(); - super.update(elapsed); - } - - public override function onFocusLost() { - super.onFocusLost(); - if (disabled != (disabled = false)) { - if (onChange != null) - onChange(); - if (onConfirm != null) - onConfirm(); - } - } - - public inline function changeIndex(change:Int) { - setIndex(Std.int(FlxMath.bound(index + change, 0, label.text.length))); - } - - public inline function setIndex(index:Int) { - this.index = index; - } - - public override function destroy() { - super.destroy(); - } -} \ No newline at end of file diff --git a/source/funkin/desktop/sprites/MenuBar.hx b/source/funkin/desktop/sprites/MenuBar.hx deleted file mode 100644 index 3655f6f0..00000000 --- a/source/funkin/desktop/sprites/MenuBar.hx +++ /dev/null @@ -1,52 +0,0 @@ -package funkin.desktop.sprites; - -import flixel.math.FlxPoint; -import funkin.desktop.windows.WindowGroup; - -class MenuBar extends WindowGroup { - public var spr:FlxSprite; - public var buttons:Array