From 9040fac7182966173c38b29ef539ce6cc894d365 Mon Sep 17 00:00:00 2001 From: Yakov Borevich Date: Thu, 8 Dec 2022 15:46:04 +0100 Subject: [PATCH] [widgets] Implement , closes #7 --- assets/bevy_logo_dark.png | Bin 0 -> 15171 bytes assets/bevy_logo_light.png | Bin 0 -> 15161 bytes assets/icon.png | Bin 15161 -> 15860 bytes bevy_elements_core/src/lib.rs | 21 +- bevy_elements_core/src/params.rs | 29 ++- bevy_elements_core/src/property/impls.rs | 8 +- bevy_elements_widgets/src/img.rs | 244 +++++++++++++++++++++++ bevy_elements_widgets/src/lib.rs | 4 + examples/hello_world.rs | 2 +- examples/image.rs | 35 ++++ src/lib.rs | 5 + 11 files changed, 338 insertions(+), 10 deletions(-) create mode 100644 assets/bevy_logo_dark.png create mode 100644 assets/bevy_logo_light.png create mode 100644 bevy_elements_widgets/src/img.rs create mode 100644 examples/image.rs diff --git a/assets/bevy_logo_dark.png b/assets/bevy_logo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..f144a3a6f114e28e9b68fbed643ccf9c349bb5b0 GIT binary patch literal 15171 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 H^Z5S&`p1sm literal 0 HcmV?d00001 diff --git a/assets/bevy_logo_light.png b/assets/bevy_logo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..3e2cbdf5198291c88253b210066e67aefe21bca6 GIT binary patch literal 15161 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

