From 7bccb092d1aae786eeb26ff7e3746e3c41105628 Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Mon, 23 Aug 2021 11:14:55 +0200 Subject: [PATCH] [DEV] add test --- old_widget/CheckBox.java | 85 ----- samples/resources/test-ewol/data/mireB.png | Bin 0 -> 13673 bytes samples/resources/test-ewol/data/mireC.png | Bin 0 -> 29724 bytes .../simpleWindowsWithImage/MainWindows.java | 219 ++++++++++++- src/org/atriasoft/ewol/Gravity.java | 27 +- .../ewol/compositing/CompositingImage.java | 51 +-- src/org/atriasoft/ewol/widget/Button.java | 20 +- src/org/atriasoft/ewol/widget/CheckBox.java | 308 ++++++++++++++++++ src/org/atriasoft/ewol/widget/Widget.java | 64 ++-- 9 files changed, 570 insertions(+), 204 deletions(-) delete mode 100644 old_widget/CheckBox.java create mode 100644 samples/resources/test-ewol/data/mireB.png create mode 100644 samples/resources/test-ewol/data/mireC.png create mode 100644 src/org/atriasoft/ewol/widget/CheckBox.java diff --git a/old_widget/CheckBox.java b/old_widget/CheckBox.java deleted file mode 100644 index 2214ce3..0000000 --- a/old_widget/CheckBox.java +++ /dev/null @@ -1,85 +0,0 @@ -/** @file - * @author Edouard DUPIN - * @copyright 2011, Edouard DUPIN, all right reserved - * @license MPL v2.0 (see license file) - */ -#pragma once - -#include -#include -#include -#include -#include -#include - - -namespace ewol { - namespace widget { - class CheckBox; - using CheckBox = ememory::Ptr; - using CheckBoxWeak = ememory::WeakPtr; - class CheckBox : public ewol::widget::Container2 { - public: // Event list - esignal::Signal<> signalPressed; - esignal::Signal<> signalDown; - esignal::Signal<> signalUp; - esignal::Signal<> signalEnter; - esignal::Signal signalValue; - public: // propertie list - eproperty::Value propertyValue; //!< Current state of the checkbox. - eproperty::Value propertyShape; //!< shape of the widget - private: - ewol::compositing::Shaper this.shaper; //!< Compositing theme. - boolean this.mouseHover; //!< Flag to know where the mouse is (inside the displayed widget (if not fill)). - boolean this.buttonPressed; //!< Flag to know if the button is curently pressed. - // hover area : - Vector2f this.selectableAreaPos; //!< Start position of the events - Vector2f this.selectableAreaSize; //!< size of the event positions - // shaper ids: - int this.shaperIdSize; - int this.shaperIdSizeInsize; - protected: - /** - * Main checkbox ructor - * @param _shaperName Shaper file properties - */ - CheckBox(); - void init() ; - public: - DECLARE_WIDGET_FACTORY(CheckBox, "CheckBox"); - /** - * main destructor. - */ - ~CheckBox(); - protected: - /** - * internal system to change the property of the current status - * @param _newStatusId new state - */ - void changeStatusIn(int _newStatusId); - /** - * update the status with the internal satte of the button ... - */ - void CheckStatus(); - protected: - void onDraw() ; - public: - void calculateMinMaxSize() ; - void onChangeSize() ; - void onRegenerateDisplay() ; - boolean onEventInput( ewol::event::Input _event) ; - boolean onEventEntry( ewol::event::Entry _event) ; - protected: - esignal::Connection this.PCH; //!< Periodic call handle to remove it when needed - /** - * Periodic call to update grapgic display - * @param _event Time generic event - */ - void periodicCall( ewol::event::Time _event); - protected: - void onChangePropertyShape(); - void onChangePropertyValue(); - }; - }; -}; - diff --git a/samples/resources/test-ewol/data/mireB.png b/samples/resources/test-ewol/data/mireB.png new file mode 100644 index 0000000000000000000000000000000000000000..a935478e5f8e3ed070e7c217d6c74aa33e912e77 GIT binary patch literal 13673 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 literal 0 HcmV?d00001 diff --git a/samples/resources/test-ewol/data/mireC.png b/samples/resources/test-ewol/data/mireC.png new file mode 100644 index 0000000000000000000000000000000000000000..1d721d3b2d7a794962ee09d8e711e6e0242b0cc2 GIT binary patch literal 29724 zcmeEtbx>SS(=N{9?(Xic2^!qp7g*fg-QAtw?(S|09vp%b+=B-Qm;7F@`~CA(-TU7= zReN^MO!w2>&-6^~sXZO3r0@v|9v>bI3=BzHN?ZjD44m=3zXO1HzrGTaynummig>AM zxu^i$NgbT*%`9y|q%NKgAX1Qrr5PBQ$68H}Wf~!0Qt{g!rYqFhgkya#4^PJ43{8MH zCdb#aTEF?PrsA_h8oC z|E14fM6oz;`B3!SxnO&XW&IH16=~u?W1>zB_u2Q&=eInhe{ApYujR4d=Ubtxx{=RN zm+lS&KNrIviAj&@I0|mWdJLO3aR+A@*nGmrLtZRDpRp){e)rOU`0#40Uix}d81k|S z^w_CO&h+nnyLL_gegEq)=s@9`#U0sD;M(6?=<()Z$LH;HQzf5y-?zJr%()l51^0*t znoZt}pAH|=o>U*RA3N4R#C}*b>PeGv9-F?GyXnX_M$`Q*{Vn#x zn@53j^Y*kQ`(ZZ2=ZOhA55$_B-k;3a!?|@tB?1FmAN=1GPw}+|T*^Aw`|ZZMhNUh{ zbQ_BtaQLrAhaV2DYpZ9VGsrJ;J#cZfz_azGm<4pZS*F?IQ}2%T%6B>a>YVY4qG;GSt5{zZ&%95_#y2`zsp zOA^`MMm|mQ&QCT?TA5}0K4D?=HvFWos%`z{MxeUpSeEO)>e{w}QtCDsNt5d{UQw3& zyUA+08}xcUYPA$w;&YSn$0Lhpv9irp0ly zSu5N;I`c&mwmDx7E(31c&2f8P%k#tdD`-P5=FRZ*ppU`4+2xJkuWP+iU)^^S4coiu zp@DU*BmyfH+x}Nc;I(2d+0{XgM#_F3=wS^=**|tT_mKo=wAr$3PBwFb^(Fbd013p>G;<{i;zCu&g3`^xSedoT5XKbS%WWR3n)ZiF`nbcv0IdzW}DU2 z_s;`Zx+j_L`uX`xdTz}sw^`EGp+oYAruDKc9fAZncq=Nyz=%2ZXrG_Y6>SssDv|?Aqy~GB^{oe{ah%0RY)dCf|AjT zL6=n{3G$8AJ$2FX#huXvYz^!PV>;GE8p3t!ip&Xt9X?}H=RcJD3psU1RpXZEah&r8 zLY)IxjR9Y*Q<>Tl^HPNK?lY^oewDTm2W}gWMWUk19^;b4Gyvq z*o01~8f-;q5AYijn|s<2>#nUMf&orW?6oOB0iZo-uF`=c?#u6t)5I%i3}WJj`n|ZP z!k(8Ik&KM8F-m>2K7t@8=g+i8A%3lnNF_vt=c};dnPx_w6!#|XIxj~vo9$+l?c3Y( ziI7r9bQAR8;4xcHBj!6bAuSUSAwJx%;&NJHR8ak;6Zm4$BZBe=$=01j1?aX>1~ zz9DuCX!SxDZ9-Rjm8)=IRY>Bx*CfQ=vDz0sdQeG^ncjC=-q*fvQgx7cY*N(qLAd5| zt>!C`c|ixfrB5l9B^IG25xx+&I#EvPrVNh z!KUj|IR~@ZfkRF zlY{Ed0G>XHfr*5+Fy)~$Qje_l1&e}KKR(yGpEC~HQu}vkDoF=WfP}}?2$vQ3DLIbe zA>=xaE#qg;&0t{bgm`{R2kA5+&y6j9evo^7r>WZzPufBtZMDG^#%PC_oi9z{^c^?m zkYC(qKZ^{$(J)Jv;#Gur(GdoLGj!%*)I$iSz3rJVS4_16sW^pE%K!Pm zo$W$34HwO;7boGbkBk6M`m6?GmBi2 zhDMkaQY`(b0yz|gr<5#9I$=^20>dTi~hMt)p170-+yoMooaXLg*^` z#9}_J`-3cw+DFvU#zfIHrGN*41OT2w|E7lcuN`%Ft1TIhk!ntSluiMUc1+mhvo4d2 z5EyEKRdSo)9{dziirep7o)CxB@CNa#2Rhj@}$ea%x z4}iM~e2CVWHL`^I9z8HC+&Q)N^%Zco0wg^ncFBOOkt>E9ANY$9;=u^((R8Xaig5?c z(iGZ~edvVn(CRuoBPrbT%9RnYvFO5uIr{IZvT}^VF0Oc`nb#;N12DD`-gst+#6?G_ zU$_FUd4v1&zIa3$xg)`LOe62l_K(sJ<>*D$(`fHfgjp1bNRywHzZUyT=7O3*)BV>HTl)N%s#{fg1RUOcxT-h5}z z)x>m)YU*{UBl8vqQrWZ+;n2(gIc91r@)=o|Y#T{05_S7mACdbS#x`4^d4CXo0b>cY z+BFx*6rr-lYi28UlpKasR3lsPbH19?jc4;rFdke_SBf91Ehxqw=^INs!+^gf670bq z+zhTgg_F@HWLr(p26@kZ71^4{v9Q_^pA04`8+HcdC1l*^k)oDu&0#E$z5Ym#UhC^u z9YM57l(X`ob5^VLp&VRSz_z;5Pn1G8ukVmbksiWI@w?Ih7znw3MxJ!Aw74!}`v{Dg zegDvVfn(L;FcGG9{B2cKmj0<2%|Ns-z-6}euaa5lmcSKSY9;DHo9I|ng>}_A=o;Q$ z052J@5a*^;$V$?qpb9E6>T~8KsWQjajt5#jO=1{aM+y~7vZ2>SL03?x60scS=8RtgY47RO|j^VdYA-8IYX_)^8In6V~0Xb2D9t70e zEpLLjM!j{WVwA&%@$w4tAk{Uo>o*93;M?Kf1%rl48H(4iVRY83d4o+vl3^@TikqtY ztcXe!>HK}Pk_sY6eUinXX@b!xu$n9)YTGCR%D0`}m=YnPD-97k;&o3o0UcsX=PPF@ z+zat$`KK%``e6Q>4hrf3nTg?!0-ui$I92&H36J1Ym=beUO?W}pV%!~={--K96BVqj5v zTTr3`U|ULC}}E-9bFPW zoTUU&5)u{llt0FfgWmy$a6ohirh|(I35IBN(L^Z{7d%d#C|zv*MtoL_<}0ilIo^N< zxuMyhy9i3U2F-8b)TNK0vdH|pd}0?NN?{p297RVwzAWy7!2S>s^h}(1vX+Q;&r<3^stg3B zp?&rdh3Lja_F_9){@U1>;nvtb&^RJeI3A=+fOHxsI^h6pfj#@pbQc|UGe9?m6A<%A z;2!ZAaN5o7mEtDcnI-MiyR-vke7bZ37COVLpM#7f0Qu7wEHScA)M2oVYL(Y!c;YjU%9KlAbCs`+iIcHTEqg&j59Hoj!z`*Kw zO87}v;J7+9fj7Q2Twx+2e|n_MSJ5r&#%62C$W zQuF-_FWWsEsAwF5qS$>x_?&c8hU|`nP*Lw;^Hj4q<;oWJcuukmhiVI%P2r8(?2W4- zERXYv@)_4j#w;Q9Nl|s;?!=~9e@2j*mFgq z+?LgT3{gh^pwOVNk{U=usnE~5PCVREEGGtrIe@W%Cfka&8z3qQg(j8{AMBbemBfl# zJ<}P&FE{s zZdI}{qEwm~=gME* z29edF$qTitq%pd;Hwwv-?}M(!nx-`SAR{I5tSP+YXK#^8hhT^;sZz0PNnM1ja~*e& zkS_WWmaib@krj~)Ib6H~F;{))^mDlvve^s50{IqRNXG;B3bddbb>nE+AvR>ajJthh zbbn2>R#fj@OV-k(TD*S$=r3F{UASq4LaJ({V9!EP0kF^kDNc$s1DTm{ek_@!5t+_2 zjU(sOmCfDk2x->Bo%ljZX1&x)jJ-;m>)ROeXLT?DxGF^c+~_AiS%+OR4Ruz|rfb)e z>jbfJ>?#FFia;eGznnKy!WQ^?C=7WOSfDUK++7rtX9kSkD|z+P{BEEz3+#ahH>Y%Y zBdjtsPeAHLk6mdp2uzrDu?=y2M{k_etuNw>*|rj`9j#3^s71G<+cI#8W?T;2bpPRT zh%5!F1_ROnXFXt&DJ~<9OM3=wD`%S>7dcHoLQy`{fVGuq@V?iR7@MRAyzn+LGDr$h z%|U!OhBapB8!N9FB0Y%Byx*A-oMbqGL3R!OSzC614+=?iCq+0?DUfl9cG)5}X$Q6m zZI(9d{xm_>REDvM+D01_Qye2o{!nnBnX^m%T2;xsg;i}&S5tlA8Z81YL*^C`!ed%G z)yrRs;qaN@9uDCK%TsDQ_%`YgC|{mVkQ)2*_SAZOnJUw{cxyDIj_y0y0HKFVxSlCb zK9bJ?2-#?6_^x2MV`syG%>gQ1Hs+IS@V9*2mA1Jr@Q!oi`^@9ZNkrU1C*}Do&JNb4 z<-~49P_^h0)#DlCY2=*&{1-@pfi~O@;4x(P>w_POx0xpE26+Ko;AK=vKo%wKk8aJ? zYknhfJeTM60;r!8m_k}9CE$%rA7c;+wki;6)@t#&bm&3urp92*{1NR4DBuF92hhF< zff>gA4nx&vXYk5T<0Xv0QL_s9p4l7GF1IBHJ~6W27#XJs<>Mxw(&9aufqWf)u;y1n z)giW{AWE6a3*oc=w$12ckD!q&lHod**H^-e&|+00&7oa1oDHeTsEWQep8yRdW zFhLAPs3;zWtjq0U^x?pQxA=ajDd(tEFo6W}tsNrG_6bGW6ak zW>lh5@iUmp2Iu&WTml_)C9JQ0{sRs z&zp4eYB5C?tH6s}Df|(#;jEgG&*6ta^T=l~dOEz`PJ9%whiX8Hh5F(o?9JP3MwQiA zdq!_Uz_`%I%j@2BZz&=X_xw2en$y(ENyz#8DZz|%FNdLu-V#@HMx6&TWh+fYAw?xL zv`dqQ^KBV*=+zP(I>kP+4uWsS_ZoLhc8|C+C;htxG1u>3kP;RVeMg9{LC`;+Ziq{W zP?cF#OdvB6)uKX0{Lt+)`lx-6!3w9}#>qd^N_fQD=UFQU5w)n5*B`Tpn}i|>>cqs3 z%;n}+s_x6yCz6Sg3^4Lk{zM(tI)Du=@Q#sBvHbdgvI_ATasIoyGQmC;_^ZBNSu0HO z7}}|kAFw#o(j*I=nauI{yB5v`kLRg|wPc?(Cx)t$p3d zF$_*REz&)AL-kzGWA)RdXag9qgX>F_ttPi{SdHr96k6^F&g1q4J$s=u{Ua%%A&~)F z91LioHdG5dEcPleQ0BR({QYT>VkKB}aFgwjff_X!&r6OGP}`(_(K#x`u_{Wqf=xMa z9ucjG&tN_1d5g3K8~($?{$k`ayGRW5wU9B}O65n<5c^B30Xp$$;Wvcfs{`liG@n9& z)@@)=8kp+FjSW%|d_IuMWZ*(I)AI%y>)aq1eVPya+rz*hVEmv}b)eFb2 zKjnZi!r+I$AejUS5Z%VgXsO4s@L{U*mc$47vSh zKzv0k3K|#Miq^55m@@B}pK4T-5iY^W7}9P?17}N|OwyR8@sD5P;MBe=dN8a3?j|&V zl*n!324EftytfSV~ph$G@^41yI^+k#2j){BhY8P5q#Xeo|~WaI;jHmhKk z7xK(7L7mxG_OJy}ELl>cs%rOPpxxbfl$Md5-~{l!?T;y@1kBhOT1K~5zg?4Fezra&E!DtQd)H1$=8ZsQh%3S z2bdv|;nI2_uMUjah4Y6?CDp!MKWom6d|xVOYb)Nlp0fLB!&BHzGM zZ*XH2M#!mM!z0bY87F3g6=r%c?0s>{=}f@jU9ayIb(OQgVA*xehiVBr3%+A5E|M@e z+Hd(P8X=;q+pGkzr23qR(mpogpqb8pnpPR3O!vJg)B5ov4i8?YVW6jAaie}~+h}DU zfo%5|RRHq|W6am`0;2+p0{aoomKul>X?aJ2Zle-#j67S%iHZVnJVY5NUc4EBRH$;9 zA4@=w?K%I*j1S;V(So&c;E-4DV8H-#xnMu~-YGs-JmW8ClT~=JT0whgSBo|CP55FP zQBA@Tz7@Qp1_@zVP;Rc)E~dmmvae2e3V9hHie1Y0w5U3o7MdgXy7%9gYR6A4wNj&ZZZXyLe0~9H&2pZ==jACWi^C zq*kan>)93%}x(Q#3gRQO-%A%s^(BIsrDtoT9{`e>p~4E%Caz(1mBO>E?{4a+AW`ZK*s- zRt{*)kc~g5g`q4%q19i?@ptkyad+@FifKvuw!WA}0YRiOUpPvSIcFi$%Wl8R%RTb6 z86FYBb0cmwCK~JoUfRcw6s_!?x<<3j^l8fHgos2g+lfSVpSJ&;+rJj=arR>YZZrKn zPIlE5N`|;95;fb;{x4)_s#DVPuiv#TaqHHN265fB0|+WfX;rw-V<2AndP$P%rkJgK)Jr+k z4-iB`121Hxx*|;5yh2C~J9x9!2J&C7kML?EY}H7+7VOh3tJ?KhX*R6cRlUl> zC9_@S4yKPG+9eTeJ>MTQ?&k@7qqQH0vgzjDb&wXLCFRAF7Wuh5-$mEyow)khHh zu|i*|xvD~l3uC_1JI>Y5$z#%&3SO6*YobV+M~Is|49Qjwn`QFw^y(>L^$w&BuyVD_ z391YiQ$Yp?{M6PyoU?cL-ZyVE#QAD%*w;Rp(U9+y|FhHP+YCF_wlPXkz*kotFtZV@ zH2!suxPpMT)YS76F}O-@j(JqvYaCat>dbtW@a6Evv6Bp!0Dg3R{SOv(p^C_^pmX&V=3Z^N}U-6AaYHEHfs1D5S6cFW1Age zwbjJOAX1RT?q`q;r-$~IaFpOSC24-*{;rgEp8fQG_&Vsi0wCL-R7PE9z&i*ZW`T!$iG_ph~ z%DNaej0KmXDFoCEDmIGEXD<);E?rT4N@{6G-br~!`^t{WjrTwMDEL5-Tr5=C)dt(N z=q8JOltYI+Ro%Gh>d_-4A)op`k;GugYX>aG-JzXgX4gNNaN8Ks)~E>UKnb_1zuZV? zljB+{2{>y)B(|64wA}BpYK0?b(DTUFc$lQiWas1Qpx_&5<3JgXNs{L1U;`-e)!?Ww zsVLNSvSt`q${1huZasIp!yxv@cKEny0E~DUuL7D2?M#`K&_1CMZGOT<+nc)n_=Kv^{tfTKOj?i{;YvWNAg;t(XnMBlI zP2}~YQ1<0?2|$SU&bbX3bY!{?C?l}v)iFBF%D%mdDxES2Q5v(c`GSsKB@ro;-x<|P zN~@B_k{DhTkh~`)#+L=DAQrC3Hp0>@BDhy#S}_=0wXSdr0Y56NCg}Z;x5Ok%pqOu| z>F|hcEjMW?L`2r!{(bt|=-gjx3Iap^ApD63j*TvS5N2$ecmP|NE>xRi3{f?8VmS}SPJ-|RhkkVG zGmI8uR|H!XZ?S@{ZJ0PC$~7j{IqC-J4yChdil?HrMsz|Yz0pl{Ao`$J8raOW2ZNUt z)pWw|wswLUuxN(W!$SEWOQ5UrThBUnkpXGF1^7|*i)s(uZ&vP-t>nBu39W5E%eVB> z`wJWx&WmJp%kNbtg(L(C(D+4s5>cJw^!fkB>kpRuQBg5)S zQA1_*6mX#lTtxqJ2A5F+iP9-uC%Y=ZL*&DgQusp+eXdmUVuV1QJUCKZaQO zmbQLnk%;$I>W?BfZRYb0xfaM+6X{DnAH^(w+9g0o%nN8R6roeWH9!QAs|}8Z)x2n| zXhYu?5+L+j6|O+xZi)0Z=#h%>UgPNF@89$;Nj(qRRbRF{XMWkXz=J(LxfAsp71b3< zQlar&&ahU;Dus~B-RYit75QhM-^-<<>nXc$w4HoOjcgWA{mmq>BoX5Q`V>8^v8p`M zPAytr+h@zgr4Zn>;lUb?U$GE8J)1(D?n(;vpfMJN?nFGj2|XcTqjCp#HRheu%4NAw`AP`C$g8@z8b`c8Jy8>X-Le zrsAc)m#$-}p$Kku{He#zmLCcF0;?J3NTf83p?2p5z{Xh!tX7#8g%qVv`KoJ699mnB z#8NIEA=+GSQ{uk>mYzx@VwUF9_Vlltmf?365C-ni2BgOPnEObweRkmP~=oHLq516ZX z?zoqLa-xosZnK`6)U;nlAWTQBA;Zhhz-ko+%t@|XbN1?p&iraQTT;pxTCGu16 zL~g4?s^8F1CoC$+<8iWxT!wmteZ77h&l8GVaIL$Z4WZwAQF2ov*dWYWaEyL$TEC%K z>{MxG-yefJ_7;6G+D;d%GH)j&sC>l$*I1t=Nf}w8 z+lE<_QvV<>@LRhe#Lb_$NUrJjRjg@&(w9dO!x<=D_a=Fy(O8wSEdeXf`58E{@&chp{H3E* zqS8`x#QuVTy3lyk6=k=dW@}^^J$-M9juvWsEv9h=tS-GGJg)T`O9RZZEm7k0$a8@& z@6KIZ$kRP(T+J)o8jL1Xhg=h$d~zbnz#;dvIH%9|Ipp)!{mrQ?Ep(~a?9<_JI7%Ej zM`yh}b&M&Jjf83E0JUA<^{fsojR91TRll zHjmw)gJ$$0NEWP?7iEgFXeX_C?nu=0xUZ7o)b(DeXNDuuGR|evXpF2NPR>DXCygEZ z9P;dJFnjc07{7wPHq}f;#?nQ#VIz#`(*jXjiBUy$fs5LDb_@&yuHc#!GbI`%8f|#> zaDhq-UzeMwOe0Vv>hR?OMLS9AT~hhCc=Q#OwO~Xsh|`uV-mdOt-`Vhgo`PRK5aMvr z^}c>W3!bly&;EK>yT1PYX~E&*t3`;#eiyw0e!C2U5rj(M98jz-v3W=^9xq=&Ey~{T*e^Mdg48x&!b6^;^T~exXfd zLw9$Wx8Dq}lDTksGjGRCRzxa9gyUwYz9$iP=IdgVjHN}wz3OM}3p=?m!K#`>*G@m= z*YbXON$zyCUJLGSM|NdvD!F%JyT8!^Irk!J*35}A32C<( z0JJw-)2pX%y$Pp1VAD_wn}-y0-6B?y4~KSD)ivNYt3PM37Q`SSWUU%qsuGRPlDkCJ zS(;$|P>Lo@~`NdR(_Hy=3c&7-- zTn%_#XHlkDu0U~{O>VtnDcldfZ?(Qjl{ z(hK2P5_?6S07wL-&B*shp6KH!nj<J7o%Mk7o-((&)rqeELXp`(P^CbsAn6; z%8r{b13RN4y#2V5$Z|)QGV$|}I>If_+?$R!5@d5mOCq$NFZkt#x@+$F5l^5$zO9=3 zth;x(+GBsr~x*H)gP+xSu(*yo}S2G1gFumbCF3DB+T7 zUat?;Gs!qa()>LbH zFSqucjmpnfIb(`e1V6i=d=X){mYJf9?z0>5TW9R$p7Q<%EGfkBs6r=B>|{`6S>sFH z?{!Vou4`qrvS~km)h2=xbk&u8C31ppo zB3GcjHEQ}&WK;DDar6PMKxLV@px{(^;CLI3Xm&*A6pH110MmRl)N9!hzn#?`&Zt7g zkP#K5Qpm6I6+Y@~g}wLlMjOQ&G%O0mYLUgG5Z9z{sS7X z%eT($$Q-GxJrFv`&O8V~kRf7cNTD@*y3J$RA{CS3D{MW%%Ci!-a;wigK60M~Le*xL zz~v&0N-k4`t>F-kbUj-tp&GP5@zqUTDfd85;YI<%? z(WA@SKUAQmA&_l_A)7BQ!IHaLBk>Ow!9e+W{Eim#?4ESX1u#_2uys?gvm)n!i=))* zBpluQ760DKZ~W-VK)MB)Nd4oHIKqXe5N(YWyJG1?IFLmyW0>m%T}O z38OdsxzZvpneblPhea_RWX@)NVsx!R>Nw%A!gJpFilV>#sGgSM8)1uO*8Dv z!7U%9>T^@zpx1c4&pGKgNFFenTdnc#_ky+3Sg= zg`{R!ANA@dE%m@a9aknR9O9e`jRg3aan{w7HvB6!nPuc#M+OM}iunnc$)5P_EtOJZ{>&^AK3rg5T4zLot^Pze6M$$8hh#I=UO1n=OQ!m z^8gq4j{^(oIkOylKjb8CcnT(BF{z&>t-GFVMHcjGMsZs{L9u!VM@pMtcYw2eJ$buv zJT9iQ>obI5-GT|=qzEgcMtgLo88vdOhSS5ZHAb4$>Vj+jz+2g(M&Ow3HgGu;=;OQr z`Q$bq=i^#y`Sw}UEJl6aliby-ImGLAfpQ^tSbeEMJNB`T-Jkxn(!QFX_Dqz~VMn9I z`GpMINLKAk18E}6J+J(?!FgNG_$umK%B%C%!mVN1VTljxw0Dx?6W`FB-m*x#A4)^D z@$Z%m4#piP)QUJ|kWtp+<_W>a9O+@KM@W|HiqVkv79bu)^AG}y&e zQLEnePcootCWa7yl#3icvh3v6c;upFfe}w-=*u6|UD3O3BX0G%rPbkGPeGu?M})H6 zgtrw6FWY>*9&!P870C^D4L3=3u`U!MWgnhcZZi2G3CxJ>Hbu$_=zD$1t{8S|rt{cY z6C$+BH7$dWye<$;wUgmkv$dx!4`)pzeW2T&+B$X5RA`O(C^stWPxU&u>exHMNL^s- z&5F%mN0UEBJs!F^)NmKKc~>7m(m4~zHXlM*ak?P$N>xrdT`Em&9aNG!ZKzSy*GEb` zQHxD(G=Jl)M^@nTI5>RK$!-4zt9R+`S0l)C;O%!VRFA;f(|b`C6gaTjLi63g9M-+X zU-yg017bH*r@LLV<(EybNN$2Y=1AQq@nJT6>j(gAlXq4!4Pr$L_x;z{d^P%c#=F7> zW{Dn6D|BU<;pi!d4OuO&k^GKXs8#P?$G0?<`8KCiyM6kK$J~b*@Dx6Ol>CLK85L$I z9{*DCSoYB(A^5?HuK=_PD;s?N1o^QoBBH2Wqs5bxE_3QWdAY5%eOoqGej9ayM7x~M z{K$~AwVINq4keM0lCHLWNS!Y(`?pt|`~2;RsJxfJUfnDg#=&1Hs6S_FsY4z~66uJU zoo&eS1-^K*e3x3<0R%%63#)r{c6F4i)Nt#Txa&|Yi-cvp!A4ZE%L?PC-oDoqng5T) zM3xRNCVz^FgknUH16To2m)(OjO4tm-Wd%YWH`{M}VYun_vbaHd56O+G-3WtIig_p1 zhGtBQ4i1E@v|X#FlAbJC#nDi>O2WpxZp1zeA>H>=IM%w1&wB3#O(B+IVoK6tV*jXL zdN-8gn-Ala(Nc0c$bYWSsx3s z4p4~j3NX?#E)`Cfqu%E0z1Z11)lV_^%zJjerR7To7f$p@I}VfR77^^RJkEKD9IB?J z8$KL1fzeNROgwFzu+Kq2MiAt%DOSB11{ycajye%E6&9c?qJ6?tFY+PVYaH~9Zqli3 zJP>+95aY82Wu9_|qmGfMC4>O*)KiqgLTPL8>8MqjNp7xC_%HU6J{VU&2Qzk^DnWF44l2KFZOQ1rBpQ|3AVRUaha6vJIA_$ z&wF0IOINp0=p&q>y67qY)S2O1zSom!$;%F79)>ZPD&;$>~ZXG;D-7+%nW{~f>< z3=fAV?&IgMJ z(1C@GnU%%XmgV0yoLwZ`-a-EE(Eq66toB}($D#sqws&|7}R9m3S)pZX52 zPBwpqV`{TY{o|grxDfdt`~0T%CYGlBe|5QloW^{{Kw~C$ zb~7N;d!LVq*ObeQ$;6bE-2}+aW5UJ8`)^RvcFrz9I}^|!sCRH?%Xb`35HFV*7bh1J zFOL~F6DJplhsoIVy=Tg5%)@2M&I#n<;P^KPMJLPmtOVNpyH|gpOy8kEJbb2{9PF%2 zKr>b@CQc4cb|xSQ$olS_u?Y`{DK{IB$=|#&HQ|@Ecd`Y(FQ=s~&>Y0#U}yf9jX#9* zizrD8k+UnTgvkH6 zMEXbbukc-wzvsLv$nkG?f7=2!mVZr=lKz#p{6Lex8F2=>flU80 z^se`}DH98zojK@zfB!w9{xNR(KP(nEFDIudh=YrX1Ncrer!hMx6OfIAjmgY}hnF45 z$;!&b{

