From 1cc537807d8492800b86b2c59b90f6d00fa51bf3 Mon Sep 17 00:00:00 2001 From: Aleksander Date: Wed, 13 May 2026 16:36:13 +0200 Subject: [PATCH] Welcome screen basics --- dash-frontend/assets/dashboard/splash.png | Bin 0 -> 22020 bytes dash-frontend/assets/dashboard/welcome.svg | 1 + dash-frontend/assets/gui/tab/welcome.xml | 22 +++ .../assets/gui/tab/welcome_page_0.xml | 13 ++ .../assets/gui/tab/welcome_page_1.xml | 5 + .../assets/gui/tab/welcome_page_2.xml | 5 + .../assets/gui/tab/welcome_page_3.xml | 5 + .../assets/gui/tab/welcome_page_4.xml | 7 + dash-frontend/assets/lang/en.json | 2 + dash-frontend/src/frontend.rs | 7 +- dash-frontend/src/tab/mod.rs | 2 + dash-frontend/src/tab/settings/mod.rs | 4 + .../src/tab/settings/tab_troubleshooting.rs | 7 + dash-frontend/src/tab/welcome.rs | 147 ++++++++++++++++++ 14 files changed, 226 insertions(+), 1 deletion(-) create mode 100644 dash-frontend/assets/dashboard/splash.png create mode 100644 dash-frontend/assets/dashboard/welcome.svg create mode 100644 dash-frontend/assets/gui/tab/welcome.xml create mode 100644 dash-frontend/assets/gui/tab/welcome_page_0.xml create mode 100644 dash-frontend/assets/gui/tab/welcome_page_1.xml create mode 100644 dash-frontend/assets/gui/tab/welcome_page_2.xml create mode 100644 dash-frontend/assets/gui/tab/welcome_page_3.xml create mode 100644 dash-frontend/assets/gui/tab/welcome_page_4.xml create mode 100644 dash-frontend/src/tab/welcome.rs diff --git a/dash-frontend/assets/dashboard/splash.png b/dash-frontend/assets/dashboard/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..15a9b38728fb4472bfaccde64e5b2d4b977bb759 GIT binary patch literal 22020 zcmZTvbx>SUug8lNhvF{97bs4l#hs#EbQhNbrMSB+PNBd;vEt6+P+)N=UZBv$-4}N) zkMGG}@6MUIH#w8vO)|;3nMrQ6mZlOuE;TL+3JSi8vb+uo3OWb{1r-Gw{h5xdFl=QsWKd9Q6Y(C*F`sF;mb#vT(iipT_4NO)qoe<2W&HO;`RG%5 z+f&BUe~AC#*pwf6Jw1749NA7f9X*w2Jn0`j*|Z(mEIrvojp{EwWkfC6j6Ow0 z9c4UkEj@X)9qC84=|4j~OO+qlv^_;V3qIpSEtNk#wPie`jXtC4XN*3-CnM@e-mBcJ z?LTT{Jg?`ir)M3Op2?{Hh>VUtJ#k_^IX)Xg;;y5qi-JPD#QbDa{zhN_8S3aMsx4FV zXCVp-BZ`W=jGp)WL3V)ix){*_@V&iOURN4YL4{x|kwcYCze2&4xM=?PsdoI0rKIH! zrk(wK^@A8|$kqHpai{c~jp*Cc4d!^of+1GyP!*K>_lIVo+2me%Wio)W|+fr$U#;;KihwutPv=#&3aURrvMT)MBr@)6K@98{jX zwS0}lZ#?CQOI?3cDht?AF+7jpXh8ca%xS)ZE`B1hc#1r$PIXq!+-{Ed}ww!FJif?y+hL^Jymdvi%l~FtM)>%}@ zP||enrg=V{A&xt1C)q}c%s~U3*Deq=7hY8BFanpuw4c_Cc>jY472W#7HV!>Fj?jmnjU#BIabL7kG*( z-W~1IhHtVI5+dU86ymJq_RKl+Fi6y5km3G=uPri)@;z&(Uyd^p|E$CHLV9GJF@ ze|vz5k_eD;E0%}vlJdholvE^}^ndjYf#Bq!$(X4Mz6dGU-{4^LWpgK6SHbOVklZSf z%&w#_4p;D|q|Ap1%so7Wg!tYSjGqcGtc#crk_v)XPwuQ*Sxt6L&5R8*tYdglRdMp_ z-d5=IJ2&B9iEe-D6RD{UneUxFCz?>y=(dqBMK!Oq%awl)212;Bite7NtR7pweqRK? zT@f2r_YrtxmhO?D2U0p#5HQ9ckw9&k=qhxvUhRydDe)Q^} ztY3i6vOZ4wacG?)s(Xk_YQCObbVFEeq0Oj8%!-MQ!rU@0823mpN9=-b`yMxQ4&#*IrxQJTWqahqZ2%@>AdZQUw+J zk*KhVX1g6zWN<`M6JQ8>d~!)`RL~fX6B9|oN6ccdYO+&jowsFV01Hr{7Kp(oaO*yZGyVg%8AvC zk?wpgHgMjX^BHRHqfEZP5tM3O%oni6&UFwv5I^rT_LYKND%YcG+rUsbj}uy?sxcxj z4;M0%+lKRje_&{e*aFWiC?|&uOv#|A?Y(n2;xJfl&d!y$TaFO{DX(Tq1} zRCDX{;w}pduE;r?8GC~q6T>kwvb8|I1{fJocVT@sURwp3%}(=cM1=R0`MgGg>JQe{ zPT98FJT&*=jC!J-k$-d$PHDoHx}&yQjxj=FZGvmJ%DXYeV^F#((HLl6O+(xqwUB1E zQSnMqMbeb!*Dr%g$|lqS{(9QV9PriEmT-D8RReWQIZ?GAliHweF}-zVqvBfi z>EM1dgZCNXvC6uc5?oDY;>**9iJ}8EPf3*~EQ;4pG!3pi?uC4&Dq(DG^LZ7quQT7e zuYqVN^>&I#aszzufg*hqL|in*)iO-Xi#O!9MT%w8y1_2?yI{taHnay&0_3mh!z zB7wixXbYkvsy({-;;b*uA;EfomJI=+_eTQWL&Nbz%~z8NRVG~_IxobM!aRRKp$D6O zB{gimf6^^&bOfjvxBsG{${Sd~P-o1|X|~M*G-7B>hBo+mGGH91{rE7ZhOarS_+_Dn zu+Ta_D(YAK^z?O0=SMdW^}4?qZ^b414*S=6U_dejijj>)9%q9Ruz1?e9&aS|WxN{+ zzvL5c8=CwUc$ykBTU%PqivUsL7Eis;YbcGhOvuPtn(9sm5niK}ogooY`cfJbV5NmRJSeU3qWag^$E z-><%h>*e$Z8*%kZ4AB`O>ZzmxLZiqFwd~K`Jyux7d$^>EK<}x(;7asP-OBo|T15Q0 z8Mwo9SNQ!t=8?iS<`DFgR3+;d!Wp^KR!Ie@2K8_{wU6PUmH1fHq|ThjkJ2fakQ1lN z^i^uZ9ip4ho!0l*3iW=Tqt)MiS6F$!XbF#tMla{Z>u=Erxl@De4^ZjJ-_8lYe^U#Z z#dZD+yQ<2f*l&J&?<%qTt)_l7&o+Z__?NFUaqm>SYR5Cg>|CSw%DR?3FX_<4Tc}_@(XhHy5!AN?dsR;A_nh zah>WIha|1_h7}@D5gBGK4URM{139&W*imJo!oVt8c8PG6nugTsH+6t8%Fvk&FcICp z2Vub3*5%sw#m;0u@*ARkj-`sP?!=&1a$|?HDvTv@{x3~ls*g7D>q;Ng0vbUmcmxG^ z4?o;$!aQhf{M<{Ir-{5)5sC_ zuCoD)Iohf>2eCxGcZyzESd-?3h=$Wfd>A2smg`yv>toq$jos>HM>oG7ds=Zhgynd! z!{FL{R)F-C_|R;gQ-CiN@cp)RKx(95X!p%obJ9acka2?ROwbhKc8`Y=PX&Z?2uju^@J-6Z&F)0lF)$T%@|4cHb23ob9_>PsAqf&Z97X!fnu?F6QQny;$O84nzWA>^l z?d;|fF-N+%AYwBE`L{x+zE8domH?{LW($c$XXg8+cfcS_aCg=t>&g%!JfJFbZ|K8M zvf5Lw7D^cKH9yAj)Y0YremB!`A#+!7O*$`?87ymT)pfhus2+wc%Krrriqz5_SVE3b zxLJVlBK7o&K!CgQzpP{ifcC~|%sbPfG!?_go3h3%x%OHp*X{|FA7eDCfj`Dh* zF7e|Bem#;~Us{zv9a#i-g@1+!iUos8=jyo5abZpuS2H!vOSyOa(OMf`mY0t#y|?5~ z7L~NkIGTZNq9{$Rt44`rpa_Lo%RE(@rvUY%{`+7rNxSTPRc325x<4anVV7Oj!{;9% zDW|ZK60M(z1@80i_N3n6}<2YiSVJdoF{)Cl9#h7s9b9DLPl5mb91F>=Z zBs~nDKOTL^g}WU((b(pHVO(hav5W}S_QBT|d@y&yP(kTcSpEC+;_0apxcQY#C7yMe zwo!&{C)A?ei9|}mmOx1kcUC)LC&PE|r@yVZx`tRaS}k|1sCT%x)5)FAnTNGfdkuI> zNl)hX?$4SqA;)0UY3wg&tpqFqVSPZ+&eyH8#8J9sb@&}NDQ>YQ#nQZ|a_v5{^>Kdh zq{#blx288Jv}{l*+?&`FnH?n2{;GOKM=$}{1PbB+C((|It}A4lyL`Bn$VQ&;vFv>! zS4VYRz#(2BEaCxKmqdhNUBvj~w0pL3v4R+g1b+k_G9*xVjwpvF%?m)*P6Y8{3!Yrs zaf`wI1w=4HAPkts{I3LW_G3l2;%0>veg_aPwXaIi;qT|G{UYf8fFB$r?dC0tcO|uj zMM6phVCf{088Jsa{>S!}{2CMUprPzt!&UOOhsnn%DZPHR{!00Izh+)D*T9yDom4OS z{fO3v%(hQC2pmyYNp-0_PTEs6y$(J55R?LXQO0R_}&78%8z3%0hbJ! zQ$dbSp-bi>#CC_-(pe_w2?_BpnEuRpu&UbMv|kr5t96nEa>kq0Kqt)JA-?+6emn)z zPFDz;$X0zeb3OjfHeS%iyMG_y247~|9k9{6*mYnC1fG5kRttKQyY3%bxgUIm`k98ZFnV(M+*ic+ z0;Z4{kyYpGGAbeq-!D7KkE+F0NB#iX-h9M0nvdjS`%M6wngSMp7(vqBYnq2J(U+Im zhPLOkk9==>9K;g`5`5Awh|@AE{ctY1!u^R)B{Yga7j$BM$J|z!FCCJ~^=zZ4T43T}9D6?DIetHx7+yrLT;ehlUDflw%`;LE>G^L6n6Fto#vjB|RY z3ur1R&;yzgq0O^JUgIEXlEMzb0IZlTt9`IQj%($5H2E}5zxw>D-g+@)(0kTQ=!5P; z#`hCp(UI*Wz%eoTyLK(V^tc(&cX1v@=t_DyV&we%eC_e#d@JI}IdDx<;6-J(-M4Az z<9l?-6g=-Y*4L%HN)X6f9DI5Q7~0(P0;Xj$6Mjgcm{&Hje!trF&==Ly$`7C(dXmiL zeTA|APax|jkRX$aQ01f-FBR6k&_$~aAcDPS2D5v^->Llyv1Aw6X0xq9iDbKw6M$5L z5l(Fvm@TPH(|8)mBouRRz5+y@#S&jo6Qm>s%m;UYEZO59gpMffA?sI(!KWkJ&;du^ z^@t^%7ssv`08=<4^z~4Cv@e`Kr|kvt8&t!ucd>TsP<>lJh$=A*cWLm93rR88i#=+- zMLOEXt%?|m3rhN?qc}Iam}V&Ws}m~io`T)|h2F58|L3Ql~}!F68~a+wV!S0VoBfdnd2T5Hq~_OdG{c2^mcZjLT!bhS zses>|u6ri&WBKKqEM7VUthtH#ZmR8{ruOz#Y!bk}(tiHwed~0xwM}4J?hWbW6kI9^ zK5{3@e2jIy=hl7lyysI)bd;`3kKBl+F!Hx%_jWlAbqquMc+LqI@unNZ0W>nBQ~7z6 z^%^`4cxA&tw_HW3fF(MSph08b$I(3FmAny3TEFau*^*#vgX?k?jcUs<K|gqymuR$bFCGNr{FpoWTO*ZbC5>o?R&@RlUt`))c7}!MKkW z%UbDj;LDzcx0aCmm08$q>#$l?u{Aq(T*jma?ZV2@{lBH7xreEB&#ekj#+EbfCxASh z`j*)rp1Iy%L-JyxNaimimh@!VeT_Ip96$pukytvoA=>mwP9zcq>tn_ZjAq5|Lj?EMpy)~$%r{_4t`JdrT}!lDs~jv#e`G`2RMd0C%h zQXa^kpeaSs{XU!{xf-U(b;5Mi$Rv{dr**tel$izf=P)*oNIK06nZ^?qVu|GZ1vr_d z9tzL^`*Yp)psEeB!h0%Q^2GJNS23E~B0XZsC%>;g-#8JL4F z%YcUZ=E-stUX)|BIlhe-k@ivI`!?RZ=<8eQV@e|H9;9yR@i4!}eN6wPb>y@@pwPLw zJC<4R&$ob54Qyj$2g=Fn{?-v-k#yf;4$m@2QC0NK_qrh0*$o2Hg|?Mh534==unFN1 zUvUD=_ZGREM>gJD1W3?+9fecOx)V*SuZQKk7z##@>P%9CGsDi5Np#kO8J&*rXULwL zeK4AwNG$o9qTyj^8MIOIVCBi?{fq67@Y|3pl#KWA#k$+YPbksOu67kQoU4~8WlZlh zG0Wilx*As>L4zN5>#J`tAF=7$Ur+F1QQTu^(TxXuBxZHITvF}+5%4c`p8|Pym||uv zsZEwFUk$=HfW1JXqOrA&I__5OCeQT+l+|eNHX04(;MM_*5?;eakNBG{phWtI^ zKYkJzFmE?+2R)VTZ>5acdb(`jf6q^2;e`{9lB(`E=Ivj~hu;1f89e<+8Yi;zJ-9K% zt44hGmS;4-*vcu{`$pw$zPacxOca*mz^W@#)IU7=Zz+Q>X+B4bJH`T@LwU)3(_+!L zb9k7B;1wvgf6$;ddS)cgnf~YXOVCk{x1saFKmmT^6_>p3@x7nvh_*t>*4}$HzNs}- zEtkG=E95Lbks`N1peIpSN^gD}l=%v;DW*!%SFGvGQ5(%578pE_*Lh``xoCe;>>zj2 zwOm}!`g_~4(x4;jF=0RAIMW6>zR|X@MsA!2>Z6s8djBu43U1eM+Q9T>rZJA(lzV&Z z!*7pX;8-~FC1JEcABI)t8>qk-dy@<^icOLW&+ZvQ)Q5CChdx2|Q(~y73}U(Ss?H5E zxvH@Ahu3Ng|Gsj~qD(r6d~72raz$l&L^|^~?^5AwP*V{F4367W_<;RI7%(sJr1z%- zln?fJRA1?%K6?|pfi$9&y&5tMRUf3ag8> zW<=FE(u@93g?syz!*IX@U($;QC3;|nJiHQu#`rGl;mFf_&iSsQ6#5k~@1;DAEUTsh z{oWr!WlCaVLH0HCw%R(k8g7;`e~h3DOpY{dGo=rFZ2t9-m&Mf6=6S0o0=Y+Ngr-W; z;#^ud2cG9aG+Uv89XCtUBO)0ijuiQiCoxsVEu5fD|3XJ8)hiLXOaGtZA|wP7#QIl9&9nEjL^Jg@1gOmCRoIK7;;a4IlN?-{)_D%1{0UjG;@e6`-_ zj;zd8gikm(gFA?tvzLefNHe)o1kEHL8X|L=3Nu{gtbgc}p(JwH<2UGl6&DNZH1JKO zxzHP*B-;EWsX~AA@Wz5dReRm@WcQ1vMg$iMXyBelsleWJeFy*4+{x`e=rMfX8X=l% ze2oI3XOXx<*P2oLv@n~sS_XSf1=tIgRYg^Mw??=&qcu}g%$?ptL0)sbjq{7!{hA)r z%s?5OnyM_OT6Q6El)&^C&a=37^H(P-vH3L8;P>)wdxrGmcV&2GB$|9vcjO9@BQ(uY z+pkvl2+6j`T%)JK;^kw=a$2e<*t6iP=$$i4`$NE$~KWnw`54weyzr z+M7}S4~pb1S3S*fF)BRVSZJzZB3`p0C7vTjx1 z;r&M3JWwP?A$yoLGoiCxE_MCGNwW?h(^0ziDKPs~*7EOZNm-e%4ExjjSQsR~0DO=g zO8J(MebCqHEPMz7H;M^SYX?^F8+K`O*GJ`yVSgUHQ`}{S?a%u5(FM5RbKef_%@cRX zu3GOBxPALrIQ@%8LRvi$3jS6G^$~fOYv?Cz+dgp!dC4xN)4tqSjtHCfP%gN|;x`KI zUYJ0|kWzJQoNqL5EhAyHA(Ewbds+Fr%zlgXnE2E{S9G4zGY9n;rONKs!!k^gbDS@6?e1ukkoX?*1JqJn7Ns0v@ojSzv|&qWNoUbe6Yd zn)#1!^4;RAhWpZpBB?ECE%(i6w{g3dzvGLvEj}PIA+x?kM>2W-G*AP&n_GNBoJFfFY$J&6si z@uJXy8Q>-l)h55PAy&*TgRC1-DMQZSdN&`ti|nd5Q)dJT`JHy*)d2-vC_h3H+|2jJ z_xOB2^fIlSf( ztF!aT8@@}Q$7=9U)X~(`6tb=VUMSok>H5KO9d@p_J#zear|xgRz23p=MSN>tI8ZoA z#RkcE%z7+=y#ap&<|k^s*epokZ^(Y^Y_a0EpNx#LwhQ%rj&#A!NnuaamXni) z?dmFm+73UDyvJezT%zVmp<{6yV<_I@A)U3nEPvyuW0^5yv|;V4$uN893 zZ8$fLu{4;|FjdGb&~+xm`9ZP0v)(s6-qzlx?<+(;$26o!x1)N=Nu?24JgBe72=7rgEQ%99~; zl6R<^Oi#0CmfQ{b?xL)P)e>mu7-l?A5ho(l%&f*}-v2iXKzJR~Ie*Y^?(sD@SrT$& z$8^3bFHYGZqx9^$Q@Ty!m8UzuTA(+_doXVn$CZ&f%bXfhMHMl50OuEdBj%4O4Sl_u z3)IHA0PN?z8K?0w;VCF>$^uIv}sk{C(eYhEo+kLpA~u%|3Nahd5o87wUskv4&BCJnDcr zvv_7BT(TIa6m>EY8RuLN>$s=tkMZcbp)pN7wk%YBw=;PFxi`lmq81H#mZ;0_ME8Nb zei2w#ny;jS7JrLwJClLqnm^NDp`oCc)u^JW*{0%kgBDboN7aK3*`+Rajd5&3VWK8C zmt4DQF>*O5l7G+$v}ubh0Nth^pqAfbZpTNetf-F#w~owtG!?Vf*My_ZSLUuQU=!`P z%Skq^4T9s}!JjrJN*7wlI|gHsa>}64R$P{=a6_P1l6 zPI;EtR4Zsdgt{3V&O024Q3nRA|2B%TjaFw*}1@$ZBFFZXm@oycRL?ZnF%}j z$5N-W5S!0O7!zS0=kM&^l#~6Bkl5g__7JMLrS*n2is;_c*%9Oz!1t-9I_HnVYMMv< zz08&0l4Cgek6{E>Mgdxq{ue#PBZmsDfejdM0LmrYh*_G3jkYG*@RlZszyEw}yR*~k zOfCIfu=@dH@iweMWcNwK*2%r1*PcUe<3QiVFA0e)K)ype-a+Gc+kSfmbN@HN09sS) z6Y~1-QYrZR*u0huG=$%Pn#~A$toen!sPqt%jW+c{ge=iX&7gKoNX!5g{)1mX_$D+J zQtmF-9Ap~oWp^8y0#CqMn<*mbr82hFP%0FmO~2lE7)=}m(K`or6&3FA2M@WU+q|*%gIuJL;|) zd)glQZF&d1Erxb{>EhfQhPf4R}18ayIk5h!|$3( z#0kD`JrE+%mqO7JsVM(R?#0ss1A_Jre)~7o)&PlL$NQP&of)Ve8o^5!O#GJ%yJf%C zoz7x3@5qwR>THB8DzzJAO=DS zwZHqj1^;`e)k+f~15WN!|FC?vGp1;x{T|i>APazh4r~~e`?!cV1)^|rVzmL-0*7gJ zL93L)>HXB*VRvx$IZ-QEb>5$EmDk+t454t`dJ06ONWjv5=wj^M6}{2FJIJ^s23k^Z zv~K!tm5>EMOlr6%ZCId}n3fC0LF8r%|0~$WG_~DRZe}8}4|GJnQEIhG(wOK$=SBbf zkvEPODbX}$AZT4O&5NKmipAU6(D z1jcAH6uFtPmF5Eb&jHSqZlE~K7CXnXGmZgMp*;VO1Bw<`Jt0;R%YtO~iB-OTzj|f; zQufvu2!|pmT0cKkZxiNXz^<;tLV?{xo~8d5J5=*RRH(gEmNq1DgA}Nw_ml2Z;f&lBvdw^2~zt-0DrhEu2EW5Tl^#q(9gZd zAtU#X-6QfAhu@~v5~r??h@QTDE6;>|C4qC4jIyz6ae}LH?zl{^X2WrIiy}$yOTIci~?@h_~$D71+yeSS>SP2FP5szGA(bf0f*B zw8UAYzmDX{Z!Q-NG;;;>H1g~rOBt`+iF#{u6|Df*%m#};Qwe7x`Em>{UgPkz%L0#Y z8NKl*&Na{{Ry;sT_*JHdDbx53)t$6p8z%p{i5r2w?l{- zK-K6hEP#2_qk_sWz+bG!dTrDUM)wO*twYC!HPG}OZZrn|UG=JF%C1^|t0UM8d%u9d z)%!TTmSWv8J@K??30AYO0n#KIEg*e2Tgo?($#CMjx0bp#ht$K)P-dz9jusa!*N9ga z)=BBdd6qnu>W{ImdF=7^C=ym%Cse#(@Srdz7cTzP+aQwSGFZ4q{1y1DwFDVGFZrT_ z^x^4tsdW6U4NCjR)6TCPZ+U!?As<2!803B~&Ks;J`noksWg>+Km!dTloALD&>506I zAA^Tx^Cd9}-W^bOOzO9vhQ1-h3^467as2Fz9h|LX1^e3F5p`D*`xb}2Li)$S{J-xT z<6~VkJdslx6FR2vUPd53xqD|1YIA?7efQ<+ZsK6Z;Grl-+xs+Ie%p#hK&o5^+p@l( zdOO82woMhYTBk9nY!}&_ju-p`Fa-7!p5FGZnTvhsoIW7`>b?B$Z&$R?@%45$-|`+V z>}Oi-3PO+u7dC;(J)Fug3OZd*umI%af1ox`>16ej;TP|z+5V?|s^4P-W+EaF3K<}4 zbDHZ073oXDRQ)n*d~W826xSjJMF~E5&J0M4`+4x8DVe-}d`+?~IH(?fNnbG2Ksd7&5^3_S zMU_;{@__ACRwj2$b$;qCt~$XGXtYRlP^}hG?`VouFM6YOz)+e8Q9SAAE=X^5`KZCw z&Li+_BYv096DbarMaxgS#sem6w+pZIEf*L)4gj`1&LB+znk@6nxh|*bL-AQUQfCZ& zusT^km^pz^pr@K*| zJ&({hqWhhGUEV8w>629Q{#RMLIOe*$RIHTC(%sC@NwZ|zXvSLQ?P0=5;KRR9M1I-I zHy-ydCMecmiOrFZELu4h0+jawu7v_WIkM$`t}Lc^X%BIt7S*oF{4yHA@ZIymwl4kk z+3v2jp!hTPu~uFz%Yiq_X1{tr@#+>%KLXu-!v9C|@b;fqEp<1JP6$lKk;6k{`tj%p zgkT2uJ6cf1EQ1o&`9sUnKeiW;SsG$UIJ^?dve;jvz|iP6h&oWbgyIaUrO2H6n1LLl zs!o>;NB{it`fC*&;|R;uE(N=zYdRi%i?<^gI~jp}vS0Y)A7?4{{ZGljk&n0T%uVzf z#pn8^w9JW?$&R&pfOn?V^@b8M2wrRp)7$P7*T;u{_W2`0RIM?(+PYVFkR_Z3$_Qe2 zxbS#x+zX5E@N^Gv=v5x}&uLo%4pK8$vH*MhckNt9$*Jct9m*#jPqAf-H${^ki|A;7 zNYSoX`aw&3YnQ<=)0g4_4N)U?lbXbc*-0^OtD!HPn{lc$@;eXf5Dg3q9y&sD$a@S_PBvQ zHp>~=KO4$*CSq;Dztv5G0mc06HLrYl#o^NA@D8(^NJ>N#kOVz0L@F2JtDWH&CB7$D z$s@62>DTKO3Md%pbtB^pF6vqI-iQWD@WAIkW3k}wcu-b|uK1hIpzX<<$hY@f&|@TF^ZS*y)Uml;4?i_mVuUMXcjX%NVH11v_3ltRMo^ zI4(y|9l5VpG&g~7KGvz?QB-EI_hXeDpBa{x*=>jIt42G`hW))oZWw8l>P6(!Xq}R6 zdi(F}Q#4@yGGd&mS%kG+)q^|>)DNs^CwQpEc%G61h)c!b%fGzVF_`EHp;t=azOqZX zAw7pt_n?4}nOsDrLGhaUxX1iD@!INUV)Ix|w;{VT4+P%z^t(uRboC{sEe~{m4=50C z`Vq1MfTit<@#i7f4Q)-#-otdjDw6QRK{0rTr@`Ox{>?8A3kaA7#Jjfs; zSS2vx(|%-RY{sEs^{1e#ip(^BL0)VAp8<)7-wP7W=781MdUk!DW>@ zWPJ}}eIU8p%X#Gij|Deu8@;HlBJ(}<(&N5}`@w6h6ey{GSUa^a+`A>def#m>q9$MdE-A zUx<4?{(3AT&BGgC7N&UpcQ0>j{94;K;3pl{_=V;X&!)A{UmFzP#=C#S{4G!@fDsxW)qOJ?IC_SxU}X3lx@bU zsED1jUavp-F#61_1oH)mc5ArC5&Sdfw~xx;qu(%cCpvQ4)Q2|2bFbViyI1E3fBe8V zsFnt&gwM*YSA;`D+N-@8AoV2ayK;pnVcWO4?^JfoON}9n)i;e{UZtBwlWO|#{N}Yy zVdS)^8{16{XHMO3KRGZswhJ$<3K7TmwaVuA{K7l@IOF0<$ zxs9doAZ#8nZb&Y;B!-YEj~%Qyp~pP$7DiUT3M)Hx7w(|Vf3$U;s2_1(^^e<*RN073 zhF0?_z}8%0`%0VnneQ)7CdL`V+RR)uFv?9e32zoF9Mi|2+bb>2cGl%^uBJRDKjz1R z?){8Uc_Bfyl`o&$chEW!K|EidO5!BK&nz1Ynj_z)fgH_!%$>6Mrgv5-W>#?1n>)eO4IoyflRf)!AbR9aB7FMQ?0MZ4 z8(SkAjk%l!W6XeD7j&+COAZ~rNrn=I{~`r=d)M3KAX;-Z`YyazMm{bmAk8&tZ7cU1W!OX{B5rBC&diBA?q@PGN<4&q;pI?9AddE=6}w z^J8hw&DN9O{^I5i_9uPI-}uy@wXaBD#1dRr*OxNToG;#5tebFbv`VeFMl)di+r)z5 z1_hu8O`P$76pU8*56Edb}?@@mQpsfm7dH8q#^452Zn~E;V+1O36O@l&&o2 zRnwxiPiG7xC)W%K3E1GJtstxvM9{7)d%f9FjDvJ%{Ac9vgK_kreKDwmmD`T9uQlv* zl#H*8|IG#KUjH4zx1IrU6W`oBEBRW#*l@@$V>xFB{>H4Hhv5aCg}YtdXrAY`+7uq< zK;Tkz`-$ck_N`u*ET$ZvsfSU`>!KGyi2i-hm&2TI9%a?9dHhq?Eo#lZe4>S`R-HKl zvQywpFK+h_wLKz}a(vcDz0O58leSW>XqHLg9mk(Ih;Ogi0mZQJsn`ezj|2~4+7>r+ss}^f43&~%4S4H@XVw46DRx$NIrLwTe^kzibZ`C1S z`Jb`Z7DqfHDL)YeS-o-YPA3T_iB!5N_^DEA7Rh2vfbjUEXA&kD1(fvDzlj3%4fpE z73YmLofK$0(p#8x+HE^@q|n{@=OH%3Zu!5?R<|Ke@#K?C6KXtYq~CUcb!b>zc-D7C zp}krRwwBYcE=d#`$MMUbo!a?EBJPVco?pzx7|RRnBUJ~#;^cXL+I$~TC-;rUMR z4SyQ`7aLF`8k2L!+>6S8y?&ECzE)s#+|>bdw~5d*7m%uPoOlD+>!*I{vyxX`tqsZs zv^~mQQ&EMsC;Zmm(V{J}O4M);;MKR(W6H*#7w#mHexcd7j2kPBa38o~+w&0N_E)&; zi|3%*yTt#yX4*>4EGF+SqXy&hmvPEafLN1wN?)9A8=f=mP?SJt%{iwpl`{*^^k=>8 z>t|m=_3BtS8;-veBATth)yHoaVeJXC4ch;PvEf9fZ^hJOr0+t*z$qYsB4{54DfO?v z1n<-}IyT=5+;w_@gyA;us8V4z;h) zNaNw5Ajv_v=O^~ye1zq!A|S~>q}^Z*`Ms6E_!C{Rc2)V?;Sp6ZUUOKB&3Lcr2r??k z{LFu}VKLV0Gno=SeQ4MC7Tr=!cPuZBU?A;jri z)%5v`rQ|!eEEJN_wYb{RA92Qf!E6dS8wGaH^jEJ>%_KCVA8Ba+q_}W8*ez4-uTkmDd?v?SEe}ICGI|9RYZOt)!99J(9^CvU)>{ig7rJ=| z@QafjJQL^Y#op`#DU5F{&=GD1VeeBq&RQbGFNpbCg&qa&0Z>@T>h4S_&j1po8+7Cg z8o4)hby$xB=%j*v@I}C6OQ3pWK=LQHr;AIEj<5dRBsPT<(`jDj2K6|=7=xe7bxiqk zOf}<9G}?FEFj=)bQ$@cCw3@#uF_s@!eFQ8|>y$c)P>g$9yfe`g@hs zI5m7ZA53n$VJ)(ZvLW2io)81-S?JpRdK$Y0%EWEQO#rz0cK@|5r1*X=&=39Fdm40A z9VzOPg~PHFCO-^1*J*qmPSpCT0>wBaP46|vucs$t=k4CBSrz5^qpdm}v;|(G1J=uL zw%ZxCJ0Ey**JTf*ZqFjyi9i8$`5z_f+R@Deg=-NF_;|2&zyL+z1s|JVYL@RH^{W*C>-k!_((>BwA zs2%{3wih3+*ubV%@n%Qf5Qe}TLZi~weRTa6Ck)#006ES6KdZo|{!+R_Fpt+>_J6c8 zA<#|=(_OR`hfC#EqZwU-|0sbvTk%jK|7ETPTJZUYlfie|1d>mD#^8fWsoI4A?~r41 z{Ra;pF)0&zz7hzjBjHTY3{8nzMB6-?Xo9(c`RUoodvF*#mphKZr8!JL9?tHqu|PD1 zmFG|p0Kl4!_2?SBpFi((3ww=)BIz+&(Qf;e-T@iwn}E3U{>1ag3m~ws*F91P%_MEi zUKMtd>r(rm%$Woy=+_AzVX1w@dX)n+c)9D~yc!{B0da|X?p87W4nTb;Zc@aljEG3B z1wh*vN3;}wzKZ2D?C@RvSv#MY%xXN*r->&ere~Oti!?W{7M~?D$A*ofe%71TUb}$pAG4~0ddf$ zjTEtr0p{fWYjt^qM@!#pYv)9ax-fu}tYO8QR~tq!*YnMyFSHr(&jEEWA0y=B&-E=~ zL)YJ%x@Rjk<8HUi4QWlzd?%v>)s#45WZN%0+N~= z@gebZqM3D&yaoLc`PvXN4zy-{Rq1qdaLLR@;L9AOU6VmqW4z;9Fu>y&2`$4lwuA}S zBVK6qR+!+M*#>@oeRUVH5T&!JlwOs1fVsX_jInX@e)u880<1=b?pNkUnIDH3KGGwg zD1PaP-Zgtog130`yU_}Ugv=pJ%wYQ2@PWGF7}dk1!p<3tJJ#J!+0wTohEWRFJt@tb zx^FV&e5!hQqLi=!BKRuvC~YTZmLuDHCs0s7^zwGS;9%yz0&5kN>L6|0^dcNSe^FxM zXM8VL+Ssu;zq0%_9(d(;q0KZJxKNM!(vRMb+hkPe>SQ8I9=IFhf+3# z55@zpxv4D&11=vFUGv~8{iQ+wuS+N<5x`4U3;V=fg&Gk=nvW1(7*z&k!=#VNZ2$li zuSrBfRIpdE^d5zVnW?R}w88oq|R2;d_I+c3^PQ+e5iS9K_Agz!S*Li#FL zmp}N}LQt6%I9^=$>x?RWH+z|CDZaYlu-BUa*AeM!jX6;@_PRDxmdrzx?B&M1fWAfq zugY$syLW6xS(wCWqC5jm(Ex&%Dv6Ue1CMuueV`3;b7p$*DLD#N0%P9vlcaHj7X5J!ty}rKtzE?AOot)qPc^1mN z53tqu%Xk)$&9Tlwq6Zl*)fol3VhfCpG>9 z(_S=u69+UvQK>%L^e((?dnuiGl+n>i6Vmg&u!XRCPaI&?6CX)beOg_p2>T5ND%!%n z7vyb#^99H{Af|i+(V?%sh%I9ou(FTub&XDq?8V06n^-rBe!N-sdUu8S1}rt<>+&po zFV{8%c>OV=<ax(`EyyE67_`I+wtI) z%wZ^I8L(uvLo`oQAc;)5yjuB3tiC{3xL1Uo0KDdW^w3#GXJFu!x}Zt9>1ucS-{K>q z_Qcf??akmM=5#W78@y5tuSJy80j55@6d4I{ee>DC>{T**!H+|OG`|#H*NaG`$JD4^ z>=oT-ueG}FH%{3FYvKQUR*?QvMVQ9xSJwg#Y(MM8*y15zCFkX!`leMxJ_K}zyfW${4WDn+Y z(cVl;KdGbqw6GVoO^%)mFS>ChxqAcoH-)2u>_T9$O^M`HETv`WOeo~7nSL`*aRhn~c3yM2A0j3VG zyh)Qoz9QREjBprOt?VTXODmf@0VM29nH?o?V2F}&Xf;9lt&P1Hl(v!T(B`-WP6125 zy&1z2@u|AlE6^tLyaq44MnSX)2KvjZqOk0R+6I}2?1fo$A$J)IaWC`@n!LQ}EV8G` zt0}6ia}Gf+G!s%-I27<|3m>;ChtD+OYr9(2xC_{8RPa*TAy8H;r!i88S6uhpQp9JJ zuwMg1&$Ju0vzLJvyF)WELUl-vHnOYq?iOBihot7vOdESKNoj}8iF@Uq5h>f7>Gs@% zZ}YvB{;&=&Y=T#A1rFk;JMaQyFRu=i1qy&ykYyQSH=TJzq}z-8!7J?rFZ5go3qPxG zK6@c~QO^9qu@0AoU4i~ZrbxlOFSHJ?pJ%V5DO+iz!#9>TKAO_&DTk}at<9Myo#XMh zfmhOxy>QsY(ITBMg4}A}zlgoEoVR$^&R%&Vd-=v8dXp7_aA<(=p{i%>xI?MKhVidt zFBC$f!E(936&zDW-wRwX8(J=0C+x*$ZwL?UOzH-#7!pyZNbOAx z=JLGntZ?4WUROI?`OO5CNu<9S_B!@74(0FPw`?44HL?tQJ+6Ly|KCXA73;r$LW2te zSwhEdf){!*IpxR(T64?w?V3S3R~BtGctPVNA2_nLd7ILon%T?fiHbxy6X42g8NV?G z)>IR`5+^{GYtX~apJp#+KO_r0N(MlWrGv=kRcri&EJ9fTE)F6C~Y>9abFO;{^1XD8r5;)qDB*|#7Ho*&a zfe}4l2-zTlFU>jbl`il#j4dBtRaZ=aakWF{raki8Ngn8kR-L^tsS7)ch?#Oefv5&A zyaB{@e7JEhh*Cg%Ik(piuRO*rF?Om4uh<+3z&F9Taxz@rbXXLevjI;O<{kU+P@9;t z^yV$|x*MA=`s!q_wFXx8I5K;!4ZuFI)`l$b_4xR>HN3Tz%Eph;!i(fBtW8G=6fjKj zB@VJCc;SF%5G7XVhc87Ye}Nlu;DxxvjzhD9Bdqb;5jEV*UTkwkMgg=ZP@Auk3)4)% zD|W?=JaXD=g_lrW8jVA7+8p-McY|TvFH+{oHbnMXGQPBV=u#J_NXgkL8=W=3Ip6ob z+SyC`UK(J}WFH#m>)4CEPCk1XU4FZ>IU8&ojtpLz4L4E7-6EKWPL7ZcHaCooiWPDi ze_Vx=1R(x6vd4}e{+!(rSuWv42z0Vpx|Rwba+*&z_d z)ocBE(lj&@`czKfg)ddZQ*oZTf|p@!28uG-<+B8ONosCMB03Ls(mHiy@uO04giw7M zUZo9Im^?ydQ{a_1P1|WtxxLyG)LUq-fZ2mDh;u2;hv`s}uWvQ>LUn^8%Ua&>*-LX* zX-YeAO`=Oz&U{P8{85+GdlFgm#Aob$k?(b9o>x7QL$lY4BVWv3kEG217*$SG5A=Px z0iB)k>n8Q8d5afAeW`hq9s4_8yDw@R{50Ce;lODd=!-e(;j*Yt`_kI{J$#+0l0z$d zy%|yC?db_&_AH$*Z5;l;z4LEv9M{6|(#gG({L#X$u_2UT95T39G7+hV#dOo}|Fy2p zPaWGyXBWDuXR4z_cG95(yFBxr^ZH2oAz&BPD|KuXEM9(LzWl!)|NZiH0}jPImL1@m zT>NdY270~Te7&IszSMsdxh;w^#N#$SSk}txV(n#Cq~PGg9ELaYLjdgRHlh(O^W2M5 zM5A8e`HvrM(R*3Fiqr)q;jusVITU|ysV*O6G$s(R`PHWmv1rNh4X5U-DLW>r{NjnZ!$0RL%r!JF(_r*Lf1JHl6qN24H_) z+lcK|e2qAvci5GoO6rx8!@vGf?WJ^0bHgQV1#qKStv6X|LSeq zo7i%Ccx+Air2?jHzWe#{L_`<^_WbTpXcEvIZXA}r_Bv>e4uw|f|q=8@8Qub{WAICBx=B{A9?}|5gYh) zb3Ar=65r!{7iSpX;vHp%l@wo?8dk}e*S^CP-{XMSwK$zl;Z$KqF9PFia$6srku@Mj`k$k$WF zm6sXx=_%)iIc{lgSouooCH~=YvM^=a>bd4U+w=VR3;H({F-i^V5nA6lITX+$Vn`Q? z7Xen`3#+hk`GtTXPgc&pB~=5kAmHGlNS8Ppg{+{I%VA;rY~=X$p0su zYHQW2mb1~Y5Tsyw&D5{hmV*SPTVVDs1ZJZ`DaCkZ4hQ24L)gU(%^^%OR z;Q7&mc;(zM$IZ+Q+jvOwC4C#h*p)L=dV|=|vpMfle#msyGr0KD!7$<#!6F4?^-_1k z0`@I&#vf1oLPtX@ugmJ?9}kCzY;5GXxqQj9uOn?Y-yTzQ)C{mOVl~-^gV^-WI*1qL zivjCiNxD?MC_Uu;qB_>E-D^q^CnB~JvUpUdz+1VodL5E_aq*QauN=3QuhhBGlX_{- z{Cr!{sXN~%dmcAEbm|}ubvL|T;S0zDxOSt&5Qf|Z&J8=WG{weg7YtZYxdI3mXNII+ z9^O{H4#i^@uN)sEU($PcJoc%zcl_YXZqR1Z!=83!li_&OwWNm~A;n;&L9TpKFIcRM z^_RNy2v46=!ut*eYZVWRR!0p{DqNBw%CluIz#>DOAy(6Ik~gJ=r!id~@_ZsW)oVtW6Z=po6Bp4%`BKEjs-@y(hO})UX`xIF9e6@fAOWK{ zjzFqap&Nf<>9V#w!R2{A93FBXca9s&mq`z6(XXgot=fm%N&Cj-4yihI&`WyQ)dE-7 z8M2ail@q?$MC>3*#97&*8QOebd8sABg-4v9_{hDHba|voE(cual}-5^H;+|vH^#m5 z?J=$T+RnXsb8t#8yKm6;^U%tngz@OCW~G?0g{fgE$?RZ@J}Forib98XJB2D4hR9b@ z6_zke5g5a7F0|!+R4CM+Esvjc~vhk zhICM@9I4_(y$VPUsq*s4)X3VEV*z~0amyrRwY3wsAZBg6(7cV8J*I+t z{HE>qKo-eXObU~1v2ZnstfXEgXNhi_8+KZOb){}HN+g9c*%<~f^fiDnP%kOF;(*LB zYgdj1iCz(@MwN=ot>kJ*>D2&L@S4?M!dAfN%&1@?saKg! zi7h!LWbr~%qw>XM9CDj{j)nLeHb1mX)m)JYPRx{ORJ@ueTy#%{Va=d*R=t|*-eE^i zzPgZ1dcrF30V<)a(m|Fuc_Us0Fy=|Wo^TuvFZa0>D#ud%LjzVnBCKJ#niGbCg_Rbf zMobZC!kW}xG&%M(9Oj4Re3abUD{6&+nKSlEuD=kj5~ZtDut>F@JVcbP+^dme34E>7 z^RIfE69QX(0*ptxX;{M=F0$yh5y(WylrSgiYIyvVJ_Hok|8!VKk8~`riN5r-IS_{dZ}>;vmX0Z zR%K-!4bQ0|`G)?fD8bCg(v@SGv1zS>QMpBlU~iR6WlNJpMXfV#d_$sDOQzVUa56f#sy?Ey+CP_3*pb8c($`m719w&HLs9m63IWNqy zxD0XAwqujSy6|I1V_t-@e$gbhMy*=bgvL}{X&_(0XqP_xVkt}NMVm>565Wi_i+V9x zo`vfrD_4%CDj3#awXM8*>Y8e3BPf+J!&j$87$e2cziQ1CsR0oh5#7Ym;MqJ@w#ro{ z1xxCMlV@w5C=<3IE8JwbaxB+GyuWV^Vp4?xV@ESA_ z?qzWo^5yJs_;z$}zxexchF2WrIh>t$aW2n3-gvme@Guiu51?C_tsFlEVynp5eS6>j zC diff --git a/dash-frontend/assets/gui/tab/welcome.xml b/dash-frontend/assets/gui/tab/welcome.xml new file mode 100644 index 00000000..4753bd37 --- /dev/null +++ b/dash-frontend/assets/gui/tab/welcome.xml @@ -0,0 +1,22 @@ + + + + +
+ +
+ +
+ +
+
+
+
+
diff --git a/dash-frontend/assets/gui/tab/welcome_page_0.xml b/dash-frontend/assets/gui/tab/welcome_page_0.xml new file mode 100644 index 00000000..ae29c5d2 --- /dev/null +++ b/dash-frontend/assets/gui/tab/welcome_page_0.xml @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/dash-frontend/assets/gui/tab/welcome_page_1.xml b/dash-frontend/assets/gui/tab/welcome_page_1.xml new file mode 100644 index 00000000..c7fa5d71 --- /dev/null +++ b/dash-frontend/assets/gui/tab/welcome_page_1.xml @@ -0,0 +1,5 @@ + + + + diff --git a/dash-frontend/assets/gui/tab/welcome_page_2.xml b/dash-frontend/assets/gui/tab/welcome_page_2.xml new file mode 100644 index 00000000..e25b5249 --- /dev/null +++ b/dash-frontend/assets/gui/tab/welcome_page_2.xml @@ -0,0 +1,5 @@ + + + + diff --git a/dash-frontend/assets/gui/tab/welcome_page_3.xml b/dash-frontend/assets/gui/tab/welcome_page_3.xml new file mode 100644 index 00000000..344cbe6e --- /dev/null +++ b/dash-frontend/assets/gui/tab/welcome_page_3.xml @@ -0,0 +1,5 @@ + + + + diff --git a/dash-frontend/assets/gui/tab/welcome_page_4.xml b/dash-frontend/assets/gui/tab/welcome_page_4.xml new file mode 100644 index 00000000..b7f18379 --- /dev/null +++ b/dash-frontend/assets/gui/tab/welcome_page_4.xml @@ -0,0 +1,7 @@ + + + + diff --git a/dash-frontend/assets/lang/en.json b/dash-frontend/assets/lang/en.json index 14b8d023..e48fe534 100644 --- a/dash-frontend/assets/lang/en.json +++ b/dash-frontend/assets/lang/en.json @@ -101,6 +101,7 @@ "SCROLL_SPEED": "Scroll speed", "SELECT_VARIANT": "Select variant", "SETS_ON_WATCH": "Sets on watch", + "SHOW_WELCOME_SCREEN": "Show welcome screen", "SKYBOX": "Skybox", "SKYMAP_ALREADY_DOWNLOADED": "This skymap is already downloaded. Select desired action.", "SPACE_DRAG_MULTIPLIER": "Space drag multiplier", @@ -154,6 +155,7 @@ }, "GAMES": "Games", "GENERAL_SETTINGS": "General settings", + "GETTING_STARTED": "Getting started", "HEIGHT": "Height", "HELLO": "Hello!", "HELLO_USER": "Hello, {USER}!", diff --git a/dash-frontend/src/frontend.rs b/dash-frontend/src/frontend.rs index 192cbc06..0b1f9bb0 100644 --- a/dash-frontend/src/frontend.rs +++ b/dash-frontend/src/frontend.rs @@ -26,7 +26,10 @@ use wlx_common::{ use crate::{ assets, - tab::{Tab, TabType, apps::TabApps, games::TabGames, home::TabHome, monado::TabMonado, settings::TabSettings}, + tab::{ + Tab, TabType, apps::TabApps, games::TabGames, home::TabHome, monado::TabMonado, settings::TabSettings, + welcome::TabWelcome, + }, util::{ popup_manager::{MountPopupOnceParams, PopupManager, PopupManagerParams}, toast_manager::ToastManager, @@ -390,6 +393,7 @@ impl Frontend { self.layout.remove_children(widget_content.id); let (tab_translation, icon_path) = match tab_type { + TabType::Welcome => ("GETTING_STARTED", "dashboard/welcome.svg"), TabType::Home => ("HOME_SCREEN", "dashboard/home.svg"), TabType::Apps => ("APPLICATIONS", "dashboard/apps.svg"), TabType::Games => ("GAMES", "dashboard/games.svg"), @@ -400,6 +404,7 @@ impl Frontend { self.set_tab_title(tab_translation, icon_path)?; let tab: Box> = match tab_type { + TabType::Welcome => Box::new(TabWelcome::new(self, widget_content.id, data)?), TabType::Home => Box::new(TabHome::new(self, widget_content.id, data)?), TabType::Apps => Box::new(TabApps::new(self, widget_content.id, data)?), TabType::Games => Box::new(TabGames::new(self, widget_content.id)?), diff --git a/dash-frontend/src/tab/mod.rs b/dash-frontend/src/tab/mod.rs index 68e7fb03..915019dc 100644 --- a/dash-frontend/src/tab/mod.rs +++ b/dash-frontend/src/tab/mod.rs @@ -5,6 +5,7 @@ pub mod games; pub mod home; pub mod monado; pub mod settings; +pub mod welcome; #[derive(Clone, Copy, Debug)] pub enum TabType { @@ -13,6 +14,7 @@ pub enum TabType { Games, Monado, Settings, + Welcome, } pub trait Tab { diff --git a/dash-frontend/src/tab/settings/mod.rs b/dash-frontend/src/tab/settings/mod.rs index ab32bdf1..1c0896f5 100644 --- a/dash-frontend/src/tab/settings/mod.rs +++ b/dash-frontend/src/tab/settings/mod.rs @@ -81,6 +81,7 @@ enum Task { RestartSoftware, RemoveAutostartApp(Rc), SetTab(TabNameEnum), + ShowWelcomeScreen, } struct SettingsMountParams<'a> { @@ -136,6 +137,9 @@ impl Tab for TabSettings { Task::SetTab(tab) => { self.set_tab(frontend, data, tab)?; } + Task::ShowWelcomeScreen => { + self.frontend_tasks.push(FrontendTask::SetTab(TabType::Welcome)); + } Task::UpdateBool(setting, n) => { self.tasks.push(Task::SettingUpdated(setting)); if let Some(task) = setting.get_frontend_task() { diff --git a/dash-frontend/src/tab/settings/tab_troubleshooting.rs b/dash-frontend/src/tab/settings/tab_troubleshooting.rs index 8635efe5..70ba2111 100644 --- a/dash-frontend/src/tab/settings/tab_troubleshooting.rs +++ b/dash-frontend/src/tab/settings/tab_troubleshooting.rs @@ -50,6 +50,13 @@ impl State { "dashboard/refresh.svg", Task::RestartSoftware, )?; + options_danger_button( + par.mp, + c, + "APP_SETTINGS.SHOW_WELCOME_SCREEN", + "dashboard/welcome.svg", + Task::ShowWelcomeScreen, + )?; Ok(State {}) } } diff --git a/dash-frontend/src/tab/welcome.rs b/dash-frontend/src/tab/welcome.rs new file mode 100644 index 00000000..40798c2a --- /dev/null +++ b/dash-frontend/src/tab/welcome.rs @@ -0,0 +1,147 @@ +use std::{collections::HashMap, marker::PhantomData, rc::Rc}; + +use wgui::{ + assets::AssetPath, + components::button::ComponentButton, + globals::WguiGlobals, + layout::{Layout, WidgetID}, + parser::{Fetchable, ParseDocumentParams, ParserState}, + task::Tasks, +}; + +use crate::{ + frontend::Frontend, + tab::{Tab, TabType}, +}; + +#[derive(Clone)] +#[allow(clippy::enum_variant_names)] +enum Task { + SetPage(u8), + SetPageNext, + SetPagePrev, +} + +pub struct TabWelcome { + #[allow(dead_code)] + pub state: ParserState, + marker: PhantomData, + tasks: Tasks, + current_page: u8, + id_pips: WidgetID, + id_content: WidgetID, +} + +const PAGE_COUNT: u8 = 5; // 0-4 inclusive + +impl Tab for TabWelcome { + fn get_type(&self) -> TabType { + TabType::Welcome + } + + fn update(&mut self, frontend: &mut Frontend, _time_ms: u32, _user_data: &mut T) -> anyhow::Result<()> { + for task in self.tasks.drain() { + match task { + Task::SetPage(page_num) => { + self.set_page(&mut frontend.layout, page_num)?; + } + Task::SetPageNext => { + if self.current_page < PAGE_COUNT - 1 { + self.tasks.push(Task::SetPage(self.current_page + 1)); + } + } + Task::SetPagePrev => { + if self.current_page > 0 { + self.tasks.push(Task::SetPage(self.current_page - 1)); + } + } + } + } + + Ok(()) + } +} + +fn doc_params(globals: &WguiGlobals) -> ParseDocumentParams<'_> { + ParseDocumentParams { + globals: globals.clone(), + path: AssetPath::BuiltIn("gui/tab/welcome.xml"), + extra: Default::default(), + } +} + +impl TabWelcome { + pub fn new(frontend: &mut Frontend, parent_id: WidgetID, _data: &mut T) -> anyhow::Result { + let state = wgui::parser::parse_from_assets(&doc_params(&frontend.globals), &mut frontend.layout, parent_id)?; + + let tasks = Tasks::::new(); + + let btn_prev = state.fetch_component_as::("btn_prev")?; + let btn_next = state.fetch_component_as::("btn_next")?; + + tasks.handle_button(&btn_prev, Task::SetPagePrev); + tasks.handle_button(&btn_next, Task::SetPageNext); + + let id_pips = state.get_widget_id("pips")?; + let id_content = state.get_widget_id("content")?; + + tasks.push(Task::SetPage(0)); + + Ok(Self { + state, + marker: PhantomData, + current_page: 0, + id_pips, + id_content, + tasks, + }) + } + + fn refresh_pips(&mut self, layout: &mut Layout) -> anyhow::Result<()> { + layout.remove_children(self.id_pips); + + let globals = layout.state.globals.clone(); + + for i in 0..PAGE_COUNT { + let mut vars = HashMap::, Rc>::new(); + let is_selected = i == self.current_page; + vars.insert( + Rc::from("COLOR"), + Rc::from(if is_selected { "#FFFFFF" } else { "#FFFFFF11" }), + ); + + self + .state + .instantiate_template(&doc_params(&globals), "Pip", layout, self.id_pips, vars)? + } + + Ok(()) + } + + fn fill_page(&mut self, layout: &mut Layout) -> anyhow::Result<()> { + layout.remove_children(self.id_content); + + let globals = layout.state.globals.clone(); + + let _ = wgui::parser::parse_from_assets( + &ParseDocumentParams { + globals, + path: AssetPath::BuiltIn(&format!("gui/tab/welcome_page_{}.xml", self.current_page)), + extra: Default::default(), + }, + layout, + self.id_content, + )?; + + Ok(()) + } + + fn set_page(&mut self, layout: &mut Layout, page_num: u8) -> anyhow::Result<()> { + self.current_page = page_num; + + self.refresh_pips(layout)?; + self.fill_page(layout)?; + + Ok(()) + } +}