From 670a6ba4779d56e51403779e7e3579f93e05c149 Mon Sep 17 00:00:00 2001 From: Martin Vladic Date: Sat, 14 Dec 2024 11:44:31 +0100 Subject: [PATCH] #664 --- packages/eez-studio-types/index.d.ts | 2 +- .../project-editor/features/page/page.tsx | 38 +---------- .../flow/runtime/lvgl_runtime_v8.3.wasm | Bin 1999084 -> 2004479 bytes .../flow/runtime/lvgl_runtime_v9.0.wasm | Bin 1960510 -> 1965901 bytes packages/project-editor/lvgl/build.ts | 16 +++-- packages/project-editor/lvgl/identifiers.ts | 12 ---- packages/project-editor/lvgl/page-runtime.ts | 20 +++--- packages/project-editor/lvgl/widgets/Base.tsx | 4 +- .../project-editor/lvgl/widgets/Keyboard.tsx | 8 +-- .../lvgl/widgets/UserWidget.tsx | 59 ++---------------- .../eez-framework-amalgamation/eez-flow.cpp | 14 ++--- .../eez-framework-amalgamation/eez-flow.h | 2 +- wasm/eez-framework | 2 +- wasm/lvgl-runtime/common/src/studio_api.cpp | 13 ++-- 14 files changed, 60 insertions(+), 130 deletions(-) diff --git a/packages/eez-studio-types/index.d.ts b/packages/eez-studio-types/index.d.ts index 00beff2d..b85dc523 100644 --- a/packages/eez-studio-types/index.d.ts +++ b/packages/eez-studio-types/index.d.ts @@ -725,7 +725,7 @@ export interface IWasmFlowRuntime { _lvglFreeFont(font_ptr: number): void; _lvglAddObjectFlowCallback(obj: number, filter: number, flow_state: number, component_index: number, output_or_property_index: number, userDataValuePtr: number): void; _lvglSetImgbuttonImageSrc(obj: number, statE: number, img_src: number): void; - _lvglSetKeyboardTextarea(obj: number, textareaIndex: number): void; + _lvglSetKeyboardTextarea(keyboardIndex: number, textareaIndex: number): void; _lvglMeterAddScale(obj: number, minorTickCount: number, minorTickLineWidth: number, minorTickLength: number, minorTickColor: number, diff --git a/packages/project-editor/features/page/page.tsx b/packages/project-editor/features/page/page.tsx index b641bc9f..ffea49e5 100644 --- a/packages/project-editor/features/page/page.tsx +++ b/packages/project-editor/features/page/page.tsx @@ -69,10 +69,7 @@ import { LVGLPage } from "project-editor/lvgl/Page"; import type { LVGLPageRuntime } from "project-editor/lvgl/page-runtime"; import type { LVGLBuild } from "project-editor/lvgl/build"; import { visitObjects } from "project-editor/core/search"; -import type { - LVGLUserWidgetWidget, - LVGLWidget -} from "project-editor/lvgl/widgets"; +import type { LVGLWidget } from "project-editor/lvgl/widgets"; import { lvglBuildPageTimeline } from "project-editor/flow/timeline"; import type { ProjectEditorFeature } from "project-editor/store/features"; import { PAGES_ICON } from "project-editor/ui-components/icons"; @@ -215,7 +212,6 @@ export class Page extends Flow { _lvglRuntime: LVGLPageRuntime | undefined; _lvglObj: number | undefined; - _lvglUserWidgetOfPageCopy: LVGLUserWidgetWidget; get codeIdentifier() { const codeIdentifier = getName( @@ -237,8 +233,7 @@ export class Page extends Flow { makeObservable(this, { dataContextOverridesObject: computed, rect: computed, - _lvglWidgetsIncludingUserWidgets: computed({ keepAlive: true }), - _lvglWidgetsIncludingUserWidgetsWithoutCopy: computed({ + _lvglWidgetsIncludingUserWidgets: computed({ keepAlive: true }), _lvglWidgets: computed({ keepAlive: true }) @@ -1112,8 +1107,7 @@ export class Page extends Flow { getLvglGroupWidgets(groupName: string) { let groupWidgets: LVGLWidget[][] = []; - for (const widgetPath of this - ._lvglWidgetsIncludingUserWidgetsWithoutCopy) { + for (const widgetPath of this._lvglWidgetsIncludingUserWidgets) { if (widgetPath[widgetPath.length - 1].group == groupName) { groupWidgets.push(widgetPath); } @@ -1159,32 +1153,6 @@ export class Page extends Flow { } get _lvglWidgetsIncludingUserWidgets() { - const widgets: LVGLWidget[] = []; - - function addWidgets(page: Page) { - for (const widget of visitObjects(page.components)) { - if (widget instanceof ProjectEditor.LVGLWidgetClass) { - widgets.push(widget); - - if ( - widget instanceof - ProjectEditor.LVGLUserWidgetWidgetClass - ) { - const userWidgetPageCopy = widget.userWidgetPageCopy; - if (userWidgetPageCopy && !widget.isCycleDetected) { - addWidgets(userWidgetPageCopy); - } - } - } - } - } - - addWidgets(this); - - return widgets; - } - - get _lvglWidgetsIncludingUserWidgetsWithoutCopy() { const allWidgets: LVGLWidget[][] = []; function addWidgets(page: Page, widgetPath: LVGLWidget[]) { diff --git a/packages/project-editor/flow/runtime/lvgl_runtime_v8.3.wasm b/packages/project-editor/flow/runtime/lvgl_runtime_v8.3.wasm index 354c0460bc5bf3e86f089ea954dd27b465b323ae..f18e3af7ec3b6f5740ab42c23e5a9eef976178db 100644 GIT binary patch delta 50842 zcmeI53y>AnnaA%rcXEY019K5pP)PPWhDyzvxJlgXXswudYe^)Qwb9)qRl8fI_=ria z#>7fCA;x$?1{mHTj|<8h1r&sl*YJ?XC@%$cP}ETb@qyqQ6^##+{e7or`hc5`%)hDP%Cqc*RRga+Ysl4SnaZorvg`lLJeRw0 zr#U-!*)8@vhxgB$p=T`1IH@VVgB~fDUH|}yt$mON>QhQ6~^_`-v!3~QGY9pyD5F1`x8h1DdTRIo86z&Bkw41x5%I6 z7Wt#xlzOlW`?+h$W?X+G{f!%7h?gBab;N} zWyTFMGRUNcc0MC)$6zl78ZyMMEH$p&ugo)Us1eqOn$+4ZZkR8mox}YK4IN>4b|cx6 zk(_;$kx|BtHtCIn3fveYqmA&N$|Fo_Nf+8N*8GU7W2t(Zk=u+Lr-zT%!^cxL!N>&T zCK`mAGeVna4VN5eWTFvDawavmvzuhnSvT3pBqNi}Z*!{_wEJ?_xT$)Qso@>#UD5Pu z22o5mGR??zPCrAd%%I9VLsMqz)=Y|L8JT6=Y$LNxYI-Mkr> z9X|Dp!t^BL7V6H0>|A7IkuOfKH?BfUD=59s$bC6?LGrbtPm0Vcll^MU6{M?k>E6jM zx&AjMyT@y$f2s1ye#!NL0&J^OfWEZ~(6`kJ(AVWFz%`8&;2IS{U)N9p`qnEzNxlMH z;~FbKxd}9&+%#4J+U!+eOQ-^=-≫puS2&1DAw@_|W6S4zMYIM?- z=>tU(%2XGA=jd+y4dQ{S4$$>VZSVBAydIzc8P$WKMm1nqo#N2?KoMyE2o5T-8;n;5 zuhS?4iZRM74vN5D?hbWGTvTGYzp*CWO|>9_9%N7ix;dJV9yh8$^#GmVKefl2)W$Bf z0}V)^1{u|ioKYp{mYcad+4<`+HziatRX3F44kMIIF{%4HqZQ~1-5>3khOYdks9ldN zIzg9D(CJHUon%n`*{Ut{el+1uuA}{4?xM~LR!S`QO3!D7dqoRa>5UGg+iCYt(D^gk z@$WHo`1C2-+3EP`#{!dDaOxQ}pN^lP>u20T2B3w89?zi-db)9oL*+sjWU)z&=t`9( zdfXC@TWW++X_=8_fuh9Ra^1Du-$Wr-sMO6$YSLcrW~Gspp{C6sC~X?qY;Rd!NAOeTPs505{@(C>>2 zn?aaE(;|dnh&bjnt8N^vN0>1Y!knZC<61zN;=+2{W%Z9DU}=NE^8Q07Be0YukGt*C z0yp}gf?(xv)1H>Qr$#*3U(bW3JH)V6@H^sTNzLk#8+%u~&g!r^fxeYvx>mjx`BqMx zZ{?p_WWH8+G+P^ZF)Q(6?ujUXR!{)A`_UqG;X_5EQe}-?_;}}VUIyMdbzgcZB(O0@o!gi_H&kSaNBcl{hY!a_MDU z8kZ#()+2dL>a{G%TD++0u+$3${#Bj`E=vk{BI>QgQ<;8=M}UiRwZTV;PZNhGKFrk8 zF6_l&$(cCCnlR#HEyu{(fEbAvYShPhZk?8`!@arQ2&b(wQsqM&9>52ikO!#TLjzbI zH1Z%fzn+`lzz**w-{@C*xJ^b_<^KlL$;PO>Sr6SDdR@sH;lm7Uv+Y^!s+Za30BA=@c_#KNxw-&+s zVUVT?H^dmlG9~73cl$85tRFK9pr4rpfl%|YP}?iE>TH5ZL>LWN9|aW#L4{#|J{quL zG?WGjYBV4-iv$ykj7CB&@nE^H(3<&yI&3P7)S(Tk!^+1$pX$(J^sACDbF{zHt2F=+ z7AEY~KSUD}s6$4z;%*ZJ0@ek&q7Zozu(jQ~p(bbq(!RplUi~k_qFx>K>dz*oJM7ha zPgJjdy4dW>UAT%&g&Cuh8vnnNkEHaf;eutko34;5bq9+5s(?wUgG23OFSzA=aC5lxuHZj93mtE z8|-vedI`72PLMK_n>CXCYfzw zUOiuLcP&s&yf>)HK;Vai8+BY_@FK111#gIj)>SxV)$u7eYJcHr-<;&x+PqPzc801% zEyGeqN2f}!A60ewQ8gvfk2a_uPriFn=|^8isMab7RX+m_dB4!y8z9KAS&@dcK@C~9 z>+`80Eiw}xBACoF$DIpAfDcS{=P5+|4--UyLua?)z~AKbwl*JEC%3={Ns2n7tOWv{ z;DRF=o#0k@Akc1JN&5N0z@B3&8fBihmCW;#s)xUDqI&qN#b$RvTMWK8qAeoYqQy5Z zjoudY1}p|E$OA^h(;M6L zh=9k~&P5i?+eJXm!mOaW2~IJ7TV4Qi{L0tQchvXQAPo6iy@0Llz8JLEnd* zU@Cg7cf|PaKC{?7S&5_JipFo%Ix+qI68%2{ek$d8d`}=dW9HW1VmFGe2&%OGaiWU3enUAbn!dfp`#2it!{@>duD*K zAa?@L&Zz%khY7&C4rBX%J6VshAvkC1-3)0kRwoPfUIz8q*YiD-t0IhzF!s3l>?>P* z51YCKn&5kO6rUizr>djbR=IamgspAg5Pooe6O+mliLHI|@)lZY2siQWL45kTndcUE z&d&O9!OUB%+!)ofeyt{aI0a26-f-dZLOp>#;~EOi@C%h^BMhn0R;f*B0~IE z5W^c7yuH*#&tHYlZ@}c$Aj48y*i)gVr+VvSxk0PjpOwY3Tv;3Z2o|Y1s}*WtGWB$E z=tRee1S#1G*sFo7h=qO2FW!Gl+#)q`6F_4oNJIb~(>wPUs5yJ&aDieXa0x_m4D0JO z&w*pIpkxA^%&1+v$-|__V~~U-MtNV_s2h{QTB^k?C#A>=5`lf#o&&e zcD$W;j~1C_4YE*!T(jLZQLfpsUM4-lhh={Dsi^DAn;Pd&SSsp8c~d%n%Q{4_Fs?b@ z2E0PMqa!lY=e01SYuD0@uHCU_bUq8Uyf*Z*M}6ewK7|HmbqS_+`f^{AKre2TK@z-3 zH!%B|&q0AC;6XB)m%2Qd5D}mVUy}DOUA6QV7n_>EA-Hr;(7!Xs=>4(SN$`x1LRP{lVsP<43+p&A#qa~UsLsGz z#~v=h1Wv(B5ZkP7LA-(9m&fC8KB#$1W4cj~Q4*5a<^<8r84YXRRp-$*Vg;D6Q_I+GX8(+{`-^WL%nt?X>CP#mp z>onYUEXT`fE$=A^nY)+Jh!t#Y?(QVe6DqqAh4&JJ#Ek!j+|Ka-A+tc02d5 zaX#hv1LHdAeDjduyE^>BrWH#^DON98N(8Mx%(H2u@@)*BYA&qg3E#2Wq(X|Dezaj?0dCU$OY1?6R$$~F4y^PDc`8kHdN#;Ta^69*J%3>bd$DUq`%bf zqrWuuhx$uXFHTR&?bw?<(@rwE0T(8PZ(-yvyCm5q#j!t;pXjG|eyUX~a%0{~o?h3m z>JiEA+425bR1Bjm$KZ(zvgXFLK5LGu`B`)08)wZ07ok?ethq6!=$yLm{N!iNae~HK zb1TBExfMrc&CzzBHHU!wmwph8|I7)3xheg@v9ji<(5kFC|F|^?Z=m+Ofz4#i(U!qp zpfqNPUpZu4xnH5L4L#~rL9}(a-%Ddhm~?ehS#v9zdIjB2wJBpcR2sZ2h!d!+<+y$D zr@ogrZ=%ujY0ON$ZsV-EsxC*r1EBtOL3$W;oMt;`)MmqEf|IyAYf=w%sSo401P)wl zHW|sm`-pI6duxqgjzvtGDgsw>g?A-$SZJ|j)KpunsdAbH2fM#iFT9iir4K5JrM3(T zUzKvX@oL#8NKL_RQ^mxSoxq*VS8G&{dgJKEn+;vR(gb9^vh%R^_nRN&*7hkngC134 z=?hBAd(Fjd%}O8dwDzj2?rN{Q8%+8e>aA|b!~0KCLB4PHd29i9zrnNi-)Mq^_a1R& z;{E5Tpy9L1!%PD_Y9N`=)s|UPlI|mz4C@sU@p*fo4$ldgB^yMwD5p zt$hkRwO}XDi|OSPCPv#;m@ujtJNpH#ZUy{hef z&B&|9y>8?+i1~w z`$pb3?k~naVX*8kM)*(VLq@+mR^&d^njcd0BO@Of_puSq%~?MVAFs#3!!(ko`_I9b zmsS|}iND$d6ap9(EMy3!<%$uN|M+3@?Cu3`e#OkJytGSU z7w5^spRr5jmkZmOQLp*tgB-=>x2W>N{?VO-7NKc9f!k-jxEPdMU zrC$>dKzds|5Px+X@z>a6$e#+W0_iDn#fmMqWss&V0Z7vrm3xWZ84p2vOS}n?rmX=; z(^x>d!n%?Av>JSq?}On@QbIIktk!J+(wyMP-~L8Zk!Q37 zxNa1B#_`apiL4JkJCU(x`BFWa7Xo7S9e;?GRw|m~UT+wDhFCXgxrU1$W{Twf>-u`X zjJnmg_|UV5>f-qjE36OC5UFnUD@av6>i(&2_c`x4)iG282+tx`wZlp*Vy$NC7-YWJ z131u~t|%)|QV0;|KeY)e=Sz{aEGL@jy2vyNKw^b_Tnd z1OeAz_-;b__9%b@+hF)}0QlZu9=6xd!;A-R@VeCIi}eLP1ONxhUqmcGcS2qYq)H=0 z{LVNJ+ltux{Tmj+Yu>_sfO^E~fqfxtXFzKO>em#gYr`ZFD|j7<73^jOvA*e7=&WxU zVf`&H)`PwfsRmGvRNpb_83B%i&lzwWj0VWl1NIiU_p=5#2g(CXB?2u zT;M~00&qM5l4lgkKQ@l85L3AJ(+J_J06v&b$tONg@>7*6zzvcgL8|>NA{t<&zm);@ zMt3VCKT#vM+H8=J5Q2C^v6ksE06D-OB6$KV_nnnS4pD?30>YPDDYtH@m7!K=aKp5G z7}chjbUAj3ZVso~2rDBP@~n)sc~Z@e@^C?K9qm^T>lnX+SjSpneXP~qdYdmqtmFI& zVjXYO2V-smn=*mZPqZ@8x|~ffBV>J&m7Ep+Q+vEssnU|kT6Hp2Z?|&0b$9sVvs1Km z3Z+x6Oto&BMXb}U&@39nRqwDe%?c&ct;V0uu!wc0l^IrM+TXfaDx%p|W?7kySnmwP zdZ!JfdY7L2E)|6WN~nW#^pLq$=2)3)Gg&uJE6oeUN-OWy&AVyOJy!0qZoZZIRs&EO zQArQBvcSr{Txp?JTgXw@D;2g#w-#|wg%x1oJ}dX-3wbfS{fMx{uOQ>4egzq4msw$B znHTbMUy6_`{R%=}Vbkl0$7NGia{5(PR#~^&rk@(gTTiX5w!(jEukb>qC2O?m8mg|f zvevqF{`mD;xSql)D^=D#pfY~Y3e8%QwZc``S$V(;MGtx*Z%`p`w6ejstaLZwZC`ke>XZMnZmA57}zvVJlm??l!HnEs!yd+^(D3DSw1n=p)uWYUNQc z!pSHsK z(_X~S_(DXy%db>tyYt84W z`GS=ftb0+9eo4z-qHLd)eb&9K0^VoCE3a|euLlBtJrwX8dh$0K3HVJt9@IJq0|A$~w{`1nir=yFj&<)^ zdDjmOIyIC-)bcFaq_}&}UZPT4VBP!d@&@H!{K_`tKJY7382#4~PWTt>#- zsJM)Z2QHH=9c;Aj9nIb`aT&uv7MHQ%UNrnR-FX{3$HiqF<5*nAhdUWnC+N-z?3@^v ziE)>UOD^1bz_>}ea}qlz$7OQd-5!_Q!<|eX?$Dig#50$>DRG$+cT?jsHQdXLZJO?# z#-Y>WGCl5Q#AQb9MdNO!?wrZaS#g==i_?4KZnl=rru5FZ+!8>C9EQ#gf$6k!Xk^PAfS;&0YN~erCVGOl=+?eeOVs75M*(Qw<_=D zes}rq{mwh@obx;9-1|HbM>_u~88soul;bZpnJV>>G8*iM!IHx;?^9_R z@!$7UH;=lZW1|~5HA|)Irt&XUH{+(5buKFR|;xGJ=ewhEFAK{1j zkvsLHF6kIQ%CXM6llm=pYLXJ%`7!xlO8T$ze=h0AJt-8Ee!|VsPvXW;#&l=yteMBF6P#ioV!F4WqYB9FYuJ~5vf{cc>g=GytfMrqcL&Du)S5$(%!L%rVz4PVs1+Rv{tue4G_!0c- zjvAUO+zQUcJ38l6be*s_I5ouHAapehE8H3tZViE1V_;VBDYz93F(UX@$TtM63=T%k z2#U^c0j33qgFC^zqrl;#gR6$CUCe{AVa{hVBc|=R(KW6 zC@d~d1?dHDMFHdh=c3SF_%;NVb*~Uk1?%E^GDYWt^^$RGNSM@cJQx?e8XbH!hF9@x z%YVi51?(CyJa{(5GqIExiC-j*bCL+=Q; zsU?m-zQc;+3lql`c~%_z;`qeHisM#ii(_h=(kxOVh>uTd=z@5-6~ql$5Vxo$h=sLl z4C2`DtpvU>3H-%ID}j9poEN@GgScJ^tom;%xj#Q#(r_)|Z_=zK+<-0Nx&`o&d#nJy zFaex9+zMb{0QbH80(i{u1}=b4TLJuYvVi-*C0qiR@UezwQoz6SJ$Qr1PHgmZ@dl^B zr{wS1>VuSWR06TQ!uG}p;HB)yNLc19G^x3CL{-0&>gA z(~pbK93hz}+|4QVMC8z+o{-#Nl9*ikI;1eBH!(R(Z(?$5NqZ(J2j6{SOb%XsKgfZF zAtuL3VsabzC9{CrCyB}NIbw1MtRM(-31V{Q$%8mVT|v200%;P1a-JWRi*Avi9O4|X zX%Xre4?$b#heirbXr#S~Z9wM6{GgnOVMOD$X4J&uu7NB;D6WVQ5JG4d!8m-b*ZAQ$ z#N{NA8wBIBRcmQ$jTnbZUVOx|NW1vIA8CArhe~`zbIeG5MhIP)TfA)k<0E;+6!4ME zLqQjldjOxoeBxqayrUaB%%kX{OtdZ_gg+4a;05FdZ5Lt;FGSo1lyV|In=F#LMR=&i z#EZd;ONf_{1Sm_Sp#+^Zb&3c6mRmhKkPtEGB1s@D*&G4Al1Z*3dT zerxTw)_!Zx`&+yAhx^t}i_i=|_2u4t>u9<#M^k=9GBx{?Onq^pr<=z|+}osu7Xq3I zl3&uHSxuJB1W~l2T)INVLKFLW15mPi(x9yThRMDE3WZO>jgkTbGcn*sNrVAvkNM`J*ow%5sY=ZPAJ@v;GPVzxF_D3NW>i(& z_|Qnpjg}kFok19Ie00738ekkcy4VXq+QPwGR^=ui)Wo@)?vWl9|o8uJ?njrk3PKJZA8*IIcdgx*~R zp|LVR=<<{#7&^I(#N=luwwA{;mZoKT3AwD705+S)75ZWQb;0IJa zNA80U6XFns9LWpxCF2Kakc-gV5QmVDffq9b0R8Kf+u$;WSd?_um=B-*G}fwYOVC>+ zVwM8Iq0(3~t|C}7FZ=tvZtVbU!nEig-g?4r*NLm&w^8sGQlaEnJJ!xC87N5p7H z!r(f|uoP$w;2aZZ{fgjfBv=AXhXAQ#f~@BgfHcH9z%!PC1z-|@Z-8smEHnw0izLAk z_!(GwF?ER-wrSGZ!?Oxd1}4r%{%2smV7W_$3RQ?XRs)qQ&5H4?f|kv*0xgGrm2w;K zGDZL<12>n$DFK`u0z7t=K;zW{ngNi5%*wTBx0zF z4a6IK<0nOLltCNKG9{OIlU#1XJzgVzjr3;X&4I$IOo=~U+~lfTjP}|NXFp3e?j>0E{P-AMzat~F2;6#e;m>5`Q(>CwaO1^Z|L3LznVP$)*M!M{G#1)v0!MfpX8fBpS-i%J|h1iTv)2)vLq&~A#LU91VK!IS{W z2KfT~%67vgf`$=2MkKie+YJ$MH&7T6B#0Bv;4~9}Ta@EP%!#y;eZ-IszaDLIxZTK(c^hVBwem z_1{C(U9|8z(qNpbU=@bFOA;4i-r+{Rj;t+6gOutV2I_Wov->3%3 z`b}wk6O91K2xV8Jj}OXPjGTh z{mFWQAtl8N44@DbH*lfZ8;*?C8l?sl;R|sA5Jss9cN(WI7!zeUd9a5bJ{(j+sR?*6 zN^P1bwdpv=p%!RBJlEa%X==4P^qoNd84;oup{Qb_7GEM=hfYip4=~n*)nLlmRod|t zb4moTP$Os6rnnoU@g`8Rq(B6 zK}%wZrKpC}xXh$hEhWUt;VH%-=t1bo<(LObQBtY=!1=@CX&2ono_44&{7;9Y7z3aU zQ>wKgyvD6WA)+Tb!B<=;f&fZUT*Xxi4Qet36&Vwk@vG#kMn6mmukVze;Z|2ecLho? zR^t?QkHw?;;mp(;xYq6stEsG}ik6)7gp)ep+E!sq5eApqn^4|_Dtx%sX1j%J7YEnY z%t>ZY{Rq`m)!{qwtY^dNcVL0Y>XjpR%=snb<;)Uy>WR5idWz$qAaHF(7dD457R3Zj zkeIW9MBk!#?jOU~<^U0(y$G^12mA^cG##0-rO2`K!C8)gp(<05Is9nCO|c34lhYy5*!B zaVp1e?-c%*l81I#g>hjDWAFZC-^8C}UZ5A9Q>`#=qo%^*{*hQWP*eG$)&p&JT`p)- zW7j;i&$8)-vFWyklfLRj=be*H>#%F~TrRt2M}%hkJDL7`$nJ@_h&>VI{ga8(ANx+G z#(qXtwL3a~+feEcLH)MYpcWyE-V`E$(Re zp=E1PB;G48e2t$a1oH+!Is`Nw6EE}}-#&m-6q#5dY)y(u`qj(EKA7K>UiWSESB_d6 z{o-u&IdFvZCC*DcEb~Wbqhm?QlL~9&#~kZQ!WXM{65%CxC3)Y;m1H7XFzf*b*1{xu2R^sLyUnH$C*C@0;+UO>$)Vl1FoosR({Lfod3 zl>uWxh#!A{XSmfZIFTSoy2w^?&Vot2@b8W63;*7*3*H0`JD8mbIC&x7G&RDFbNoX( za^h`Irrjz&R}g5I8FHBPZc{*TagQm$ulgPe`h7B#*h~CAG2YSo9^piMH0>kCXpGwz zoT{)N19-px*#0h6pq>xR?Q--1ViXS$emVe)K1hE=--D*FVW|&g?1$jJL&S$jA0|Fr z<5@i-jYrV<5%EXWp4E?~_G8q3Li~wAPRFjG?(ttXjbxYPh9bpD1m57p?O1K=+KqLW zPpP}ke=ip9Z1!UH5B6g9z)mb7F|wGSfUEi3zb=qo-$twsfgk)X?8NFCT`b9b-SF_; zvQ>wOdpHH>wuiWTOwMgLc{Ib#hAa;Ch~eP&7fR-YBfn~udh|LPTeABXkz~mUyPbre zT{y1lB20nfQ>MTsz$Nc7`mkrJtC%tTTbT7lMSXnN)#Y*=U9!vQ7g|7xBLzI|2U%KXl9s5=N z{sP7ikjgWEfWfQz1qL2;(Lcaoo?gE9c$~U+t!;3GJO*IGN8;7~4Tgk#(z(hlQ0L56 z05K;T5`mf$pv+R+&7Ks0ekg{?iP;Ju=~UAVB!znDrIMv9j6a$zT>&dOJ6{1e5Ur4y z#P=N&7O+jS{)C0vWUUKjf~;6%(u@U2X{ZuEqwf^C5U|iBau!TXBa;t0MYPDu>Ld`5 zb(J9#$Xad+AgctF%*P7#fihxBNCNTo2goY+VwM6~*O8nP1MQKR%;y&8r3%D^0>L|a zBkvDC6oQp_KGeigUJH<>+#nHQ0$M`IAa4)L!h$d>ln&I2$>ft?3)w1pAjsj{O4#Gp z1$*3}_mI4Yy>8o~`FHr5e@Bo8^0qAQZAg1VRr5T4;eq!=_6RFvLJ&{9>YHJ~b#6sQEMigGf{ z`hld&7_wHYB#`x>X$DzE5gD=`BDcsWq7YP3OhX49At)d>cWVYc4J9-~7WW`FL zhC)z8F@2QyDCxhM@t;cNr>Hze48Z<(p{n-}(V5VcP=Ne5;=dE4<{u`#<})GdapKR2 zkAtkA3yHoU{+##=ko8NStX~FX{Yq~BRTWu-r#c}+z9v3F{59r1DSb}*RK+4s;WGa4 z&Ebp;aOi1iJ1yhM?N4Jvk*lgQZ9%y{N^S_s<(UHbv9BrMgUeTpa=sFN>}M)Lxc;U9 zejK3OV<~zdE_tAe=|PGIDLq)Zi;;jhMDbw7ct`I6O85~9bEtG3imt+9o}Qq%Q1JxJJ5f4KL?`egRyj#7C!v0_;>k)EDK1iy zm^4LZnyPq;;;EQvnsl3nQICnGJYBA)W6%u6GnAgGc&4hwoiC!<(0G<9YN)|}h z1?aj^@j|5+nemIIaxp5GC|;tpf2?<@Vyp`*!mNuFmncR}sUdQi5P7NMGQ~?l{Z3<6u*j@)=Rhb7$zRk4RWyoV>T+@sPrbqn`+beH8dLicz!M(07j~1b$EP9>wp0!0*dr z?^XQ1;=Oq6eLjKr1q9wNH{X8-fj^KT2NZvx_yFcTD18q41kTbQ%GHOcKBV}N(uWlv zR$>4gk@_R()!ytVDRA^hr~wF5`eRc#1@UGIn@Jxvg$a;wrtp~l6i+qE9dxact2z3( zJmlw!VMTtS_;aPdRE)xx>Q4QY8Ii6}D7VHxc*1%u>pVq*)2EH}$t$}Y1{F*1)$0zBTZzfo~1`AHu+2Y7G2k*1*5C27Zs;*1)$0 zzBTZzfo~0bYv5Z0-x~PVz_$ke4`JXhHwOL+Yv5lh1OG{i-#R<3eZMv%BY36b)da7m vcs0W-idP0+&GBl1S0-Lp;&l~XSL1aJUf1H)60cTxwZ`kZk~Sl+-{bs0SM0p0 diff --git a/packages/project-editor/flow/runtime/lvgl_runtime_v9.0.wasm b/packages/project-editor/flow/runtime/lvgl_runtime_v9.0.wasm index de0c53b0bde15c7214d2ee658f784cd6564d2600..db965cb7f59cf927aaab4560794b84b6dddb0340 100644 GIT binary patch delta 49307 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 Bc=Z4P delta 46546 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 Q;`jnb=jy7&7iYfu|8wmYLI3~& diff --git a/packages/project-editor/lvgl/build.ts b/packages/project-editor/lvgl/build.ts index 3515c78a..cd62d014 100644 --- a/packages/project-editor/lvgl/build.ts +++ b/packages/project-editor/lvgl/build.ts @@ -172,10 +172,18 @@ export class LVGLBuild extends Build { NamingConvention.UnderscoreLowerCase ); } else { - identifier = generateUniqueObjectName(); - this.assets.map.lvglWidgetGeneratedIdentifiers[ - widget.objID - ] = identifier; + identifier = + this.assets.map.lvglWidgetGeneratedIdentifiers[ + widget.objID + ]; + + if (!identifier) { + identifier = generateUniqueObjectName(); + + this.assets.map.lvglWidgetGeneratedIdentifiers[ + widget.objID + ] = identifier; + } } pageIdentifiers.widgetToIdentifier.set( diff --git a/packages/project-editor/lvgl/identifiers.ts b/packages/project-editor/lvgl/identifiers.ts index 86106a3e..d3bf1493 100644 --- a/packages/project-editor/lvgl/identifiers.ts +++ b/packages/project-editor/lvgl/identifiers.ts @@ -173,18 +173,6 @@ export class LVGLIdentifiers { let identifiers = this.getIdentifiersVisibleFromFlow(flow); - if (!identifiers) { - if ( - flow instanceof ProjectEditor.PageClass && - flow._lvglUserWidgetOfPageCopy - ) { - identifiers = []; - this.enumIdentifiers(flow, identifiers, ""); - } else { - return undefined; - } - } - return identifiers.find( lvglIdentifier => lvglIdentifier.identifier == identifierName ); diff --git a/packages/project-editor/lvgl/page-runtime.ts b/packages/project-editor/lvgl/page-runtime.ts index 2de9caa3..e771269e 100644 --- a/packages/project-editor/lvgl/page-runtime.ts +++ b/packages/project-editor/lvgl/page-runtime.ts @@ -123,6 +123,10 @@ export abstract class LVGLPageRuntime { beginUserWidget(widget: LVGLUserWidgetWidget) {} + get isInsideUserWidget() { + return false; + } + endUserWidget() {} getWidgetIndex(object: LVGLWidget | Page) { @@ -319,7 +323,7 @@ export abstract class LVGLPageRuntime { //runtime.wasm._lvglDeleteObject(page._lvglObj); page._lvglObj = undefined; - page._lvglWidgetsIncludingUserWidgets.forEach( + page._lvglWidgets.forEach( widget => (widget._lvglObj = undefined) ); } @@ -615,7 +619,7 @@ export class LVGLPageEditorRuntime extends LVGLPageRuntime { try { // set all _lvglObj to undefined runInAction(() => { - this.page._lvglWidgetsIncludingUserWidgets.forEach( + this.page._lvglWidgets.forEach( widget => (widget._lvglObj = undefined) ); }); @@ -1140,6 +1144,10 @@ export class LVGLPageViewerRuntime extends LVGLPageRuntime { this.userWidgetsStack.push(widget); } + override get isInsideUserWidget() { + return this.userWidgetsStack.length > 0; + } + override endUserWidget() { this.userWidgetsStack.pop(); } @@ -1377,7 +1385,7 @@ export class LVGLStylesEditorRuntime extends LVGLPageRuntime { // set all _lvglObj to undefined runInAction(() => { - this.page._lvglWidgetsIncludingUserWidgets.forEach( + this.page._lvglWidgets.forEach( widget => (widget._lvglObj = undefined) ); }); @@ -1529,9 +1537,7 @@ function getObjects(page: Page) { const objects = []; objects.push(page._lvglObj!); - page._lvglWidgetsIncludingUserWidgets.forEach(widget => - objects.push(widget._lvglObj!) - ); + page._lvglWidgets.forEach(widget => objects.push(widget._lvglObj!)); return objects; } @@ -1548,7 +1554,7 @@ function setObjects( page._lvglObj = objects[index++]; - page._lvglWidgetsIncludingUserWidgets.forEach( + page._lvglWidgets.forEach( widget => (widget._lvglObj = objects[index++]) ); }); diff --git a/packages/project-editor/lvgl/widgets/Base.tsx b/packages/project-editor/lvgl/widgets/Base.tsx index d19d5011..84703ac0 100644 --- a/packages/project-editor/lvgl/widgets/Base.tsx +++ b/packages/project-editor/lvgl/widgets/Base.tsx @@ -1600,7 +1600,9 @@ export class LVGLWidget extends Widget { ) { const obj = this.lvglCreateObj(runtime, parentObj, customWidget); - runInAction(() => (this._lvglObj = obj)); + if (!runtime.isInsideUserWidget) { + runInAction(() => (this._lvglObj = obj)); + } if (this.group) { runtime.registerGroupWidget(this.group, this.groupIndex, obj); diff --git a/packages/project-editor/lvgl/widgets/Keyboard.tsx b/packages/project-editor/lvgl/widgets/Keyboard.tsx index 3a2ebe0d..8016d659 100644 --- a/packages/project-editor/lvgl/widgets/Keyboard.tsx +++ b/packages/project-editor/lvgl/widgets/Keyboard.tsx @@ -237,18 +237,18 @@ export class LVGLKeyboardWidget extends LVGLWidget { const textareaWidget = lvglIdentifier.widgets[0]; if (textareaWidget instanceof LVGLTextareaWidget) { + const keyboardWidgetIndex = runtime.getWidgetIndex(this); + const textareaWidgetIndex = runtime.getLvglObjectByName( textarea, runtime.userWidgetsStack ); - console.log(textarea, textareaWidgetIndex); - runtime.addPostCreateCallback(() => { setTimeout(() => { - if (this._lvglObj && runtime.isMounted) { + if (runtime.isMounted) { runtime.wasm._lvglSetKeyboardTextarea( - this._lvglObj, + keyboardWidgetIndex, textareaWidgetIndex ); } diff --git a/packages/project-editor/lvgl/widgets/UserWidget.tsx b/packages/project-editor/lvgl/widgets/UserWidget.tsx index 84db5031..eb913698 100644 --- a/packages/project-editor/lvgl/widgets/UserWidget.tsx +++ b/packages/project-editor/lvgl/widgets/UserWidget.tsx @@ -1,14 +1,13 @@ import React from "react"; import { observer } from "mobx-react"; -import { observable, makeObservable, computed, runInAction } from "mobx"; +import { observable, makeObservable, computed } from "mobx"; import { IMessage, MessageType, PropertyProps, PropertyType, - makeDerivedClassInfo, - setParent + makeDerivedClassInfo } from "project-editor/core/object"; import { @@ -28,13 +27,11 @@ import { COMPONENT_TYPE_LVGL_USER_WIDGET } from "project-editor/flow/components/ import { getComponentName } from "project-editor/flow/components/components-registry"; import { USER_WIDGET_ICON } from "project-editor/ui-components/icons"; import { - clipboardDataToObject, getAncestorOfType, getChildOfObject, getObjectPathAsString, getProjectStore, Message, - objectToClipboardData, propertyNotFoundMessage, propertyNotSetMessage, updateObject @@ -234,8 +231,7 @@ export class LVGLUserWidgetWidget extends LVGLWidget { makeObservable(this, { userWidgetPage: computed, - isCycleDetected: computed, - userWidgetPageCopy: computed({ keepAlive: true }) + isCycleDetected: computed }); } @@ -307,49 +303,6 @@ export class LVGLUserWidgetWidget extends LVGLWidget { return testForCycle(userWidgetPage); } - _userWidgetPageCopyIds: string[] = []; - - get userWidgetPageCopy(): Page | undefined { - const page = this.userWidgetPage; - - if (!page) { - return undefined; - } - - const project = ProjectEditor.getProject(page); - const projectStore = project._store; - - let userWidgetPageCopy: Page | undefined = undefined; - - // WORKAROUND: projectStore.lastRevisionStable is read to detect if the page was modified - projectStore.lastRevisionStable; - - // runInAction is needed to avoid observing copied page - runInAction(() => { - const idsBefore = new Set(projectStore.objects.keys()); - - userWidgetPageCopy = clipboardDataToObject( - projectStore, - objectToClipboardData(projectStore, page) - ).object as Page; - setParent(userWidgetPageCopy, project.userWidgets); - - for (const id of this._userWidgetPageCopyIds) { - projectStore.objects.delete(id); - } - this._userWidgetPageCopyIds = []; - for (const id of projectStore.objects.keys()) { - if (!idsBefore.has(id)) { - this._userWidgetPageCopyIds.push(id); - } - } - - userWidgetPageCopy._lvglUserWidgetOfPageCopy = this; - }); - - return userWidgetPageCopy; - } - open() { if (this.userWidgetPage) { getProjectStore(this).navigationStore.showObjects( @@ -434,9 +387,9 @@ export class LVGLUserWidgetWidget extends LVGLWidget { ): number { const widgetIndex = runtime.getWidgetIndex(this); - const userWidgetPageCopy = this.userWidgetPageCopy; + const userWidgetPage = this.userWidgetPage; - if (!userWidgetPageCopy || this.isCycleDetected) { + if (!userWidgetPage || this.isCycleDetected) { const rect = this.getLvglCreateRect(); return runtime.wasm._lvglCreateUserWidget( @@ -478,7 +431,7 @@ export class LVGLUserWidgetWidget extends LVGLWidget { runtime.beginUserWidget(this); - const obj = userWidgetPageCopy.lvglCreate(runtime, parentObj, { + const obj = userWidgetPage.lvglCreate(runtime, parentObj, { widgetIndex, left: rect.left, top: rect.top, diff --git a/resources/eez-framework-amalgamation/eez-flow.cpp b/resources/eez-framework-amalgamation/eez-flow.cpp index c29de08d..1e8399df 100644 --- a/resources/eez-framework-amalgamation/eez-flow.cpp +++ b/resources/eez-framework-amalgamation/eez-flow.cpp @@ -1,4 +1,4 @@ -/* Autogenerated on December 13, 2024 5:53:17 PM from eez-framework commit 7dcacae5b4b7936d36d1c7257ee51cc53e895925 */ +/* Autogenerated on December 14, 2024 11:41:16 AM from eez-framework commit 48ec9b6f2bcdc7677b3f9485f6e6dbc07fbad732 */ /* * eez-framework * @@ -4177,16 +4177,16 @@ void executeLVGLComponent(FlowState *flowState, unsigned componentIndex) { NAME = (lv_obj_t *)NAME##Value.getWidget(); \ } else if (NAME##Value.isString()) { \ const char *objectName = NAME##Value.getString(); \ - int32_t NAME##_WidgetIndex = getLvglObjectByNameHook(objectName); \ - if (NAME##_WidgetIndex == -1) { \ + int32_t widgetIndex = getLvglObjectByNameHook(objectName); \ + if (widgetIndex == -1) { \ throwError(flowState, componentIndex, FlowError::NotFoundInAction("Widget", objectName, actionName, actionIndex)); \ return; \ } \ - NAME = getLvglObjectFromIndexHook(flowState->lvglWidgetStartIndex + NAME##_WidgetIndex); \ + NAME = getLvglObjectFromIndexHook(flowState->lvglWidgetStartIndex + widgetIndex); \ } else { \ - int32_t NAME##_WidgetIndex = NAME##Value.getInt(); \ - for (FlowState *fs = flowState; fs; fs = fs->parentFlowState) NAME##_WidgetIndex += fs->lvglWidgetStartIndex; \ - NAME = getLvglObjectFromIndexHook(NAME##_WidgetIndex); \ + int32_t widgetIndex = NAME##Value.getInt(); \ + for (FlowState *fs = flowState; fs; fs = fs->parentFlowState) widgetIndex += fs->lvglWidgetStartIndex; \ + NAME = getLvglObjectFromIndexHook(widgetIndex); \ } \ if (!NAME) { \ throwError(flowState, componentIndex, FlowError::NullInAction("Widget", actionName, actionIndex)); \ diff --git a/resources/eez-framework-amalgamation/eez-flow.h b/resources/eez-framework-amalgamation/eez-flow.h index d196d52e..df2cb58a 100644 --- a/resources/eez-framework-amalgamation/eez-flow.h +++ b/resources/eez-framework-amalgamation/eez-flow.h @@ -1,4 +1,4 @@ -/* Autogenerated on December 13, 2024 5:53:17 PM from eez-framework commit 7dcacae5b4b7936d36d1c7257ee51cc53e895925 */ +/* Autogenerated on December 14, 2024 11:41:16 AM from eez-framework commit 48ec9b6f2bcdc7677b3f9485f6e6dbc07fbad732 */ /* * eez-framework * diff --git a/wasm/eez-framework b/wasm/eez-framework index 48ec9b6f..88de271b 160000 --- a/wasm/eez-framework +++ b/wasm/eez-framework @@ -1 +1 @@ -Subproject commit 48ec9b6f2bcdc7677b3f9485f6e6dbc07fbad732 +Subproject commit 88de271bf838c027275362c258e7c14f072e6aae diff --git a/wasm/lvgl-runtime/common/src/studio_api.cpp b/wasm/lvgl-runtime/common/src/studio_api.cpp index 75d0b4fe..ca4efb30 100644 --- a/wasm/lvgl-runtime/common/src/studio_api.cpp +++ b/wasm/lvgl-runtime/common/src/studio_api.cpp @@ -930,12 +930,17 @@ EM_PORT_API(void) lvglSetImgbuttonImageSrc(lv_obj_t *obj, lv_imgbtn_state_t stat lv_obj_update_layout(obj); } -EM_PORT_API(void) lvglSetKeyboardTextarea(lv_obj_t *obj, int32_t textareaIndex) { +EM_PORT_API(void) lvglSetKeyboardTextarea(int32_t keyboardIndex, int32_t textareaIndex) { + lv_obj_t *keyboard = getLvglObjectFromIndex(keyboardIndex); + if (!keyboard) { + return; + } lv_obj_t *textarea = getLvglObjectFromIndex(textareaIndex); - if (textarea) { - lv_keyboard_set_textarea(obj, textarea); - lv_obj_update_layout(obj); + if (!textarea) { + return; } + lv_keyboard_set_textarea(keyboard, textarea); + lv_obj_update_layout(keyboard); } #if LVGL_VERSION_MAJOR >= 9