From a31436ac32e26dc2aa6e00663e026a106097224f Mon Sep 17 00:00:00 2001 From: LeshaInc Date: Fri, 15 Feb 2019 19:58:36 +0200 Subject: [PATCH] Lost and found --- sprites/APU0.png | Bin 0 -> 549 bytes sprites/APU1.png | Bin 0 -> 556 bytes sprites/APU2.png | Bin 0 -> 556 bytes sprites/BorderH.png | Bin 0 -> 120 bytes sprites/BorderV.png | Bin 0 -> 114 bytes sprites/CPU0.png | Bin 0 -> 320 bytes sprites/CPU1.png | Bin 0 -> 352 bytes sprites/CPU2.png | Bin 0 -> 360 bytes sprites/CornerBL.png | Bin 0 -> 373 bytes sprites/CornerBR.png | Bin 0 -> 369 bytes sprites/CornerTL.png | Bin 0 -> 366 bytes sprites/CornerTR.png | Bin 0 -> 374 bytes sprites/EEPROM.png | Bin 0 -> 393 bytes sprites/Empty.png | Bin 0 -> 67 bytes sprites/GraphicsCard0.png | Bin 0 -> 400 bytes sprites/GraphicsCard1.png | Bin 0 -> 390 bytes sprites/GraphicsCard2.png | Bin 0 -> 390 bytes sprites/HardDiskDrive0.png | Bin 0 -> 425 bytes sprites/HardDiskDrive1.png | Bin 0 -> 429 bytes sprites/HardDiskDrive2.png | Bin 0 -> 429 bytes sprites/InternetCard.png | Bin 0 -> 590 bytes sprites/Memory0.png | Bin 0 -> 308 bytes sprites/Memory1.png | Bin 0 -> 300 bytes sprites/Memory2.png | Bin 0 -> 322 bytes sprites/Memory3.png | Bin 0 -> 281 bytes sprites/Memory4.png | Bin 0 -> 323 bytes sprites/Memory5.png | Bin 0 -> 281 bytes .../scala/ocelot/desktop/OcelotDesktop.scala | 20 +++++------ .../ocelot/desktop/graphics/Graphics.scala | 31 ++++++++++++++-- .../scala/ocelot/desktop/ui/UiHandler.scala | 30 +++++++++++----- .../ocelot/desktop/ui/widget/RootWidget.scala | 11 +++--- .../{ScreenWidget.scala => ScreenView.scala} | 15 ++++---- .../ocelot/desktop/ui/widget/ScrollView.scala | 20 +++++++++++ .../ocelot/desktop/ui/widget/Widget.scala | 33 +++++++++++++++--- .../desktop/ui/widget/WrapperWidget.scala | 13 +++++++ 35 files changed, 136 insertions(+), 37 deletions(-) create mode 100644 sprites/APU0.png create mode 100644 sprites/APU1.png create mode 100644 sprites/APU2.png create mode 100644 sprites/BorderH.png create mode 100644 sprites/BorderV.png create mode 100644 sprites/CPU0.png create mode 100644 sprites/CPU1.png create mode 100644 sprites/CPU2.png create mode 100644 sprites/CornerBL.png create mode 100644 sprites/CornerBR.png create mode 100644 sprites/CornerTL.png create mode 100644 sprites/CornerTR.png create mode 100644 sprites/EEPROM.png create mode 100644 sprites/Empty.png create mode 100644 sprites/GraphicsCard0.png create mode 100644 sprites/GraphicsCard1.png create mode 100644 sprites/GraphicsCard2.png create mode 100644 sprites/HardDiskDrive0.png create mode 100644 sprites/HardDiskDrive1.png create mode 100644 sprites/HardDiskDrive2.png create mode 100644 sprites/InternetCard.png create mode 100644 sprites/Memory0.png create mode 100644 sprites/Memory1.png create mode 100644 sprites/Memory2.png create mode 100644 sprites/Memory3.png create mode 100644 sprites/Memory4.png create mode 100644 sprites/Memory5.png rename src/main/scala/ocelot/desktop/ui/widget/{ScreenWidget.scala => ScreenView.scala} (94%) create mode 100644 src/main/scala/ocelot/desktop/ui/widget/ScrollView.scala create mode 100644 src/main/scala/ocelot/desktop/ui/widget/WrapperWidget.scala diff --git a/sprites/APU0.png b/sprites/APU0.png new file mode 100644 index 0000000000000000000000000000000000000000..594997792a5c8d7221eddb854dad8b9f91839098 GIT binary patch literal 549 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>$(fVNl@>2p(BIeBP+x!LP|xYDML+}JKAkTMG=i}t$S;_|;n|He5GTpo-G!lp zRn`N@VK4FYb!C6d$R#Mo^l-KK6QGbla-v@uhz8;WAO?foK@69Gj0R5^#}J9jsplj4 zS`-9a14T5t(li#bF8sd#LR!bH7k_OkJsFeNPfLC3h^{SOq=%7W{{kcxFxNk0;uD+%DSn!?BzU+m6Bc@m}sH_nwvh(U> zwrIGU<+bwIea`;rTnpdboByAA=L+_jWq0pQ2D(MH#5JNMC9x#cD!C{XNHG{07+UHY z80s1tgczDy85vm_7-<^-NrTkNE&3=La`RI%(<*Um5K-X)*&qqBAviy+q&%@GmBBG3 hKPgqgGdD3kH7GSPrLyp3Dk$z4JYD@<);T3K0RUsf!aV>0 literal 0 HcmV?d00001 diff --git a/sprites/APU1.png b/sprites/APU1.png new file mode 100644 index 0000000000000000000000000000000000000000..d847566821baa6640efd1c4ea27f3eeba5e8fc51 GIT binary patch literal 556 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>A@4NW?`Sa^nuO2&gY~i|N8`iH+ zY&%ss<5JtAYi?mhix({D@9S%*ukV|;ySi_EQQIn@v7dFrJ^>A4ED7=pW^j0RBMrn! z@^*J&=wOxg0CLz%Jbhi+A2V_Zim}$8Z*m6;2_z@_m4Rp=P5@#s*d4@h3CL*lba4!k zxSV?aHea)XfNP+R0gr3K5w51c|KICOU*UPTUt3)=;mt*py*mVi7-j^mVpKX6CHmrk z;5#V}mbLefN!Z@zjyYQ$<+q_PDzU-EpzqpwH^s6Cn;f-ySFrakFIB#^zV%z}L~r&9 z2EiVg=YL9YGwhxsk!-n7{mUGp00i_>zopr0Q^|QZU6uP literal 0 HcmV?d00001 diff --git a/sprites/APU2.png b/sprites/APU2.png new file mode 100644 index 0000000000000000000000000000000000000000..a4a9e42e26c80bb52f28b33e4b31b69bbd9ce78d GIT binary patch literal 556 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>0bEfd;M?Rtqy~-g-ho3_4n2{)Lks!cQSGFv9NVOV_!3#cLN&4SQ6wH%;50sMjD8d z21sKW5|-6ysp5`v-EXKyspA8Hfhr1Rw^3-9ZeOfQ&{@7sn8Z z%ct!|o{($(H-n|LhInDEFVdQ&MBb@0B*a+CIA2c literal 0 HcmV?d00001 diff --git a/sprites/BorderH.png b/sprites/BorderH.png new file mode 100644 index 0000000000000000000000000000000000000000..7b68a2ae7c4b91247cf90acdd156c5c003ce5212 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-R!3HER>*_fHDb50q$YKVD7&j1R6q(}e2o%)v zba4#fh)zyPNch2jgh%K9|K?0KH3Lo|%ep@nt2mM~GBhFtV|bN)tQn>yaVE_6oGS#> O#o+1c=d#Wzp$Pz;=Nwo7 literal 0 HcmV?d00001 diff --git a/sprites/BorderV.png b/sprites/BorderV.png new file mode 100644 index 0000000000000000000000000000000000000000..c74942b82908c686424a888552653138433c4986 GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^96-#(!3HE#r_6l|q&N#aB8wRqV%$KOQDlmjuG@oM#R(GyG-eV*VX{bw5x&gQu&X J%Q~loCII3+AsGMw literal 0 HcmV?d00001 diff --git a/sprites/CPU0.png b/sprites/CPU0.png new file mode 100644 index 0000000000000000000000000000000000000000..832c6eb7f3a7f7b3ccf058b7fb20842c7d12e9ac GIT binary patch literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!forvRT2S1u7zAoJL!(eba`x=m|NsA2`v)%q8X;B^`esjYt7Z={e=n{{M4oA+`CW`?j695NGEG&BQkXYh3Ob6Mw<&;$T*bc=QX literal 0 HcmV?d00001 diff --git a/sprites/CPU1.png b/sprites/CPU1.png new file mode 100644 index 0000000000000000000000000000000000000000..9e947f48b768705ff4737bff3f04d13634973736 GIT binary patch literal 352 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8zyO~RS1u7zAoJLHTywL-634^DrpUXO@geCy#{h~(z literal 0 HcmV?d00001 diff --git a/sprites/CPU2.png b/sprites/CPU2.png new file mode 100644 index 0000000000000000000000000000000000000000..77f5f5fe7fd4cc8e5ef5749f7d54390b703f0f90 GIT binary patch literal 360 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8@Bp6>S1u7zAoJL1kpRx1cxvLMa zU%k3{-^C5<*Z0laz2^AYhWh%&3l=O~ckI!F)jJMd>F?`nTXe0uZ+&9hsmd9bcAURb z)VAv2shj`*{}0akybx%vY)Oz`Fp!HAFhsUJ&jKo}^K@|xskjw$&QqvGLBQqWk}gTs z^y&xyp6474u>Nsce5c0~wI`WX?x%SaxD~lPG-s|};54N|D?xS6Z>i)vGI;^+_bx{? zsx~bODsK+lvOnzA7tWXkCN>W;<2$DbA1K(T7gT@H=dOW{X0AFz;+w74{(f62aM5n- gqxHX>*KPORfP7!}MF4Ri^Er>mdKI;Vst0LO%=n*aa+ literal 0 HcmV?d00001 diff --git a/sprites/CornerBL.png b/sprites/CornerBL.png new file mode 100644 index 0000000000000000000000000000000000000000..86c5a798c173a2845f700f796347cf3e0a7376bb GIT binary patch literal 373 zcmeAS@N?(olHy`uVBq!ia0vp^93afW0wnX;%77#TOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>Dh0AlAUV+wWQzb411Sa$S1oT-AZ_F6;uyklJ@oWN&ISV!<^$D7 zXR^d@YA)fo4*PT2%)YTelT*#AE$yV{EAbeMFvFYr0fCiY@-vpai`8ir->=6%_1c<~ z(OI#yLQW8s2t&)pUffR$0fuW_YfuXLUL5QKLm64^Dk&(86k(GhL{XHH_Q8eV{ zr(~v8;?}V4;Ri{e21$?&!TD(=<%vb942~)JNvR5+xryniL8*x;m4zo$L1Dq*>FVdQ I&MBb@06tb_K>z>% literal 0 HcmV?d00001 diff --git a/sprites/CornerBR.png b/sprites/CornerBR.png new file mode 100644 index 0000000000000000000000000000000000000000..9016e6c63d0836472e44fd7a67c4545b38d5ca18 GIT binary patch literal 369 zcmeAS@N?(olHy`uVBq!ia0vp^93afW0wnX;%77#TOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>Dh0AlAUV+wWQzb4gKaO3V)z2&TX?!ShHzXjJ$sP%fP%>33*QBQ z8*?-pgjFpR@>simUuy z#5JNMC9x#cD!C{XNHG{07+UHY80s1tgczDy8ChBx8EG3BSs57I-{Y|qMMG|WN@iLm zZVl@mevkxekObKfoS#-wo>-L1;Fyx1l&avFo0y&&l$w}QS$HxP6b=lYu6{1-oD!M< D4U=a5 literal 0 HcmV?d00001 diff --git a/sprites/CornerTL.png b/sprites/CornerTL.png new file mode 100644 index 0000000000000000000000000000000000000000..09e07c70fe5fd62bbb42ba23a35d5402a7aa4612 GIT binary patch literal 366 zcmeAS@N?(olHy`uVBq!ia0vp^93afW0wnX;%77#TOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>Dh0AlAUV+wWQzb411Sau?~jMsft0DIi(?4K_0Ur%1sN21m=Bt{ z{$p`cXnFcqr~T_hH`9q7C6_vDA~ZbiC;z>xWyjW&ouk9+On)XK=x%E(CDz{twL;Qk(ur6?M5^HVa@DsgLA z_wa)xP=h4MhT#0PlJdl&R0hYC{G?O`&)mfH)S%SFl*+=Bsh~h$@O1TaS?83{1OUoP BV;}$k literal 0 HcmV?d00001 diff --git a/sprites/CornerTR.png b/sprites/CornerTR.png new file mode 100644 index 0000000000000000000000000000000000000000..fad4fdaa575bf21c9be6d2edcc43c8bbed41c043 GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^93afW0wnX;%77#TOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>Dh0AlAUV+wWQzb4gKTH0ZtOS)q-;H1978y+hn_mf*`}#iG-;26l{-EUV1BrKUD;R8bc(#V_ zPC5)UNVUW@q9i4;B-JXpC>2OC7#SE^>KYj88XANcnpzoIS{WH>8yHy`7~J3Eu@pr^ zZhlH;S|x4`>mGiP1Zt23*$|wcR#Ki=l*-_klAn~S;F+74o*I;zm{M7IG8GgU44$rj JF6*2UngDO6YPJ9X literal 0 HcmV?d00001 diff --git a/sprites/EEPROM.png b/sprites/EEPROM.png new file mode 100644 index 0000000000000000000000000000000000000000..7dbd8218588629037dae6706db4831ea6f75b9c4 GIT binary patch literal 393 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8(g2?jS0OoZ$D(kL`a}f_9m7y3yWC*Uh9sNJK>LDFizIK~ zjx6hpfXF$OYEC90lZ$rj*r9B#U%qL|!Gi}i+|0IY*>e7Tjek$h|NsBjty^al;d155 zm3#Ll=>^y=UcC7H`ST}EobYN+d-m+v&6`bEulBBAzkc)P0-$2|*@r`c4p1)%@(TuX zi2w}EVbgB{wUm3hIEGZ*Dmi~#sM&zWHIVc4p&b{TJk?o${P$Psj!2wQFg^Wan%tS$ z5A2`3R9EVnApO4fy6P+Ll^f6K=diBWB%W6&6mV?cOhMre>4vD+I>HK@Te)U0Ti4I@ zs`2~2`g#6L=kB&GlHeCS5bMm5`ja{H|D9E?4U7!kZzO~JDu3kzoxtGf>gTe~DWM4f D=7zXJ literal 0 HcmV?d00001 diff --git a/sprites/Empty.png b/sprites/Empty.png new file mode 100644 index 0000000000000000000000000000000000000000..7d3a386a21026f9b15b2c303a81f5c69333e9056 GIT binary patch literal 67 zcmeAS@N?(olHy`uVBq!ia0vp^j3CSbBp9sfW`_bPE>9Q7kcv6UzxWv#Ss9tmFVH&+ OlJ#`;b6Mw<&;$T@!wsPT literal 0 HcmV?d00001 diff --git a/sprites/GraphicsCard0.png b/sprites/GraphicsCard0.png new file mode 100644 index 0000000000000000000000000000000000000000..f37f1a76c2bb26c71ec8f383d554ed68e702598c GIT binary patch literal 400 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8mH?j+S0F7SB69!!eGLr_4h{}Z9!>!P0Y`tw8#n3$0|U#- z+(e~Cc?EencsTCdxg#toeB;KAUAyu;{5(ueO`V*aj4X@{>N#)9cfdfv&Kv(gxrIxw2}#%VBIbv;{StahM4#;9k{RXVWb?%cVPnyOS*=BA;+*Vblqkp^A!%nVE2Cs7yhD%GIkS9v+fHLPD07A_fM6=H|lt_BE=g@cjS(|9t30ZlDXa zN`m}?fn4GMgVBl)F+g1zo-U3d6}NiMoAWgo2)JA{Jvbwy=v?LdddDL{3OhgP&tE3# zpn8GfaDcef0bi|r@6$>f9?vM9Y~NDqB5jnDFFiV05(_Dnc%eW!b`bHj^W tnOaY6tyn~po~6o(b-xo|>fXS}AoX6}-eK{SQ|ymRM{ zVo(sDj0`(J|E^tmH*VaJ^Y*@Rqu!vRqO8nKL|eZ`a=H^$gmK6W^A*`k*VQ83}>$GJ{inNoHp`oF$t}dUP94jyH|Ns95YTwrZU7%GG zdNqRaSW-r)pOpQufagT<)UeV&#@-w5dL|9Cuhi;JbA7NxQ@SkjXQ|r*%N|3^&SUmJ_?HS?DAb7Sc=-Cv=BsKBC3g*Y rn##6uRvppk6uRSfSKq6jftf+|zP$a)Ce_72I~hD({an^LB{Ts5&rY4K literal 0 HcmV?d00001 diff --git a/sprites/HardDiskDrive0.png b/sprites/HardDiskDrive0.png new file mode 100644 index 0000000000000000000000000000000000000000..ef3ca624617161b16eb8fab838af96378bbd8f15 GIT binary patch literal 425 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8#sHrX*Z=?j^YQV?%F6!u@x##2(8$Q>&Ye5=@87q!wqCbx zotc@Ll$6xIefzw| zMkYBqxwW-*)22;x=FHL4(_6DDb%DO()LhUMlg`caC(vM?f3tg zoLSRe&3<_Nx6Fgj<{Q>`zdhycEyezE^9g>=xhx+ym>zht@Q$<(!|k1Hhi&G(iOoJ0 z$9V1k6xm?@*p1&KtulTdUZZQo-g3Vp>N*p%&S3?qP6^8s&%WPSJVlG4@2}`ou7dTe iGNj8tY+ld6%rH|{@^04RrhPysF?hQAxvXb^4o! zTeMWT-K>S~pQ#J;6st;?`~CCN%|k(P0TQ;RBIf#hukNmDEmXX5FvVDh_uNJ|HASum z=UVjCdFFIzc-jeD81T7R2|c?$=kCc$T{RvH1EI&4C*3}l_u|%~{1|Cf1uiKuwv+$~ zpaXuLbe{)wk4{ODUoenMEMPc(jk5=+uiewdF{I*F%&C_`O$s7y50zz3x|p3cJ?nM* z{r`VXtZA=iKRo_h=D}z44eR^gep;!vwE0J<%5Pa&mX90E4m?o2FBQUYyOZsx&73!} z*{9wyPWwMa)`-7$P2!7 kE^fQHYkTwjT2={$bCFUxZ(j1B2Rezt)78&qol`;+0C|bWw*UYD literal 0 HcmV?d00001 diff --git a/sprites/HardDiskDrive2.png b/sprites/HardDiskDrive2.png new file mode 100644 index 0000000000000000000000000000000000000000..fcaffb1e47a5125ffc1c9e3b816039d604d98e45 GIT binary patch literal 429 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8mH?j+*Z=?jvx|s)`Tbi!OIz8|Ny^RR(%biEUccS-^ckO; zx*Guo6CUVj;>Vt_moRnKqoPHy85}Sb4q9e01#=&F8}}l literal 0 HcmV?d00001 diff --git a/sprites/InternetCard.png b/sprites/InternetCard.png new file mode 100644 index 0000000000000000000000000000000000000000..66104313da856b1928c8380292c09c0fef9cd87e GIT binary patch literal 590 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>@N77B#>K_O z*w}dfwjG8|@={V#K=TX?48HmLo;-O{r&Q+7ojdiDCi9rFXk zp1!W^j~TfHrOlbPt?dE|2_z@_m4Rp=RsdoU5U3~@-Uy^CJzX3_BreZAb5^LyfQRM5 z6t)Ro6Bf0s3f=HWW8Z&fr6(_X=bk+G#9HS-pT<}9iN_=aAFJ4Mq&%A;99Xz0WP#4w zmFL8xi|NWu4;#+eu8zODPc*{ZMzDPDy$7PLb5>@|{H?$sz-D`B$%X8O-xS> XN=;0uEIgSCiev^)S3j3^P6ief>Rq3YA=x zfZ*oMCP6_#DGMnV7ngPG)}1du`zbLPzX|Ns9p7JiTeL`#DFf`MENz@UAz_7zY; zmZytjNX4y~UPqw@1s>+$6}nAITL0@;A39ieW?}o>CEfqHk0quFlo~Ra?5i{_kkx#9 z!>(b1SLX({bGFAk_6dr3t!9^yV*e!lUpeLME1eR*wWb+atN$)A+ma-_GSu~`+NPc_ fPnqrd8JHPL75TKqS4C?@AX8soUqVMhNl8h=Rb$VdLLp@#K|w)IVNUG; z?VC57q%5S?ty_2M)F~Gim)6$SJ9qBPnKS4A|Nky?rP_g-MM{GFf`MFgz~JxyTo5Rq z=IP=XQgJJ$*HP$z0uR&08E$K%qW}ND?q?(6&L<-wX29pzJJZqR2-AX3$EUNte_VTH zFH?$qQ?u!XMa6yJ+LX4Kizx1PwKd*;><#dt$d2tm=?ZT3YflsYB(ehxU!H b+y)HH4!mii^J7YZHZpj+`njxgN@xNAC`57k literal 0 HcmV?d00001 diff --git a/sprites/Memory2.png b/sprites/Memory2.png new file mode 100644 index 0000000000000000000000000000000000000000..d1522c9b5e50a9621274ddd3d3c46c01dd022153 GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!foj{u(#S4C?@AX7p|LSJ8BNl9tXp2F6aA`Mp!PGL?VWg&w& z13^K-n>U-TUR`1lZ{gzNq8Fs6?b{orETsPb|L^emEhEUFk|4ie zAQu~8I4i983aBQ>)5S5Q;#N$bH{SsT4pzZ6UTd$_?fvh&TCb(VBgRMW(}I5u|0>=y zZrs!{w_{Pf%Z15n8gsc6vS&|Vak=a;wcv)kYLVVkH%sp8w=UH0Slqj-X>q%k!qUsL uwrgFi-mvDwi-VgEEet*^GRwb#ksSB<2Hh>aZCQWVwn%Liow&> K&t;ucLK6UB#Ag`* literal 0 HcmV?d00001 diff --git a/sprites/Memory4.png b/sprites/Memory4.png new file mode 100644 index 0000000000000000000000000000000000000000..a732b1716c9c1763cd85fac6871a8d38fe942ed4 GIT binary patch literal 323 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!foj{u(#S4C?@AX8soUqVMhNlA%Qm~+pbLW4L14Oa~zWug4G z&YL%z1O)|^Y?T&Wx@Hk?p%lZ8NoBuaw( zf`MFYfZ?pL-YcM*Tu&FrkcwL|ecpTr6gXG~w{(U6UjKc6=GE2-e4X7Vo#n2`Uzjhz zBoHcAsF1|f&9SG;bb}vbMy~Lrh7_qKLWbKFr{36BdtN2|;TPV&?qAmTzvAkZ({hZE u%YL`Y<^91;hZeJ+=GyI78k}Lr$i`6nLV&q@Qp7Q!#SEUVelF{r5}E+9kbMaN literal 0 HcmV?d00001 diff --git a/sprites/Memory5.png b/sprites/Memory5.png new file mode 100644 index 0000000000000000000000000000000000000000..2a851fa245076a757c153c25eeb3cd15fdd81b61 GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!fo;{cx!S0Jsgudk$}q-d=up(C+pPobcopoXgkr!c3Gve3<& zO)f4ji!NQ;aPy9og;dY+Gynhpce90?TwL`3@~i-sdA-pAXKu?Luy3pknd*8+XimqD*V7o*`yDvW)Z@aO(p)Yv z@e)V-6gP__|7D(bw=6bc`R!a#&3HM{a$`Y+-l5CNSJB=9WCS{Pt0xRScf4 KelF{r5}E*Acx*iY literal 0 HcmV?d00001 diff --git a/src/main/scala/ocelot/desktop/OcelotDesktop.scala b/src/main/scala/ocelot/desktop/OcelotDesktop.scala index d874d47..1052628 100644 --- a/src/main/scala/ocelot/desktop/OcelotDesktop.scala +++ b/src/main/scala/ocelot/desktop/OcelotDesktop.scala @@ -3,7 +3,7 @@ package ocelot.desktop import java.io.{PrintWriter, StringWriter} import ocelot.desktop.ui.UiHandler -import ocelot.desktop.ui.widget.ScreenWidget +import ocelot.desktop.ui.widget.{RootWidget, ScreenView} import ocelot.desktop.util.{Audio, ResourceManager} import org.apache.logging.log4j.LogManager import org.apache.logging.log4j.scala.Logging @@ -17,7 +17,7 @@ import totoro.ocelot.brain.util.Tier object OcelotDesktop extends Logging { - var screenWidget: ScreenWidget = _ + var root: RootWidget = _ var ui: UiHandler = _ def mainInner(): Unit = { @@ -27,8 +27,8 @@ object OcelotDesktop extends Logging { Ocelot.initialize(LogManager.getLogger(Ocelot)) createWorkspace() - screenWidget = new ScreenWidget(screen) - ui = new UiHandler(screenWidget) + root = new RootWidget(screen) + ui = new UiHandler(root) setupEventHandlers() computer.turnOn() @@ -110,27 +110,27 @@ object OcelotDesktop extends Logging { }) EventBus.listenTo(classOf[TextBufferSetEvent], { case event: TextBufferSetEvent => - screenWidget.set(event.x, event.y, event.value, event.vertical) + root.screenView.set(event.x, event.y, event.value, event.vertical) }) EventBus.listenTo(classOf[TextBufferFillEvent], { case event: TextBufferFillEvent => - screenWidget.fill(event.x, event.y, event.width, event.height, event.value) + root.screenView.fill(event.x, event.y, event.width, event.height, event.value) }) EventBus.listenTo(classOf[TextBufferCopyEvent], { case event: TextBufferCopyEvent => - screenWidget.copy(event.x, event.y, event.width, event.height, event.horizontalTranslation, event.verticalTranslation) + root.screenView.copy(event.x, event.y, event.width, event.height, event.horizontalTranslation, event.verticalTranslation) }) EventBus.listenTo(classOf[TextBufferSetForegroundColorEvent], { case event: TextBufferSetForegroundColorEvent => - screenWidget.foreground = event.color + root.screenView.foreground = event.color }) EventBus.listenTo(classOf[TextBufferSetBackgroundColorEvent], { case event: TextBufferSetBackgroundColorEvent => - screenWidget.background = event.color + root.screenView.background = event.color }) EventBus.listenTo(classOf[TextBufferSetResolutionEvent], { case event: TextBufferSetResolutionEvent => - screenWidget.setResolution(event.width, event.height) + root.screenView.setResolution(event.width, event.height) }) } } \ No newline at end of file diff --git a/src/main/scala/ocelot/desktop/graphics/Graphics.scala b/src/main/scala/ocelot/desktop/graphics/Graphics.scala index 7651fad..61bce14 100644 --- a/src/main/scala/ocelot/desktop/graphics/Graphics.scala +++ b/src/main/scala/ocelot/desktop/graphics/Graphics.scala @@ -8,6 +8,8 @@ import ocelot.desktop.util.{FontLoader, Spritesheet} import org.apache.logging.log4j.scala.Logging import org.lwjgl.opengl.GL11 +import scala.collection.mutable.ArrayBuffer + class Graphics extends Logging { private var projection = Transform2D.viewport(800, 600) private var z = 0f @@ -28,6 +30,8 @@ class Graphics extends Logging { private var spriteRect = Spritesheet.sprites(_sprite) private val emptySpriteTrans = Transform2D.translate(spriteRect.x, spriteRect.y) >> Transform2D.scale(spriteRect.w, spriteRect.h) + private val transformStack = new ArrayBuffer[Transform2D]() + GL11.glEnable(GL11.GL_DEPTH_TEST) GL11.glDepthFunc(GL11.GL_LEQUAL) GL11.glEnable(GL11.GL_BLEND) @@ -78,6 +82,24 @@ class Graphics extends Logging { _fontSize = value } + def transform: Transform2D = transformStack.lastOption.getOrElse(Transform2D.identity) + + def pushTransform(): Unit = { + transformStack += transform + } + + def popTransform(): Unit = { + transformStack.remove(transformStack.length - 1) + } + + def transform(t: Transform2D): Unit = { + transformStack(transformStack.length - 1) = transform >> t + } + + def translate(x: Float, y: Float): Unit = { + transform(Transform2D.translate(x, y)) + } + def sprite: String = _sprite def sprite_=(value: String): Unit = { @@ -116,8 +138,10 @@ class Graphics extends Logging { // ^ dirty hack to avoid edge bleeding, somehow works ) - rectRenderer.schedule(MeshInstance(_background, z, Transform2D.translate(x, y) >> Transform2D.scale(width, height), emptySpriteTrans)) - textRenderer.schedule(MeshInstance(_foreground, z + 1, Transform2D.translate(x, y) >> Transform2D.scale(width, height), uvTransform)) + val transform = this.transform >> Transform2D.translate(x, y) >> Transform2D.scale(width, height) + + rectRenderer.schedule(MeshInstance(_background, z, transform, emptySpriteTrans)) + textRenderer.schedule(MeshInstance(_foreground, z + 1, transform, uvTransform)) z += 2 } @@ -130,8 +154,9 @@ class Graphics extends Logging { } def rect(x: Float, y: Float, width: Float, height: Float): Unit = { + val transform = this.transform >> Transform2D.translate(x, y) >> Transform2D.scale(width, height) val uvTransform = Transform2D.translate(spriteRect.x, spriteRect.y) >> Transform2D.scale(spriteRect.w, spriteRect.h) - rectRenderer.schedule(MeshInstance(_background, z, Transform2D.translate(x, y) >> Transform2D.scale(width, height), uvTransform)) + rectRenderer.schedule(MeshInstance(_background, z, transform, uvTransform)) z += 1 } diff --git a/src/main/scala/ocelot/desktop/ui/UiHandler.scala b/src/main/scala/ocelot/desktop/ui/UiHandler.scala index 2b6b04d..e902a0e 100644 --- a/src/main/scala/ocelot/desktop/ui/UiHandler.scala +++ b/src/main/scala/ocelot/desktop/ui/UiHandler.scala @@ -4,7 +4,7 @@ import java.nio.{ByteBuffer, IntBuffer} import ocelot.desktop.geometry.{Size2D, Vector2D} import ocelot.desktop.graphics.Graphics -import ocelot.desktop.ui.widget.RootWidget +import ocelot.desktop.ui.widget.{RootWidget, Widget} import ocelot.desktop.util.{Audio, FPSCalculator, FontLoader, Spritesheet} import org.apache.logging.log4j.scala.Logging import org.lwjgl.glfw.{GLFW, GLFWErrorCallback} @@ -13,8 +13,6 @@ import org.lwjgl.opengl.{GL, GL11} import org.lwjgl.system.MemoryUtil.NULL class UiHandler(val root: RootWidget) extends Logging { - root.uiHandler = this - private var graphics: Graphics = _ private var window: Long = _ private var fullRedraw = true @@ -23,11 +21,11 @@ class UiHandler(val root: RootWidget) extends Logging { private var soundContext: Long = _ private val fpsCalculator = new FPSCalculator - private var windowTitle = root.windowTitle + private var windowTitle = "hello there" - private var windowSize: Size2D = Size2D(0, 0) + private var windowSize: Size2D = Size2D(800, 600) private var sizeLimits = SizeLimits(root.minimumSize, root.maximumSize) - root.size = Size2D.Zero + root.size = windowSize def fps: Float = fpsCalculator.fps @@ -126,6 +124,8 @@ class UiHandler(val root: RootWidget) extends Logging { } private def update(): Unit = { + updateWidget(root) + val newSizeLimits = SizeLimits(root.minimumSize, root.maximumSize) if (sizeLimits != newSizeLimits) { sizeLimits = newSizeLimits @@ -145,13 +145,27 @@ class UiHandler(val root: RootWidget) extends Logging { for (event <- KeyHandler.events.iterator ++ MouseHandler.events.iterator ++ ScrollHandler.events.iterator) root.handleEvent(event) + } - root.update() + private def updateWidget(widget: Widget): Unit = { + widget.uiHandler = this + widget.update() + + for (child <- widget.children) + updateWidget(child) + } + + private def drawWidget(widget: Widget, forceRedraw: Boolean = false): Unit = { + val redrawParent = forceRedraw || widget.shouldRedraw + if (redrawParent) widget.draw(graphics) + + for (child <- widget.children) + drawWidget(child, forceRedraw = redrawParent) } private def draw(): Unit = { graphics.clear() - root.draw(graphics) + drawWidget(root, forceRedraw = fullRedraw) graphics.commit() } diff --git a/src/main/scala/ocelot/desktop/ui/widget/RootWidget.scala b/src/main/scala/ocelot/desktop/ui/widget/RootWidget.scala index 7388bd3..df3c062 100644 --- a/src/main/scala/ocelot/desktop/ui/widget/RootWidget.scala +++ b/src/main/scala/ocelot/desktop/ui/widget/RootWidget.scala @@ -1,12 +1,11 @@ package ocelot.desktop.ui.widget -import ocelot.desktop.ui.UiHandler +import totoro.ocelot.brain.entity.Screen -abstract class RootWidget extends Widget { - // TODO: Remove - var uiHandler: UiHandler = _ +class RootWidget(screen: Screen) extends WrapperWidget { + val screenView = new ScreenView(screen) - def windowTitle: String + override protected val inner = new ScrollView(screenView) - def update(): Unit = {} + def windowTitle: String = f"Ocelot Desktop [FPS: ${uiHandler.fps}%2.3f]" } diff --git a/src/main/scala/ocelot/desktop/ui/widget/ScreenWidget.scala b/src/main/scala/ocelot/desktop/ui/widget/ScreenView.scala similarity index 94% rename from src/main/scala/ocelot/desktop/ui/widget/ScreenWidget.scala rename to src/main/scala/ocelot/desktop/ui/widget/ScreenView.scala index 125b66a..40b024c 100644 --- a/src/main/scala/ocelot/desktop/ui/widget/ScreenWidget.scala +++ b/src/main/scala/ocelot/desktop/ui/widget/ScreenView.scala @@ -11,11 +11,11 @@ import totoro.ocelot.brain.user.User import scala.collection.mutable -class ScreenWidget(screen: Screen) extends RootWidget with Logging { +class ScreenView(screen: Screen) extends Widget with Logging { private val fontSize = 16f - var width = screen.getWidth - var height = screen.getHeight + private var width = screen.getWidth + private var height = screen.getHeight var background: Int = 0x000000 var foreground: Int = 0xFFFFFF @@ -76,13 +76,14 @@ class ScreenWidget(screen: Screen) extends RootWidget with Logging { } } - override def windowTitle: String = f"Ocelot Desktop [FPS: ${uiHandler.fps}%2.3f]" - override def draw(g: Graphics): Unit = { + g.pushTransform() + g.translate(position.x, position.y) + val w = math.round(fontSize * width / 2f) + 32 val h = math.round(fontSize * height) + 32 - g.clear(0, 0, w, h) + g.clear(position.x.toInt, position.y.toInt, w, h) g.background = IntColor(0x333333) g.sprite = "Empty" g.rect(0, 0, w, h) @@ -108,6 +109,8 @@ class ScreenWidget(screen: Screen) extends RootWidget with Logging { g.sprite("BorderH", 16, h - 16, w - 32, 16) g.sprite("BorderV", 0, 16, 16, h - 32) g.sprite("BorderV", w - 16, 16, 16, h - 32) + + g.popTransform() } def set(x: Int, y: Int, text: String, vertical: Boolean): Unit = { diff --git a/src/main/scala/ocelot/desktop/ui/widget/ScrollView.scala b/src/main/scala/ocelot/desktop/ui/widget/ScrollView.scala new file mode 100644 index 0000000..5fb5993 --- /dev/null +++ b/src/main/scala/ocelot/desktop/ui/widget/ScrollView.scala @@ -0,0 +1,20 @@ +package ocelot.desktop.ui.widget +import ocelot.desktop.geometry.Size2D + +class ScrollView(contents: Widget) extends Widget { + override def minimumSize: Option[Size2D] = Some(Size2D(10, 10)) + + override def maximumSize: Option[Size2D] = None + + override def children: Seq[Widget] = { + Array(contents) + } + + class ScrollBar(orientation: Orientation.Value) extends Widget { + + } + + object Orientation extends Enumeration { + val Vertical, Horizontal = Value + } +} diff --git a/src/main/scala/ocelot/desktop/ui/widget/Widget.scala b/src/main/scala/ocelot/desktop/ui/widget/Widget.scala index 1172844..a72d24b 100644 --- a/src/main/scala/ocelot/desktop/ui/widget/Widget.scala +++ b/src/main/scala/ocelot/desktop/ui/widget/Widget.scala @@ -1,12 +1,17 @@ package ocelot.desktop.ui.widget -import ocelot.desktop.geometry.Size2D +import ocelot.desktop.geometry.{Size2D, Vector2D} import ocelot.desktop.graphics.Graphics -import ocelot.desktop.ui.EventHandlers +import ocelot.desktop.ui.{EventHandlers, UiHandler} import ocelot.desktop.ui.event.Event -class Widget { +abstract class Widget { + private var _position: Vector2D = Vector2D(0, 0) private var _size: Size2D = Size2D(0, 0) + private var _parent: Option[Widget] = None + + // TODO: Remove + var uiHandler: UiHandler = _ val eventHandlers = new EventHandlers @@ -19,11 +24,31 @@ class Widget { ) } + def position: Vector2D = _position + + def position_=(value: Vector2D): Unit = { + _position = value + } + def minimumSize: Option[Size2D] = None def maximumSize: Option[Size2D] = None - def draw(g: Graphics): Unit = {} + def children: Seq[Widget] = Array[Widget]() + + def parent: Option[Widget] = _parent + + def parent_=(value: Option[Widget]): Unit = { + _parent = value + } def handleEvent(event: Event): Unit = eventHandlers(event) + + def draw(g: Graphics): Unit = {} + + def shouldRedraw: Boolean = true + + def update(): Unit = {} + + def relayout(): Unit = {} } diff --git a/src/main/scala/ocelot/desktop/ui/widget/WrapperWidget.scala b/src/main/scala/ocelot/desktop/ui/widget/WrapperWidget.scala new file mode 100644 index 0000000..15adc7a --- /dev/null +++ b/src/main/scala/ocelot/desktop/ui/widget/WrapperWidget.scala @@ -0,0 +1,13 @@ +package ocelot.desktop.ui.widget + +import ocelot.desktop.geometry.Size2D + +abstract class WrapperWidget extends Widget { + protected val inner: Widget + + override def minimumSize: Option[Size2D] = inner.minimumSize + + override def maximumSize: Option[Size2D] = inner.maximumSize + + override def children: Seq[Widget] = Array(inner) +}