From be0358a4f11de8bf3037fb3190ebb87c1f0c5305 Mon Sep 17 00:00:00 2001 From: David Walter Seikel Date: Sun, 6 Nov 2011 09:00:21 +0000 Subject: [PATCH] Finally committing my edje lua additions after a long chat with raster on IRC. Not everything discussed is in this commit, but that will come later today. SVN revision: 64803 --- legacy/edje/ChangeLog | 20 + legacy/edje/src/examples/Vera.ttf | Bin 0 -> 65932 bytes legacy/edje/src/examples/bubble.png | Bin 0 -> 4737 bytes legacy/edje/src/examples/lua_script.edc | 182 ++++++++- legacy/edje/src/examples/test.png | Bin 0 -> 22869 bytes legacy/edje/src/lib/edje_lua2.c | 674 +++++++++++++++++++++++++++++--- 6 files changed, 798 insertions(+), 78 deletions(-) create mode 100644 legacy/edje/src/examples/Vera.ttf create mode 100644 legacy/edje/src/examples/bubble.png create mode 100644 legacy/edje/src/examples/test.png diff --git a/legacy/edje/ChangeLog b/legacy/edje/ChangeLog index d100aa8..59336d8 100644 --- a/legacy/edje/ChangeLog +++ b/legacy/edje/ChangeLog @@ -181,3 +181,23 @@ * Add Edje multisense that allows playback of samples and vibrator control and ultimately beginsd to pave the way for more complex audio etc. support. + +2011-11-06 David Seikel (onefang) + + * Lua: Added color_class and text_class functions. + Still need to write a function for setting the classes of an object. + This works for things in OTHER groups using those classes though. + * Add image, text, textblock (commented out), and edje objects. + Very basic support. + * Add functions for set/get text font, size, and text. + * Add function for set/get image image. + Still needs to limit to only imagess in the current edje file. + * Add functions for set/get image fill and filled. + * Add function for set/get edje file. + Still needs to limit to only groups in the current edje file. + * Add full support for evas line object. + * Add full support for evas polygon object. + * Beefed up the example lua script to show most of the above. + Including some handling of size changes. + * White space fixes, one of the editors I use cleans those up automatically. shrugs + diff --git a/legacy/edje/src/examples/Vera.ttf b/legacy/edje/src/examples/Vera.ttf new file mode 100644 index 0000000000000000000000000000000000000000..58cd6b5e61eff273e920942e28041f8ddcf1e1b5 GIT binary patch literal 65932 zcmdSC33yaR)<0Zz>)zY@nsoN1vlF(2gndgBNFXdBLRb|{$O1t~ViMNKut@^41ca~) zQ2_xF5g81KJAw$z=m0v5IF5?TyfVl*%#1>E`Ty$P?kuP?@AEzX?|Ht@raQN5JzJe~ z>eQ*0P(p|UA0n}j9-EYM?BUx5gnU@tBt8%AS5MEcEGIg=C>@6H=IOH*6q~CC z{T}r<2zlZ+GYV(V?|v)FN(jCZ*RUBy`Guc8{>%qxpNoQ?Gf-g9(3fHUk@y}vV|LYi z!V;FBa=Wf%KNM%$>as^vz}P>v%JqH5@cBJ zeYP0Whxb`W@{IrV zKI=(XNTv7LM3Tdv_C8yj@y6=GW#tPhN~X`Ka(5_5bf+XIr@E&taHp44RaR9L<K-&}mU|3uRp}m6R9RFpx2UjdOB?t2qKbU?*!u4R!KooDG==toyl87Ct|QdcYbAM zSwTrY=5rU870j7kR9cl^#o;L~nN?Kj?!ZS>JGjS|6<5v6uPBO6R3U-jR+JUaDJW8h zDJ%g?N~X=JDpFzKGqiN*>@F!Sm^G)6Lo%lgcXGl||q^T9*J+FZ%aQ&2hxApcy9gl1`my-i)%@ zKZljGp?FS3DJBF((6O-0U0K%IT{&mk%%XxSUZT->)~vF59HD};(!vr>u*$xip}9aN ze_GkxA{7Tsc2y8s1fjI73XA}QIAEMFDrlMvXm#$&8TmkKT9KD-0HmbU&5K$wEh~j& zRJdoCRj3leVQPoCyJ|ssQE@&d>goflef{kG1$>6tWrZchC0y9@XH`M`@PJ|S3ky~3 zRXX#@%kwJ$^_*Gx6)O6LMU^GfOI4CX!Isa!Q-vy}`2`rHlK1dIRO!BNCQa%JHKOIu za{uB0-abA!T1NwTrLz{eOWKJ#Xi!naHLc1q{!r-#DLHR^OQZ;LSEKZScfz1C8SbpH?wm2B$7c=67~+l|G#1~ZJG&=jR8|K1Wx7XYj2S!(BM(Z?8kvs{unTbIMxpM}M$;}!(Zsedb z?woOBaz>BMz!*a?Y<5<5<`~S9F)9N{V4%UHb0&?+8agbuGdks>u(LaN%%C9|qXvx` z(V0UyI(Jyc7`NJ_E1<*}?u_xg^Vng7Mvio+XXTE~9g{I=6mN^B?xESEM{ydB%N{Z) zH*0jZJ3Rxa3`!r#3jrIbFnHvktWllaLk5i+G?b&`n}j#>qSHza-eG7)cE*@NBRjjt z=41@c;t!x>)|iaJfEF!5dr$(U7-{h6?6DaSj6(t1`KACvhGnRD0D(dHH&}&CML!$p z@^NxUj{!lvpiIabo6*@lXiU~v&XLS9qX91GCwg!k$AO+`nw9N^m-C31@w)cXfmXb? zmx@C&293mk5R&Ylw^ijUV}3zVIaXYyZ;@+CQdOv$7KM?*%G8trq0}0}B5u-w6p%#xO@Wh{Oj7YQ4K3Ux z9c`*eCEgXJh~$&mq%%shNGaNP#nT`%3okbr(=t}2`mG3kiqK~+J`2(E=i|7^c(p}7 z+Ktqvb5&t94rQsz|8jM-O79G17_|y@C8*`^>1sZC9~M;@lh07B_T%!yM=Vg=&4%o0qx(kStu@$Z;co$Ya#`U0JCJCS*)m47Dxth@ zp*kMNy$tP3FrJ2=8#TOS4(Q59;jmVrUZYPjp18blXgZ)=gRyl6E{B{8Rb(Feae3!6 zw$g-`l%u>1v&>Q9)ab;aDa6>?Dk%Yt=3opCzi$p74nLoPkIv~(0LbR3qi9r}hf?0V zOdZRO+7jTz%i3b(8^3iWbKEoz&QWQ|$M>L95A`hM^l&=1^)<*NV|Rl^(M(&wro6w;GCp zVFl>Rxx@L*d8N(BC52;Brs7?xQeq}r6rkSM#y1a_V~%ebB*Q1Q9CI#-oF|%uRbrd( zTcNq?Y@BY>(2i@tRz9?H%STr}A77{KH9{$R^0E1f;8bX(m~XwbQmw5XXxoot$k(^V zt!XM8ZRJg)2ruE||2j`Ot{exA|FhM<+IOzCe02JCj`KDPRK6Bt9u1?eKcm)v>d$pP zw@4Ze90E>zzNUSejl<8^9bc!KuG669bmf%w@xE1_wYA6Pjjwl&)^jil|JI5X@5{C9 zbkLwx%BQ0p$7qJPjQ8;AQjVbp32(1a_kJ4jn*WSbE5|hqS|yER>IOXjTL{|Eb3Z*= zG4;{EQe6|A=X?f^L0c~K)xdSDCX<}nZk6Vxpc~gOK03S6N-N^46lzQPd8(Whsxw9Zf^CdOPmRYu>iT-Pp}T#)Lp1z?w(C-}H6t-&TU*2Bimz#o zfd(&^1Wsq)x|@sIk~Y}+<}4!fRc>>vcJLE{S7 z_HK0rbC@`c+^%uSX)ph+P-@uyk{;)LnSpc$xqYbBtP-g)%pMyD_L44E8LW(Tn52+mFIK*9&Pb%3Eh`4;3F-n~y^_ z3g5OTH47t*Lofb~myW~V9JCvY zUK$*nejM6tw9UpCW7NMxQO_aJIHA#MFk0ncZr)-j;L25@;4^XTcuNjdF6sw?BD_DJ zb%a`~LB?sqxy)f{9fj|b_}m&Coc`mz<8c|__>aVk)0We5tU5ymN=Kng8&@0E4X8LK z9Bz#ovY4EY$mj&p_6b7V_Pjc%GOaGnlAi%}}%yg$c;Q>0ZI+G64xtvz>s zNjiMe#>e7(b`BTv`e5&*h3s{$OCxDsh_Jb9(#QYEteoQlS+KKGp=46RrHvIKUy~a=~Zx(X5sGd`=Ft4<0VfT*`cWXr&5Ye_Y1+Ok4{1 zH$DSjBV5Kfmw26TeQI;~_&84O>l>B#YcKs=%J@3+we$7+Pr5^+k#BB3b}Q~&S~)E> z2sxKEYW(+cTeW=#Y#g_io z-?r^qOF3ovZiw5j);$n!>$A^4-#c?mwMYeT*VYsEc_W%PsqK}xebnIR9uoK2HJ_0C zewvq}`5N3S*LK-_H=ylQeY+UGJLI;x{r;~KFmgYDL!r&(v;VDQ@x2$1WpK}d&&DaN zLBnU$sQI64?fpAOzEkDhYm;ziO+tQ0Sbd156^WzR_CrG0q!Vebk~a*jljM*10uc#{2< zrLt4v5Yb9LV;9*$@)c$gG5&c{NA{3vz~WEK$YP;d7=x0t(nYczuQJqMq`T-PKzEWZ zCs)W;CJMvIE_wxcohSby%UQ0l80Yn=LNVY!i?J@E|8`O-66p#x5=H2QGC+^Hrm3Id ztc!F-ecd99F>@~2BR9(ax){vDDYlQkLvP3%NdvjW9%7HOPv{CUM%*tBBXt@DSRSdv z*xPv@xtJ~h?)+8FM;GRadGsLptC**ohOyt}7-8mP!WdvwOitlFPqqW6esl#}1xR^q zIJu}BE+(NrM$jz+)`XO?9%Lq-s>xw;lyqU6NgYN~@s)c?|3c55;^)A*j;ld`H$iLSPa1_Ko_lu{cE_Ln6vuu{VgKID{$*wVRM>5W{UeV3U}b;b%x=Z8@1GbX zeXp>ao7vwsvm1BVcX!zTDD1C&*|+KJ8-;zH!oIpbR{Cl)yN-s}$FeWKNRqz1!@fvj zpDXMy3i~XD{n?*=x|v;5*e6c*r$y}QtL%>o`v}cHTEwng9x7c~#4ZnIm;MkcT~gQ| zLfMB3`#@p8SJ>|qc5ySia6Ur1ps@21?EMsWPGM(OIHWUS?A-u%T4C=f>}`d;rLZ>@ z_J+bsdldHUGgj%@6!wgjJzdBe(4=8A+pVx&Pno4%3VX`TcJ2t4b{4W7+wIbhV7A@P zwi(%0g>Bhvk+vvovxU{8Q~hSPX`@xz)PZfZvM2Ab4eMW(HYjX;-4tp4t8D!ev2Iu1l(pV+$3wKw|v66+F1`1>mI>UEi9#*NlH;zHxo-vGD*o6mSkdGyBMUdcGktfI;XHs z9pj`wX0$d3Fq6WJc4knR9?kR$)A=*Gkcp@iAptIiQl>Bg--RxW+8I$8 zZKQ=O*3wS@fB295e;UZ}zOV50lINl{%o-}lvR*SU|7oFkS6 z?#6rfawdwQ(xf9&*bx?|KO)A(eEw^dpLgjzB4?ueNOQ&z@2DAhLr^w$A|}8;UX0l? zhIE1HA;rpOu~^!Jye1t9@tDQCM7~S)(qcg*NvAL0=tk_9Z(P2S?B|Gb#6>xxibc{? z$wHgHQa0r+=iLPN7jO%0#35QdyJ>k9f!UsqY?9eo=Uf zfy$@3G;YWY8e7sZo%U9q9zzEzJ7zRYS3a5k^bF-)nwP7*PD_f}3gsxPRr2X>C4ake zbel4b?&9xlGq490k;GDHwE^;eI49Mx_;yIIW@ozf2^>2>A zJ}rO5zfFn;GYwpBl2tz90N2Y$l$*h1d+viHj@VRAqXv@2k9a+*WYHMbl_vCvpn;CA zv`6=zy?Ug&@Wq8fM+9~G%R1(;;%`8pV<76|g=2-Zz7+@CHKPB}bw?28Y5 z`O%jj6;>^L^z+3_tCdT%i_oRZG0z}M--|u8`Poy}@4giyLtpIJRaC~s9NT%|9UIaU zw_9dT9G`bZ8SN;YJQ1mr5_$CAm%2ph7BL~?F@_|-Tdw!?jJ3tZ$Hm(cViVHIljevg zyRHp-GFE=lyf)ssrbFz8?g>$$aRz2_Sq&Cjl%TYj3edG2G`^|sdT(X zb?VjKyHA`HHf(x)S$+Mo<@JlNz541WpS*hN6CuBT+2flwJ-&4F;-CH@TRwU9wLg7w z>f|-P?v~#BQc^%M14*VAJ)14mYOZlO9i|$i$?0?$YKXxV;L=f9UlS1E5-6iJ;Su4a z#y}z>!rhTVRD{FmXT-8(LH-UuqfRf#28W-YQJ?}NT9pvwLJeyDjOk93fyu-e!8*9C za)$)DKB!ZD!lu{_L2Imj#;zu-fpm4c608xdt1}_W>abx|Iz#Q<>`jp8%Qx(2G+scS zxk&Tne&+hWzJ`q3&u}S+hzEK_9GsCf32*nO-50z5XX}8Mw3JSYK59#$bc*Mw&Ll+} z62nLsjT8b+9Z5$T@9ayuJBOI2l1X&3ah!8<$mGaL$rES7^#S$K z+qy&=Oa`;wVNNi22ogdK!KPqyup`Vr%oPwGnUX*fXrdv;+0n0~e+O4mNb&xLl>AAIyRDxbc;|g?bPkm@78ZO z>@aONuTN=6Ig-+63YkLHB?lSnWuOCTuT)vk(U=4)jfp0FjjAg(H6?&A(->9k=noH$ zyWH^bzAUAhHuX!FPnu^;p@B_xGp;ZHyYjo5n&gx}H;&yqZo;l1CCmGnQB$iJx2OC zS&E&YAd28DHzqgQn-Wo7F4)ofOo_!K-XRhH{^7lLeQ* zGcYDz=+WKTOQ^0{wtPjy=K4)rWarn)z;C`$`hE2sJ@c2(=;<4PV-MgcQ{jk&mF95h zC^0!jKcrgQul2v(3Wr~6fYaqK=wf<0dvq7}V95H-4J(!}mz_71{-6Ct>HFPR^xbd1 zp>Jc<0m5+h4%VoHWP3W>EhZwG4LT9Vm~E3B=50o5-Qd)ljm#iB7-a(Sw}~c$zeRT1 zFZaKmat&{;{JD9w-@XjHefkCp@I9GIk}eJgSxShD>m|V_h{NV?8=c-)IZ~k<=}V_8 z+xpU+3YsH+_Vzo|&MUQa!TD+Lyj^gfE>LRE1G1}7x}QiQ^lgmCK@4=Kj!A+`B!NcR zr8nEJHNh5hdvqCpPbX6cOfB~TdPF(cVWCU&rTxv9;0ue*mk#oWgNS)hvg@9czC#pf z^I(se?IO!%c+SBjNCx{ZU(mSNE7b*)ee2SmrDK#s%A1sXI)(HzVX?3rHrH{S>=Z;w zMEf<~o;z2VxKIdf{z_QBhs(<+_&AI?(DoIwT;RiNqL_3e8DqzMa_N$ypdGoFE*w>* zwu{G~gixrp5Jp(Kup0s_5XzEHtAYgqRxN9bL4fWS^aq=NgpB?)o9o%ydtZumKFj3s zlN+3*!Mwq_Cdd$Gi(p}{&>*09n=gjz-0CFLXu)B3rl!Ez5fV~}!%nbn@hPm{`P5VR z_taB&sX_Vo-Mh-asX@w7E-DxBzDQH?>P}M|luD&WsZ}cJTDpKPq-#0WpW_C@WME?? zBRsBj)*uQE(o!91Fz6%YFgRY+1X`WuD>CUu%5CnH0x8uoP?v^DT^c4ZTQmE|Y|JJK zQ+h=?q#kjpoVN-c4)G~^pAK)@b5N`t);R3Wm4kfd&6s&Oun!}9Jqf`fp)4rO0kLsN zl9+CP+Of&f;J-mc1dP~WIgDX}b|#0z0AIfG=9{YRRpDtvWL1x=kh$QR1b9s@mT$Pa ztiwsTPjjS<6UR&AbqmFX(%jJ6U>%f7uowbQKdg$(mFI+1hE|0wBQ?RxLY9Rt3)@fj zhdQ7;JdeD2&LD%y$t|2wJ$$@=*Rxy4zFtvzZqnD(ypF|1o?idy4{>qtbW7P>_jvujdF7SW zvGK>;?hlVX_B^D%5PaVQi4&li*LcFIg;@w=mUO~Qx(4iCmKvzpNWx^jXoh~g+#i}r zHS5>8nrd-Z&%w(&r*hi_6g7|Pe*Nv~Xd)ePTr&xw*Lma#q6?s%NIdPtdeUq<+C17a zo)*(NbRk2n?e}7KY839HC0C{q#+~nE7f3pA@*_ zkmUAkicr}UK_c$6LHLeYQSM!6TzkQDPE8>$Y$Vz;j`QnN7Tny>d1B`~G*-E+d_VP_ z8I#|9l_zaB<>vqVUHPZmeZE`r@tr%5$HsGwR0pg!s~RbmO!UP1 z$;47)CJg~{Ls-CGdxLpZ^oFoCapq`4Sa5`27>kMwjf0AU3|?22)b*z8e0QOtAVbj9E}jBV5il_p{1&)Aut~%F>bEVqEZ5cJu7$bUWqp~jNCEuy-T)! zM<4l|O3JM-lxF27&7q+qcd&jZpLzP#SD$|7q_ChdHeUHb`F_F_<@@ixR{lp-antDD z2+phhkhmG(l}rjeL6SpY0&|GaG7|X2Bt~HtWF0n(r&W(2sf|wYdGZ0=4bZ8q!9_CP z3UW>qsLVp7KGHC0Iy*v+$U2A-I74G-)PDA6^B0$>(wr(?8GmP~gdHs-t3lt@Dt%+H z^Be4m3j%c$7f40FYX*$mMCFaoxyQ0(Ne?Klk!0K)o~y85jT zgr^NL#0sb4;NpQ{m#hB<=l=%6!6%Y+!_4>Vg*RS8VSJ}I4!@WO$rfgXH}-+P8_SiWrI#%0Sl2=8vMt=+z(rgr;y_t7OUfAGP}OOCpu&(vN0_S>siVb8{KxBh`L%^CiU07I@Uj&Jc4zs8Ng9YHT zYF{h=^vO%W>EO3R-VA*+?9K4EBTh%^4mwXc|LSCrm|m(@a{754Rg$VnNpw6_cS}GE zJEzY_?i>L*>3ek6UzEGl{ss0W4&^1~tC2hDK(8!CLQ1HGI>$dmZQp%O15|^!TX`@- z*y58Uj?*m&%{yWY_@yIZ9;>`u+y{q14Xgwq*a0=fts%sOy9Hcf+`5GS6h(|t&|CFY z)ZPXX=kbI0q1z=cC;PAwl4!7q`)}$Hs@rnCiQ9EQZ5Y*ixy1b!4Agwp=fhkjQ>9M; zfsDvYM`0%u8QqC%c>Iq*C0QanWhq?}5!{m4e)%~a6-cZY19?XL2dnb-4e$Pk@9=$l z8NRnS2rk-#N}t^QQPkg2B!S&hHYgj9(+~I24>=XC(md%C_KcSb7PwFHP7x@GB!&~= zG>G7hQb85*7Y?BKICm8G%>G*kvF=(SAMNQR?<8>An6wj+`{8rlQ12=$|;UN}-BpM^AB`ib?17}Hmh+mxj8XO&LDfuendq=** zPrCUp<@QbcMHF%8nD6DG3gT2%5J%#?s^Itn!$RXiw-!h9i@};p!~O~z`4;2J*Q5>G zFCBJZwD$b@ci-qed2*lB<+Db=oImxg>5ZQan>;ZoK`+aSLN{zLS~h-CkEz`zm1Yh; z)u;E{yGO1XKR&5Pu&aM}&Y4MB9oRP~I7YZVBu#EvcDopp~@uU)@zL7foQf5-Gg zAOG?B={x(?J-Ii{Gefy@r231zr(UX@T|)hzTKdzB$%~Y$TTdvBOP18E{LNB2=C#Z8 zk?IknmA92|h2Xkp_pDp9caJh`RMt=Ly?1BC$mPxMfX`lf$T%__@c$Nha0ASU9J42d?0iB+xe|r)q^pTlb%8R-ZIRIz&%&$ zFft=?2=Hi(I=HhkFEluqQO_&jSwr5cbnNJeD}^QIt-?08Sq#+t9c&C@7^0lQDdnaRr&NC>^!dZe=7(2ak*v+Z?C_mVbg{A& zE9o38=nY`3$9~fdyA=~m>Wzka=Tcg4d?C_d(hGjUkrJ_n1xUeRT@576DMoPx#FrCy zPx(UPZi4-0pX8&qXuytrpQgK89^zp2x#3b>(U>T@kq&wGsi&S*PSH-AHf-3Wm;~{g zJ4+s`->clZ+x)F?uKCm2)oWG=#md04ibu=$z4_9rXZ+pgx4!o$Xr4+$uo9pHf=N$L zh~;VPVPn06K1~jbSpJSRA-Z4-N%psga1gzQh{N`;o5{y)p^>2iz~g?2*B9y8%LNhk zIVMs<@i)uv5#<)OQ?l%v;+cPYTzNrRNNecWn!icYt~@+dIjj6pxvHF<`tYS;!{}}b zKG5AmAvd6+bi_-=t{xYuH-LV2yo_vbv++F2BRBDqQ~hSU3>xNLLC|=j}NVxO<266HdEVyW6rV3&E-N)^O5)Yn8OY> z_u_sV=OXu(!bu;Gn@FLwo`u%yoliRsyXvhQ^lKsn66WYGrUnI@>~OGeG+l4P6nwJ` zZYq~m6&9yP7NA{6YC$oQAp7Po-;TkH5ZNcmYQvMufM+ zq}~Qx@Yl!+^npC0E(kXr%~7d}-7%so>gmV1_k};d|9*2cuy5We6yE8?Daw#d$H5dvapi9M`O5nGZaEi_gq?M7hC50jjGA4A{iMCiTEO0hbk z3EqUCNg%p<=?GbBmh^HTAF$U|9}}(#Hvzs`%<3#={DOd2-CL3^9!riT&r)aEZBb{j z%icZXx%V%AIV!ED6jN?gez<*b^V?orq?y3QNWS-U&^zF{=o~VPKX=7d-I=b36T--g z1{qFY(o>^pv{mhYFd} zVEs5@x-eImCoLCNN_F~8!Vdj6f(zPGGRUDUSSLX@>w;JZsgvAM*Hi2%^^|+)lFfsd zN6e5svPb7JPh)x5LrmArlgiDj*=lK>T&JruZ)Z=*Pw9@c-|F6F@9I8gAL+hje-*!# z{zv{d`%(Hy?mXpDGUZWlfJR|=iL)+ndKVR&Ls^LOujW+F?^VLQ=3z}=3cqje=B1Lz zsU*R7H1j1Y(lFMSh&-^f2g+(26QGawNtu zlQ%rwnM0@72@Wdg`5z`2j0PAfqaod>6PO<4)|+6Ba5gF#gp1)c~UkfwqIUPd}l1)`En zbwZffQwJQmMp7l5>- z&!iCft9O!mE%Fy^OJ%_>JCFRSVQ^pMk8g{y*~e#srpeS#mT*mJrtI1^N|k%pXkR*C zS*e^+-sMqQX{6Gqe5HJ?G}2)-goe^#dz1&2T?+O)bPt_|*IvygiEBYIJ^!5$PY~=8 zH%m^tQIE4|Sfw-vH%tBi2dYaG2{j7nG1**^t~A%ft`}VrH|O495v({uVqz!oi*8ib zZr{FE=}q6e%i+7Lye}m+|NhC^nkV;t`N^kWH1Fq>P=54MBAkrzbVOv+M$Hzpm0B$3 zbX$a3B~1{5qLv6ts12TOaHvWkRo`&s zoYKHeU4We2PN3EvIW)lf^F(kdO<(9oB_dG?4xmnS5f}9r0$8Ak{Rxc|;#qLMYxhye!r@l#vQJ4ck8J7X&d1#xM&?BjHbv? z9f=MNwsz44`$u=c<_s(1IyPl0U0~(C=dNd3)KlB@YY@iEO_6)x zWqBmM{W9WYP&>D^YzZSb;y+82@FRvuVuu2W)Y*|TQEu36FihcT37j{w_uBE0@5Xa}j)oR?G#DgK6 z#Od44M*7wH?e=5bx@bE&Xf%Z7uxO5+Km5+yhtDgYL9u+Ldce0_=&z<5R`H2!HF+mp<0_9 zJ(u=rgmq*?#i7zlzYrpZNF5R4jTaKdL@7>o>w6QNehB@={!%X) zS14$PkR@i}*O(@e@p7?HB9=%C$y{ub7KjU^Ir0)c&gbMrtcEC>YQXMD7~Xv561__Q z^oQoN(BXmNU%3~BYXL;J57ai(YEPCFB1^EUVu;beLXgNI;7ka495Oe&SoxCI@WOYZ z4*dL7x)E-U40~kKn@vW8Udvc9>4?RC*_*F|B$Zz_xh*?E%@RY%iE4p=kOf&1kk>t5atqH`e3u&>K3CUx9rxr^)ZH6W1PutbzA!jeOV7NRZ7

B-* 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 (count % 10)) then + D.text:font("default", 32); + else + D.text:font("Sans:style=Bold", 32); + end + edje_geom = edje.geom(); + text_geom = D.text:real_geom(); + D.text:move((edje_geom.w - text_geom.w) / 2, (edje_geom.h - text_geom.h) / 8); return true; --// repeat the timer end @@ -60,7 +73,6 @@ collections { count = count + 1; --// keep count of calls - object data fndata = fndata + 3; --// play with object vars to see if they persist D.tim = edje.timer(0.25, mycb); --// inside cb add new timer - D.ani = edje.animator(mycb2); return false; --// cease repeating the timer end @@ -74,9 +86,22 @@ collections { --// actually add the timer to call mycb in 1.23 sec D.tim = edje.timer(1.23, mycb); D.tra = edje.transition(5.0, mycb3); + D.ani = edje.animator(mycb2); if (edje.spanky) then edje.spanky(); end + local date = edje.date(); + print("lua:: date: " .. + date.year .. "|" .. + date.month .. "|" .. + date.day .. "|" .. + date.yearday .. "|" .. + date.weekday .. "|" .. + date.hour .. "|" .. + date.min .. "|" .. + date.sec + ); + --// send some random edje message edje.messagesend(7, "none" ); edje.messagesend(7, "sig", "signal", "source"); @@ -108,10 +133,28 @@ collections { D.rect2:clip(D.clip); D.rect:clip(D.clip); + D.text = edje.text(); + D.text:geom (50, 5, 150, 50); + D.text:color (255, 0, 0, 255); + D.text:font("Sans:style=Bold", 32); + D.text:text("Lua rocks!"); + print(D.text:text()); + D.text:show(); + --// example of deleting something --// D.tim:del(); + + --// test the color_class stuff + colour = edje.color_class("test_colour"); + print("lua::color_class= " .. colour.r .. "," .. colour.g .. "," .. colour.b .. "," .. colour.a); + colour = edje.color_class("test_colour", 32, 64, 255, 128); + print("lua::color_class= " .. colour.r .. "," .. colour.g .. "," .. colour.b .. "," .. colour.a); + colour = edje.color_class("test_colour", { r=255, g=0, b=255, a=255 }); + print("lua::color_class= " .. colour.r .. "," .. colour.g .. "," .. colour.b .. "," .. colour.a); + text = edje.text_class("test_text_class", "Sans:style=Bold", 8); + print("lua::text_class= " .. text.font .. " size " .. text.size); - --// shutdown func - generally empty or not there. everything gcd for you + --// shutdown func - generally empty or not there. everything garbage collected for you function shutdown () print("lua::shutdown ... " .. D.val); end @@ -132,15 +175,114 @@ collections { function message (id, type, v1, v2) print("lua::message ... " .. D.val); print(" id=" .. id .. " type=" .. type); - --// handle youre message type here. chekc id + type then use v1 + --// handle your message type here. check id + type then use v1 --// and/or v2 (or neither) appropriately. they are the same as --// the 2nd and 3rd param passed to edje.messagesend() (if any --// are passed at all) end function signal (sig, src) - print("lua::signal ... " .. D.val); - print(" sig=" .. sig .. " src=" .. src); + print("lua::signal sig= " .. sig .. " src= " .. src); end } } + + group + { name: "bubbles/lua"; + lua_script_only: 1; + lua_script + { + local bubbles = { }; + local bubbleCols = 8; + local bubbleRows = 6; + + for i = 1, bubbleRows do + row = { }; + for j = 1, bubbleCols do + image = edje.image_filled(); + image:image("bubble.png", ""); + image:show(); + table.insert(row, image); + end + table.insert(bubbles, row); + end + + function resize (w, h) + --// Don't ask why. lol (This should go away soon.) + bubbles[1][1]:move(12345, 12345); + + for i = 1, bubbleRows do + for j = 1, bubbleCols do + w1 = w / bubbleCols; + h1 = h / bubbleRows; + bubbles[i][j]:geom((j - 1) * w1, (i - 1) * h1, w1, h1); + if ((1 == i) or (1 == j) or (bubbleRows == i) or (bubbleCols == j)) then + bubbles[i][j]:color(0, 255, 0, 200); + else + bubbles[i][j]:color(math.random(200) + 55, 0, math.random(255) + 55, 200); + end + end + end + end + } + } + + group { + name: "elm/bg/base/default"; + + parts { + part { + name: "background"; + type: RECT; + mouse_events: 0; + description { + state: "default" 0.0; + color: 0 0 0 255; + } + } + + part { + name: "bubbles_lua"; + type: GROUP; + source: "bubbles/lua"; + mouse_events: 0; + description { state: "default" 0.0; } + } + + part { + name: "background_image"; + mouse_events: 0; + description { + state: "default" 0.0; + aspect_preference: HORIZONTAL; + color_class: "test_colour"; + image { normal: "test.png"; } + } + } + + part { + name: "some_text"; + type: TEXT; + mouse_events: 0; + description { + state: "default" 0; + text + { + text: "This is test text."; + text_class: "test_text_class"; + } + } + } + + part { + name: "example_lua"; + type: GROUP; + source: "example/lua"; + mouse_events: 0; + description { state: "default" 0.0; } + } + + } + } + } + diff --git a/legacy/edje/src/examples/test.png b/legacy/edje/src/examples/test.png new file mode 100644 index 0000000000000000000000000000000000000000..fb620d7d24efb9b67443dbfbfe291da6b1b38f1c GIT binary patch literal 22869 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