jV 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 ZSxpzZ&qgB00ZwcqYPYqOD$o{T{~z?%`bz)+ literal 15161 zcmW+-2Rzj8AO9X@X3y*y*_@eu&PqZ`B%3oYJ7nE2>y#Pc>=h{?k=J>(q-A|eBSe@aFI{^Zw_`UAd@ zd+AyDg4ZW6e#2y!YuBl0XW;yTkK3}AXXm+J+@bR@s7B4{ z9h_z__|`VnA5N#CHk%sh82_`KIiQ9T1Pl2yju{{n#7bk!hj|29A#17I)N#jGp~TFR zV{0#FQAUa=dofK-cB!<vj6x3BhAFGC++U`vj9 z{&6Gy@OG>N$2^t=#=?vatV=vc9Vh$iqStO^RB^P?gqkhM>`C4lIlD?np67r4VpVbZ z9GAGUo%YJ)yks_~A( zw%0HYuvP1?0}(R~jg13$4RIGA_;&$EB++}Z^*ekg?{$CTrS<}DjWp$87600UPcY*@ z>yBL=;rjLUDk|(62ld3gd-pn>*3G~=w7rB$3m}eer8wLKG^j$mBD1$M)0~H= zCpR}m6c@1N3|vB;0iTz{!zSECEEiJ=Tx*I`lw z77l&1UhQS#JBjk4{{O=0D5f!YI=!@zcL`crJ)VMudD^dfk50=QWOhc@|Sxr z{Nl-PC@X&uD&+LDN|f0XK;;q$CVV2qQn}ckjCzi?$9l^-cTpVwcrj{_?Q$QI(E(*S zQky~hnI6%^KoK?09z7&@u3!odmTHM74nke)_GW$}cCf)Q(R^7WI$}@@IWJHcdC96M z+FVSYu1&3CeNz*uOgtHd3xG*QVXwhhNg>2p<+Ie)@MJZVjzn=HFP{_~OV&^kfwP;z z6WfZ@HS$nZPu(6s)gGwz zqT)p)t}ale_|AwM|#@1eYji2T5fdf3MvnXSnuf8sALPRzx_%x@Jl` zU;E5V$u94~s$lmy@>%|daB3`r&?7Ea$z*deJOg~|E1{8ilIyEgu>_O_Ybte}Hb~Z6 zY~{*i7fy3B}RC+?GbtpXRe%iEG$^Gp8Uq+&y7|gZMiobo;W@b@S&s zBy{f#qUs*S>lD>*S_j<((Kz8hJ3u?M1F8MzI5DuJIr&o#`3K!D_2`R#sI&8mNkc_= z6wZjK%9lE($p{$$ef%U9r=aWM0u{Gt)nHw?;M~-|s^M(#cjB}T&XrMC-GH-1| z!#>jp@rz^JUf}B^RN_j4zI$1oBrIfi5NLwR0%(=F_39;y}a4CR3(3rnM9|+SirKKgy3?rTO6% zsPE+TN)>VSj-FhqGHKfc^xGUG{E49Ou_E|iv3|-8Usacp62lSt*p63vHxBpfoGQon3pH)(LYclJm|&}EF3%J6u?4l<2}{pc{B z(6&rStx}z-uO~hVj~=+}#ZbM)y7*Z=iq>CFPVW3bV;t+vvGM@*Prk{3X_aU@p0L&G zL%Z97-%y2)>R%lSz-=5emq(DP*zSdU73;aw-}xZA)>N6jw@XV)-S^DQZiM|3*5>Fw z4si=MG27IY-X_EN8jghYivE`+kA4Go&LQNVj|+-ccy#x}iFo3V6g^5w2~HNIGJ9xN%YGP? z4Si<9wo&v;T7BcwJ|2q`xWIa>lKY%$7qB1n#fk<0Wxps=2f`OvSR<=oxr9yw3>Ld z4YqhhdVKPIQIW&M9|qozjco-a8ETHHt@3PCnuz+)BJ46I4}DsQo|zXaqzoOkTyNOy zIXHM+7F$Oshi&(2LYOMrpA;HVth-&+v}qpZ=k)Zg)jP#W|(J zhvJhfBeI^Cp&7hqbgR&TEOA4{!0U>NFx{sWcKUzMCvF;#brXjC{@r~;^)ChbOz&r7 zm${rMunL1F@u6av?z8cBLLS?mP-_Tp;Xyun8{4f_FevT1l3!mR^a07YBMVm`dhM|M zYjXML7Xm|a`J7@DE_|V3v-N?crHwlp{dd}b!b)i2xo|vqv%c^O1hooJ#E(rU)5X z&wTq9k~tAg0&b(upgbc3vewhWVyc;tz1OM6lz9{#ZpNgJyqgu4ttXJ1`uZd;GBkY4kyYPHZrv_>%WmhwMf+MZ;6(9b*=mzPx(1%e*_&zJ6SMf)XR?@hN(ct z)pg&-GeqD*ke~D(C=gStGPG)-3DxBiiTW1pl6t&))c0{nAlZByHr?iSi!4T zOUBS!KTroR`mCGVx|3wc!mFr$#6VInsheTq`bb9*9Lo2IUmr1mVqXv@FW5(Jk6E)8Iy2Mp?<%Xp_V+~sSlPPpN zy&wa-%%?%h%lzDs5%F8lU>?8XIN@J8E^C+;0YU1{%Z;(G=XE*ne5SnacJs5Q-hR{k zi2rOmc2x>Gg-xoew(^9QuIzk$ePiEO<3R=OPkyb(H_3EIYE40f&HO{z*VhNIm(#XT zzgh}zqPDh{!_vm4b&mA-*>@i3zRX^jlHZJqd9zwV7qx}g+;Sf?iB^+G^3;xi#e z)1HflZr@3*vaBqq6Ti`_IlPjDEt$gq^@m#bv|1JvO>seK+|@BW4^ycT!NI3TUW#X~ zyd8E(zt;@!@gcf#DUYemDy=!EtDSoN3BLmr8m%CeKP&3z$88KoD({7-Ux=tU z7FF@;-I3hhs?uPeX%W?D3m6EZcj zx-YTJ(tA|xb(37z2_Ynl*KP+e8@{kt;hOKPF0Vn)Jfez1$ivmM-`J_r&DC~u^b%Y= zJ?EcPqn0K0hLvktThDLmH!%7rNyZe5&7TIQLYz1wH+Ofy7qFyMOO$YKA%h7#?NF)H zn!|FU5&{680GS%XRi?%%{KoxiJYky%DyJl9+M=3kYW9Rdl+NJ)Mz1%l$FAOhe7~bx zA6?b}RYMQTkaIU9YReQ`SB=26jtvj4Suej7KZ9S zP~SE1Bx}=@@psESc<;5GdfikF@Bjsw4XA4JIdw4(qyj|@&bo*2U+c{PTKo5tEon|x zYl{7iWk0l@OYQ2To^jYM7s+tZ+|cOKm9TDp;%^dN!^p2omMnft5G~nk&Re)b5_C)# zdyQjdzf*+8V`h%#MfJuA8Lu__?|pE5>|aEKF41kUJny{y$Ncw%YFauID$MLzL{-q< zGSs*3BJ@ljF)=YG($5OwX6rnk?DNiUhVm;aD&n#K zk}Dxp7)#s4li=VFm6er=08yAp?m47Vj!2_}UKYFp3gXR&Pb#jgWCQ zg(Aq{M=JTQQvY<2T50cHGap}t)O%?@EM?p^&$q?Thn)`a76l|;!LIg~nU)?Lt?{r% z??}MI({bVCZM&xFe9D9nx0Cm@KQ~oq=4mOS)U0f5!h4&7_MSktb4@{6EB!gam+3-D zrdmVb08kzFny$Q#!T#$Yq|*%%@twQ?$v|eWRMv22z<(BG4I|1Z1fAi?V;vdB04cgq zx;9Bz`K3YjRY|FXYqHCi;PXuJI-cCip=EX?u?-M}6nNX|lWE5((JnQ2S!(gTohBnF znZ*aI_ayK?>?4@KAH77KqAg+<`{h@lZp z;L@{0cE3hYhnKy5d+Kgr&^rc2bDHx-Dl)ab4YE{y7K`L7T`{L;8VEci!Zbnvu=k`c z1gK%Is%2!vs}c=b{Qd@)lG^V3!R(TGz=AsP9sX{XamdTB?N_ht}ZtsZu>n|GcQts; z6uU|!u&3o%-RKzFNq7J`vqnpM_M~2K&z-p-9#F?(M$}H46Q_ti3wRPNzYg$^`F^FA-{wxI}l#16V+@UK@4N?!_Sji)V zP-1-a-vp!-I~!wHHBtY}`SOu}xyg8M_*tF13($X6s*J(X(h){w2-ZnVW%7C z8GSos6us3g2xJSjH4JK(LRbe_`Eso25<=?JWnv2EW&1R9=w|R%N9R`mqQQnAm$$Px zhIT<1TwbhB(H%AxP$5VJ(kd8+wyv}*Do^a=(ep(5ds25Ex@IodA9Fccj1ST4MwYrt z8Tx9U=$kym#_ElZj+Q^uDXOuWnB{Eqfdo~ls<34|h3^Cvk)x^Y(l1Z9TF;$hEc0C- zsM&nX!5s(8&dyd|l(VdE?`IrXB;S3aK zq&@=|V846}{kvLgSd?^(M{hxpzrTMXZ%mgs^3VFcw`No)yq>PExOT!k>wlcVu)y;A z`s0$u%?5+IkpnV5dZfU+&Bl@vRFjxhQS6&HZxrcNMfI)p$h>RkZ=Rf#59t`*v0jR`!xu!`F8&b$on05B8Dea!49>)t!ln zsS;mXt7lNmw(;likY)Ocs53G)K~bC}<5<(80sG}}O&XP!6TZEbe5HsU@$gbUAZ;X3 z*f2nDA|Fmr^4=z`%1OM2?kxcu{JzR@=mwc9_KTe19&AL`nVk1Pw>qs(cwt&$PV zSjl&}=`v4x!Oaous`Z3_qveAKKaqd9;OE>J8JgcySKHRc$IZsPhlsBk<$7q|4xU2Z zyEoQdvU=So0&8~jZot!d3P&Mf8DHxkQL=y)hoV~g-GieG*fjcs=pn}#7Kw^CZ=QLc z+7Bs{;XwQ}*=H`__qUp-`bwF}#;@XoAT*6#AN2q03{CqgCE?n)OKa|5hR;tA56jGx zPB|nehW_|FDE*LBxpNz2^^%TX3Beuq?{m)Ra~rh&72E8R79|O&P57t7RuB3!fAAJw zu3udDd;EBl#x|V%+N-I_`T6iMThG+gh@_H+h7-;a*?}=xbj;mY$J>Gu&l0`M7ZhzE z%v6nY0I!mws0&%!7{FpS6w^s2m^jyGN=h%E71*I%8_6oxpQs{TL^De`VfC-}2!zD= zKi~CJuKCjs30kwIMsb3msZJAj%Y0mN#X;t1$v9N`=CGz7Lo8CBJ=$Aag)1+5vG(nU z2z=S7?Q-w*%uF}22Ed)~kbhhTqOrz(;4RDxvb&XVE3wl)kA1CgcXwA(tH0kS z^V~qrf<4vb2Tw6?AySsDc~&Ye6j#r+>-NbYN1KzA^Ay(ht={*X>N^W;CT00MNV=vq zlBOQdY3&~$+=~K~jP2?Z9eCMQ^6F@Xd!6?0Bbu3~LDbzw=IuV%^rAKSL`?)C`I6ar z4@-Q$8Y`#~&NwY}r1suM+g+J??S5B@EGH*t#xl)64n4C1I}(B5E?GAtlPcEl!)r(& zc7;bxm$a)XwUCrg@dcw*V(t_eyO_&CFu1y@sp-h_hurrVf>Z?U=RGMc5ZVQLX-2(# zxtY!;QpiOLUbgDWKP0Gsj$+KG=3iaG=?KB}e5LT|+IYc^9|;QtQq1w*3JvX00E|)V@yUU8g94B_irmOj)7u%v%@v}7InbPGWigEf=cGlDptVxo=W`O+Ty`Hd1?1R5JE?FLXd zJop~i&fqz#I0a!BQr$yxCC*9tu7#aO!PTn_w=!kR7~19q%TDj!zn}i&{jI6LG%Dnh z9{j%2i-uaNUaaqfG(g zN!B|P08%sYmwMt1-KI~33A4L*zXkq`6?$XMq6D(kCSZmCVT-RU+AZ%z8$7zRXyhjI zYULOfkxz5w3J1;i+meyezF)kv+nbYK@_+W9RSy=IWs7fdnK|Hwh4i{lX$?Z(eF66_ z)k2J!+?G?XEy^(T;$|Cf!~erVPfV?wOB;F>r{3G)VbrxHQ;T`MP4)gmc*UqjG+B0>QUvX!SIT z?APz#XT>G1lEF@QnIFj-j-*f)pl3*7Nfw(YO|F?OwN9R%o|QoJIe)4i{~aF{>%t8H z9|#G-FRlrrTF6HB=$%Ir&!4-I{)fBH{5&)o*V<0-HFi9Rrvr87`U_rmz@~cJe{3sl ztHHoIj3ECoVuaS$)~xr1(~_+;Nd(e=7FhK+TQuXGJf-3Ae2MJ_!`^<6f1B%AE=Zf-Xl+!opcLPIBKs zmqZ})V_S7ODNmU%AN;&Wwl6!IIA8BEZHCfs#r|~I*`>BQ&6y$y%1*j%@A~LbOEgyJ zVOTq1i+;!wnuE3*N?Zp@mem=>s~^+ejH8KNRcx2a?R9!z%o%BKXJBMx)HhmYO1Z`h z)+0!08Wb&x)*7h|^_g|!qMpH9LZd;pcYxq^fiHihpN;OX-ivF=S%1vi5to^nneAMA z=}F8SNCVbZR-tJNiqD~2RKv`j-HP00<&(D&bT3 zP-+1)xi1);FyAP-o*Von$TY)BENa=O2P z0-^lHQLKP|sv)qwKR%`F@y0ViXWUTn3-a*nc4-Mr+Ngt@hlff!PW_Ut^j?Gi`gn8L z;cUQ4PF-cv?QE=s%#{TN{<3P;qTho;Vj8DlV5~#e^wJvdTws&7)g3Wwy0L#XH#nP*09jd zTGx>$u%@&H=}JP5@&{rlP0XVDe$Vww5G`GaQC>^X&d*LGnE5-`X?}xr3GruX{mB0-1@dlhG04QToQ(~oc9q|cHUr1eoje@C-+5EA zQD_-qWHc~*5ehI{XWSFjjxqnxAw8M{xei+kvru8iCn>mr2p{U3$zFi0_(6fcUZu}z zKAJ%rz2g2@p*;C$2q^&1m1IDi6%`cxSc;C0-jbJ-`}%vK;z*I0&?KC!cT4VyL$VLG z4j~nBx%jb%*%NR!4X8vvdpFSWV9%@xBykQ6#&NvhnCs zc|N!39=Nb;ByA(4VQQKJ4JNnq8kKO<4!xgZW*8ERU0nmw?H?Z>?+nEC_?Oim?fGvZ zSpWiM7w>(;{s`4+=}|i_7d6YHSQ~<$JW<)o&7cI(%m~UQ zLj?TiN69N8g2b!{Idps9))SzwgdIJbsAk&bEqqt=6{nQjev%H$FDtu#i6@WYizBL~ z<->==UwQxjl#c9vxcdXP0A=eS#X$yXuP#5yrxKCNm`aKJXP70gN|fJAX)!e@i|*G; zNcqiE%Q)>&NQ+%1g^HsURBSCk-!GV#NX3^nqn?1@uz~O8!G5p4e5hR|wKradL8hW5 z5QpG~$wM09;pak0SA-UOe*hstQchMjP|f>xGD|S6NzH75f>We(hvG=evQ# zbo(fk{)5&~(bR6E2Y>3qfoR7hV9&Q=?rajm(mzMh78y(_r?SVv5uYs&cbvamN!ha(+bR z(ehZx~`bxK&=f63)hfK2$+=q$VA>v(`p} zFYonv*4K-fA%$u|wLpG2AB4o_jFbo-G>PRBVhIeDa1xp>D zn~oyt0qjrkbzd@kWkp5*ufqAEA!*Lt(Ywk^G;t&-=?eB ze_$)J+1%q^ACc^y!OKYT^@`-T>jwAL0B^HFBBSu52bnfHMJ7h1p-aDc%+ury$ljB< z?fx{kH(k3FWh`9lj_(8vNRx-JQj+6TUS7UO?Cl-LmB4Oqwx{xidM@&YBk5ic-RyGA zH_bnbi#&S2!)X-^Yg|54;)-{*90|Q&$oU>j%+CIGuUuMQ1o|615zE!}Wo?@2Rqym4 zV!oa=9-g9PtWiLk%^%H@LMe$Vba02@yQ0W$f2;Foo6n664ZtI@n0|HzWuErZVBch% zy3ASwc}SZax7~vUnbi(Dyo4r&r1ld3l65-HlHkSGdkG=F67Ebzlql=09mVv`Xv@-n z(lxoS&>;p+m006fvxNrmnu+?NS%1X4o)YVPtULCSP~TzSY% zjgtrgYTJ4{)^xgLPkndL0$r~YTes#r!Q0#zE^ZL9mLEO6?reOMUj_9q<%(()PoyHy z%opf91m_n@Tu)?3f+wE?ecM@P&)@hZg~JO1D?8mrkII?9SdGzVFaD>oF0MgA#{*fJ znNMK0pPpV`5D^iPa9Z9%NxODEy-dlMZW9(H_F+E%NcxI{e!)WO%=B~*RlA}dnKWq| z3v}zSt0BAWgV=f-sBeXi&CoUx=KRZ@E&}kvn2_yEfTmF-OP`C+qCC{1Ojf26$;){O zilDOHi+BuB5TQlP+|A8x8a>kjwY`Mlk_Kfrbi>HGhcy8v3?`hhzwW4#ri54a24>53 zXdrQUr3IU>!)iRHs`ubFAJ2AsgQ1XcPy+!jRnL9~nAR^yCqCl)^YSZoU^IZKu1(L12@T+Y8QQsS!iOR=BiD3AEDqY78$n~Dl9kz(Fn&5v)5 zyDgZb?as!5DFafJh4$}*MojpTV8~z&YzE&-{apk!7;kAID;-t(1pBkcG;Nm)WSXzG zZPi@2McoTmzk*z3i}vQH!`lb5|h5Z zu|Q!Vjbt%-l>(x?y!^Lwn8;B^1VFMY$tosqt3FSbsByP`2bDMYFJr;+{@m%gYHthuM!6Sf-xhg zYPNLya};IFEuB&SP?S6;ay0$9I7ORm-y!yOe$aN1%)>xE6CQv~KM^YRjpc%?>P3+P zqD@{g_uoBrk^xGp>6hM^pmwRa`Qvwv>oIMBA7NLiA-mR>A~&CQ!?{*uvCq{rI~7-{ z?<#Vrg<{+F$#(WVZakb2k9BqHL zNLil9Ndz(!$3PtG@*H%TW=6_NlyMPH@hpf)*e#wyH)srbS3L4HU!fb{8@uH)%Ja@>!OX_DC&Z?P$?Ie~HYG-Xs{X;(HzuGCqR$`1a;U2S#vP7HM*@ug~W+ zA!@!te%P(FM~=w|nP_prMjQfb7`kkNIFXz(^a7v)e8cF#vxYHWHx<4;=su|<$ zHg&46%nnrFv0t8ohGV^CI3m+}dT#D>O7e}$D?@xg!B*JIvY}HnM(Z5J}-KZ_%r1?%+?Ns?e!yZ&HO zfuDrJM=~hX{@>X#F$9$3+xKYr^B_|QkyE30+DW9!yQ zMy>_G(7tCc)Tb{P$Yr(K1)6P$qxHOP-$uDiW%hM<|aaHyp<9QK`3jI zF%lIa;8B!f*Sen?NDUVy)g(f8$lMT>*=vXT_bn4E*55oSATyyxaAlMPrK~rcYCTE} z#)%oK(;^mq?|k$DoheHwzqHhu3mS26$J=dz*d913FIv?1uX!kJ@(Q3R<b1O@Fc?6DqPZtzd_#AZg zND$Z$PHUzR;o%y~gg64*_*5Ptt>`8^LRMB@?gxxMK#gMrHb^f|0eTB!2=qWkAi}`T z$L_VYwMP&pijpP4dD-Ah#tY=e5j9ecgG+UV*DgSP!zKmlU!lh=a`c*|5C)K+0dkG4 zDq53Z0s1ndc-I4}cBu!P-9g+M`ZszBXQg*-*tF>ifnD+f+VobBGYr+{qpxFtg3LZ_ zgmt+NPhatR$U+w?s_HM!NFjc?>aC3qH3^(Mo<4w9toIp_%b`a9f5<=nyd4(EyFdPO z4bnoo6B#!etd+jDMS=WHfjK<`Y7aT^w2)Ly8mWfymOV6;Mx;g<^8h3~KzQ|==d1yQ zsyI}O$8#mE=Lo^WTU%QGwL*iFlYy-8@OdNtnEb_3QnyU}5PstWtVsijCNy!iot9}j zm#;rL2Z)_iqq-Y{dzQLBs4H=$L(N6t4h0Jxpj$NC6A&~sKVSL4&RGMw^4Xab20fhk zn^Un)CEVPTJ3-Z+B;%(iEdv&#=t+XsfSomh2D|ewAwm;TeU76f15YP z`*!k9T^^VowSNf#`_}}Nfh*mlhHmF}Ux}U@9W8!x&O!=6s0Ll(rYI~>?TcwjorJyzvLS6IrstaC!S8F$E#xXZf30m?y~Y5|41ai3-N2-tuZc5{iEN@TQ%D~FtWnW84&s6Th<3HXE$>KuJ}-SGaxHVPb$ z<@D}Jqi(ES<0(Pl>0^+Z9N`3bO*d0bZwE2!-FE%GvC+)lW^yddga~mz-d)PA``&!I z*=QxObt_bRL{_NgxABg5#_>0hzM; za>&sglN~8cxW^<4Iw~VDG0N!#l|XB`MYM+c?^{%F5GoD-=Sl zlpRhl^`O)8*<&>-*@iM zlzYnpF-uxEWzqh0MX4#;bP~?mLCn)o)~dVQA8JVIlKJ_=q|l}NbQn& zt!_^JUcp@tD++ZER@N_Rv{t*T4Qda+yjuib`vfUC(1FG2^z&XQAm)gqM6L2#KzVPr znh0go7~^r@0?z(mpa`QkqCW)g{2a+Rz6`;4?*YwC+@__;zc`wO5;%6RLF`ZQMc5-t zVa6L3)zvbkjUzzG7DxIu&+9NL-9ma^%0Co=v>Dc&m)E-yqMP8@6(GOM=$QLp!$~jN zg5CD-XJUod@ovf6KEMTNQsUY|3W1hnBS5v=JI|s%K!l3Q%JZMVVIj_=gs%sRI(Jm1J-$#!wJpDL|jxvf+`r z98CCqn*W;P7ixJ4U`%2@AL(a^lpf75Pl3h-T7@>aV*|~Z7yOBCneuO|tA|N2Ak18m ze}v&i{pK}XZ8%_@I31msP)`l>9xBw1iAEH##IDXeuD&RCGR1D&J(&9iqsByQUDECKR7%*XN-vPHF)-7ZI_>N z2A` zQ#e3^HsJE$DU`e#z2k8b1(RphPaTp3wLboWUf!7e?5-4;662chGWkR`9Ld}&nMBKlejIo`-vl@Q# z-lPA}Go{2INp>G=ZGnD#v|U`LmqW`WzWEA9@`v0KkDdVYb57pKBXvj!tSYxQ?d8i* zIQ(r>U7f$O;YguSUdV2D51Luxp`tY~yVDNwEh@-Kvxfq6lJ8f+^x7cdn%A!G?xKlE zK7Ya)lK{KkOH%X*Sr9`TxMy$6Q|cEKgJt#xlCCJl;eCyX+Qz_2BeBm!lzcBN_5cq# ziRASpwgwZm{YCoW>{#FEGh@uf4qPYvC9f6ot1v1Lj*P&iRlNp`bY{}w&KdP$%+LFn z5ZUWH>P944xF8c*w!X4R4@-5=1vA&9c6fp$^EL%{ zz(lzRlw)qxzZ>vyy0(PN&kUsYd^1aCQ}hJ>-LYOg6FYl^bLil>!KT*D!FC%m~K^xMSsC|46ikCMQ1%VU!4G z_n?-2C!>9pqb8eOgJe7&zY8)_DDGIpaD>`+IW)NmV$NPk7P|6%9{Hz`_NO4|G}zyyw3z8|~l1pEYKg>f~bK-l&z z{_r8dO_*^y0oM)pRifLc8%jg+4QU}chg@nSutehTxfrMsB9G331XgG`;)l@y+8=9N5HZ?QDE5nWKmLH%J z+%nC233YmNCZkXW*3myX;nPeI9AgM+AiYs|oRSWb8e(s|fwBf8Gz~QBXI{8^?u&M0hl6r+hffcS%f{IX;ilFt&BtF za~8=trmvHSKmZ_-V(>Z7dwX(n(&BZzl>U}7X`uGQhs4Tv?>6*lX6}G#tE+J$q;`AD zeaZj*_n#7UTT5o#^i8aTMzz(794NinO5YuSe2%)f@W)VCoNZXEHN;YG)p$@ny6Ob9 z2;(@!&1qm{eb&7Y4By)+L+?9C1^zBibs^p+FblXK`KOKMPxK`*X3zv^O;6%uuY*sc#?^L5 zpq*TEJFdi)MZ&7#&wI?Di%CC(jP?dkG22@LQl=}64C9a-SC`0~D_F=LMH`?~G?W%*>vRs%@9*#{1DhA`Y%YfGKHZT8?SvTd-f5uNG$%Egf>D&x zB*Ge(VH51TQN{Y4iKS(u{LD|#Uu(v$%0f1mtFi|0^^h5SPaOF18%xW|^k24v0l!XG zK`BzeSG8av|KXhZEcn%^G!%t{LzdN{f8ep4mt{)|1P#(Ij0w@$1keZjZuoZooG6g7 z%?7(V1X7yP6g5~6Mdzvz?ZwY&2DLoZth+WOC=2@l_Kh95U-pWAXgfGKFt+7_i7DEl zD+24QRD3eHditwH*0_3uk=l5IhxFbPzLRc1$K2DcpOkIXS^ac45r|OhhvPPPJF%M{>4?v2i#*@AOVCCA?j61;WxpP&>P2V-#*o#ukHz;{q7ROle^mXoKDiqMpR9f$ATfX=}P z9ap^01YL5b=*5F5w4d>u@`R|3i6~Lns=S~|zQ&{E?;X-L>4e-@7-s_@ToxO&1 Self { + ImageElementBundle { + element: Element::inline(), + image: ImageBundle { + background_color: BackgroundColor(Color::WHITE), + ..Default::default() + }, + } + } +} + #[derive(Debug)] pub enum ElementsError { /// An unsupported selector was found on a style sheet rule. diff --git a/bevy_elements_core/src/params.rs b/bevy_elements_core/src/params.rs index aafdada..e710453 100644 --- a/bevy_elements_core/src/params.rs +++ b/bevy_elements_core/src/params.rs @@ -1,5 +1,5 @@ use std::{ - any::{Any, TypeId}, + any::{type_name, Any, TypeId}, fmt::Debug, mem, }; @@ -31,6 +31,7 @@ pub enum Variant { Params(Params), BindFrom(BindFromUntyped), BindTo(BindToUntyped), + Any(Box), } impl Debug for Variant { @@ -45,6 +46,7 @@ impl Debug for Variant { Variant::Elements(_) => write!(f, "Variant::Elements"), Variant::BindFrom(_) => write!(f, "Variant::BindFrom"), Variant::BindTo(_) => write!(f, "Variant::BindTo"), + Variant::Any(_) => write!(f, "Variant::Any"), } } } @@ -91,6 +93,7 @@ impl Variant { Variant::Params(_) => TypeId::of::() == TypeId::of::(), Variant::BindFrom(_) => TypeId::of::() == TypeId::of::(), Variant::BindTo(_) => TypeId::of::() == TypeId::of::(), + Variant::Any(v) => v.is::(), } } @@ -105,6 +108,7 @@ impl Variant { Variant::Params(v) => try_cast::(v), Variant::BindFrom(v) => try_cast::(v), Variant::BindTo(v) => try_cast::(v), + Variant::Any(v) => v.downcast_ref::(), } } pub fn get_mut(&mut self) -> Option<&mut T> { @@ -118,6 +122,7 @@ impl Variant { Variant::Params(v) => try_cast_mut::(v), Variant::BindFrom(v) => try_cast_mut::(v), Variant::BindTo(v) => try_cast_mut::(v), + Variant::Any(v) => v.downcast_mut::(), } } @@ -132,6 +137,13 @@ impl Variant { Variant::Params(v) => try_take::(v), Variant::BindFrom(v) => try_take::(v), Variant::BindTo(v) => try_take::(v), + Variant::Any(v) => match v.downcast::() { + Ok(v) => Some(*v), + Err(v) => { + error!("Can't cast {:?} to {}", v, type_name::()); + None + } + }, } } @@ -409,6 +421,15 @@ impl From for Variant { } } +impl TryFrom for String { + type Error = String; + fn try_from(variant: Variant) -> Result { + variant + .take::() + .ok_or("Can't cast variant to String".to_string()) + } +} + impl From<&str> for Variant { fn from(v: &str) -> Self { Variant::String(v.to_string()) @@ -456,8 +477,10 @@ macro_rules! bindattr { match __attr { Some($crate::Variant::BindFrom(__b)) => $ctx.commands().add(__b.to($crate::bind!(=> __elem, $($target)*))), Some($crate::Variant::BindTo(__b)) => $ctx.commands().add(__b.from($crate::bind!(<= __elem, $($target)*))), - Some($crate::Variant::$typ(__v)) => __value = Some(__v), - Some(__attr) => error!("Unsupported value for '{}' param: {:?}", __key, __attr), + Some(__attr) => match $typ::try_from(__attr) { + Ok(__v) => __value = Some(__v), + Err(__err) => error!("Invalid value for '{}' param: {}", __key, __err) + }, _ => () }; __value diff --git a/bevy_elements_core/src/property/impls.rs b/bevy_elements_core/src/property/impls.rs index 640624a..c33d08c 100644 --- a/bevy_elements_core/src/property/impls.rs +++ b/bevy_elements_core/src/property/impls.rs @@ -253,7 +253,7 @@ mod style { /// Impls for `bevy_text` [`Text`] component mod text { use super::*; - use crate::{Defaults, ManualTextProperties}; + use crate::Defaults; #[derive(Default, Clone)] pub enum FontPath { @@ -272,7 +272,7 @@ mod text { impl Property for FontColorProperty { type Cache = Color; type Components = &'static mut Text; - type Filters = (With, Without); + type Filters = With; fn name() -> Tag { tag!("color") @@ -313,7 +313,7 @@ mod text { impl Property for FontProperty { type Cache = FontPath; type Components = &'static mut Text; - type Filters = (With, Without); + type Filters = With; fn name() -> Tag { tag!("font") @@ -385,7 +385,7 @@ mod text { impl Property for FontSizeProperty { type Cache = f32; type Components = &'static mut Text; - type Filters = (With, Without); + type Filters = With; fn name() -> Tag { tag!("font-size") diff --git a/bevy_elements_widgets/src/img.rs b/bevy_elements_widgets/src/img.rs new file mode 100644 index 0000000..9512014 --- /dev/null +++ b/bevy_elements_widgets/src/img.rs @@ -0,0 +1,244 @@ +use bevy::{prelude::*, utils::HashMap}; +use bevy_elements_core::*; +use bevy_elements_macro::*; + +pub(crate) struct ImgPlugin; +impl Plugin for ImgPlugin { + fn build(&self, app: &mut App) { + app.register_widget::(); + + app.init_resource::(); + app.add_system(load_img); + app.add_system(update_img_size); + app.add_system(update_img_layout); + } +} + +#[derive(Resource, Deref, DerefMut, Default)] +struct ImageRegistry(HashMap, Entity>); + +#[derive(Default, Clone, Copy, PartialEq, Debug)] +pub enum ImgMode { + #[default] + Fit, + Cover, + Stretch, + Source, +} + +impl TryFrom for ImgMode { + type Error = String; + fn try_from(value: Variant) -> Result { + match value { + Variant::String(s) if &s == "fit" => Ok(ImgMode::Fit), + Variant::String(s) if &s == "cover" => Ok(ImgMode::Cover), + Variant::String(s) if &s == "stretch" => Ok(ImgMode::Stretch), + Variant::String(s) if &s == "source" => Ok(ImgMode::Source), + Variant::String(s) => Err(format!("Can't parse `{}` as ImgMode", s)), + variant => { + if let Some(value) = variant.take::() { + Ok(value) + } else { + Err("Invalid value for ImgMode".to_string()) + } + } + } + } +} + +impl From for Variant { + fn from(mode: ImgMode) -> Self { + Variant::Any(Box::new(mode)) + } +} + +#[derive(Component, Widget)] +#[alias(img)] +/// The `` tag is used to load image and show it content on the UI screen. +/// The `` tag has two properties: +/// - `src`: Specifies the path to the image +/// - `mode`: Specifies how an image should fits the space: +/// - `fit`: resize the image to fit the box keeping it aspect ratio +/// - `cover`: resize the image to cover the box keeping it aspect ratio +/// - `stretch`: resize image to take all the space ignoring the aspect ratio +/// - `source`: do not resize the image +pub struct Img { + #[param] + pub src: String, + #[param] + pub mode: ImgMode, + entity: Entity, + size: Vec2, +} + +impl WidgetBuilder for Img { + fn setup(&mut self, ctx: &mut ElementContext) { + ctx.commands().entity(self.entity).insert(ImageBundle { + style: Style { + display: Display::None, + ..default() + }, + ..default() + }); + ctx.insert(ElementBundle::default()) + .push_children(&[self.entity]); + } +} + +fn load_img( + asset_server: Res, + mut elements: Query<(Entity, &mut Img), Changed>, + mut images: Query<(&mut UiImage, &mut Style)>, + mut registry: ResMut, + assets: Res>, + mut events: EventWriter>, +) { + for (entity, mut img) in elements.iter_mut() { + let handle = asset_server.load(&img.src); + registry.insert(handle.clone_weak(), entity); + let (mut image, mut style) = images.get_mut(img.entity).unwrap(); + image.0 = handle.clone(); + + // force inner image size recalculation if Image asset already loaded + if assets.contains(&handle) { + style.display = Display::Flex; + events.send(AssetEvent::Modified { + handle: handle.clone_weak(), + }); + } else { + if img.size != Vec2::ZERO { + img.size = Vec2::ZERO; + } + style.display = Display::None; + } + } +} + +fn update_img_size( + mut elements: Query<&mut Img>, + assets: Res>, + mut asset_events: EventReader>, + mut registry: ResMut, +) { + for event in asset_events.iter() { + match event { + AssetEvent::Removed { handle } => { + let Some(entity) = registry.remove(&handle) else { continue }; + let Ok(mut element) = elements.get_mut(entity) else { continue }; + element.size = Vec2::ZERO; + } + AssetEvent::Created { handle } | AssetEvent::Modified { handle } => { + let Some(entity) = registry.get(&handle) else { continue }; + let Ok(mut element) = elements.get_mut(*entity) else { continue }; + let Some(asset) = assets.get(handle) else { continue }; + if element.size != asset.size() { + element.size = asset.size(); + } + } + } + } +} + +fn update_img_layout( + elements: Query<(&Img, &Node), Or<(Changed, Changed)>>, + mut styles: Query<&mut Style>, +) { + for (element, node) in elements.iter() { + let Ok(mut style) = styles.get_mut(element.entity) else { continue }; + if element.size.x.abs() < f32::EPSILON + || element.size.y.abs() < f32::EPSILON + || node.size().x.abs() < f32::EPSILON + || node.size().y.abs() < f32::EPSILON + { + style.display = Display::None; + continue; + } else { + style.display = Display::Flex; + } + let aspect = element.size.y / element.size.x; + match element.mode { + ImgMode::Fit => { + let (width, height) = if aspect > 1.0 { + let width = node.size().x; + let height = width * aspect; + if height > node.size().y { + let width = width * (node.size().y / height); + let height = node.size().y; + (width, height) + } else { + (width, height) + } + } else { + let height = node.size().y; + let width = height / aspect; + if width > node.size().x { + let height = height * (node.size().x / width); + let width = node.size().x; + (width, height) + } else { + (width, height) + } + }; + style.min_size.height = Val::Px(height); + style.min_size.width = Val::Px(width); + style.size = style.min_size; + let hmargin = 0.5 * (node.size().x - width); + let vmargin = 0.5 * (node.size().y - height); + + style.margin.top = Val::Px(vmargin.max(0.)); + style.margin.bottom = Val::Px(vmargin.max(0.)); + style.margin.left = Val::Px(hmargin.max(0.)); + style.margin.right = Val::Px(hmargin.max(0.)); + } + ImgMode::Cover => { + let (width, height) = if aspect > 1.0 { + let width = node.size().x; + let height = width * aspect; + if height < node.size().y { + let width = width * (node.size().y / height); + let height = node.size().y; + (width, height) + } else { + (width, height) + } + } else { + let height = node.size().y; + let width = height / aspect; + if width < node.size().x { + let height = height * (node.size().x / width); + let width = node.size().x; + (width, height) + } else { + (width, height) + } + }; + + style.min_size.height = Val::Px(height); + style.min_size.width = Val::Px(width); + style.size = style.min_size; + let hmargin = 0.5 * (node.size().x - width); + let vmargin = 0.5 * (node.size().y - height); + + style.margin.top = Val::Px(vmargin.min(0.)); + style.margin.bottom = Val::Px(vmargin.min(0.)); + style.margin.left = Val::Px(hmargin.min(0.)); + style.margin.right = Val::Px(hmargin.min(0.)); + } + ImgMode::Stretch => { + style.min_size = Size::new(Val::Undefined, Val::Undefined); + style.size = Size::new(Val::Percent(100.), Val::Percent(100.)); + style.margin = UiRect::all(Val::Px(0.)); + } + ImgMode::Source => { + style.size = Size::new(Val::Px(element.size.x), Val::Px(element.size.y)); + style.min_size = style.size; + let hmargin = 0.5 * (node.size().x - element.size.x); + let vmargin = 0.5 * (node.size().y - element.size.y); + style.margin.left = Val::Px(hmargin); + style.margin.right = Val::Px(hmargin); + style.margin.top = Val::Px(vmargin); + style.margin.bottom = Val::Px(vmargin); + } + } + } +} diff --git a/bevy_elements_widgets/src/lib.rs b/bevy_elements_widgets/src/lib.rs index 361a9c9..3efe076 100644 --- a/bevy_elements_widgets/src/lib.rs +++ b/bevy_elements_widgets/src/lib.rs @@ -1,4 +1,5 @@ pub mod common; +pub mod img; pub mod input; use bevy::prelude::Plugin; @@ -7,6 +8,7 @@ pub struct WidgetsPlugin; impl Plugin for WidgetsPlugin { fn build(&self, app: &mut bevy::prelude::App) { + app.add_plugin(img::ImgPlugin); app.add_plugin(input::InputPlugins); app.add_plugin(common::CommonsPlugin); } @@ -16,5 +18,7 @@ pub mod prelude { #[doc(inline)] pub use crate::common::*; #[doc(inline)] + pub use crate::img::*; + #[doc(inline)] pub use crate::input::*; } diff --git a/examples/hello_world.rs b/examples/hello_world.rs index 6f48a3c..d185f81 100644 --- a/examples/hello_world.rs +++ b/examples/hello_world.rs @@ -16,4 +16,4 @@ fn setup(mut commands: Commands) { "Hello, ""world""!" }); -} \ No newline at end of file +} diff --git a/examples/image.rs b/examples/image.rs new file mode 100644 index 0000000..110acfd --- /dev/null +++ b/examples/image.rs @@ -0,0 +1,35 @@ +use bevy::prelude::*; +use bevy_elements::*; + +fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_plugin(ElementsPlugin) + .add_startup_system(setup) + .run(); +} + +fn setup(mut commands: Commands) { + commands.spawn(Camera2dBundle::default()); + let img = commands.spawn_empty().id(); + commands.add(eml! { + + +
+

+ "Mode:" + + + + +
+
+
+ "Source:" + + + +
+ + }); +} diff --git a/src/lib.rs b/src/lib.rs index ccc493e..e41b7e3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,6 +4,11 @@ use bevy::prelude::*; use bevy_elements_core::ElementsCorePlugin; use bevy_elements_widgets::WidgetsPlugin; +// bundles +pub use bevy_elements_core::ElementBundle; +pub use bevy_elements_core::ImageElementBundle; +pub use bevy_elements_core::TextElementBundle; + // structs pub use bevy_elements_core::eml::EmlAsset; pub use bevy_elements_core::eml::EmlScene;