From c6b05080bd5ecfa5385a03e9508d2ddc171e90f5 Mon Sep 17 00:00:00 2001 From: omigamedev Date: Fri, 16 Jan 2026 01:45:01 +0100 Subject: [PATCH] add icons and navigation --- assets/demo.lua | 9 -- assets/demo.rml | 119 ----------------- assets/{ => fonts}/LatoLatin-Bold.ttf | Bin assets/{ => fonts}/LatoLatin-BoldItalic.ttf | Bin assets/{ => fonts}/LatoLatin-Italic.ttf | Bin assets/{ => fonts}/LatoLatin-Regular.ttf | Bin assets/{ => fonts}/NotoEmoji-Regular.ttf | Bin assets/icons/add.tga | Bin 0 -> 9234 bytes assets/icons/back.tga | Bin 0 -> 9234 bytes assets/icons/backspace.tga | Bin 0 -> 9234 bytes assets/icons/battery.tga | Bin 0 -> 9234 bytes assets/icons/browser.tga | Bin 0 -> 36882 bytes assets/icons/calculator.tga | Bin 0 -> 36882 bytes assets/icons/calendar.tga | Bin 0 -> 36882 bytes assets/icons/call_small.tga | Bin 0 -> 9234 bytes assets/icons/camera.tga | Bin 0 -> 36882 bytes assets/icons/clock.tga | Bin 0 -> 36882 bytes assets/icons/close.tga | Bin 0 -> 9234 bytes assets/icons/contact_phone.tga | Bin 0 -> 9234 bytes assets/icons/contacts.tga | Bin 0 -> 36882 bytes assets/icons/dialpad.tga | Bin 0 -> 9234 bytes assets/icons/files.tga | Bin 0 -> 36882 bytes assets/icons/forward.tga | Bin 0 -> 9234 bytes assets/icons/gallery.tga | Bin 0 -> 36882 bytes assets/icons/history.tga | Bin 0 -> 9234 bytes assets/icons/home.tga | Bin 0 -> 9234 bytes assets/icons/maps.tga | Bin 0 -> 36882 bytes assets/icons/menu.tga | Bin 0 -> 9234 bytes assets/icons/message.tga | Bin 0 -> 36882 bytes assets/icons/more.tga | Bin 0 -> 9234 bytes assets/icons/music.tga | Bin 0 -> 36882 bytes assets/icons/notes.tga | Bin 0 -> 36882 bytes assets/icons/phone.tga | Bin 0 -> 36882 bytes assets/icons/refresh.tga | Bin 0 -> 9234 bytes assets/icons/search.tga | Bin 0 -> 9234 bytes assets/icons/send.tga | Bin 0 -> 9234 bytes assets/icons/settings.tga | Bin 0 -> 36882 bytes assets/icons/signal.tga | Bin 0 -> 9234 bytes assets/icons/store.tga | Bin 0 -> 36882 bytes assets/icons/weather.tga | Bin 0 -> 36882 bytes assets/icons/wifi.tga | Bin 0 -> 9234 bytes assets/phone.rcss | 137 -------------------- assets/screens/browser.rml | 16 +-- assets/screens/contacts.rml | 15 ++- assets/screens/dialer.rml | 11 +- assets/screens/home.rml | 81 +++++++----- assets/screens/lock.rml | 5 +- assets/screens/messages.rml | 7 +- assets/screens/settings.rml | 5 +- assets/scripts/navigation.lua | 45 ++++--- assets/{ => ui}/html.rcss | 0 main.cpp | 134 ++++++++++++++++--- run.bat | 6 + 53 files changed, 232 insertions(+), 358 deletions(-) delete mode 100644 assets/demo.lua delete mode 100644 assets/demo.rml rename assets/{ => fonts}/LatoLatin-Bold.ttf (100%) rename assets/{ => fonts}/LatoLatin-BoldItalic.ttf (100%) rename assets/{ => fonts}/LatoLatin-Italic.ttf (100%) rename assets/{ => fonts}/LatoLatin-Regular.ttf (100%) rename assets/{ => fonts}/NotoEmoji-Regular.ttf (100%) create mode 100644 assets/icons/add.tga create mode 100644 assets/icons/back.tga create mode 100644 assets/icons/backspace.tga create mode 100644 assets/icons/battery.tga create mode 100644 assets/icons/browser.tga create mode 100644 assets/icons/calculator.tga create mode 100644 assets/icons/calendar.tga create mode 100644 assets/icons/call_small.tga create mode 100644 assets/icons/camera.tga create mode 100644 assets/icons/clock.tga create mode 100644 assets/icons/close.tga create mode 100644 assets/icons/contact_phone.tga create mode 100644 assets/icons/contacts.tga create mode 100644 assets/icons/dialpad.tga create mode 100644 assets/icons/files.tga create mode 100644 assets/icons/forward.tga create mode 100644 assets/icons/gallery.tga create mode 100644 assets/icons/history.tga create mode 100644 assets/icons/home.tga create mode 100644 assets/icons/maps.tga create mode 100644 assets/icons/menu.tga create mode 100644 assets/icons/message.tga create mode 100644 assets/icons/more.tga create mode 100644 assets/icons/music.tga create mode 100644 assets/icons/notes.tga create mode 100644 assets/icons/phone.tga create mode 100644 assets/icons/refresh.tga create mode 100644 assets/icons/search.tga create mode 100644 assets/icons/send.tga create mode 100644 assets/icons/settings.tga create mode 100644 assets/icons/signal.tga create mode 100644 assets/icons/store.tga create mode 100644 assets/icons/weather.tga create mode 100644 assets/icons/wifi.tga delete mode 100644 assets/phone.rcss rename assets/{ => ui}/html.rcss (100%) create mode 100644 run.bat diff --git a/assets/demo.lua b/assets/demo.lua deleted file mode 100644 index 33056c0..0000000 --- a/assets/demo.lua +++ /dev/null @@ -1,9 +0,0 @@ --- Simple button click handler -click_count = 0 - -function onButtonClick(event) - click_count = click_count + 1 - local button = event.current_element - button.inner_rml = "Clicked " .. click_count .. " times!" - print("Button clicked! Count: " .. click_count) -end diff --git a/assets/demo.rml b/assets/demo.rml deleted file mode 100644 index 07c4c0e..0000000 --- a/assets/demo.rml +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - Virtual Smartphone - Home - - - - -
- 12:30 -
- * - + - | -
-
- - -
-
- -
-
P
- Phone -
-
-
M
- Messages -
-
-
C
- Contacts -
-
-
B
- Browser -
- - -
-
G
- Gallery -
-
-
C
- Camera -
-
-
S
- Settings -
-
-
M
- Music -
- - -
-
C
- Calendar -
-
-
C
- Clock -
-
-
N
- Notes -
-
-
M
- Maps -
- - -
-
S
- Store -
-
-
F
- Files -
-
-
C
- Calculator -
-
-
W
- Weather -
-
-
- - -
-
P
-
M
-
C
-
B
-
- -
diff --git a/assets/LatoLatin-Bold.ttf b/assets/fonts/LatoLatin-Bold.ttf similarity index 100% rename from assets/LatoLatin-Bold.ttf rename to assets/fonts/LatoLatin-Bold.ttf diff --git a/assets/LatoLatin-BoldItalic.ttf b/assets/fonts/LatoLatin-BoldItalic.ttf similarity index 100% rename from assets/LatoLatin-BoldItalic.ttf rename to assets/fonts/LatoLatin-BoldItalic.ttf diff --git a/assets/LatoLatin-Italic.ttf b/assets/fonts/LatoLatin-Italic.ttf similarity index 100% rename from assets/LatoLatin-Italic.ttf rename to assets/fonts/LatoLatin-Italic.ttf diff --git a/assets/LatoLatin-Regular.ttf b/assets/fonts/LatoLatin-Regular.ttf similarity index 100% rename from assets/LatoLatin-Regular.ttf rename to assets/fonts/LatoLatin-Regular.ttf diff --git a/assets/NotoEmoji-Regular.ttf b/assets/fonts/NotoEmoji-Regular.ttf similarity index 100% rename from assets/NotoEmoji-Regular.ttf rename to assets/fonts/NotoEmoji-Regular.ttf diff --git a/assets/icons/add.tga b/assets/icons/add.tga new file mode 100644 index 0000000000000000000000000000000000000000..0115e115d6db1e22b1859974bd7e36231e032473 GIT binary patch literal 9234 zcmeI0K?;LV3`9du(q)$(qxU~Tdyrp+K5#pWIRDECGA<_O5l0MGJ&I$it)8zjM&-;5 zl7VC(8At|_f!k!@y+6zE|2(c&`_6xMW{%@}HGbI9@L&53nLC>KXZ}hC$PKF0&ftX` zoqO-k9bWbsc)Il1nL75R^FGtX&V4)frPcXY&yV^}kp)z( zcl+T+-8^c4xKXvCj-eqGH~Mz`~bj*uJ8Z= literal 0 HcmV?d00001 diff --git a/assets/icons/back.tga b/assets/icons/back.tga new file mode 100644 index 0000000000000000000000000000000000000000..3bc351217cac68d8bc5701ee191a461cb996523b GIT binary patch literal 9234 zcmeHLI}XAy47E4`zXLEbc0pW$t1vLJ081~)31A22f)t)5B2`s7L=6c>&ytl!t(@oQ zm&S_7NW4{2$zti86FNDd2B-mQfEq}wff?e>6UWSTULAq^34g(N#&W2Ew{3S!a`85F zow^PD^L#dfKZN}O>?;HK`>?Nx{i}P2yqEbmk$3VQdsb01Wi)fZ8I;?uSa1W6)kydI zDPm|JS;8(@w2LQpK0%D81bD2O0>9?FFMvOletf-7fgH5Aw9ub1hvECsbC_bJmVToi ztOM(iVn1t)f7X(P`x9TsP#vt?U-jj1gTDMbE2H*&4P1NgtwH?C^BAuEw-wHbleMA- Kr~zughz8!J@aen& literal 0 HcmV?d00001 diff --git a/assets/icons/backspace.tga b/assets/icons/backspace.tga new file mode 100644 index 0000000000000000000000000000000000000000..f7065828ab8ba8b0c0f9fc7ecc6e5d8323cc77ac GIT binary patch literal 9234 zcmeI1OG*SW5Qc+pU8d3*+z|g<~G;mCe_f)^AZmYc0#%ro4R6U=a`(*!2 zwU_cqAf6bWdI1+4I0wraT!}S3b>9s9hh+276SQI}<-bSW$PjY;m(sA)ev1Eqczf0j zr!&R>$Og_9_tdv@4a~6yYrQ4LU#pvI+8qA&sCw=j*kTRV!iT45e&}Z7aqwsRLap?* zOXCNFAK1WFu7xjak?YX6>>2Zo^XDA0&r%FAcKGnQtY^%o6Gr3%`tzg_bdya#U{n8uQNZ||LSO)&kr0&t&Ungzy0VWXU5FUZLN-4 zK0m)^c=Z%>%eGcWE#6;lG+<#Yxn;jrM?JhhB92-e71GswTIO8$YjxBdGUHG)>v64) zGFvvC(!6@yyN)z(Y}~7kEWh7!JU!}YO-f|GQoHp3FA(1mRm8l+|Bp)NGv@7D9=RI1 J8X6!C`~olT790Qo literal 0 HcmV?d00001 diff --git a/assets/icons/battery.tga b/assets/icons/battery.tga new file mode 100644 index 0000000000000000000000000000000000000000..838aaae635ac8bb8ba6db0c52abc6632006a9b46 GIT binary patch literal 9234 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 Mn*%lnI%E#~2juN=iU0rr literal 0 HcmV?d00001 diff --git a/assets/icons/calculator.tga b/assets/icons/calculator.tga new file mode 100644 index 0000000000000000000000000000000000000000..2a9db6cc6a580554d83d7fe840b1653803865948 GIT binary patch literal 36882 zcmeHQy^a(|5MCMa1|~R17g`Px2y}s8fEPfvEKUxLWF&F|2gs7;z&eQwEIY9L0Cq?O zp$dsy}>sjhpf>-X#0p4pZ5cD4Fo6=;98zuNtH zyrGfyk>5cz3JY!m$3E1?;-I?#m;Y^}upU$6fb@Gc0)SX`Fte-fZVhP7B1 zwoekeHKN#0k9kcFOY3|i38ZSjB=UFn_=l=9^%v*a||<|_%P)g1O9hdpd> z8#z_sh`sImtym}CV-+-@;`T737Zw)l-0R$gFSrJ zQtKYf#U6QuJbR6`wa0oNI_3pmErdO|E?mOnhUm=cdoh1Qr8slfL!6dzSCr?*4fgQW zLikL0PdM0XBksrXvuR6=SXcA!C68m(&VLX^ulVp)OSRaC+&uOm`06#*)*kEqCl@~n zUlHClGHl@kzG|oy`+(QnJqUh!jWx9|t%EcFQ(-FxSHtkq41N{9 zEBsKnM1P3F_rkvk|65YdtoOh?_L&LIB|#v@s>hrl=Mm_EdF(SEovSfcJ?2C>k3bL1 zW1soxT#d2nF(<-#1bSc|`^-n@YK&Enxi`Yc;_!~}&Iw}<*``tt%wwP4xB&0iKjx5a zDotzgzV^oDBXKy*5wcCCX)WH@-neM_S>wd#ndZAB$607S2TQ)^u3K@@?6iC|{gOO& zo@p^ka?3eb@;P_CRDbKbmQSmnpr1O=v=}A1kYnINvp?8 z-kMKIU(2gxr>%S5Z{Vwyw0gYct@)JnwY*Ap+B)&qkV(tE@#p!I##xhk#=Y{3D!#gjlKQEj$Ki0f7yZF4=5hY*`*`|_)o0oi3aT%4j z7tWfWQFUx;91S-w`KIDBDsL~GH9w>3*wi>0ZeDVHua=ZX0N8lptoeDA4o#^b0Bkhe zyyOQ&T15cZc;T%1;s2jc!;kM)j`;uc*cbl(!r46-_4^CJpT9qH8vh3;m}qB44>|S# z-!o5rr}=bt@9!0A2L>a5`(?V9IP-Adc`UpQ&!(smwW8)x=lv9OUiW{_A;!d*J-{Ad d53mQ=1MC6z0DFKvz#d=^um{)!>;ab^_#Z0$o{j(j literal 0 HcmV?d00001 diff --git a/assets/icons/calendar.tga b/assets/icons/calendar.tga new file mode 100644 index 0000000000000000000000000000000000000000..4f624c19ef7be3569eda9f1e9bde6cdd1118306a GIT binary patch literal 36882 zcmeI5O>Pu15QRsGZ~-=mY}gdNYWJ6avBZrwRMJ6oxXfixfuNCVPv(bxyIZx0X??<+WJQ(rX8?< zIM4Nw{k&^E!Y<-_)z*G${ipSPZO9!A4y;F5*7}0|bL(pV2%OlDIcxAx;MWK|v5{IG zx6Hq7>wI5ZT?4ol&GCNlK&VFv;61rT(=|RXM^~5O)eQXK3G*lc+?&>Dxn=IB(bZ)D zfflAUKH~4|tcGRFT=5rwpTM%#7ERaqd|o!a?pLp2*)muBeF?NMt??0m@%ITVYpv08 z%UtQ-uWt*}8Xxgrmj4%j`MtN+Xt`ys`1=xTVOrzE_}9eR#<@QI{O3R7?^hsOQ{ulY z|F8b?>Ca!Y^~K_o^waYff4>5(eo?#li+@x@5r3b4{{4^i?^hsF+f97Me_8(D{N>Z% z|2NS{<{XlKdj8_?S0Js&r__?a}1w;zW&AE zuRykTdgMPmzrm-oZpE1t$JRGJ3t>IN#gTpEKX!h@MJoJXo1RC(BJCT0Xm_fHSd1TA zi}^?Gy zQEwf_F1= zQEwf_F1=65L+{G;~X_#YaO()r$u(`Ea%eE!lKf9MG{fOhd&Vr|>D&mVu21f#!S zz5A2&>Gdm`pZNO~i1KCr;xGP8Bbj!eKEHp8?v3gHrfo2~Mz8+JjkWB(v-R)WgzP;m z6(6~=mc2K&{u`Tc-Fo&u=8lh?kQ-~+`(o?Ej(tKaH>_vxCp$iJKrWlGw`uA5;*3$X zGJ!eHU&R@_YGnd*oIi~3x=lDkiA}uy)+;VNCVP< QG$0K~1JZyrutgg91Mau)SO5S3 literal 0 HcmV?d00001 diff --git a/assets/icons/call_small.tga b/assets/icons/call_small.tga new file mode 100644 index 0000000000000000000000000000000000000000..da6a556235eaf312f95411921d16763b27ebc2ae GIT binary patch literal 9234 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 KGzPkO4EzgOOQC`Q literal 0 HcmV?d00001 diff --git a/assets/icons/close.tga b/assets/icons/close.tga new file mode 100644 index 0000000000000000000000000000000000000000..d5a136a74e57e6ffa6cd3568278c01ff715185ba GIT binary patch literal 9234 zcmeHLv2Fq}42?P>)D?*VF*5QeRcZTYEPN)6?Qr-Zr9>zWhaH1Kwq!0!&h~rGJ9L+n z-cq)8TBqe|7={!cJqQhi20{a&fzW_^4a{ke-VOF?LOEv!dCT{U9p#4|$iK0EezT{&pb_n?Lyc;TgarPV_YL|ELk$VGu`yQXhtQ10xz$)+ai6VjqQBAK&_HM) JH1I+iI0B!8>bn2{ literal 0 HcmV?d00001 diff --git a/assets/icons/contact_phone.tga b/assets/icons/contact_phone.tga new file mode 100644 index 0000000000000000000000000000000000000000..2b0f344c995835bfa07a96b4b7699ab84d4d9b8f GIT binary patch literal 9234 zcmeHMze^lJ7~Kd$)TBr$idqUG8--x?3Xo9xO}1 zFz~4kex{GHX6+dSe}J`SiG=zy_`U#tT&B^#3=+c`Ix<&lyD0boNZhLqGL8Nr2e&jHb2WC0v!iB^>Z!r*+Mk)&S~$TlR4?$EoRM` zBYli9hq6mCA0Tmd!GGi_esshh z;GYB90f|@RBL}(2>9XGlxH!Ke=Gs>!{k-p^9zNGNAwM}?J#~jzzh}&O#3YmSOW%P) z+Oo#U?XrCY+5m~`ucJuPKj7eyc(p!q`;7CP=KSd?ko2ePTYc`4Q{(rMaqAj<+Q}oW zsaESv^Ko3C@fucu4PR0{Ch5;mR+yCcpg-o{K&$A4&BAnpUdTF1dVm=Jzqo|%Zh-p( duYva=#{ZAf`&)Vb|1-3llX6bV9>}2w{sEL?5v>3K literal 0 HcmV?d00001 diff --git a/assets/icons/contacts.tga b/assets/icons/contacts.tga new file mode 100644 index 0000000000000000000000000000000000000000..2257d3a642ab9fb559d05fbdccc2055b59bc212f GIT binary patch literal 36882 zcmeHQJ!=&~6kUYa_<`8QB8@2i0?SwE-;f|$Slim!3rXWI$R9`<6a;^Ppp|vBu}WcM z;CT)@@E8*I&D@#2ceCfhW!}D>d*|FUXLk3!B$HvdHYD30_J_TP>-BnQ;Je6i1pfiQ z>c$#bD{F4Soizt>{DLpdSaXCqpca;Dtlg?#Yy9a_$w%F+-O8UeUi|yc0oUMCjkR0# zYmL|aH^v-L3wr+ap9|}HQoQC+8juF00ck)QkOrgyX+Ro?qk%{Gob?X=4Soh+x{(8N zK~Bg`FRkt%_aXcoF1wfkazl>DRm*u`z7x1?I|j&A%Q-mMZdmo&V1S&pSOdJK>6)`a z?3ORdS&RDt?<=x82FRUt4ScN|T2Wwt+*$e8GiJS%$eoq{`q33h2E@Ow4#dCsZ^^(% zBzpnB55M`}`I_(XTr|5X`u`4MSMafV*oS?i*cjfi^AYO!3=ntWV_4I9_GL^2OPFd~ z?;5D(67Ex-jES%g5}w-DoBtI6)M96>x7A`#ah~`;VDN;awq*`atHqt-Jh8vT;0Z@< z%N(9oi#x@6Vt;_a6OP)JIXtZvcZ&1GehY&q9JMWTcv>y)6z7Ru{Cl#$UhDef%fIfw zzWnR?)0cmazJjNFQEAIqZ!5)|_xHxH?;pHp;NN#?CEo$*`?vOU#&y8!NxnYwWA=&g zy<1`+$5(os@+ z#xT~~62{ur1OFEc`Ud_OejQ$mow3ZpT+HcVwb)bKRG7J+-CKBzpSdLLdCS}!W6J#k za}1@&fZNr6BKvFj4R|TG+Ws7iV{+`?R*Nyk^~Coc$#28cSW~wgn;3eUwWc1}{vhcy zxD{Kgcw!-@9%jYZ1JiRPwc=_WPfR_`inBGQVJ?9Ht<8$HHJ&F(XvNekp4eKO z6>DoecaYGEsaHI)wKgl(Xn3skjKxQ*HyWNX{;cPt)f)|umEW=WX!Sv!0JuZ)-eD%NI=#;=kWZ$AgE z_a9Dka0m!oSF(#4AUEWQdbM8nFN^0jjrSGpKMxXMe8!w&|M|=2L+|&~y0{g$(ttD| z4M+phfHWWtNCOcyu#3+iM{xcB<>~cF?x*~F9t;=4STk$)UJum$QjN8H^MATj@=-Ty f7yo_&h`>MB;8KmXd+T5K-xza1E$I2Pa4!A=vJ4X6 literal 0 HcmV?d00001 diff --git a/assets/icons/dialpad.tga b/assets/icons/dialpad.tga new file mode 100644 index 0000000000000000000000000000000000000000..cf901e95e3299fbd28b586427f3871d3345f5099 GIT binary patch literal 9234 zcmeHJK@P(p3`6_IE<5hnPxCZ(+8;VBZI?6-<@!a>l z)%@V{?n6HCX=`A|YaC}jXgzv>$+_%!SJ)hoc>DcIYh7_3GS}<9@0eW9T$IJ*>p&%&UZ<2}G zx6&w4;>kE~U%ZK8PtzA8&sJ|1pe&d;Z;2_5UehzyDK7 z_~*_h{NbNVAh$aH51apU?(Pr1y6QjtH3i_W@l&(muM*Vq;ji&ivsL~t>JC(%5C2>N z;1B;?0=d;y{}<`pw_K8C)!|>pEh-ECQ6$S=2mWQ;qO#y0MY8O5RQ~h6-lgnaE^Ze5 zbLR&B@XsZXTOI$0&EL;sWRw$7{fB=!d(VWw#!tIy(zs66^R{5*-YtM&&t^q3lS@rnLr81xD z5!YY)HS~-!0ulWOyoUs%j6g*H4ez1Ce_;LjNA;ia^}~A!G5QgR>c8aty`P!))M89W zAhQ2h_x;J|zX9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KeAT2fhFs2ky-P literal 0 HcmV?d00001 diff --git a/assets/icons/forward.tga b/assets/icons/forward.tga new file mode 100644 index 0000000000000000000000000000000000000000..d9b954fd8c075a3624ce9ee7481b1e87c96b1bf2 GIT binary patch literal 9234 zcmeHLOK!q26tsGS(jK78?ube$SKulvSg`@M5TNJlt|x$9#cvHrVJxLm6#1bno}9dB zEIlQ8ik@f2OCvhjI~~kfct{DBIX7; z`~h>Zed8gPb{hTs6v5~BmN;~Qc^BZYMovSY7&YF2bsylcY5|9(Ar3uYJp{&~4IENK zO>FF L1M~nrP}u`F>oDoj literal 0 HcmV?d00001 diff --git a/assets/icons/gallery.tga b/assets/icons/gallery.tga new file mode 100644 index 0000000000000000000000000000000000000000..05140d37d2bea1e0bc71c67793f2cee7dca31581 GIT binary patch literal 36882 zcmeI4y{;5T5QSGrfNVk%eiAGQ_;~?-9s$Xb69+aovCIST97qr$5XcUA335Op1zU1# zL0~yT4vb`JUFT|B+B(Ukav*Xbav*Xbav*Xbav*Xba$ukwxN5xjt^Q{9qt(`nVo)rKNwH1!?^DOkw})2$ zv%0TEu_;EyI;C}xKQFA#r6|@Zt-*u22)`DmVxGb?pgnP)_nbA!k6bF|DVzs7m*!d& z``FLGySa*QaVz$*_1}lzn0-@7v5&2PU*Gq|F7zLFB}4zve_RE|ojvkD^dDD&ac7VG z5B42L!rvE!5=Qm~^I1To58)(|*Pi%W$4MW;DSod#@wbkXK7>>JUVGwi9VdMV zr}(}0#NRqj`Vda>d+mw8b)57eoZ|P|6MySC=|ech@3klX)^XB@aEjk+PyDUpqz~Z~ zzt^7lTgOQs!YO{QJ@L1WlRkt~{9b$FZyhIn2&eeH_Qc;hPWli|@q6uwzjd7SA)Mm( z+7o~4IO#(;#qYHz{?>8Qhj5DDYft>Gs^y zhbp8G;pCUsp7@8r_3t>&Sxvs{T75&5G)Lc-d?H@5|I+v;oA9R9uHUz;PuQ+Ycb;wU z$sgh)`!9|EY!l{uzB_<3xw&fl$tB_;`&#@j8+dP3b={{tHY4))Ngv{Z4b4Y*f%*{g z+7rL}yn~D^%Y$<&_OSVKs5&+LJcs^)|#XHaAagKhR@5WM6~-V1v5;{#awU z8l!)wban$rmowe(@;pwQeOn5Xc*&mdrv=@fk+I?bTD?)=$oapk^Ek&}+fN}9580RS zw+4P?H8;oChP^8h81_@aKF6E-cX1vkuD&gVm(?cCNA@|qyXPmqZd*DF9yzp6^LWqW z#M8IU>67}2H;vo2)&5T02|w6C{?htt&fCP1YrW@jj<>ddLug03i08=Q${X$L#M{Mx zS>xXJyzO#z?>*;nmuuVmwXil`65mFnLZ|j~?d!zb#ZQ^d?^bo*UhiSwu*7> zLx}jvKH5A6tGfhGKWS{VF?1H$a zg5OR~SF~QAX$s;e`-H!+i%V9CZ){vX>UUOc@%l^i5Py7s$(K`J{ptM-@wbdCcFIq} zDSon#@9+86z^lLBkHz;V`>%mle?1@Z{nc^xKW=NF-#2q9id8Yw-dux|W;GldBY*U5 z>V4je6q{n)mG;t&O0E8BoX!KC$?^U9y60op`loe>HuP^H2O|IL@^q-R4E?9A|2bQr zq1HZlDf^ep??eAV^N&{GPaAML)?lzTApM1F4fGtGu^M~EZZ(+O`+NOAnCDi{Pb8P- z`u@K5`=&!b?{j{CujgQBeTjdr@9$0e<@*Wful1SZ`}-;BulK2QdVeqNRi?22r2R>2 zu7Uwtdw;*Kxvr=7`!net?fAciVhv&qA_pP|A_pP|A_pP|A_pP| HTsiPRRmm8v literal 0 HcmV?d00001 diff --git a/assets/icons/history.tga b/assets/icons/history.tga new file mode 100644 index 0000000000000000000000000000000000000000..6a98b6826ff810fb005ba01e1ff2819ece515bdc GIT binary patch literal 9234 zcmeI0%WD)t5XRR>M8RkDA`%FKMnN$bH6Dcc08wuN!B<@W08d`kBtAiJ-VGvNRPdx= zNR06jb5eYR;$x2@-hzk*b^U#?BSq7_+p{}~A#B0NbXQk>RXx*F-7~q|^jspXxz=3s zs$#L2tD}Ao>T96B2BydwSj0T`fh%ALd;(v9qyX-LUXTY1z+|a^yU67s_zhy^Cx*Ad zPVm3x(N65gpjH`xU@e%adCVZz`C5~9{D0B!2ID=4Mq>1XkUU|a2W$t+f!6tKuo7$o z8hZmma*csGU_9nAAKq7iz&Fshq=>r?+r9wT2>Pt&pfz*H6Hhf}1E}_X?ZEf5hgZ*G zS`EBzJ{LVPR1X(t5Tgl>XCD6U47fFqHt+{nxlgA7xbv*GKNl`{4tl4vs7u4}SouIF zi~H`*RnNg)OR5#FU7CJ}O`Nu#gPunW#~JKK!P!WAaq4|=Mf+n+JfDqQD^+KFc0S#Y zQX<-Ged8gWTPJR%^iOzoo*66Upo{Lk>Uc6<=_;Q@D%slc*2JlF)%+I%YZKG%bar6Wj?08ID=SV9j=*0LXHr6-M#a?@?Gwt4#u@z^~;nd30iZWoIRgpKNvhv7%a5j^hC1 zNxidvp|))0Q;yT_*+;O|8LFJU9aFur@|BJqciRW8ab!DRf%ApK^PK+X3O-3*?)uSM zPR2slV@|ws-JS@(HQ2oOkX%K#w1R)Tvp{K7E&UF11gmh!y%qhN@!7@bR3q~>_{YSsHf_YR z_nvNX_XNhbxuk6`A(1Wb!x~aUTU{<%{rF&)`LAj|8{ES*L{BgT)BXv zR&JmFVH2o8dut7GHsSjbxYCaz&3VI@XGnL~38wc=d#e6Pg?wDS&a(Oz^@+Y+s;QT5 zj8OlaFK9_O%(V-&gJz)hrGFzUfS!}a+`S3aKk1{T|9qj?S?C+!*V@#+lBMV$*?6rP z-@G>x?_~xPcm#*)zAwf^=(N8KrkuwZ_5+{;Ohk?`F_w`_C%6noKmmLQqu?DF0+)bn Ys`(!hlSAER@~nsYv#39dDZ2*#0#ulq7Pp1WSpgA(Rm%gP}%}dc$dt8-;SPp zsgzmw!+Y%S*GuXB(t;IYFo4DL9?qoxrvhu2C0IP~0sNm`Vinf$4m|w1cQrM3j-g~N z_D`xq!bSz$- zXZf;pG@li-d|5gcugb bsL_2oX6b0%i0!?PJ&HYwGZ1HBYtFzwXac1p literal 0 HcmV?d00001 diff --git a/assets/icons/maps.tga b/assets/icons/maps.tga new file mode 100644 index 0000000000000000000000000000000000000000..390b193d98cdefdcebe9858651fb3092c84967c8 GIT binary patch literal 36882 zcmeI5Ux-yz7{#w6l4OQte^66zQxEwd)PooVJ_ripOHvT2=%u$F1gX$L4WS1i5b7Z! z1jB~{MFk&1F$5zbBL5KBAU+795JZ0woOGxe*V5Uzx!$|)K6~%)%ynEF7H8jc_Wt%d z-}&8h&mFkmG#Ud9*IJEMqxs_a_;^E74#a>M5CdXB42S_SAO^&M7!U(uKn#chF(3wv z8F(J?--dQi=q+p)K>FL1T@GGAes@7XL*3eUIPebi6r^jBpMycQ#X#Zl&`w+SYRc)6s;YlbI-|E<#Soiy?hKd5);y;xgH_vC)qVLwR*ouGgpUag6^M1@+f1&x}U;Kyoh&kr7YSEAJ zkUB>Ei~m%1+&l~B{g`eYi>>$<|G8ZGtXlMQ{e|X>fAJsUBj%U|^M1@252<6szxYpO z$IbIuwdlKbEVklb{O59I!MqU*>UrHRxSE&9gD5_7yr3j zSupR%%=H(VFaE`Uh>w_KKC2e}7!Rpq#J~7YWyj64VBU}E*0I=%fAOEo6@Mej--_}# zqdvE#`nmo>^QQv;?)-Qz{OvS>1Y!*u)}o0$hf-^IigTfYk66F$<2tR|5Bpe? ziM5$nqp97q|Ju^)XFb;TeWdnBEKi_7Y}P1at+LG!YnQd3Cw7^&Wr*CqUg_5t&D@s{ z%-Vgd;m2Bju2ymRRqjSSh)wBScZ&C=)d?Uj>qGu!6rVLMS=-X0@pEVn)G1%3_pK~^ z0>2^NUTCT3e-Qnh&@WKGw^J}!XYJu>Snp(JQvS#MPa(c%CZn;=^;W1K{x`>b_&67l1lCLBXVWT(@123bG8eM+H52i9A2=A1Y0-5a6Z6KY}GgmPkPuJR`a#DEwO17bi7hygJm2E>3E5CdXB L42S_S(364Ni?-f* literal 0 HcmV?d00001 diff --git a/assets/icons/menu.tga b/assets/icons/menu.tga new file mode 100644 index 0000000000000000000000000000000000000000..6e984cee8c2bc700e6f77106439a1fafdde8f6c3 GIT binary patch literal 9234 zcmeI!!3lsc429v~Bpy9>4EG;F2Z@a!Pu15QSR^PQV7S%7O)OqwI2%S+PL^1czafBd~@OuwjkFUjhvEBDFL^PU7~f zZcnE_OQq>)x$NrC&t*@KNk7}7? z@UpI3Y8?=G8`l|g;7PP|anLT8bp(`)GS-6^b=^^`KtOAnb4GFFb@RWT<6)Q^$I||aIb#gmxLy9zk{d%W zf5q+=H+Gl*<9Gl!hF<=P-7RkHKgkw2>dT+^5AbhY1CQbT z8~MlEg0+tQ==aO({_5QW|G%{7AeX;}kNsy~{^k@~wfmSyT0b-NziNPH@U7fOKlpnC zFmi1Dg#Y^av;Ov5e|i7Y&R#j|!kd0q|2wwkzTSSP=CjM)eFm35?|-~8fWJ2hdh1_v z*o~o=|6RyGtiPWA-29{2%l@-{3^Mq88Fby=Ztmo~A8-8O@9}fJ;qMak{NeBMbG_m3 z67>Ax@9}fJ;qMak{9XP!$BfcOAmjWc__wi_SH}5c@NegzasD3s+xUxH#`%-*Z{weJ z{wn;Z^FI%ltn-KAU(a8xvd`cCQ{Vk2Yif@<=lSyv|6Ro9{{Gmye=C33=V-5mKkReZ zYwl0w5Bog!Q~AR_m;Ds}u+L{N{(r-6E4!$mx>!Dg+xWvipZTGVZ{iR8dD-8Te_%g9 z`|J3_ei`;9{;*$;{r~)7zbt$4AImN-^c`E4f%xy>-c5I~Usmtr7kHxqG=K)s02)98 MXaEhMfjg>!f8$$?HUIzs literal 0 HcmV?d00001 diff --git a/assets/icons/more.tga b/assets/icons/more.tga new file mode 100644 index 0000000000000000000000000000000000000000..73c1d5d48a10b6fc54428698ba42ee3d7cd4afce GIT binary patch literal 9234 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 F_zeINzB>Q_ literal 0 HcmV?d00001 diff --git a/assets/icons/refresh.tga b/assets/icons/refresh.tga new file mode 100644 index 0000000000000000000000000000000000000000..83e340f6694b2308c7c26ac6d9980d87c56ba94a GIT binary patch literal 9234 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 literal 0 HcmV?d00001 diff --git a/assets/icons/signal.tga b/assets/icons/signal.tga new file mode 100644 index 0000000000000000000000000000000000000000..909096a300a2a698ad9b37d02dd9e9bdf3021669 GIT binary patch literal 9234 zcmeIzy$S*`33o;^=q}rH|n1`SmKknL4>RxF~ogLqUW)nl@=tXdo1!^?v;m zPv=I?SK}JDSax0KYS#?v4AdE@GtfH&GstFAXg*tTf1uyctHSPZ0`G5K;6o|@SO0c@ zj}rWScD#di|B&6f|LBKgV6~cmh}~-bp>~UYirt!@YPaN%v0L#U5E5D1@1GPqURl$h zYS;90*tPszb`3wLJ-46Rp3}d_hY3`U_m7kvt6PY literal 0 HcmV?d00001 diff --git a/assets/icons/store.tga b/assets/icons/store.tga new file mode 100644 index 0000000000000000000000000000000000000000..7a5dbcfe8acba57a04058d2222435cad91dfce1c GIT binary patch literal 36882 zcmeI4KW@}O7{x7wQsn}OhBAlY3@8!@*@}u2P*FwD!UfWB3R)DZ++j0MYilj-dOXtj z&1ab3NE2K8+25a^-|mZ)Xoum|Fs=LHet36xJRS!&4A1}?Km%w14WI!ufCkV28bAYR z01co4G=K)s02)98XaEhMfh!t#n_hcJ`)}I+`_hb>RWtA5Zzt;GIqlw-X5PaykQRDf znmzhG@YE~(G`D7lf1CjJz+dmdUYBN%)<6Eck7pn)@cU={vxt5_QXdVV0W^RH+GyZ5 z`R=E*f2ZBc(yW?Uvq$ReCe?pTyVv!Y1{Z^YI^nNN9t)IdB-l5Ot7mL>X53~BcpNd6m{y%$%KAT@GTJy(y&kvxr2jjhG z_S0EQ55{{Z>gQui4?djBayAkWlU5#p_g>1br3d4^m;76KFy4E~etM;a2jjgH?aN~e z4?bL$<&}|u*tk6y?_HK#3lGM7m-)Lr81G$XKSi7#jQ38Imyb>lJ}j3dG7=CYmj{0x zYj9X5@I8fG{J$)hB{CBDX5{}7%Buv#$ff_+Dfh3{4*I=7Y{baLUwLoS{+#xov{@$t zVj(7C<79s=_o;*BpV#i$^0np4r$}urcm999KQ|wDe)#7jT{kiMA^XJ%>#G?Ci*LUYHVVt`rx<7Y)cm5pPl2~+q?)vWh zC5&^|MEB>e@6MlNTM~=z&t2c0zl3q_n&|%A_1*b%Y)fL%{kiMA^OrErT@&4(yS_Vr zj%`V7t-t7a$qcz`*80!g+ak8sUv#{d!CL>d`D^cA>n}R)p0754?fubw*Xq0HtIc0~ z|DOLJcZ>gr&CRz({#yPIYXS_6t2gI-Tja0pZ?E6~`JC8q@%`9K^KF&CmcQ;-kJ7>( zzW-A_sFy9+Pi*G%Ir2|+IM#n&!4QUM01co4G=K)s02)98XaEhM0W^RH&;S}h184vZ KpaC=xu7MYowEj~7 literal 0 HcmV?d00001 diff --git a/assets/icons/weather.tga b/assets/icons/weather.tga new file mode 100644 index 0000000000000000000000000000000000000000..2c8f2ad4bb4ff09b47d95e6fddf0d1799241c5c1 GIT binary patch literal 36882 zcmeI4&8yx-6vkhwwx!r&iNdE@G(uG~RxL_5% z;-Uq`h2p|RUD&$Nf*(lT)FKw^Cn$bgpPw}lLXw%uB$-L>IdFLMW@gTL&NFA`og|ZY zvDmaI+1_s=4hNNvm>RCn&Q% z7?y*Vs>GMRpD_Lh&%durd{+-Cv-}^HgMX@|m%dYG{13}PiSF7%wWa3bg$HfFSdNMeC!;-PbkiV!c<%ru?BxvdV7XAL*pvy-=~HX#>nIA@=K~W8$j%dfx?7 z^jB$Lf-P)f zdyE*S=!3EIob+euP=alI;A@H;4TYI?gwM5(s`VoH%4O{`6sNv+9~T!t^}=eH5q#p? z7v~)7J*)VOdx~M~^-~+)V3;Gfu9%3Md)2803>&Qv825jrCcfk!EE{DmT2`z-mSWH4 z5KLfmjoT@gv+nyi7s6|BfNjoeQ`X+O3mB)I<4xFkPBG-QRbTxI#+1)gn)r)7|6*SR zjbI0?vGL~AewX6;Wdz>(asgH_=fq(Q7Vbe#O~4!zb53nPni~1S3+9|S?22W#;>h7T zH#7yn4EC;Z=hE&_Xy6&u2YW6&cE!Q-z^Mw@yT%>UZlC6jY5URcKd0sY$OI=K zFy}a*biriLAJg}xJ%3Nz2e$ttE&t40w*M+^AK3oGwEQy$Z2xWgKCu1g>HC0p9&)%Y z1_M~StgENqhPZhLD3#!QqjF#54s(&cf0uUrEvpaCjyMSLh0h`f?DOh-CtM$}|9&XJ zHa_P3j!SGV?GZo6r1t*<;p20QczZ$34h1(yl^VY+x$}3;!j;@6>(L zYa(sM;Am_6pm6c5vn+4v%T8%qJD;*t|33rvwQ@i@=2^yFQXkx7)p=BSev{V88#*}_ zj=uf8Sr?Gbv8U$VOyXjmY2sc*|H%~B8ut|78$Rg+_MY_J=b`pKY`|AOeJ}%@p>aK3 z4xr)qRN}b!e=eVU2)T^akUn_0f%Ecd_Ev6|hS=@1F8hvL!td24X`g<_um!K@9l?=% zHzbbjn-+}Bk-4oELi%n+__=0llFwBTVsD7L%eIK9qdyL<9eqH=1#T$kDAg=aS9>-B5`6@8} z?uikAKvD?Vdp&K*Z8#@upF=)upF=)m{AV=3%$(g#{d8T literal 0 HcmV?d00001 diff --git a/assets/icons/wifi.tga b/assets/icons/wifi.tga new file mode 100644 index 0000000000000000000000000000000000000000..c2ba0a346c6ec0b97a1c412cdd8068c5ebe7ee84 GIT binary patch literal 9234 zcmeI0O{fl07{`am=8{WDHa9F}p?623#KMNeUD)Z?Es|_pMTC?cE2(=CHwznIDPlq1 zjkQ9`*S)WNEQBQApReCv@6>IYIdkT`=Q5-7)UTO2=Xw6mbIv?7)B8rz*eJGIRExUi zHJi;S5cVMSKN5%b?eGvr%XEKsfcnn0&SYE%TD##5{4IM+qP?I!OV(55 zx|{fC@UQFziPuAsn&mqME<#azPrxwL;XIsxlW+m*pt%oF)GiY+4Q$r27(YEzHuec8 zX>WoBFb48+jK^mQ?14Ib1{-^h(^4?$tA>vjVz=?x3=_emXEUcBmzFg1O#4-XEZu<| zfji8vHN+Kx;6ZcYuy4f#)H#Hz2i!8k*#ZH;+;%As7!nP#UM%+gqy5^#&LxrUf5 zt#-$iQ@NA2iUE^$5A*k+0S90LnEc~8J(mkXdp8K@px#2~gU|8RZM;Ss2J zd%@)IGNzMe?b-tby1_?HHX3utb*0^+Q{t~OCT*J< zTzzJv|0*T7uOVrV<{AzbDD(@yjTSn$wL>_%?r&aPzo7`duk~%wH)uK}wKS$V`DDG@ znQ9I|GS=6%-Zj6JWQ4urT)zuCz&4M36{FaZCT-=g)p7CbMSmDx!!ei%E;@=)>`{0L zLm+Ketq}MB?A;9dU=3`AEwCD + @@ -173,14 +174,13 @@
-
-
+
+
- L
-
R
-
:
+
+
@@ -213,7 +213,7 @@
- H + Home
@@ -221,11 +221,11 @@ Tabs
- + + New Tab
- : + Menu
diff --git a/assets/screens/contacts.rml b/assets/screens/contacts.rml index 27b5a80..0d86905 100644 --- a/assets/screens/contacts.rml +++ b/assets/screens/contacts.rml @@ -1,5 +1,6 @@ + @@ -71,14 +72,14 @@
-
+
Contacts -
+
+
@@ -177,20 +178,20 @@ -
+
+
- * + Keypad
- O + Recent
- @ + Contacts
diff --git a/assets/screens/dialer.rml b/assets/screens/dialer.rml index 7eaee37..044aca8 100644 --- a/assets/screens/dialer.rml +++ b/assets/screens/dialer.rml @@ -1,5 +1,6 @@ + @@ -107,7 +108,7 @@
-
+
Phone
@@ -175,21 +176,21 @@
-
C
+
- * + Keypad
- O + Recent
- @ + Contacts
diff --git a/assets/screens/home.rml b/assets/screens/home.rml index 04076f7..64b1136 100644 --- a/assets/screens/home.rml +++ b/assets/screens/home.rml @@ -1,8 +1,10 @@ + - Home + + Virtual Smartphone - Home @@ -32,9 +41,9 @@
12:30
- * - + - | + + +
@@ -42,74 +51,74 @@
-
-
P
+
+
Phone
-
-
M
+
+
Messages
-
-
C
+
+
Contacts
-
-
B
+
+
Browser
-
G
+
Gallery
-
C
+
Camera
-
-
S
+
+
Settings
-
M
+
Music
-
C
+
Calendar
-
C
+
Clock
-
N
+
Notes
-
M
+
Maps
-
S
+
Store
-
F
+
Files
-
C
+
Calculator
-
W
+
Weather
@@ -117,10 +126,10 @@
-
P
-
M
-
C
-
B
+
+
+
+
diff --git a/assets/screens/lock.rml b/assets/screens/lock.rml index 91a5f9e..967e298 100644 --- a/assets/screens/lock.rml +++ b/assets/screens/lock.rml @@ -1,5 +1,6 @@ + @@ -168,8 +169,8 @@
-
P
-
C
+
+
diff --git a/assets/screens/messages.rml b/assets/screens/messages.rml index c900e1c..dbfd303 100644 --- a/assets/screens/messages.rml +++ b/assets/screens/messages.rml @@ -1,5 +1,6 @@ + @@ -131,9 +132,9 @@
-
+
Messages -
Q
+
@@ -218,6 +219,6 @@
-
+
+
diff --git a/assets/screens/settings.rml b/assets/screens/settings.rml index 3eb0551..98e489d 100644 --- a/assets/screens/settings.rml +++ b/assets/screens/settings.rml @@ -1,5 +1,6 @@ + @@ -149,9 +150,9 @@
-
+
Settings -
Q
+
diff --git a/assets/scripts/navigation.lua b/assets/scripts/navigation.lua index a78460c..ade3c60 100644 --- a/assets/scripts/navigation.lua +++ b/assets/scripts/navigation.lua @@ -3,7 +3,7 @@ -- Screen registry - maps screen names to RML file paths local screens = { - home = "demo.rml", + home = "screens/home.rml", lock = "screens/lock.rml", dialer = "screens/dialer.rml", contacts = "screens/contacts.rml", @@ -12,27 +12,36 @@ local screens = { browser = "screens/browser.rml" } --- Navigation history stack -local history = {} +-- Use global state to persist across document loads +-- Initialize only if not already set +if not _G.nav_state then + _G.nav_state = { + history = {}, + current_screen = "home" + } +end --- Current screen name -local current_screen = "home" +-- Local references for convenience +local history = _G.nav_state.history +local function get_current() return _G.nav_state.current_screen end +local function set_current(s) _G.nav_state.current_screen = s end -- Navigate to a screen by name function navigateTo(screen_name) + print("navigateTo called with: " .. tostring(screen_name)) local path = screens[screen_name] if path then -- Push current screen to history before navigating - table.insert(history, current_screen) - current_screen = screen_name + table.insert(history, get_current()) + set_current(screen_name) -- Load the new screen using C++ function local success = loadScreen(path) if success then - print("Navigated to: " .. screen_name) + print("Navigated to: " .. screen_name .. " (history depth: " .. #history .. ")") else -- Restore previous state on failure - current_screen = table.remove(history) + set_current(table.remove(history)) print("Failed to navigate to: " .. screen_name) end return success @@ -44,11 +53,12 @@ end -- Go back to previous screen function goBack() + print("goBack called (history depth: " .. #history .. ")") if #history > 0 then local previous = table.remove(history) local path = screens[previous] if path then - current_screen = previous + set_current(previous) loadScreen(path) print("Back to: " .. previous) return true @@ -61,15 +71,18 @@ end -- Go to home screen (clear history) function goHome() - history = {} - current_screen = "home" + -- Clear the history table + for i = #history, 1, -1 do + history[i] = nil + end + set_current("home") loadScreen(screens.home) print("Navigated to home") end -- Get current screen name function getCurrentScreen() - return current_screen + return get_current() end -- Check if we can go back @@ -79,7 +92,9 @@ end -- Clear navigation history function clearHistory() - history = {} + for i = #history, 1, -1 do + history[i] = nil + end end -- Get history depth @@ -87,4 +102,4 @@ function getHistoryDepth() return #history end -print("Navigation system initialized") +print("Navigation system initialized (current: " .. get_current() .. ", history: " .. #history .. ")") diff --git a/assets/html.rcss b/assets/ui/html.rcss similarity index 100% rename from assets/html.rcss rename to assets/ui/html.rcss diff --git a/main.cpp b/main.cpp index 523b44a..eab380a 100644 --- a/main.cpp +++ b/main.cpp @@ -29,6 +29,86 @@ struct AppState { std::filesystem::path assets_path; } g_app; +// Custom system interface to enable logging +class LoggingSystemInterface : public Rml::SystemInterface { +public: + LoggingSystemInterface(Rml::SystemInterface* backend) : backend_(backend) {} + + double GetElapsedTime() override { return backend_->GetElapsedTime(); } + + bool LogMessage(Rml::Log::Type type, const Rml::String& message) override { + const char* type_str = ""; + switch (type) { + case Rml::Log::LT_ERROR: type_str = "ERROR"; break; + case Rml::Log::LT_WARNING: type_str = "WARNING"; break; + case Rml::Log::LT_INFO: type_str = "INFO"; break; + case Rml::Log::LT_DEBUG: type_str = "DEBUG"; break; + default: type_str = "LOG"; break; + } + std::println("[RmlUi {}] {}", type_str, message); + return true; + } + + // Forward JoinPath to fix Windows path issues + void JoinPath(Rml::String& translated_path, const Rml::String& document_path, const Rml::String& path) override { + // Fix paths where colon was converted to pipe (D| -> D:) + std::string fixed_path = path; + if (fixed_path.length() >= 2 && fixed_path[1] == '|') { + fixed_path[1] = ':'; + } + + std::string fixed_doc = document_path; + if (fixed_doc.length() >= 2 && fixed_doc[1] == '|') { + fixed_doc[1] = ':'; + } + + // Use std::filesystem to join paths properly and normalize (resolve ..) + std::filesystem::path doc_dir = std::filesystem::path(fixed_doc).parent_path(); + std::filesystem::path result = (doc_dir / fixed_path).lexically_normal(); + translated_path = result.generic_string(); + std::println("JoinPath: {} + {} -> {}", fixed_doc, fixed_path, translated_path); + } + +private: + Rml::SystemInterface* backend_; +}; + +static LoggingSystemInterface* g_logging_interface = nullptr; + +// Custom file interface to fix Windows path issues (D| -> D:) +class WindowsFileInterface : public Rml::FileInterface { +public: + Rml::FileHandle Open(const Rml::String& path) override { + // Fix paths where colon was converted to pipe (D| -> D:) + std::string fixed_path = path; + if (fixed_path.length() >= 2 && fixed_path[1] == '|') { + fixed_path[1] = ':'; + } + std::println("FileInterface::Open: {} -> {}", path, fixed_path); + + FILE* fp = fopen(fixed_path.c_str(), "rb"); + return reinterpret_cast(fp); + } + + void Close(Rml::FileHandle file) override { + fclose(reinterpret_cast(file)); + } + + size_t Read(void* buffer, size_t size, Rml::FileHandle file) override { + return fread(buffer, 1, size, reinterpret_cast(file)); + } + + bool Seek(Rml::FileHandle file, long offset, int origin) override { + return fseek(reinterpret_cast(file), offset, origin) == 0; + } + + size_t Tell(Rml::FileHandle file) override { + return ftell(reinterpret_cast(file)); + } +}; + +static WindowsFileInterface* g_file_interface = nullptr; + void load_fonts(const std::filesystem::path& dir) { for (const auto& file : std::filesystem::directory_iterator(dir)) @@ -44,13 +124,15 @@ void load_fonts(const std::filesystem::path& dir) // Path is relative to assets folder int lua_loadScreen(lua_State* L) { + std::println("lua_loadScreen called!"); const char* path = luaL_checkstring(L, 1); + std::println("Loading: {}", path); std::filesystem::path full_path = g_app.assets_path / path; if (!std::filesystem::exists(full_path)) { - std::println("Screen not found: {}", full_path.string()); + std::println("Screen not found: {}", full_path.generic_string()); lua_pushboolean(L, false); return 1; } @@ -62,8 +144,10 @@ int lua_loadScreen(lua_State* L) g_app.document = nullptr; } - // Load new document - g_app.document = g_app.context->LoadDocument(full_path.string()); + // Load new document with absolute path + std::string full_path_str = full_path.generic_string(); + std::println("Full path: {}", full_path_str); + g_app.document = g_app.context->LoadDocument(full_path_str); if (g_app.document) { g_app.document->Show(); @@ -233,10 +317,15 @@ int main(const int argc, const char* argv[]) return EXIT_FAILURE; } - Rml::SetSystemInterface(Backend::GetSystemInterface()); + // Use custom interfaces + g_logging_interface = new LoggingSystemInterface(Backend::GetSystemInterface()); + g_file_interface = new WindowsFileInterface(); + Rml::SetSystemInterface(g_logging_interface); + Rml::SetFileInterface(g_file_interface); Rml::SetRenderInterface(Backend::GetRenderInterface()); Rml::Initialise(); Rml::Lua::Initialise(); + std::println("RmlUi and Lua initialized"); g_app.context = Rml::CreateContext("main", Rml::Vector2i(window_width, window_height)); if (!g_app.context) @@ -249,31 +338,46 @@ int main(const int argc, const char* argv[]) // Register custom Lua functions registerLuaFunctions(); - // Find the assets folder by checking for fonts + // Find the assets folder by checking for fonts/ subdirectory g_app.assets_path = std::filesystem::absolute(file.parent_path()); - // Walk up the directory tree to find a folder containing .ttf fonts + // Walk up the directory tree to find a folder containing a fonts/ subdirectory with .ttf files + std::filesystem::path fonts_path; while (!g_app.assets_path.empty() && g_app.assets_path.has_parent_path()) { - bool has_fonts = false; - for (const auto& entry : std::filesystem::directory_iterator(g_app.assets_path)) + fonts_path = g_app.assets_path / "fonts"; + if (std::filesystem::exists(fonts_path) && std::filesystem::is_directory(fonts_path)) { - if (entry.path().extension() == ".ttf") + bool has_fonts = false; + for (const auto& entry : std::filesystem::directory_iterator(fonts_path)) { - has_fonts = true; - break; + if (entry.path().extension() == ".ttf") + { + has_fonts = true; + break; + } } + if (has_fonts) break; } - if (has_fonts) break; g_app.assets_path = g_app.assets_path.parent_path(); } - load_fonts(g_app.assets_path); + load_fonts(fonts_path); - g_app.document = g_app.context->LoadDocument(file.string()); + // Load document with absolute path + std::filesystem::path abs_file = std::filesystem::absolute(file); + std::string abs_file_str = abs_file.generic_string(); + std::println("Loading document: {}", abs_file_str); + std::println("Assets path: {}", g_app.assets_path.generic_string()); + g_app.document = g_app.context->LoadDocument(abs_file_str); if (g_app.document) { g_app.document->Show(); + std::println("Document loaded successfully"); + } + else + { + std::println("Failed to load document!"); } // Dump mode: render and capture screenshot @@ -350,7 +454,7 @@ int main(const int argc, const char* argv[]) g_app.context->UnloadDocument(g_app.document); g_app.context->Update(); std::this_thread::sleep_for(std::chrono::milliseconds(100)); - g_app.document = g_app.context->LoadDocument(file.string()); + g_app.document = g_app.context->LoadDocument(abs_file_str); if (g_app.document) { g_app.document->ReloadStyleSheet(); diff --git a/run.bat b/run.bat new file mode 100644 index 0000000..9993053 --- /dev/null +++ b/run.bat @@ -0,0 +1,6 @@ +@echo off +cd /d "%~dp0" +echo Current directory: %CD% +echo Running: build_lua\Debug\mosis-designer.exe assets\screens\home.rml +build_lua\Debug\mosis-designer.exe assets\screens\home.rml +pause