U;G;X8T>S#Cg1G*7qWB~6ysQ?x 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 E0I1q_TmS$7 literal 0 HcmV?d00001 diff --git a/legacy/edje/src/lib/edje_lua2.c b/legacy/edje/src/lib/edje_lua2.c index b4a0575..76aeb7e 100644 --- a/legacy/edje/src/lib/edje_lua2.c +++ b/legacy/edje/src/lib/edje_lua2.c @@ -27,12 +27,12 @@ struct _Edje_Lua_Alloc struct _Edje_Lua_Obj { EINA_INLIST; - + Edje *ed; void (*free_func) (void *obj); Eina_Bool is_evas_obj : 1; }; - + struct _Edje_Lua_Timer { Edje_Lua_Obj obj; @@ -84,6 +84,9 @@ static int _elua_objpos(lua_State *L); static int _elua_objsize(lua_State *L); static int _elua_objgeom(lua_State *L); +static int _elua_color_class(lua_State *L); +static int _elua_text_class(lua_State *L); + static int _elua_show(lua_State *L); static int _elua_hide(lua_State *L); static int _elua_visible(lua_State *L); @@ -108,6 +111,24 @@ static int _elua_repeat(lua_State *L); static int _elua_precise(lua_State *L); static int _elua_rect(lua_State *L); +static int _elua_image(lua_State *L); +static int _elua_text(lua_State *L); +//static int _elua_textblock(lua_State *L); /* XXX: disabled until there are enough textblock functions implemented to make it actually useful +static int _elua_edje(lua_State *L); +static int _elua_line(lua_State *L); +static int _elua_polygon(lua_State *L); + +static int _elua_text_text(lua_State *L); +static int _elua_text_font(lua_State *L); +static int _elua_image_image(lua_State *L); +static int _elua_image_fill(lua_State *L); +static int _elua_image_filled(lua_State *L); + +static int _elua_edje_file(lua_State *L); +static int _elua_line_xy(lua_State *L); +static int _elua_polygon_point(lua_State *L); +static int _elua_polygon_clear(lua_State *L); + #define ELO "|-ELO" @@ -115,7 +136,7 @@ static int _elua_rect(lua_State *L); static lua_State *lstate = NULL; static jmp_buf panic_jmp; -// FIXME: methods lua scrupt can provide that edje will call (not done yet): +// FIXME: methods lua script can provide that edje will call (not done yet): // // scale set // // key down // // key up @@ -142,22 +163,22 @@ static jmp_buf panic_jmp; // // parts extends calc // // part object get // // part geometry get -// +// // // LATER: all the entry calls // // LATER: box and table calls // // LATER: perspective stuff change -// +// static const struct luaL_reg _elua_edje_api [] = { // add an echo too to make it more shelly {"echo", _elua_echo}, // test func - echo (i know we have print. test) - + // time based "callback" systems {"timer", _elua_timer}, // add timer {"animator", _elua_animator}, // add animator {"transition", _elua_transition}, // add transition // FIXME: need poller - + // system information (time, date blah blah) {"seconds", _elua_seconds}, // get seconds {"looptime", _elua_looptime}, // get loop time @@ -171,13 +192,21 @@ static const struct luaL_reg _elua_edje_api [] = {"pos", _elua_objpos}, // get while edje object pos in canvas {"size", _elua_objsize}, // get while edje object pos in canvas {"geom", _elua_objgeom}, // get while edje object geometry in canvas - - // FIXME: query color classes - // FIXME: query text classes - {"rect", _elua_rect}, // new rect - // FIXME: need image(filled, normal), text, textblock, edje - + // set and query color / text class + {"color_class", _elua_color_class}, + {"text_class", _elua_text_class}, + + // create new objects + {"rect", _elua_rect}, + {"image", _elua_image}, // defaults to a filled image. + {"text", _elua_text}, +// {"textblock", _elua_textblock}, /* XXX: disabled until there are enough textblock functions implemented to make it actually useful + {"edje", _elua_edje}, + {"line", _elua_line}, + {"polygon", _elua_polygon}, + // FIXME: add the new sound stuff. + {NULL, NULL} // end }; @@ -185,7 +214,7 @@ static const struct luaL_reg _elua_edje_evas_obj [] = { // generic object methods {"del", _elua_obj_del}, // generic del any object created for edje (evas objects, timers, animators, transitions... everything) - + // now evas stuff (manipulate, delete etc.) {"show", _elua_show}, // show, return current visibility {"hide", _elua_hide}, // hide, return current visibility @@ -195,7 +224,7 @@ static const struct luaL_reg _elua_edje_evas_obj [] = {"pos", _elua_pos}, // move, return current position {"size", _elua_size}, // resize, return current size {"geom", _elua_geom}, // move and resize and return current geometry - + {"raise", _elua_raise}, // raise to top {"lower", _elua_lower}, // lower to bottom {"above", _elua_above}, // get object above or stack obj above given obj @@ -210,14 +239,39 @@ static const struct luaL_reg _elua_edje_evas_obj [] = {"pass", _elua_pass}, // set pass events, get pass events {"repeat", _elua_repeat}, // set repeat events, get repeat events {"precise", _elua_precise}, // set precise inside flag, get precise + +// {"color_class", _elua_object_color_class}, // get or set object color class + + + // FIXME: make these into a subclass of this evas table using meta table magic. + // text object specific + {"font", _elua_text_font}, // get or set text font + {"text", _elua_text_text}, // get or set text +// {"text_class", _elua_object_text_class}, // get or set object text class + + // image object specific + {"image", _elua_image_image}, // get or set image + {"fill", _elua_image_fill}, // get or set the fill parameters + {"filled", _elua_image_filled}, // get or set the filled state (overrides fill()) + + // edje object specific + {"file", _elua_edje_file}, // get or set edje file and group + + // line object specific + {"xy", _elua_line_xy}, // get or set line coords + + // polygon object specific + {"point", _elua_polygon_point}, // add a polygon point + {"clear", _elua_polygon_clear}, // clear all polygon points + // FIXME: set callbacks (mouse down, up, blah blah blah) - // + // // FIXME: set scale (explicit value) // FIXME: need to set auto-scale (same as scale: 1) - + // FIXME: later - set render op, anti-alias, pointer mode (autograb, nograb) - // FIXME: later - - + // FIXME: later - + // FIXME: map api here {NULL, NULL} // end @@ -226,7 +280,7 @@ static const struct luaL_reg _elua_edje_evas_obj [] = static const struct luaL_reg _elua_edje_meta [] = { {"__gc", _elua_obj_gc}, // garbage collector func for edje objects - + {NULL, NULL} // end }; @@ -252,7 +306,7 @@ _elua_alloc(void *ud, void *ptr, size_t osize, size_t nsize) { Edje_Lua_Alloc *ela = ud; void *ptr2; - + ela->cur += nsize - osize; if (ela->cur > ela->max) { @@ -265,7 +319,7 @@ _elua_alloc(void *ud, void *ptr, size_t osize, size_t nsize) free(ptr); return NULL; } - + ptr2 = realloc(ptr, nsize); if (ptr2) return ptr2; ERR("Edje Lua cannot re-allocate " FMT_SIZE_T " bytes", nsize); @@ -286,7 +340,7 @@ _edje_lua2_error_full(const char *file, const char *fnc, int line, lua_State *L, int err_code) { const char *err_type; - + switch (err_code) { case LUA_ERRRUN: @@ -316,13 +370,13 @@ _elua_init(void) static Edje_Lua_Alloc ela = { MAX_LUA_MEM, 0 }; const luaL_Reg *l; lua_State *L; - + if (lstate) return; - + lstate = L = lua_newstate(_elua_alloc, &ela); lua_atpanic(L, _elua_custom_panic); -// FIXME: figure out optimal gc settings later +// FIXME: figure out optimal gc settings later // lua_gc(L, LUA_GCSETPAUSE, 200); // lua_gc(L, LUA_GCSETSTEPMUL, 200); @@ -332,11 +386,11 @@ _elua_init(void) lua_pushstring(L, l->name); lua_call(L, 1, 0); } - + luaL_register(L, "edje", _elua_edje_api); luaL_newmetatable(L, "edje"); luaL_register(L, 0, _elua_edje_meta); - + luaL_register(L, "edje_evas_obj", _elua_edje_evas_obj); luaL_newmetatable(L, "edje_evas_obj"); luaL_register(L, 0, _elua_edje_meta); @@ -406,7 +460,7 @@ _elua_ref_set(lua_State *L, void *key) lua_rawset(L, -3); lua_pop(L, 1); // pop obj table } - + /** * Cori: Get an object from the object table */ @@ -453,7 +507,7 @@ static int _elua_obj_gc(lua_State *L) { Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); - if (!obj) return 0; + if (!obj) return 0; _elua_obj_free(L, obj); return 0; } @@ -475,7 +529,7 @@ void _edje_lua2_script_func_shutdown(Edje *ed) { int err; - + lua_getglobal(ed->L, "shutdown"); if (!lua_isnil(ed->L, -1)) { @@ -491,7 +545,7 @@ void _edje_lua2_script_func_show(Edje *ed) { int err; - + lua_getglobal(ed->L, "show"); if (!lua_isnil(ed->L, -1)) { @@ -506,7 +560,7 @@ void _edje_lua2_script_func_hide(Edje *ed) { int err; - + lua_getglobal(ed->L, "hide"); if (!lua_isnil(ed->L, -1)) { @@ -539,7 +593,7 @@ void _edje_lua2_script_func_resize(Edje *ed) { int err; - + lua_getglobal(ed->L, "resize"); if (!lua_isnil(ed->L, -1)) { @@ -556,7 +610,7 @@ void _edje_lua2_script_func_message(Edje *ed, Edje_Message *em) { int err, n, c, i; - + lua_getglobal(ed->L, "message"); if (!lua_isnil(ed->L, -1)) { @@ -570,8 +624,8 @@ _edje_lua2_script_func_message(Edje *ed, Edje_Message *em) case EDJE_MESSAGE_SIGNAL: break; case EDJE_MESSAGE_STRING: - lua_pushstring(ed->L, "str"); - lua_pushstring(ed->L, ((Edje_Message_String *)em->msg)->str); + lua_pushstring(ed->L, "str"); + lua_pushstring(ed->L, ((Edje_Message_String *)em->msg)->str); n += 1; break; case EDJE_MESSAGE_INT: @@ -667,7 +721,7 @@ void _edje_lua2_script_func_signal(Edje *ed, const char *sig, const char *src) { int err; - + lua_getglobal(ed->L, "signal"); if (!lua_isnil(ed->L, -1)) { @@ -698,7 +752,7 @@ _elua_timer_cb(void *data) Edje_Lua_Timer *elt = data; lua_State *L; int ret = 0, err = 0; - + if (!elt->obj.ed) return 0; L = elt->obj.ed->L; if (!L) return 0; @@ -747,7 +801,7 @@ _elua_timer(lua_State *L) val = luaL_checknumber(L, 1); luaL_checkany(L, 2); - + elt = (Edje_Lua_Timer *)_elua_obj_new(L, ed, sizeof(Edje_Lua_Timer)); elt->obj.free_func = _elua_timer_free; elt->timer = ecore_timer_add(val, _elua_timer_cb, elt); @@ -764,7 +818,7 @@ _elua_animator_cb(void *data) Edje_Lua_Animator *ela = data; lua_State *L; int ret = 0, err = 0; - + if (!ela->obj.ed) return 0; L = ela->obj.ed->L; if (!L) return 0; @@ -811,7 +865,7 @@ _elua_animator(lua_State *L) Edje_Lua_Animator *ela; luaL_checkany(L, 1); - + ela = (Edje_Lua_Animator *)_elua_obj_new(L, ed, sizeof(Edje_Lua_Animator)); ela->obj.free_func = _elua_animator_free; ela->animator = ecore_animator_add(_elua_animator_cb, ela); @@ -882,7 +936,7 @@ _elua_transition(lua_State *L) val = luaL_checknumber(L, 1); luaL_checkany(L, 2); - + elt = (Edje_Lua_Transition *)_elua_obj_new(L, ed, sizeof(Edje_Lua_Transition)); elt->obj.free_func = _elua_transition_free; elt->animator = ecore_animator_add(_elua_transition_cb, elt); @@ -1213,6 +1267,131 @@ _elua_2_int_get(lua_State *L, int i, Eina_Bool tr, return n; } +// FIXME: Should have separate functions for each lua type, instead of these multi argument style ones. +static int +_elua_str_int_get(lua_State *L, int i, Eina_Bool tr, + const char *n1, char **v1, + const char *n2, int *v2 + ) +{ + int n = 0; + + if (lua_istable(L, i)) + { + lua_getfield(L, i, n1); + if (lua_isnil(L, -1)) + { + lua_pop(L, 1); + lua_rawgeti(L, i, 1); + lua_rawgeti(L, i, 2); + } + else + lua_getfield(L, i, n2); + if ((!lua_isnil(L, -1)) && (!lua_isnil(L, -2))) + { + size_t len; + const char *temp = lua_tolstring(L, -2, &len); + + len++; // Cater for the null at the end. + *v1 = malloc(len); + if (*v1) + { + memcpy(*v1, temp, len); + *v2 = lua_tointeger(L, -1); + n = 1; + } + } + if (tr) lua_settop(L, i); + } + else + { + if ((lua_isstring(L, i + 0)) && (lua_isnumber(L, i + 1))) + { + size_t len; + const char *temp = lua_tolstring(L, i + 0, &len); + + len++; // Cater for the null at the end. + *v1 = malloc(len); + if (*v1) + { + memcpy(*v1, temp, len); + *v2 = lua_tointeger(L, i + 1); + n = 2; + } + } + if (tr) lua_newtable(L); + } + return n; +} + +static int +_elua_2_str_get(lua_State *L, int i, Eina_Bool tr, + const char *n1, char **v1, + const char *n2, char **v2 + ) +{ + int n = 0; + + if (lua_istable(L, i)) + { + lua_getfield(L, i, n1); + if (lua_isnil(L, -1)) + { + lua_pop(L, 1); + lua_rawgeti(L, i, 1); + lua_rawgeti(L, i, 2); + } + else + lua_getfield(L, i, n2); + if ((!lua_isnil(L, -1)) && (!lua_isnil(L, -2))) + { + size_t len; + char *temp = (char *) lua_tolstring(L, -2, &len); + + len++; // Cater for the null at the end. + *v1 = malloc(len); + if (*v1) + memcpy(*v1, temp, len); + + temp = (char *) lua_tolstring(L, -1, &len); + len++; // Cater for the null at the end. + *v2 = malloc(len); + if (*v2) + memcpy(*v2, temp, len); + n = 1; + } + if (tr) lua_settop(L, i); + } + else + { + if ((lua_isstring(L, i + 0)) && (lua_isstring(L, i + 1))) + { + size_t len; + char *temp = (char *) lua_tolstring(L, i + 0, &len); + + len++; // Cater for the null at the end. + *v1 = malloc(len); + if (*v1) + { + memcpy(*v1, temp, len); + n++; + } + + temp = (char *) lua_tolstring(L, i + 1, &len); + + len++; // Cater for the null at the end. + *v2 = malloc(len); + if (*v2) + { + memcpy(*v2, temp, len); + n++; + } + } + if (tr) lua_newtable(L); + } + return n; +} + /* XXX: not used static int _elua_3_int_get(lua_State *L, int i, Eina_Bool tr, @@ -1238,7 +1417,7 @@ _elua_3_int_get(lua_State *L, int i, Eina_Bool tr, lua_getfield(L, i, n2); lua_getfield(L, i, n3); } - if ((!lua_isnil(L, -1)) && (!lua_isnil(L, -2)) && + if ((!lua_isnil(L, -1)) && (!lua_isnil(L, -2)) && (!lua_isnil(L, -3))) { *v1 = lua_tointeger(L, -3); @@ -1291,7 +1470,7 @@ _elua_4_int_get(lua_State *L, int i, Eina_Bool tr, lua_getfield(L, i, n3); lua_getfield(L, i, n4); } - if ((!lua_isnil(L, -1)) && (!lua_isnil(L, -2)) && + if ((!lua_isnil(L, -1)) && (!lua_isnil(L, -2)) && (!lua_isnil(L, -3)) && (!lua_isnil(L, -4))) { *v1 = lua_tointeger(L, -4); @@ -1327,6 +1506,14 @@ _elua_int_ret(lua_State *L, const char *n, int v) } static void +_elua_str_ret(lua_State *L, const char *n, const char *v) +{ + lua_pushstring(L, n); + lua_pushstring(L, v); + lua_settable(L, -3); +} + +static void _elua_color_fix(int *r, int *g, int *b, int *a) { if (*r > *a) *r = *a; @@ -1338,6 +1525,65 @@ _elua_color_fix(int *r, int *g, int *b, int *a) //------------- static int +_elua_color_class(lua_State *L) +{ + Edje *ed = (Edje *)_elua_table_ptr_get(L, _elua_key); + Edje_Color_Class *c_class; + const char *class = luaL_checkstring(L, 1); + int r, g, b, a; + + if (!class) return 0; + + if (_elua_4_int_get(L, 2, EINA_TRUE, "r", &r, "g", &g, "b", &b, "a", &a) > 0) + { + _elua_color_fix(&r, &g, &b, &a); + // This is the way that embryo does it - + //edje_object_color_class_set(ed->obj, class, r, g, b, a, r, g, b, a, r, g, b, a); + // But that deals with object scope, which is currently useless in lua, + // since we have no objects that can use color_class yet. + // So we do it at global scope instead. + // LATER - Should do both? + edje_color_class_set(class, r, g, b, a, r, g, b, a, r, g, b, a); + } + + c_class = _edje_color_class_find(ed, class); + if (!c_class) return 0; + + _elua_int_ret(L, "r", c_class->r); + _elua_int_ret(L, "g", c_class->g); + _elua_int_ret(L, "b", c_class->b); + _elua_int_ret(L, "a", c_class->a); + return 1; +} + +static int +_elua_text_class(lua_State *L) +{ + Edje *ed = (Edje *)_elua_table_ptr_get(L, _elua_key); + Edje_Text_Class *t_class; + const char *class = luaL_checkstring(L, 1); + char *font = NULL; + Evas_Font_Size size = 0; + + if (!class) return 0; + + // Just like color_class above, this does things differently from embryo, + // for the same reason. + if (_elua_str_int_get(L, 2, EINA_TRUE, "font", &font, "size", &size) > 0) + edje_text_class_set(class, font, size); + + t_class = _edje_text_class_find(ed, class); + if (!t_class) return 0; + + _elua_str_ret(L, "font", t_class->font); + _elua_int_ret(L, "size", t_class->size); + return 1; +} + +//------------- +//------------- + +static int _elua_show(lua_State *L) { Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); @@ -1397,8 +1643,8 @@ _elua_move(lua_State *L) { elo->x = x; elo->y = y; - evas_object_move(elo->evas_obj, - obj->ed->x + elo->x, + evas_object_move(elo->evas_obj, + obj->ed->x + elo->x, obj->ed->y + elo->y); } } @@ -1460,8 +1706,8 @@ _elua_geom(lua_State *L) { elo->x = x; elo->y = y; - evas_object_move(elo->evas_obj, - obj->ed->x + elo->x, + evas_object_move(elo->evas_obj, + obj->ed->x + elo->x, obj->ed->y + elo->y); } if ((w != ow) || (h != oh)) @@ -1726,6 +1972,208 @@ _elua_precise(lua_State *L) return 1; } +static int +_elua_text_font(lua_State *L) +{ + Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); + Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; + char *font, *font2 = NULL; + Evas_Font_Size size; + int inlined_font = 0; + + if (!obj) return 0; + if (!obj->is_evas_obj) return 0; + + if (_elua_str_int_get(L, 2, EINA_TRUE, "font", &font, "size", &size) > 0) + { + /* Check if the font is embedded in the .edj + * This is a simple check. + * There is a much more complicated version in edje_text.c _edje_text_recalc_apply(). + * If we need to get more complicated, we can do that later, + * and maybe refactor things. + */ + if (obj->ed->file->fonts) + { + Edje_Font_Directory_Entry *fnt = eina_hash_find(obj->ed->file->fonts, font); + + if (fnt) + { + size_t len = strlen(font) + sizeof("edje/fonts/") + 1; + font2 = alloca(len); + sprintf(font2, "edje/fonts/%s", font); + font = font2; + inlined_font = 1; + font2 = NULL; + } + } + + if (inlined_font) evas_object_text_font_source_set(elo->evas_obj, obj->ed->path); + else evas_object_text_font_source_set(elo->evas_obj, NULL); + + evas_object_text_font_set(elo->evas_obj, font, size); + } + + evas_object_text_font_get(elo->evas_obj, &font, &size); + _elua_str_ret(L, "font", font); + _elua_int_ret(L, "size", size); + return 1; +} + +static int +_elua_text_text(lua_State *L) +{ + Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); + Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; + int n; + if (!obj) return 0; + if (!obj->is_evas_obj) return 0; + n = lua_gettop(L); + if (n == 2) + { + if (lua_isstring(L, 2)) + { + const char *str; + + if (str = lua_tostring(L, 2)) + evas_object_text_text_set(elo->evas_obj, str); + } + } + lua_pushstring(L, evas_object_text_text_get(elo->evas_obj)); + return 1; +} + +static int +_elua_image_image(lua_State *L) +{ + Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); + Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; + char *file = NULL, *key = NULL; + + if (!obj) return 0; + if (!obj->is_evas_obj) return 0; + + if (_elua_2_str_get(L, 2, EINA_TRUE, "file", &file, "key", &key) > 0) + { + // FIXME: ONLY allow access to the images in the current edje file. + evas_object_image_file_set(elo->evas_obj, file, key); + } + evas_object_image_file_get(elo->evas_obj, &file, &key); + _elua_str_ret(L, "file", file); + _elua_str_ret(L, "key", key); + return 1; +} + +static int +_elua_image_fill(lua_State *L) +{ + Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); + Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; + Evas_Coord x, y, w, h; + + if (!obj) return 0; + if (!obj->is_evas_obj) return 0; + + if (_elua_4_int_get(L, 2, EINA_TRUE, "x", &x, "y", &y, "w", &w, "h", &h) > 0) + { + evas_object_image_fill_set(elo->evas_obj, x, y, w, h); + } + evas_object_image_fill_get(elo->evas_obj, &x, &y, &w, &h); + _elua_int_ret(L, "x", x); + _elua_int_ret(L, "y", y); + _elua_int_ret(L, "w", w); + _elua_int_ret(L, "h", h); + + return 1; +} + +static int +_elua_image_filled(lua_State *L) +{ + Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); + Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; + int n; + + if (!obj) return 0; + if (!obj->is_evas_obj) return 0; + + n = lua_gettop(L); + if (n == 2) + { + evas_object_image_filled_set(elo->evas_obj, lua_toboolean(L, 2)); + } + lua_pushboolean(L, evas_object_image_filled_get(elo->evas_obj)); + return 1; +} + +static int _elua_edje_file(lua_State *L) +{ + Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); + Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; + char *file = NULL, *group = NULL; + + if (!obj) return 0; + if (!obj->is_evas_obj) return 0; + + // FIXME: Only allow groups from the same file this edje came from. + if (_elua_2_str_get(L, 2, EINA_TRUE, "file", &file, "group", &group) > 0) + { + edje_object_file_set(elo->evas_obj, file, group); + } + edje_object_file_get(elo->evas_obj, &file, &group); + _elua_str_ret(L, "file", file); + _elua_str_ret(L, "group", group); + return 1; +} + +static int _elua_line_xy(lua_State *L) +{ + Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); + Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; + Evas_Coord x1, y1, x2, y2; + + if (!obj) return 0; + if (!obj->is_evas_obj) return 0; + + if (_elua_4_int_get(L, 2, EINA_TRUE, "x1", &x1, "y1", &y1, "x2", &x2, "y2", &y2) > 0) + { + evas_object_line_xy_set(elo->evas_obj, x1, y1, x2, y2); + } + evas_object_line_xy_get(elo->evas_obj, &x1, &y1, &x2, &y2); + _elua_int_ret(L, "x1", x1); + _elua_int_ret(L, "y1", y1); + _elua_int_ret(L, "x2", x2); + _elua_int_ret(L, "y2", y2); + return 1; +} + +static int _elua_polygon_point(lua_State *L) +{ + Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); + Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; + Evas_Coord x, y; + + if (!obj) return 0; + if (!obj->is_evas_obj) return 0; + + if (_elua_2_int_get(L, 2, EINA_FALSE, "x", &x, "y", &y) > 0) + { + evas_object_polygon_point_add(elo->evas_obj, x, y); + } + + return 1; +} + +static int _elua_polygon_clear(lua_State *L) +{ + Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); + Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; + + if (!obj) return 0; + if (!obj->is_evas_obj) return 0; + evas_object_polygon_points_clear(elo->evas_obj); + return 1; +} + //------------- static void _elua_evas_obj_free(void *obj) @@ -1756,6 +2204,116 @@ _elua_rect(lua_State *L) return 1; } +static int +_elua_image(lua_State *L) +{ + Edje *ed = (Edje *)_elua_table_ptr_get(L, _elua_key); + Edje_Lua_Evas_Object *elo; + + elo = (Edje_Lua_Evas_Object *)_elua_obj_new(L, ed, sizeof(Edje_Lua_Evas_Object)); + elo->obj.free_func = _elua_evas_obj_free; + elo->obj.is_evas_obj = 1; + elo->evas_obj = evas_object_image_filled_add(evas_object_evas_get(ed->obj)); + evas_object_smart_member_add(elo->evas_obj, ed->obj); + evas_object_clip_set(elo->evas_obj, ed->base.clipper); + evas_object_move(elo->evas_obj, ed->x, ed->y); + evas_object_resize(elo->evas_obj, 0, 0); + evas_object_data_set(elo->evas_obj, ELO, elo); + return 1; +} + +static int +_elua_text(lua_State *L) +{ + Edje *ed = (Edje *)_elua_table_ptr_get(L, _elua_key); + Edje_Lua_Evas_Object *elo; + + elo = (Edje_Lua_Evas_Object *)_elua_obj_new(L, ed, sizeof(Edje_Lua_Evas_Object)); + elo->obj.free_func = _elua_evas_obj_free; + elo->obj.is_evas_obj = 1; + elo->evas_obj = evas_object_text_add(evas_object_evas_get(ed->obj)); + evas_object_smart_member_add(elo->evas_obj, ed->obj); + evas_object_clip_set(elo->evas_obj, ed->base.clipper); + evas_object_move(elo->evas_obj, ed->x, ed->y); + evas_object_resize(elo->evas_obj, 0, 0); + evas_object_data_set(elo->evas_obj, ELO, elo); + return 1; +} + +/* XXX: disabled until there are enough textblock functions implemented to make it actually useful +static int +_elua_textblock(lua_State *L) +{ + Edje *ed = (Edje *)_elua_table_ptr_get(L, _elua_key); + Edje_Lua_Evas_Object *elo; + + elo = (Edje_Lua_Evas_Object *)_elua_obj_new(L, ed, sizeof(Edje_Lua_Evas_Object)); + elo->obj.free_func = _elua_evas_obj_free; + elo->obj.is_evas_obj = 1; + elo->evas_obj = evas_object_textblock_add(evas_object_evas_get(ed->obj)); + evas_object_smart_member_add(elo->evas_obj, ed->obj); + evas_object_clip_set(elo->evas_obj, ed->base.clipper); + evas_object_move(elo->evas_obj, ed->x, ed->y); + evas_object_resize(elo->evas_obj, 0, 0); + evas_object_data_set(elo->evas_obj, ELO, elo); + return 1; +} +*/ + +static int +_elua_edje(lua_State *L) +{ + Edje *ed = (Edje *)_elua_table_ptr_get(L, _elua_key); + Edje_Lua_Evas_Object *elo; + + elo = (Edje_Lua_Evas_Object *)_elua_obj_new(L, ed, sizeof(Edje_Lua_Evas_Object)); + elo->obj.free_func = _elua_evas_obj_free; + elo->obj.is_evas_obj = 1; + elo->evas_obj = edje_object_add(evas_object_evas_get(ed->obj)); + evas_object_smart_member_add(elo->evas_obj, ed->obj); + evas_object_clip_set(elo->evas_obj, ed->base.clipper); + evas_object_move(elo->evas_obj, ed->x, ed->y); + evas_object_resize(elo->evas_obj, 0, 0); + evas_object_data_set(elo->evas_obj, ELO, elo); + return 1; +} + +static int +_elua_line(lua_State *L) +{ + Edje *ed = (Edje *)_elua_table_ptr_get(L, _elua_key); + Edje_Lua_Evas_Object *elo; + + elo = (Edje_Lua_Evas_Object *)_elua_obj_new(L, ed, sizeof(Edje_Lua_Evas_Object)); + elo->obj.free_func = _elua_evas_obj_free; + elo->obj.is_evas_obj = 1; + elo->evas_obj = evas_object_line_add(evas_object_evas_get(ed->obj)); + evas_object_smart_member_add(elo->evas_obj, ed->obj); + evas_object_clip_set(elo->evas_obj, ed->base.clipper); + evas_object_move(elo->evas_obj, ed->x, ed->y); + evas_object_resize(elo->evas_obj, 0, 0); + evas_object_data_set(elo->evas_obj, ELO, elo); + return 1; +} + +static int +_elua_polygon(lua_State *L) +{ + Edje *ed = (Edje *)_elua_table_ptr_get(L, _elua_key); + Edje_Lua_Evas_Object *elo; + + elo = (Edje_Lua_Evas_Object *)_elua_obj_new(L, ed, sizeof(Edje_Lua_Evas_Object)); + elo->obj.free_func = _elua_evas_obj_free; + elo->obj.is_evas_obj = 1; + elo->evas_obj = evas_object_polygon_add(evas_object_evas_get(ed->obj)); + evas_object_smart_member_add(elo->evas_obj, ed->obj); + evas_object_clip_set(elo->evas_obj, ed->base.clipper); + evas_object_move(elo->evas_obj, ed->x, ed->y); + evas_object_resize(elo->evas_obj, 0, 0); + evas_object_data_set(elo->evas_obj, ELO, elo); + return 1; +} + //------------- //--------------- //------------------- @@ -1773,13 +2331,13 @@ _edje_lua2_script_init(Edje *ed) void *data; int size; lua_State *L; - + if (ed->L) return; _elua_init(); L = ed->L = lua_newstate(_elua_alloc, &ela); lua_atpanic(L, _elua_custom_panic); -// FIXME: figure out optimal gc settings later +// FIXME: figure out optimal gc settings later // lua_gc(L, LUA_GCSETPAUSE, 200); // lua_gc(L, LUA_GCSETSTEPMUL, 200); @@ -1789,8 +2347,8 @@ _edje_lua2_script_init(Edje *ed) lua_pushstring(L, l->name); lua_call(L, 1, 0); } - - + + luaL_register(L, "edje", _elua_edje_api); luaL_newmetatable(L, "edje"); luaL_register(L, 0, _elua_edje_meta); @@ -1811,21 +2369,21 @@ _edje_lua2_script_init(Edje *ed) lua_pushstring(L, "v"); lua_rawset(L, -3); lua_rawset(L, LUA_REGISTRYINDEX); - + _elua_table_ptr_set(L, _elua_key, ed); - + snprintf(buf, sizeof(buf), "edje/scripts/lua/%i", ed->collection->id); data = eet_read(ed->file->ef, buf, &size); - + if (data) { int err; - + err = luaL_loadbuffer(L, data, size, "edje_lua_script"); if (err) { if (err == LUA_ERRSYNTAX) - ERR("lua load syntax error: %s", + ERR("lua load syntax error: %s", lua_tostring(L, -1)); else if (err == LUA_ERRMEM) ERR("lua load memory allocation error: %s", -- 2.7.4