YC%Ut}nTtEn2_$0v9_f2D?+Nr*G^DhDQAziozPMX}{_w=g&c?*b%f!m9 z#?Had%FEBm%fQOc&&o>9^7nvQ{_N_1L@dbie{mxCm%zUr1Mhl&8+$)q-cKu*e;!wV z=j;!S{~z1m*W&-9g?H%x8u?%G`(L{LOV|I3f&Z28f3xeqbp5Xw_+JVCH@p6y(FOmn z2Of~!`>!DP_s1D~o=vLvMJXZy6UnC z42%>^T3kfUW9>ZG+ecMm^X*X2*-0^rQ~pw(g|ns^6F#+zmXTDLHljQrX!l|d!ax&r zcfIPneyHubsK1fd9x!urrDIqwE7DO8hzL+icWTmGgTU7Dl4X&eZkCZ@PEP zZk~i=qCD25c%;vy=PsajwM ze(bm496W4v+#6+uce*`Neq>}tw6?Lq%z~b1v|g$XoB>T`aWPK7Pn9$@pbfD;>ctTY z;Y+&OuD7EJBNTnZ1we(E?YQtG!9e;j>$cj!6_I|5BMh7gB8@05ElpS+0EY-{uSg(^ zXGgqQv#uL3lqmWZlIZT`^^3s18+GQ%lb3^oBZiR^AIV4L@dSw? z{cAFfxvA+#>ZQ{=py>eXB+2iq@I=3h%*@QIMTsO+TJE1skXDi><*Achone{u>lvd3rGZORi-hMw{4iQ|< zmB{)EZ@r6ePxP8iWzEgaX&QKfwr^T=Y9NvCW}x~%#Qav>o*=!&6b9jzK|z2Q@KBeZ ziC)s5H8wE{6qem8g5c<-{NG={rM<=c?H7Vg+1(g_B=%!s+EK55cXk*N!ZBHdT%0rk zfCiuxg@SOzAXCN?N5Bo+;hknlGscyi=af!*>0_Mu_3Br*{QUzB+0hUV6gt^%-gbIN zQc_Zi3`kEeM~z;c786Qj-FZfcQhJUvc8|BNA&)*bo#cbz;hop3-v<#?294_a@8`_v z6J||!x3|r$t^BzPA~$&e%0cCCeQb!yX=!OWIo01Rc6WEx=&|aW!Rbv!%}=jTnDR;x9v-+7qop1NuyX(dh`BXe%anf1PP_YV%NIJ2%^KG=~%iBMAiX$qO_B~49DrKJZi zPd6G>SQTiItnjFj;t~=PCS!5(GBQ#8=b<+8%{nz2Rk`dS8C_jnSJ%7MCUfWxCbo&x;KvV_8#X z(IXIV>ooFNYWn&}mn5|56S0ye5)#la&daBFIyJ4Go%p>9jg5^VX+7_I<2}2nlP$Lu z$!exf?*=Cz!SXe#AfcA*E-|l`cILs-u-Ta*GU=K}<}U8McFOQ>y?VZy25F|eukplw z0%*)pkc_OrUzs^$qstv(4VT*ZPa3@MQ`qOl!<)=0GpXozqwk>^DC35`htS;CHY5-_ z$5}IfT$j}yWMJetDS=M?c#E%2KBl6tuYXl`bmx^-3JfoD>v|1F5k~#7a*~v+=zGKV zf<)E)LHrhOg-}F12*qHDnBN7^+b1tCuis*|xKyLNlPgfBkgKDn<}%foOsTD+!frWN zOoj;n+vc6N;T{VBgx4ZP75;E~I(}#Ovml>~`b}KT;dCwo3ro1KA^BGvLm$Vt->+8+ zJ=)sZ4;y_iTWv1hFA(G9Mmj2L7~ladPgw40Pq{K8$WzwKwTo6QN4XBT2C-4m(eGv} zRVtKhZ;RCE4<|D@9CwE?XcPeWZxjiD&~70UEdztiYVD@oy**{y5b+X~sk{$;?d|Q= z)o1TKSqMQ!{-3taGAyd@4fjKeh;)pA#4v({bf+{(_|n}eUDDm1(j_1QN;lFuAW|YF z-QC@1`M=I}J{|qwuo?DVGpzNj`~Ka}Y#n&VcF#{YhUDJAmtJ@}1s4|f9Y}ly&LQZ2 zWT>M<_6--_wHsoT24)}$5m89Ply}QvKE&FoVOeUph6<7c0hNbbtB$+3;d- zM!cDY3cc=4A`>(7@bIv(_mu;fe&8%(M*Zt2XwQh(Ha7B)H$Ud9GLW$7XXWO$`#t(z zap}Xw{vZ+m$`;UINY4KTEgvfxvy@j*xWC!0P_m`M(Wd^| zH2;+rKq|mVe*XlPumw)TMjF#kYX>EiocF!mmz9_$%l0Uvp;d3^Yl|>Hk8k3Qg9RPEBjK4=g z8kWGM_oMd97t~gQ2Lh+2ySy-p!1hR~g6qyn_7xPU|Gx{W6e)(tj~p&Ed0(F_u|znM zzgJM`btHeFS?%omen%ws@bi$9fJ_|0IviM`lL!YhCNnjaq{YAUP(ax2K-XPFIYA~k zfb7^QAt&bnEaUE?)WP+mn87yB?q{7f$wRip^mB6MK6g#%WAB^#z-!u_vBoYGmG92Lb7Z%sD5sF^4jqR|R0%S*JUwH*yXTmR5&9Js-@aiksQG7cSSUKozoMl* zm~YmIS7C{dyOLmh(s>i*bdSK!Q|U<+IOHVf}!>&(8vUjy;D=0I9VSY zL#I=U8C=({GM2PCjK!;g)z0qEHrO9-ZM}6R-*<6wu~}@Jw`-umlOnKdxE*9^m$=>U z#j>@vHSoPQE5)`l{x3M-?b57$ds#_|Xg!(SpFe-RZ}%J6uJa_ZB9Fi-Jj%nyRg&=V zxV}E!Ou(SY1`@B;>k{S_qjqsHKl|rTumrRTtdqT&nkR2$dRUnT4;EURi;Cz{FeMoX zBbN%M+Ub3@64lnnhes@<>WK-pik6dE>xEx~ERW`Q zS5L*UMkxI5Hm9OVGJ!H|UcC1WN0O72?A@(+e8}KA?IW`{Gc&`vum;QhZ(aMDr_lXl zs0|yX$J$sJg*KlAbFN?8=DgeE;;0)8KjPt{!B(Pp?2}YMx}e9&!~N~DfjroeSI#5d z8q7M#jv@sHzo`Cga^75O?$oL=53xxV&kUd16>>Ys`rNp0#Cz`Q;?j{C03Yx;-QeQn zMBSa-cTG)6x$zeEU0k4+!hnW~Pih=V-dG2%@`4Vw@%oN+C$!5CoNrcm?ZWxjc$rOu z@aI~weDG2SKMw6)c|YXk(jux@d7OvvXZD3~^C~OYB7;1dkFUK!J!x&_y1Hj&Wc>c+ z%a`hEd||N~vApmp#;&v=urGDGnn&D3yog<8U|=96B^|Y%wnXVZ$|5iL+)&*Q-+4Cr z_b+LS0=DrdP^H+}*%L7AY4s~E!P2x;Fy>79^hxk6ivWMQAME|lMe2gWWgW;z1|kkv z6P1{{%FD}9o?ufkO7yQ|whH4#97%OM&H>-E%o8lx!~Nn#D7AV}JccxC(tyj!nyjfe z21R5(2RoKbFb{V7;v@LQzO*F^x}x{=!EfK>$6t>5+}1|X^bCfc!5%BU?Id{?F}i!6 zlAKJPDUMn&(I>t7?@(oZ{iG>7b&xn}kdY>*Yp4>fSnkN>yxStRwK$fPZk7~N3Kd=~ z)&BmzQD5$3SG3 zFq2dMX`U;!(-6sPGcS2V>P$1nyESAu*ZQk9>xOiwu!rsy=`nTNek2D%D9_h;bW^UO zdcht7iLB=iB>!WP;W(`!S2$OP#Xqnh&dKfn+3?33&FZiMB#55g_D-k$2EyXGwl*}C zam{3f5Oem&$6eG`dDm&w_nd3%>p*N{Cd$efu-f!Rzd*q*(``Cg@H)KTDu`S1>H^dG z?+e9Z6?U{EP0^(PJs)c{D41TWUs zIWd;?TiOuZcRoUsV|miB7JXK%9>f%lmss%kZg-&cBxz6I!HeSAsJmAG&__%$f~PRM z@IQmh_ov}5k4>QQ^Sj6dPjL}XSdPw8t^BaG9F@2VG?Iw=kKsI`m#9A)cS>9`WO_4+ z3NJK5efH^F5_X!NbHf^>Oob>3D6Q2;#%k)G^YOpmq+nQ20+-gDYBLFpp~WRi4&-=M z4bpAb8<{BBW)>FXoO+s?7~ms-V#_P2VP-(_uJ*-{=?2?EL+cwK@uar`uID4%o*ZDO zafcj*sG!u5_bUw{L9DFVT79$hDWP42-HoMUdC)HZpu7+K0s;b>j%&|YT5z-YaWQ`7 z2$4PPz!LhISe02IRCIK7z_nKzlucImNr|w3_H!Wew-6)uUD`rfLaMYH|F)F-fb}4V z9WBoF1afpMYPB<+&hbQzR8mQ(l{haIIJV!Gs1lheGVs&Qkz5hKhqrj4^7Hfatsll| z-Tk@%c0fvBI(PtEgZSQGRb6i}nCL|il!Du?#eL(~X9KE{G&UOh(k0u!R#sL(KBJ^V z!KdJ@CxZ!XE%BVl5!FmB7~Qj2nImSEBw|(2R$N$U%wX!PBw8aVaU&Z#xpHvOI({Aj zhgBUxcSig+RcKV7)US1A$&FUYVho~4inX`lP$_TW(eVNa7@@y>=;Rh&ck~dgI4l^g z+h5a0R4NFn&qVBK>MKDS0fS@28d)WbQH7@d;16AOfQ!BU^o|FjZps{@~ zd6TbSVNhup@EM!776bf3M3&;;6~2>~kB%d${K(eL`t~aNt32&9*MqH{YM-m+52nxWjtfPF>5qb#@v%R7fPjo1Jr+?2}|8Db% z*Mdh$Py+T-bJ*&}t(wJ8>8mw_&D8Hao|CD|>#_Z{@QCPqAme?k3c?S?m!{aWGZxP%k~It$k}=wRAqk#Xlbw zC&azP`=pX_iKEW*b9y2iSoiq=l=a8^MGNYh##_5?mG|@QF58sNKg4*M>65<)+3L_H zUGsGk|6+}%N{@%nOix3}f5$U{4bs7~JM=k@@YT})3~MPdi$2y`U{Ek{3BZXopkTYY zy4p=UzLIO#q=HE1UNZj7u{@e0` zJ?c+a*PY0NlCIjs`Fd)65nS=zFQs)CTjHY-&tW;f82JK20$F2KzHdW%nal4z=r>>4 z7mz%BYVKJHzPqz`XsLcy&+ArHD4UeX9j4gM^(Aj}?e2D_#z$||jfmv3bgX!_(ML~@ z8u_)&q9U5t&v`gG_ZC{o*x5pjK(W1FiDC&v8Izt9$eY?l!|1VOuM8(J zau0~Y3*X}U_mB$rZD=4=4V~B#hGpM?g9`I}jun9$AQArWFLWMV3VSL<)vmJi1wR*h zn&`#3UcJqX97`+V3KkYYgao*PUaKdUDJ^D*SixA9un%b);fD_&A|fJyk*KtV#uA_& zBSapKar~}O*66JOoKx?%K!Sif6ai=b%;TN0F$_Yr_P#q)$#R!kHjt{`b{4(;G*_|6 z1S&PE2UyW7xs>V6Du%0841`JuxA;WnadUeJ;rPZ z$0N58BTa4Xj0r1Sd;2g!$r9DCMMXS3JYhDZrIVt<`KT@t*y$Od|lR;%_FyHh{YS89fS#po9QMWDYWg z%JhVh$&4CZ2Co3zP_xF*a5FN>>okNqjGD3ok4$ZP)0tmq1eL-KmVxJg_7C6%&J}Pzc zJ3Z#q#lu4pC0K$3`R3_096w@k-5A<;czLQ7T-7sY;GGBuMpKh%qhkB?niY#i_V>Ee zv7~eJJfWl!v`>RHmqlUxp1xI|MK%!{3dWc5^*VD6!Q`zalL(i^M>xhIx^m1(^67$+?%cf zlZA(yJLS`-qiq6${~g!YA9kGkruJRfW8IAc>Hu zXuH|@naubM6Z7FzDS#BeJ&{li+RwE$)tBRN#uR zgx5Sg|4a}8t-K+0<7m0NVbQmFYPYPoI1OMMJ-vAV8twtge<|WCNJl4KFh(xu?r?Lq zO^!%TO$8fjJ6O1&G=2H91{N_Wft(5kO-_Y*dCTwpZd5?4o4tL7F7rr#zom`M-u`~_ zyF&K#(u#_>{MQi@py1rx+?cYzXs>Vcz4uI)r%jLn2P9w#noPdu6B;^Vd<6Eh^=0|_ zur+14q>^j1(DV)~mdWeRfbluI2CDQemmh#*fIk7;68g<$ayo*1gBw*?CU)8^Jk;aJSEv06zuB?E1D5=D$aOzjA%Fv{% znD|AxgfKz^F8g!csZM*yf`o(wkr}JY?AAOFhQQ1m+y3f7A~OHeyTYm6URL=M)oLcj z)WK{05Go8&>w|myDQ_vKrmR)ohYYZ*!10ftTxWuT+)<*6HtI5iv&(No#cz-4K?@%Oouwl*m{Nsml?N=oSDQ=?2q zpyI|%v=d&7eJqY?#SPcwDw841Q)Q6c2!slKC5nKlzW$F16O}Y}K^2bw^u~Sv=4nm< zbe$3rC6RwbTq|9G@gj80s!m2SeEF5IaE=iaE;daoC?G)g;<>T=z|WtNzp5Y<>E}fH z{;^8z-z0j{lz_S&V?Z;Wj);m92f|jlIPYDd=goG} z@}U$Q|D)Oz=9})dfuyJ?kSo-cmSQcuM-6~x)LBmfE#e&BX%(k%#O3Vloa?diLUgrx z6z08K)__jF;-eo&&WG%G4qy?h=MAGqIo8-zU0q!Qe4sgnhLd!t6|D57jsQSdCZ?uL zpeYFnO6uwx$L`wN+JN;O1Ne-O3b3xex;nT0Ld*T_WkHPC!^ltB>ZYb^uxNu`_5b|& z`@>0yetlgXm%B+Mbt6ExKL-bc+$ia$Dhx!HMnj*I(JE$vg7;L!bKuu6!e?$fK$&!Q z{_x{>1(oa@fQj6w5E+nSw0V1gb?Slv#} z&Iw4=<+*cnb29pNy);b+iAhQSI|87NOj~O>u@Q*gdYCI=`62xc`QgOWl1iXBy)_SR zqyP~I&0RN+V3##34Gl^<9;{yB^>4}I@of+iR>LLSizjxjuKpR;0pc122>BcSF7G=JBD#a@NgT*6ptKV4qXp7&=tby|Qk@3Hw|fkN%tJimE5 zv+r6nGdDW=7FWW=q+rPW87i_<)7RoK&itvhk?@Td^> zR+kQ#Vxl4wN`m5^I`}Ge5CoV&nS!9S*ZBDM9;>^yu8s}Mq)JnlnIzN*T$?A(A~95A(O$o%?2*fLMCXth9iV}1R2nH+?zA2KGb>YSQ%;rM2zrbkFv zF;X<`6D?zwUp{F6PtI~+B?02B{{7k?;q5Of{EoVtl~V!H+bavl2T~|$06=9?Tuy~u z7ygFXA$ze|O6!ELAL0<=iExGS5#ifCLp%>q9e`G4F5cX;B$fDQxe+hI{s(^YZEf-1NiT(uxjc_u^=eh>)6=f!EF-`u;OiQ6|u-0pL~lic#99 zPoL7#cz^FZnwxLP*pr1BOkT$D_!y{E@9F93 z2e{>ZFB_Pzbkzmvk^dwES%Uc>3rHCITG3jbkfT;g-R%Am?CkdbZKF!X)Gqj{a@9N$ zsr-5zfQDeDDPHF{sV;JtRbt- z-&*>{r{$Z#UdtX3+TsT{|EfQyZx_*f_eox zPU-}G1A6b?{glz2+jg-7y)>1FChQy>l$xH0MHTOj@70mMT|8RrAv~|n7;^~Gjwt^j zGrymI>#Q4WXD?0$S#WH8#5`X)i6DENJJ5#nrI_3X!!=G`Jm>DKoUwU=O|DsMiI>3? zW2>1WG-Y-SCx`qa&fGbwIy^RC# zBRe}gns4-&MmE5Xo1ZOd0`YA>g)&o7oQ@oV^u9l~AT^4FrO#WA^cHrvS2MzF&=y_F zNBS>J-puujm4KdCGBukZu)&9n{wQf^G=Ob`{3>{(jfkG&wMvrh(Z zv?fEoypjm^jeWK{PJ93ws-%;VksziH(+b&&bO|yK>jn>K4-8=1*f=AeH_n5ceq(b} zoR&DMmp7ILxVfUT>e=U>USR(qhSa(_^w2j{RE+QUkuWuWf5fF+a{c*<{^+2FW^I`G z_Z|teE=I0CEMd-d*0wW}1{kE5S$|iLF;3LKeE91l9{DD9aQTvST?HL+U$03X6Qc&n z3OK~qD?hkgI1RDu>#raq&G5aQEysIVj_)^x_8>j&D%Hc{60ptV_yk^FW?M6lO-Vz9 zVi>5I#ny4;?q?=U!MYaG73K31om1giB3KK+K~l@VHnj@tJ_cEJC(iD_1_mlY8B6Ft zr+0M9SW;5*UA^pPcJYDO$tEe$m;>6@aqQXuy|C~(_fMa)I-+Qotk=qNx81z2_RTM> z6*qSk>DDY4|1)SGHQhm3YW~a}>kU$Q911~<$02QX^~s=1mL?=L8ylNB&^cy97W5Bw zJ)e0St^cTzM1Rl~a(nmi)RNG>W^n>x(BhsuK*(cdZKx`cH*52|#^TV0e=IhF=Xt92 z#Z1jJeu2V*CVZ(|MO;O?j~9Ej!^2OIaH(bIG$pdLadP-L=C{8{c}RZV*YsbE(`z&= zt$5@c%pa1o$7Qm%v~=I=LMvE|+bFj0w|TeL?fAKbe!@35?wpI_swXubh$eRv%@QGkhu ziZH7MKKI;;Gy_=@)-ufVV((=AY;w|UW+wI1&mhQI9)G}F<)5-!&Q~$+RK+5iHUZy3PLpa$>478 z{MSz#rv&PnJiO(i(62>k@M5>Tuq{7CSX*aiXX$>*^2U};IJ|FJ(9zNE%aqqnk*x3w z>=e6U^k`jJTFMg#4NxDjowfPVTC5Y8i3zHMFhaMLorY4duN+zkCAZH#lLk-^lU{+| zI43^S88)oZ+98{TiHUQIShAV@nSmhshbe_FMGyL3ktxpV$)EwXZ**rjh59TuhecDn zU>En^Q^o35R#yHyI}7?Q*XTJF=(bkgd?ghf8`e}@F;iLAYvt0;>h^5@@nh*9Or&l# z8UPZUiZ*C?Sn@VRF5qaFL zXb)YiG~M}A0+iu@GpS5kfkxkIED(%@*8>BzF&l!Ss)z$95f18!Z9OcBe!`B#%>0`! zGvl2zXf)yAr~&+^rG@;V3E2KzVIS>y6?;X+*w357&KvSonoRxvpxMPYcZ9BZ543cF zW);7a0lG1PWf`M}sJ#oO#9x1Q?Z>xC*G`fkn#RT6{9y%O3TO(-6oMx2M|q&dxsZ}*1`eL-hr(8IIB;)orJ{WyI)@N{*%ET{9>C%VYO4@&cObVyQ7%E~0%c+4AW zm`Mz0{IsL{Sp8QUHGk0)A|*%4z57k1Q0APqw@XmPwCeIsh(gJ}VtTiCRQiofaJY3x zb=p*vRvA9zp(Kb`1@Qu?)iP!30!z4|M&71U?(YLZw=M^< zCuS~tv^CG1ms1z(hcKBX)0e@2yT#bLplu|__M`oFi?@D3h;zeW5{?ymEwV| z#w6|I 0.0001f) { - if (gravity == left || gravity == buttomLeft || gravity == topLeft) { + if (gravity == LEFT || gravity == BUTTOM_LEFT || gravity == TOP_LEFT) { // nothing to do - } else if (gravity == right || gravity == buttomRight || gravity == topRight) { + } else if (gravity == RIGHT || gravity == BUTTOM_RIGHT || gravity == TOP_RIGHT) { outX = (int) (deltas.x()); } else { outX = (int) (deltas.x() * 0.5f); } } if (deltas.y() > 0.0001f) { - if (gravity == buttom || gravity == buttomLeft || gravity == buttomRight) { + if (gravity == BUTTOM || gravity == BUTTOM_LEFT || gravity == BUTTOM_RIGHT) { // nothing to do - } else if (gravity == top || gravity == topRight || gravity == topLeft) { + } else if (gravity == TOP || gravity == TOP_RIGHT || gravity == TOP_LEFT) { outY = (int) (deltas.y()); } else { outY = (int) (deltas.y() * 0.5f); @@ -46,3 +46,4 @@ public enum Gravity { } } + diff --git a/src/org/atriasoft/ewol/compositing/CompositingImage.java b/src/org/atriasoft/ewol/compositing/CompositingImage.java index ca9cfce..b337f17 100644 --- a/src/org/atriasoft/ewol/compositing/CompositingImage.java +++ b/src/org/atriasoft/ewol/compositing/CompositingImage.java @@ -8,7 +8,6 @@ package org.atriasoft.ewol.compositing; import org.atriasoft.egami.ImageByteRGBA; import org.atriasoft.etk.Color; import org.atriasoft.etk.Uri; -import org.atriasoft.etk.math.FMath; import org.atriasoft.etk.math.Matrix4f; import org.atriasoft.etk.math.Vector2f; import org.atriasoft.etk.math.Vector2i; @@ -29,19 +28,12 @@ public class CompositingImage extends Compositing { public static final int VBO_ID_COORD = 0; public static final int VBO_ID_COORD_TEX = 1; private float angle = 0; //!< Angle to set at the axes - private boolean clippingEnable = true; //!< true if the clipping must be activated - private Vector3f clippingPosStart = Vector3f.ZERO; //!< Clipping start position - private Vector3f clippingPosStop = Vector3f.ZERO; //!< Clipping stop position private Color color = new Color(1, 1, 1); //!< The text foreground color private Uri filename; - private final int oGLColor = -1; //!< openGL id on the element (color buffer) protected int oGLMatrixProjection = -1; //!< openGL id on the element (Projection matrix) protected int oGLMatrixTransformation = -1; //!< openGL id on the element (transformation matrix) protected int oGLMatrixView = -1; //!< openGL id on the element (view matrix) - private int oGLPosition = -1; //!< openGL id on the element (vertex buffer) private ResourceProgram oGLprogram = null; //!< pointer on the opengl display program - private int oGLtexID = -1; //!< openGL id on the element (texture ID) - private final int oGLtexture = -1; //!< openGL id on the element (Texture position) private Vector3f position = Vector3f.ZERO; //!< The current position to draw private Vector2i requestSize = new Vector2i(2, 2); @@ -87,15 +79,12 @@ public class CompositingImage extends Compositing { this.vbo.clear(); // reset temporal variables : this.position = Vector3f.ZERO; - this.clippingPosStart = Vector3f.ZERO; - this.clippingPosStop = Vector3f.ZERO; - this.clippingEnable = false; this.color = Color.WHITE; this.angle = 0; } /** - * draw All the refistered text in the current element on openGL + * draw All the registered text in the current element on openGL * @param disableDepthTest disable the Depth test for display */ @Override @@ -185,13 +174,11 @@ public class CompositingImage extends Compositing { */ private void loadProgram() { // get the shader resource: - this.oGLPosition = 0; this.oGLprogram = ResourceProgram.create(new Uri("DATA", "textured3D.vert", "ewol"), new Uri("DATA", "textured3D.frag", "ewol")); if (this.oGLprogram != null) { this.oGLMatrixTransformation = this.oGLprogram.getUniform("in_matrixTransformation"); this.oGLMatrixProjection = this.oGLprogram.getUniform("in_matrixProjection"); this.oGLMatrixView = this.oGLprogram.getUniform("in_matrixView"); - this.oGLtexID = this.oGLprogram.getUniform("in_texID"); } } @@ -336,42 +323,6 @@ public class CompositingImage extends Compositing { this.angle = angleRad; } - void setClipping(final Vector2f pos, final Vector2f posEnd) { - setClipping(new Vector3f(pos.x(), pos.y(), 0), new Vector3f(posEnd.x(), posEnd.y(), 0)); - } - - /** - * Request a clipping area for the text (next draw only) - * @param pos Start position of the clipping - * @param posEnd End position of the clipping - */ - public void setClipping(final Vector3f pos, final Vector3f posEnd) { - this.clippingPosStart = FMath.min(pos, posEnd); - this.clippingPosStop = FMath.max(pos, posEnd); - this.clippingEnable = true; - } - - /** - * enable/Disable the clipping (without lose the current clipping position) - * newMode The new status of the clipping - */ - public void setClippingMode(final boolean newMode) { - this.clippingEnable = newMode; - } - - public void setClippingWidth(final Vector2f pos, final Vector2f width) { - setClippingWidth(new Vector3f(pos.x(), pos.y(), 0), new Vector3f(width.x(), width.y(), 0)); - } - - /** - * Request a clipping area for the text (next draw only) - * @param pos Start position of the clipping - * @param width Width size of the clipping - */ - public void setClippingWidth(final Vector3f pos, final Vector3f width) { - setClipping(pos, pos.add(width)); - } - /** * set the Color of the current foreground font * @param color Color to set on foreground (for next print) diff --git a/src/org/atriasoft/ewol/widget/Button.java b/src/org/atriasoft/ewol/widget/Button.java index d98cf5e..ef94b62 100644 --- a/src/org/atriasoft/ewol/widget/Button.java +++ b/src/org/atriasoft/ewol/widget/Button.java @@ -38,16 +38,8 @@ public class Button extends Widget { private final CompositingGraphicContext gc = new CompositingGraphicContext(); /// Periodic call handle to remove it when needed protected Connection periodicConnectionHanble = new Connection(); - @XmlManaged - @XmlAttribute - @XmlName(value = "config") - @EwolDescription(value = "configuration of the widget") private Uri propertyConfig = new Uri("THEME", "shape/Button.json", "ewol"); - @XmlManaged - @XmlAttribute - @XmlName(value = "value") - @EwolDescription(value = "Value display in the entry (decorated text)") private String propertyValue = "Test Text..."; //!< string that must be displayed private GuiShape shape; @@ -102,11 +94,19 @@ public class Button extends Widget { markToRedraw(); } } - + + @XmlManaged + @XmlAttribute + @XmlName(value = "config") + @EwolDescription(value = "configuration of the widget") public Uri getPropertyConfig() { return this.propertyConfig; } - + + @XmlManaged + @XmlAttribute + @XmlName(value = "value") + @EwolDescription(value = "Value display in the entry (decorated text)") public String getPropertyValue() { return this.propertyValue; } diff --git a/src/org/atriasoft/ewol/widget/CheckBox.java b/src/org/atriasoft/ewol/widget/CheckBox.java new file mode 100644 index 0000000..047c28a --- /dev/null +++ b/src/org/atriasoft/ewol/widget/CheckBox.java @@ -0,0 +1,308 @@ +package org.atriasoft.ewol.widget; + +import org.atriasoft.esignal.Connection; +import org.atriasoft.esignal.Signal; +import org.atriasoft.esignal.SignalEmpty; +import org.atriasoft.etk.Color; +import org.atriasoft.etk.Uri; +import org.atriasoft.etk.math.Vector2f; +import org.atriasoft.etk.math.Vector2i; +import org.atriasoft.ewol.Padding; +import org.atriasoft.ewol.annotation.EwolDescription; +import org.atriasoft.ewol.annotation.EwolSignal; +import org.atriasoft.ewol.compositing.CompositingGraphicContext; +import org.atriasoft.ewol.compositing.GuiShape; +import org.atriasoft.ewol.compositing.GuiShapeMode; +import org.atriasoft.ewol.event.EventInput; +import org.atriasoft.ewol.event.EventTime; +import org.atriasoft.ewol.internal.Log; +import org.atriasoft.ewol.object.EwolObject; +import org.atriasoft.exml.annotation.XmlAttribute; +import org.atriasoft.exml.annotation.XmlManaged; +import org.atriasoft.exml.annotation.XmlName; +import org.atriasoft.gale.key.KeyStatus; + +/** + * @ingroup ewolWidgetGroup + * Entry box display : + * + * ~~~~~~~~~~~~~~~~~~~~~~ + * ---------------------------------------------- + * | Text Label | + * ---------------------------------------------- + * ~~~~~~~~~~~~~~~~~~~~~~ + */ +/* +public SignalEmpty signalPressed; +public SignalEmpty signalDown; +public SignalEmpty signalUp; +public SignalEmpty signalEnter; +public Signal signalValue; + public boolean propertyValue; //!< Current state of the checkbox. +public Uri> propertyShape; //!< shape of the widget +*/ +public class CheckBox extends Widget { + /// color property of the text foreground + private int colorIdTextFg; + /// text display this.text + private final CompositingGraphicContext gc = new CompositingGraphicContext(); + /// Periodic call handle to remove it when needed + protected Connection periodicConnectionHanble = new Connection(); + private Uri propertyConfig = new Uri("THEME", "shape/CheckBox.json", "ewol"); + + private String propertyValue = "Test Text..."; //!< string that must be displayed + + private GuiShape shape; + @EwolSignal(name = "down", description = "CheckBox is Down") + public SignalEmpty signalDown = new SignalEmpty(); + @EwolSignal(name = "up", description = "CheckBox is Up") + public SignalEmpty signalUp = new SignalEmpty(); + @EwolSignal(name = "click", description = "CheckBox is Clicked") + public SignalEmpty signalClick = new SignalEmpty(); + @EwolSignal(name = "value", description = "CheckBox value change") + public Signal signalValue; + + // element over: + Vector2f overPositionStart = Vector2f.ZERO; + Vector2f overPositionStop = Vector2f.ZERO; + private boolean isDown; + + /** + * Constuctor + */ + public Button() { + this.propertyCanFocus = true; + onChangePropertyShaper(); + markToRedraw(); + this.shape = new GuiShape(this.propertyConfig); + } + + @Override + public void calculateMinMaxSize() { + // call main class + super.calculateMinMaxSize(); + // get generic padding + Padding padding = Padding.ZERO; + if (this.shape != null) { + padding = this.shape.getPadding(); + } + Vector2i minHeight = this.gc.calculateTextSize(this.propertyValue); + + Vector2f minimumSizeBase = new Vector2f(minHeight.x(), minHeight.y()); + // add padding : + minimumSizeBase = minimumSizeBase.add(padding.x(), padding.y()); + this.minSize = Vector2f.max(this.minSize, minimumSizeBase); + // verify the min max of the min size ... + checkMinSize(); + Log.error("min size = " + this.minSize); + } + + protected void changeStatusIn(final GuiShapeMode newStatusId) { + if (this.shape.changeStatusIn(newStatusId)) { + if (!this.periodicConnectionHanble.isConnected()) { + Log.error("REQUEST: connection on operiodic call"); + this.periodicConnectionHanble = EwolObject.getObjectManager().periodicCall.connect(this, Button::periodicCall); + } + markToRedraw(); + } + } + + @XmlManaged + @XmlAttribute + @XmlName(value = "config") + @EwolDescription(value = "configuration of the widget") + public Uri getPropertyConfig() { + return this.propertyConfig; + } + + @XmlManaged + @XmlAttribute + @XmlName(value = "value") + @EwolDescription(value = "Value display in the entry (decorated text)") + public String getPropertyValue() { + return this.propertyValue; + } + + + protected void onChangePropertyShaper() { + if (this.shape == null) { + this.shape = new GuiShape(this.propertyConfig); + } else { + this.shape.setSource(this.propertyConfig); + } + } + + protected void onChangePropertyTextWhenNothing() { + markToRedraw(); + } + + protected void onChangePropertyValue() { + String newData = this.propertyValue; + markToRedraw(); + } + + @Override + protected void onDraw() { + if (this.shape != null) { + this.shape.draw(this.gc.getResourceTexture(), true); + } + } + + @Override + public boolean onEventInput(final EventInput event) { + Vector2f relPos = relativePosition(event.pos()); + Log.verbose("Event on Input ... " + event + " relPos = "+ relPos); + if (event.inputId() == 0) { + if (!this.isDown) { + if (KeyStatus.leave == event.status()) { + changeStatusIn(GuiShapeMode.NORMAL); + } else { + Log.verbose("Detect Over : " + this.overPositionStart + " -> " + this.overPositionStop); + if (relPos.x() > this.overPositionStart.x() && relPos.y() > this.overPositionStart.y() && relPos.x() < this.overPositionStop.x() && relPos.y() < this.overPositionStop.y()) { + changeStatusIn(GuiShapeMode.OVER); + } else { + changeStatusIn(GuiShapeMode.NORMAL); + } + } + } + } + if (event.inputId() == 1) { + if (KeyStatus.pressSingle == event.status()) { + keepFocus(); + this.signalClick.emit(); + //nothing to do ... + return true; + } + if (KeyStatus.down == event.status()) { + keepFocus(); + this.isDown = true; + changeStatusIn(GuiShapeMode.SELECT); + markToRedraw(); + this.signalDown.emit(); + } else if (KeyStatus.move == event.status()) { + keepFocus(); + markToRedraw(); + } else if (KeyStatus.up == event.status()) { + keepFocus(); + this.isDown = false; + this.signalUp.emit(); + changeStatusIn(GuiShapeMode.OVER); + markToRedraw(); + } + } + return false; + } + + @Override + public void onRegenerateDisplay() { + if (!needRedraw()) { + //return; + } + //Log.verbose("Regenerate Display ==> is needed: '" + this.propertyValue + "'"); + this.shape.clear(); + this.gc.clear(); + if (this.colorIdTextFg >= 0) { + //this.text.setDefaultColorFg(this.shape.getColor(this.colorIdTextFg)); + //this.text.setDefaultColorBg(this.shape.getColor(this.colorIdTextBg)); + //this.text.setCursorColor(this.shape.getColor(this.colorIdCursor)); + //this.text.setSelectionColor(this.shape.getColor(this.colorIdSelection)); + } + Padding padding = this.shape.getPadding(); + + Vector2f tmpSizeShaper = this.minSize; + if (this.propertyFill.x()) { + tmpSizeShaper = tmpSizeShaper.withX(this.size.x()); + } + if (this.propertyFill.y()) { + tmpSizeShaper = tmpSizeShaper.withY(this.size.y()); + } + + Vector2f tmpOriginShaper = this.size.less(tmpSizeShaper).multiply(0.5f); + Vector2f tmpSizeText = tmpSizeShaper.less(padding.x(), padding.y()); + //Vector2f tmpOriginText = this.size.less(tmpSizeText).multiply(0.5f); + Vector2f tmpOriginText = new Vector2f(0, this.gc.getTextSize()); + // sometimes, the user define an height bigger than the real size needed == > in this case we need to center the text in the shaper ... + /* + int minHeight = this.gc.getTextHeight(); + if (tmpSizeText.y() > minHeight) { + tmpOriginText = tmpOriginText.add(0, (tmpSizeText.y() - minHeight) * 0.5f); + } + */ + // fix all the position in the int class: + tmpSizeShaper = Vector2f.clipInt(tmpSizeShaper); + tmpOriginShaper = Vector2f.clipInt(tmpOriginShaper); + tmpSizeText = Vector2f.clipInt(tmpSizeText); + tmpOriginText = Vector2f.clipInt(tmpOriginText); + + this.gc.clear(); + this.gc.setSize((int)tmpSizeText.x(), (int)tmpSizeText.y()); + + this.gc.setColorFill(Color.BLACK); + this.gc.setColorStroke(Color.NONE); + this.gc.setStrokeWidth(1); + this.gc.text(tmpOriginText, this.propertyValue); + this.overPositionStart = tmpOriginShaper; + this.overPositionStop = tmpOriginShaper.add(tmpSizeShaper); + this.shape.setShape(tmpOriginShaper, tmpSizeShaper, tmpOriginText, tmpSizeText); + this.gc.flush(); + this.shape.flush(); + + } + + /** + * Periodic call to update grapgic display + * @param _event Time generic event + */ + protected static void periodicCall(final Button self, final EventTime event) { + Log.verbose("Periodic call on Entry(" + event + ")"); + if (!self.shape.periodicCall(event)) { + self.periodicConnectionHanble.close(); + } + self.markToRedraw(); + } + + /** + * internal check the value with RegExp checking + * @param newData The new string to display + */ + protected void setInternalValue(final String newData) { + String previous = this.propertyValue; + // check the RegExp : + if (newData.length() > 0) { + /* + if (this.regex.parse(_newData, 0, _newData.size()) == false) { + Log.info("The input data does not match with the regExp '" + _newData + "' Regex='" + propertyRegex + "'" ); + return; + } + if (this.regex.start() != 0) { + Log.info("The input data does not match with the regExp '" + _newData + "' Regex='" + propertyRegex + "' (start position error)" ); + return; + } + if (this.regex.stop() != _newData.size()) { + Log.info("The input data does not match with the regExp '" + _newData + "' Regex='" + propertyRegex + "' (stop position error)" ); + return; + } + */ + } + this.propertyValue = newData; + markToRedraw(); + } + + public void setPropertyConfig(final Uri propertyConfig) { + if (this.propertyConfig.equals(propertyConfig)) { + return; + } + this.propertyConfig = propertyConfig; + onChangePropertyShaper(); + } + + + public void setPropertyValue(final String propertyValue) { + if (this.propertyValue.equals(propertyValue)) { + return; + } + this.propertyValue = propertyValue; + onChangePropertyValue(); + } + +} diff --git a/src/org/atriasoft/ewol/widget/Widget.java b/src/org/atriasoft/ewol/widget/Widget.java index 9dc0c7a..83646ec 100644 --- a/src/org/atriasoft/ewol/widget/Widget.java +++ b/src/org/atriasoft/ewol/widget/Widget.java @@ -88,46 +88,12 @@ public class Widget extends EwolObject { protected Vector2f origin = new Vector2f(0, 0); //!< internal ... I do not really known how if can use it ... - @XmlManaged - @XmlAttribute - @XmlName(value = "focus") - @EwolDescription(value = "enable the widget to have the focus capacity") protected boolean propertyCanFocus = false; //!< the focus can be done on this widget - - @XmlManaged - @XmlAttribute - @XmlName(value = "expand") - @EwolDescription(value = "Request the widget Expand size while space is available") protected Vector2b propertyExpand = new Vector2b(false, false); //!< the widget will expand if possible - - @XmlManaged - @XmlAttribute - @XmlName(value = "fill") - @EwolDescription(value = "Fill the widget available size") protected Vector2b propertyFill = new Vector2b(true, true); //!< the widget will fill all the space provided by the parent. - - @XmlManaged - @XmlAttribute - @XmlName(value = "gravity") - @EwolDescription(value = "Gravity orientation") - protected Gravity propertyGravity = Gravity.buttomLeft; //!< Gravity of the widget - - @XmlManaged - @XmlAttribute - @XmlName(value = "hide") - @EwolDescription(value = "The widget start hided") + protected Gravity propertyGravity = Gravity.BUTTOM_LEFT; //!< Gravity of the widget protected boolean propertyHide = false; //!< hide a widget on the display - - @XmlManaged - @XmlAttribute - @XmlName(value = "max-size") - @EwolDescription(value = "User maximum size") protected Dimension propertyMaxSize = new Dimension(new Vector2f(999999, 999999), Distance.PIXEL); //!< user define the maximum size of the widget - - @XmlManaged - @XmlAttribute - @XmlName(value = "min-size") - @EwolDescription(value = "User minimum size") protected Dimension propertyMinSize = new Dimension(new Vector2f(0, 0), Distance.PIXEL); //!< user define the minimum size of the widget // ---------------------------------------------------------------------------------------------------------------- @@ -301,30 +267,58 @@ public class Widget extends EwolObject { return this.origin; } + @XmlManaged + @XmlAttribute + @XmlName(value = "focus") + @EwolDescription(value = "enable the widget to have the focus capacity") public boolean getPropertyCanFocus() { return this.propertyCanFocus; } + @XmlManaged + @XmlAttribute + @XmlName(value = "expand") + @EwolDescription(value = "Request the widget Expand size while space is available") public Vector2b getPropertyExpand() { return this.propertyExpand; } + @XmlManaged + @XmlAttribute + @XmlName(value = "fill") + @EwolDescription(value = "Fill the widget available size") public Vector2b getPropertyFill() { return this.propertyFill; } + @XmlManaged + @XmlAttribute + @XmlName(value = "gravity") + @EwolDescription(value = "Gravity orientation") public Gravity getPropertyGravity() { return this.propertyGravity; } + @XmlManaged + @XmlAttribute + @XmlName(value = "hide") + @EwolDescription(value = "The widget start hided") public boolean getPropertyHide() { return this.propertyHide; } + @XmlManaged + @XmlAttribute + @XmlName(value = "max-size") + @EwolDescription(value = "User maximum size") public Dimension getPropertyMaxSize() { return this.propertyMaxSize; } + @XmlManaged + @XmlAttribute + @XmlName(value = "min-size") + @EwolDescription(value = "User minimum size") public Dimension getPropertyMinSize() { return this.propertyMinSize; }