From fd855efbef81cdce915bfdb792d641a84d383efb Mon Sep 17 00:00:00 2001 From: Hyojung Jo Date: Thu, 13 Aug 2015 21:05:09 +0900 Subject: [PATCH 01/16] View: Enabled the action menu buttons focused Change-Id: I340d4572f82fc084b54054fffa72552e73a6b452 Signed-off-by: Hyojung Jo --- include/define.h | 22 ++- res/images/btn_menu_favorite_dis.png | Bin 0 -> 1780 bytes res/images/btn_menu_favorite_foc.png | Bin 0 -> 1793 bytes res/images/btn_menu_favorite_sel.png | Bin 0 -> 1893 bytes res/images/btn_menu_lock_foc.png | Bin 0 -> 1379 bytes res/images/btn_menu_lock_nor.png | Bin 0 -> 1430 bytes res/images/btn_menu_lock_sel.png | Bin 0 -> 1433 bytes res/images/btn_menu_share_foc.png | Bin 0 -> 1325 bytes res/images/btn_menu_share_nor.png | Bin 0 -> 1332 bytes res/images/btn_menu_share_sel.png | Bin 0 -> 1370 bytes res/widgets/button.edc | 349 ++++++++++++++++++++++++++++++++++- src/view/view_action_menu.c | 66 +++++-- 12 files changed, 411 insertions(+), 26 deletions(-) create mode 100644 res/images/btn_menu_favorite_dis.png create mode 100644 res/images/btn_menu_favorite_foc.png create mode 100644 res/images/btn_menu_favorite_sel.png create mode 100644 res/images/btn_menu_lock_foc.png create mode 100644 res/images/btn_menu_lock_nor.png create mode 100644 res/images/btn_menu_lock_sel.png create mode 100644 res/images/btn_menu_share_foc.png create mode 100644 res/images/btn_menu_share_nor.png create mode 100644 res/images/btn_menu_share_sel.png diff --git a/include/define.h b/include/define.h index 26e4c0b..f328d2b 100644 --- a/include/define.h +++ b/include/define.h @@ -47,7 +47,9 @@ /* Style */ #define STYLE_MENU_BTN "style.menu.button" #define STYLE_LIVETV_BTN "style.livetv.button" -#define STYLE_ACTION_MENU_BTN "style.action.menu.button" +#define STYLE_ACTION_MENU_FAV_BTN "style.action.menu.favorite.button" +#define STYLE_ACTION_MENU_LOCK_BTN "style.action.menu.lock.button" +#define STYLE_ACTION_MENU_SHARE_BTN "style.action.menu.share.button" /* Signal */ #define SIG_FOCUSED "focused" @@ -57,10 +59,13 @@ #define SIG_ITEM_SELECTED "item.selected" #define SIG_VISIBLE "visible" #define SIG_INVISIBLE "invisible" +#define SIG_DISABLE "disable" /* Source */ #define SRC_EDC "edc" #define SRC_MENU_BTN "menubtn" +#define SRC_LIVETV_BTN "source.livetv.btn" +#define SRC_ACTION_BTN "source.action.btn" /* Transition */ #define TRANSITION_FOCUS DECELERATE 0.20 @@ -114,9 +119,18 @@ #define DEFAULT_TV_PNG IMGDIR"/ic_default_tv.png" #define BROWSER_ICON_PNG IMGDIR"/ic_apps_web.png" #define GULLIVER_PNG IMGDIR"/gulliver.png" -#define ACTION_FAV_NOR_PNG IMGDIR"/btn_menu_favorite_nor.png" -#define ACTION_LOCK_DIS_PNG IMGDIR"/btn_menu_lock_dis.png" -#define ACTION_SHARE_DIS_PNG IMGDIR"/btn_menu_share_dis.png" +#define ACTION_FAV_NOR_PNG "btn_menu_favorite_nor.png" +#define ACTION_FAV_FOC_PNG "btn_menu_favorite_foc.png" +#define ACTION_FAV_SEL_PNG "btn_menu_favorite_sel.png" +#define ACTION_FAV_DIS_PNG "btn_menu_favorite_dis.png" +#define ACTION_LOCK_NOR_PNG "btn_menu_lock_nor.png" +#define ACTION_LOCK_FOC_PNG "btn_menu_lock_foc.png" +#define ACTION_LOCK_SEL_PNG "btn_menu_lock_sel.png" +#define ACTION_LOCK_DIS_PNG "btn_menu_lock_dis.png" +#define ACTION_SHARE_NOR_PNG "btn_menu_share_nor.png" +#define ACTION_SHARE_FOC_PNG "btn_menu_share_foc.png" +#define ACTION_SHARE_SEL_PNG "btn_menu_share_sel.png" +#define ACTION_SHARE_DIS_PNG "btn_menu_share_dis.png" /* Path */ #define PATH_PLAY_ICON_PNG IMGDIR"/ic_thumbnail_play.png" diff --git a/res/images/btn_menu_favorite_dis.png b/res/images/btn_menu_favorite_dis.png new file mode 100644 index 0000000000000000000000000000000000000000..bd9bdd8fea7e302ea267636be304fe737619dd1b GIT binary patch literal 1780 zcmaJ?Yfuwc7^S81CMp)BijamW?<6FUKtfW)BtV29Peo*GmSllQl8u`s2@GmYR4Q62 z6+s15oTB4{@KUNGNQ!_UA{HkUd{pUBe1JSMB2)*vp`iUyy0g3Ay?4$z-*>-zc6NVs zRG6*RDk~Ec6I*ULI~I)$<6~ilzUlA!VKjV!a1xO?C>2oxFlZ7Ygi=5(R|2Ggu^=GK z+TH=83{#vaJ`qXeMbZV3ga8;Z1eHXFvQe>Ml?)JMfCx4POcP0&xUq&CIIKv>#BHMR ze0ee!m@W#>hQYY(sCYqkhJYr-1%HiYsOYGG1VjL=N+OoZ=_)2}PM403jmtzFb`FAM zFmeABmB@?6vLG15QV4!{fiH=KrBVqbe+rdK^1+gQNo1lgdQ#OqCkJ5XFC3Z; z7N*i;*`f2f&>0h#jvz8Rk*HKE2}(Z#1g8;6G#bsQK_=r-1YVvcMF16EDtBE_V1sf2 zERrE2NQyNo0x3`?!o;DK{<8&%?1QXSKHny^VMG-mBa#Td#w{%XdA$FJN+ci9awHb~ zSnq!d%j2_TATbt{Lz%DuJ-Ad?V=5V)1%m(r!SN6zUg%yn?zC} zq?CKk;dwkdS1LyUsQ~1%nK)E|AQB1DZmwg6P}nrGFO@_haVQ}iP6&%aVbM7LR9Yy9 zvcP3Sf=mf0MHaZikKB+&xkf8UWN2nK2#XY;FcgL)*tsp!MT^%Gu&CZVSGagBfs1m9 zXfZ_N!T#%@7nV@>7>6Hhi%vcmAC#hQhf!N!4BMeYzm{|^J0xB;Fmk*jV+G*Y=3aAo z{nFF*1p9K%3W}+hhw}@qdCbe~+C~qrl&D!+!JuwvByUT?_3z?Cs$+vB%fGkIZ2axo zpu@?PCz^fzd8w0ke(iYk%h(TYhKjp6ci#|t-K_SiVdVG}A-?dM ziKdn$%#?Yr4Z31E>E+Nh1Q$F4uIe7>lB+8nd>S1iO<8>B^g|6#Y^E_<&93Hyb^IEG z-K$rQDto0aW!P-IunM1)9hJPK-;G!6ZM3~@PY2JpXXe<8dpcolfST8Jg6XU;Fbs6sJY4x&U)vlhjgL8- zD|){4a78gy($ZM$nDUjcyXMKcE`3p7t?rfQSl_{mNwU05`6;yzBj(oYy0sDamy|?q zta4v=ZB?mBgm-nOTc`SV|J4Gf$~@!cC)Ee~Xspg2>)`I1&f3B=WtHR|`K)7KCYYRv1ZKfW0);zr#%8Cx4VBls;^mEWXP(IbQu|G&(|EO7vlr? zA@{pw`xFkC$>eLJnzva_Q#Hj=_oiCKOgnoWcOa{#DA+@(0v*^I237ICQ zzYZ!^5ei6g0tL8C4nxHTL4e0&f<9ax4_pR7Y!G6xshh_DeS}<|5aI(<7oGA(s8fXD zuzboF^(CgKlB8b9Vr6AzF|#;KoY1g9fk0s4fFK5C!7yZFBw}P>2JdMG7&WK}t)A54 z7+_&UlJN{uOs67!oq|rUP`n|=3{!=oO2#rGdKSoJvvfL3UX#`aG8}yy#(!EHBD3`< zD;zc88H9@JM~e3}n5y0T9a#*iXoMkzmTC%;4&$l}9g2~Gu$T_Y1u)M?!exU}zEleH zA*p~Pm-0cjjO)whawXH)cQF(jQ>|4C1yUanmI|a0o68458P{JTh5R8d2=S$`oDcD* zv4NO@L@*U<@n^wm-(vmWixo-<6d`dU635f0J0F^glei%j*8|cB9`IR=7E|L{h9#D^ zyv`Cv32i2-mJ_%Rn5?T%`yc-Ka+oLQa3C%pqEZDx2@LtdJdRA_!-f1|UpajWtNuT= zVo^b`EMj;^9MeaX;w;-YQl~!N3=4`;6GBj<;PrLDEo#Cffv_afc;&&a)d6$D+`AK; z6u{4DNG|yRQoh$LPpNKQg ziM7K_E~6&Cxv7I**=<^iB_cuR#}C(+_HMm;42j?QB5W`~eUmFmV?27~i4)iR2x4>cbvjbs!NTU27iI zG}i8)4R~C&Zu2G{J^;oZ2X*~prCfA(v;=mWH5~V3OL4P#<>tyv2T{WyD_Z%vu4}g= zZ!NSe^xBy`;`&9b{(5hM!uoVO|AI~QprHTJrWDi0-~$F=2)*b~RX);Yv-t8>FGHVm zsMU*h!-quRk2A=;JxPA{XFJytR;$dbmFkV=qJ^7MHe5=goiN2IZwp!~MEcSt{WJ15 zqi&|?luHiV@A=dmavE}MHPt13n`gWY8fh=BAGZ@x{4f*`w%z*RVGoc9DZNsYcCTS8 z(f(RbyjrtuG&v-wt9ICUt+ZGm$zDsIP}vD?e*TGdCZ zBArG|AM49n7?*M+HiM!C1p}t^E&Ff2T2FKSp>1BU)z4qKxoQU;b}`^*rh%k=vfY0M zr#)>sqPJZzvo-&m?}U?C(R;JyWwz&?&gT<3qv21N9fby6gO+WJu*+(2x!#@gvi6{7 zqWf?~LUGK4s9R}O`R9{|ISspnXGZStbI+)67T{le>boGSWaN0?q0wqRbKqQAScZOn z?pU+TL)0Hx!q2B)Y8|>+=2qBaY~M0?#_r_i9J}(%MPuJQZ4N^ps;_PzC`ha5l|+aW z7KMel$vqM~PptT3(XGL1DH2sDDlo&L zkE^~f{tYtQj=G;XY=3urxu^8{leAToVAGIy)Z5e8X6;P#yl<9bgDsYy94%0$gpc_r G<^2oaAiI$O literal 0 HcmV?d00001 diff --git a/res/images/btn_menu_favorite_sel.png b/res/images/btn_menu_favorite_sel.png new file mode 100644 index 0000000000000000000000000000000000000000..bd2eeee2322d2533d94f617e3239093523a5cec1 GIT binary patch literal 1893 zcmb7Fc~BEq7>^=|0-{wIui_e*G1t|6fH2vrmn zm5$&=RlF5wtTe@1&oeYH!A8Mjx*ia-S53O-|zR`^OnY{#{2ag z*ptO#`6(x$YDPx7KW{JQkGyI$F=7BM*U<4~DxIx0VJwNBOu+!9L7RrDF|9r)>m}dlLJ%Mjgh8YE0s#~Xz+4Chxy&ozK%)`90D;4S4-cEMX40o3YE<#T z7PAwx(`nj>fM9lZc33tqj5MWzkVqtQbHFf%(cn-y1g*7j2r9Uf0mUet2{+O>NdRs} zZ3;P?7PA>o--lo@#>9LiCa4dIVp0ZLv_=pL+0uADFA^7)cZ?B^JUEliK=5x$hi;|XL^n9El{ken~!hjSIEg4w|mg-DKeVwD6% zYY83Zw&%v;pRkgzViB1M)6%3Vfh03KD<7Lq(j=8m8Ub0n02q;k6M8b63UQa^eUvC> z!p)doVImE{ySyU!7wijps6fHv!TfNT2^E4QC@e$;Jh@~vAC{s*1^WY5|9^4?GERW* zX85c*I**u+b1y%(I016akDClnF-sjL?sE9ru*xsPUsic|9G|`x?*|m zu3h;jtd+$90qu$B#Wf3StkZ{%wEEsjT?F=--fv`?_cE))HgVL{vi$PXp?9~;QLKy` z)_j!cFE{UdoBwu&q~UU@IHIui#f{^_O3M6(dgGdVU9`1k%NFP5)$IDqPN`3W^|xe> z#w~8xeI`};O+2%=u&wA;a^DkP0q5tC`ocI80#5w~-Ca7u3`I3*F+|9Ror)N~JJmdj3De|0q? z7H=2YqaF`lg$^1dtIuB;r|KJOf8D$6oUNrH(OcCG_sTkEISW0Yif-J#pIOx&n>e$u z_kCWQewXc1!^4Kmizy2M|6~5C*81-b?_`zxJj)TSCCaW2xiKuT_vAfE(T5zN$jyH7 zQN!Xc9dXTZ+LO1o6lgqp+46Z=;H^`h@h!%| zs=TazwSDIP&UBiwYbYzp8MVak&&&(bR?xWC_v!W$XE4{v-bXp(>w_E1&v>jBeDfsK z?|eJZeXL4%($f7tt2AZp@s$heHa<8`^>to~hA!eg%0?YnQWE*c20U$Z%08HWNG&db zBKky<`y+kN&opYJ+k)nGEgreY-)^m$rY=|!p0~*y5?OGi8Q$UJoV)|(L9A&WIg2Yc z-!qq2&B&VeNKc&RHx@4cD+Kn~AN5l2y72TD?eZ5f_MwOFdYx^G=5P)@4NO>fa7M?$ zc}Hh?Zl7Wdzg?&9u&;aWO)O~Z04zcO4onSsUV9|t?`Kppm#VDre5rZe(kqzeSb795 z!d+}bDUs&9df*C(AFKaCxH`Zn8;5@D;-(MWv~K-DbKpirM9JdadDxknE^Qt!9U~vF z3P{*hx=OOgP@%T9Df}|-C7q>&HPPpUN6nSmURUdsA!}R}OL>cPr`cB*G`2<=Dx|jjWlxZfdQDR6)Hl9OaFOLq zZe%_leU002L1OQ-(Q&l;AiO&j3{Xs7>7vr)K`Hak$=4*Wvwf|+?i2t3 literal 0 HcmV?d00001 diff --git a/res/images/btn_menu_lock_foc.png b/res/images/btn_menu_lock_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..5671cfc5bb6e8995cfc7d0876c47622a3c02e00d GIT binary patch literal 1379 zcmb7Ee@qi+7_JkPm8pOZHtn{{xy6x4??-!g^g?0RyH*+~BhXRe631~p=vmq;cL!}T zi^~St7R}6bM9hc@AjSoCERKz&2@;HMFkKum$fjFhZpIkcSR~9XlI%O6=pV*pm%ICZ zo(?CC<4%ctSA=Yg`lWGwPL*#w!?oW z&cl%8x5GZdgL)#Y7?6rv6tS|U%qz461)Co(DufDRG$06x8V|)n4Pljz+2JK#8qD== z1csJOw4fbc4yxKy4zaQ#LWJ3pC!iPxk)#>35+sT3gm4tY5fr>+9%iKplEx`$<$-}W z#a~BPaIO_!U}c8`niioEBpQvHqZYHQ)FYV9X45%vJP%mpsqwJJ$MVAJ_9O!*s)8a# zG)WFaIwM~zH)(blM7o?pDB|&~5{K0lp@3vajE^9g8AU=NJ+CEeRjUvmhVfWy)f`7}ngJ9mZTXjSaum+m zEH0M9P$!X(5(JaPK8gWsX20a8NruB*RtJlt1chNv!bWj~6D3)W!zi3_T9a6JSk?Hj zAnN{ftn?7;cp{c&6_M9u#VgAV$;y`pWKC8Bas*;4N$6Fd6!yzeHCHdoa+aK^NX??( zrN|*@Nmp8WjDO0-kuHk`Cny}GieU_g=X0dR$yf>8!R5Q)6|DdNXoY|v5WN{5X^!L; z=s114+Uj7jdRW9TI3Wr+3W0lNeFnpt9yiB$V?WJw6zxo5w!AOfPXFpCIs3!t8)GG$ z*Vr|*yK_&^$43IKRZP6yvG3W`td>u%?;Tvo+7G|n{D3^pF@u*2qUY}I8$J5-%ut+q z>vmmp6c$R&C+>Wgn!V*D+Ll|&8!J0Tj&1(_J!5`KbU5v6jhoedX#? zJEmNJc)ne1yqeNCxYBT8c%;(x2%i@(+?jh-ZoGuja6OQWqRlSrhnMO!4qeE zBhI;$kC^@IXUA_^q&KhK`E;Ut;OVUXXMUjrM{k>Zg9on7)o#ogwoINo^#wv03lGj& zKVU9&yV$*#@6VacqkoNcU+OjOcst|8cHu_%rTQD0FSV{WO>F%wp=~-nPR!NJ-^y&5 zT)2KQF`quTE@w=zq@Nt_pYpzqUYBx?D?u?w{ko_O+UB!Zr5UO zPe!Y6sME)06#hHi*=KEgfg370zpb$~w{&`{)e{)`yR53@(88Bvj+?XJjAx(v-84fj sW_@0h$Z>TX$WF?&tlad>#e`w4VN|*`oz+!vMZfmk&NA+-qvqZJ04uKVuK)l5 literal 0 HcmV?d00001 diff --git a/res/images/btn_menu_lock_nor.png b/res/images/btn_menu_lock_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..5f384947ac2a948e1812ac674c945025a5b417e0 GIT binary patch literal 1430 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ-L~|!!ko6N+NuHtdjF{^%6m9^eS=-fVzQ(*;f=KCTFLXC?ut( zXXe=|z2CiGNg*@ERw>-n*TA>HIW;5GqpB!1xXLdixhgx^GDXSWPQj+a3TQxXYDuC( zMQ%=Bu~mhw64+cTAR8pCucQE0Qj%?}1aVY^Z-9bxeo?A|sh+WJvVozYf|;3~p^2%P znW2t?k%6I+z5x)K=^C0?nVMM{nJYkn6417ylr*a#7dNO~K%T8qMoCG5mA-y?dAVM> zv0i>ry1t>Mr6tG=BO_g)3fZ zE`@j@x4_pIZg5^PG@yV%reBd*pl_&Wpr4xy@)uZjaY;}r!Wmdq7l%|9r0NHy7U!21 zB?IFlO&O*c7&4a6BsFpIWGChrManjC7v#}N``KhE@mcU znp?P80L?Rm>GjMjE=kNwP6gQq(wm9UYl2s=m2**QVo82cNPd0}Ean3;@=NlIGx7@* zoP*62G{Q6UQu51-H9^q=@uf>@QD#|cid#{Bt^zn*tunFLZ|>$|=4NbcWNK~%^s1qu zql=M+i#&rDPg4#bc8-AF(4%lm=G|~)nPsTM94K-8JHhFrD(EiONa!= zBDRfpu5>uAkri-kkzIU)XGLI>qiX3t@%YKoCYF1xYtR4P|73dk-re7~?*D!-_FnbM zmll13%QFm;#6*@Ev}*b!a%qe7CaP`L(VirqdE2ZyqBOBwW$8h=3YNYP3ePVk_HVP7 zycC)wkkcfh(Ii};e%xA7*ag%R9(nF=5`PND v5P>+MEgX~U<)MKaJmU~JoZqPLW07Fs3{Kl-aORf}sHF6C^>bP0l+XkKU7hz@ literal 0 HcmV?d00001 diff --git a/res/images/btn_menu_lock_sel.png b/res/images/btn_menu_lock_sel.png new file mode 100644 index 0000000000000000000000000000000000000000..1baa790190a4eae0ad430bbfa92251e189e961f3 GIT binary patch literal 1433 zcmb7EeN5D57(d|z#>bSeF%2R0NDx%6?cMc03Wpr+9h?DV+)XjMg>o&>aMyNi*&Y00 z;xQP;X&gGoL;_JEm`p{6S%5IexrMl8xVcQcCB~7MFvBuGvP`zHvA2B9Ka9zmw(m!t z-|u;z-}Aih(TeiogxIaIDwQh1SwdEVF<<#&qQD7APlKt%3i-Bof`St;(}eOgMf(FS}1Km)Sf0fF)~Ffvrb)UljZ^Jr{B z1F^JKvmYx%$^?R`XG@wz#?@Tz_B1zmEVO2K0hAxW0fCQ^DJbCcauOb}YLG$87o4%!unu(CVWB z-bA_c&yH@#%dS2$GdR~ACml4X|&vG>HmvWS{tYk?t zBKs~wJ4D_GE$fQ2FYs^HlSYSLuft3_kSdDWNS&E9>g_fIrYj3XY!#rk1kIB-Hla1?G)b0aF%hOm>gxdT7_dUkA2q%EaQpY&Cz_i{({ z=4;>Y+06Ia3*#>52In)??ufSw4IR@3?X9iH`zxNbrFq|sS%^A+CJ4QbURjzyyv^tgYQ1cAlOe-PUz}2YsNTGnCSgwC0pju}cTuYsvcM;ONul?nESh z)OPCJ#D==+WN-T3;V%~7Ps~tR2DL-c)%(n+rN6GH<5%y?v+BE%vGGT;+gmK#v~y8? z(*+lk`(yK<2b2pAMQwZ#1v0vS8eo9_~IWnr0m3_9hRD)uzg@-SY;XNxbTg7_O%>1 z;(__&p|E;3D(BJPS(C$u`Gb5=XiSuTd^{#kR@gpguXSX-Q5qagnwTj*8IpV8`5Tcn zTMq?)NQ!%=x;Mh4-FX&%rSs`XVNE#GC+-mcqUN6kLj zG<6~&ly^T}`lw$>)Ew%c-*EzHs0BKlu+PSVh=n`W1~`3&#S<)hhL2riULGm{u-Jr@frKQdAxM7kgs-8vpT`v%eOQ)wxqII7 z`~Ci}&%IbzTUl7Jw!mVs6b7r_5v8qc0^Ryiq?kVZnxXiAP6f&SoKcX;F4BZFU=~jK<714HAF>5Ohv9m z=`cJf^mHKvNezXTgk^m(Q7~m#l2b90BF zmS)K?clS1A0--m|PECYG;o_{qcSt}sf~*I{18$afcqu#XbNYO&lkmC8fX|8B{glg2 zQQj=~P7YMF38KLGNXkxD1YCrja^kq3a=S>E%S{m^?kC)|gU)h;vTkrP4@`R|SG>)2 z-jmDtG{6~(7EzRVw(@l`#ZdH^q9VR}8rjk$%7T*6A2Z9c5G4yVaUT!@nj#^YyfWfl z>^lQ29Uw`9f*$xO9QU$>i=|1w*Fg~#tSf*na)tksD-1e;nayxVb7YTT$C=BeR)?FV z%K~J0Lo|35UP<2^w^)`*LDm~dPX9dpacz!wb>8gWV-L=4k*qJ54CPkGyO%$c8l0Mb zYItH@71t7*8#`Ayb{$(=Q2a}G!DqkMjBgZrx5^)ouYGqpEu1?$-aS10&E%MP6im_$ zn=Xx`$C`UrZq5wR;=c+f%hT04@g3{mJ8TRkQhl*UPVb(0f7?)#S3S-zfbuUtQG2}S z)`4%I-*Ekhqdix?yef&i9xCP2>(^YlX&Wkg5|n_PT@%NT-~gH?&?&^c7thDXF6{kx__`gn!?`wV&vbqjpEdbPtR{2O&(cx z;L(cy^zPK*y!n&Q6}{A-%q^}_e`~td@MHd4EC2bm@!GCeC%!uM$A&{a4-9~>&+K#@ kboVU=p9#)&_C`sw#dAjZe0a~M)8-E>=&xl*E1G-%1L>L3-2eap literal 0 HcmV?d00001 diff --git a/res/images/btn_menu_share_nor.png b/res/images/btn_menu_share_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..bdea318f97c4eaf4935c9947c40ff7b88adf7182 GIT binary patch literal 1332 zcmb7EeQXnD81F!~xnw9>ogmZORgvk|>s@zu?McD*uHCA%)V8vj2y$!Rt><=k-?u#!tS&BER%9}niv2ZQ7_O^~uP`4<=GLzYT$XCyIxQkMXenL+CU;z}2Z&$f z8$lTG@z%{_03sHy7ov4qU0^K}lSM0U=vZ|z3DJ;jjh^IVO+Z8HL8BnK(7(POMiC+I zLTkx@Es$hELa1p|K%^}gjkPt!oN;u`YGjqpKmrkHJfe%ulFH~VG{eily>X49NJd3# za-nlh)dfNbD=PpYt@g^84aX6Rvf@=FMd1|)VZ#Z`24AWYuVP4wA!sD~pwOBUZ(zcl zFKY{)Txdemk_?8WQYmZ7Zk3fr40k%61_wb@LXAqbRnmC9Qc^8B1`en(MM!FbEFlIX zUoW?4E);q?7lN1!1m=k)HJd1yGEC=_7;d#;qG-gG(N?uExZ}n>wbf{A5@2DV$}LI^ z)}z6a1H;_i-;kjQya702Bi;ovB{*Ih*t9?s!Iv)K6m$rT2jz>H?Nt2uI4u;YyFe5=F5 z{ICECPKW|W0UH$_Fq!gTW!zEy-1NEOw~mL*`G0?!FVH8`!C-jAQ_}w4x1J?0AN{j4 zbWr~Bk*$-H{U5h)4T@KvUS4$dV#Lw^CgK^4MxMPszVk|I!t#V==H%e`iC1npJ{)TQ ze4%`5$EMB)SL}h}Xzd79u#I22_+jso7x&UPO1BqZIDfMz_{9#b=b`TI1adw6oxi>8 z@UoHWy$3Q7vg3u(!LJSvPmwq9+rRb4_O0F6OTG5wQp@g9+wW(*D{9I=Q;+mCl}{90 zm@L^c@Wa2psk7I*tJim%r@!o(?S12=D|?PeW{vo!;L2_DtN54?q>Px?D++=UGHozJ+xomu!!Durf;-VnR;HoczNjB zv47q#OqYF+ruFFs8}*MKA3M;wju2l@Z%-i%c9XkgO?dxb5 r^5^yWpZaNa-|kEbvSQ+s%hm7ZnaYB|q78g--1v|Ay+JPR+0^+TUxn4C literal 0 HcmV?d00001 diff --git a/res/images/btn_menu_share_sel.png b/res/images/btn_menu_share_sel.png new file mode 100644 index 0000000000000000000000000000000000000000..05e8f16e2a127e6bcfd15854b6325a99854bed9d GIT binary patch literal 1370 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ-L~|!!ko6N+NuHtdjF{^%6m9^eS=-fVzQ(*;f=KCTFLXC?ut( zXXe=|z2CiGNg*@ERw>-n*TA>HIW;5GqpB!1xXLdixhgx^GDXSWPQj+a3TQxXYDuC( zMQ%=Bu~mhw64+cTAR8pCucQE0Qj%?}1aVY^Z-9bxeo?A|sh+WJvVozYf|;3~p^2%P znW2t?k%6I+z5x)K=^C0?nVMM{nJYkn6417ylr*a#7dNO~K%T8qMoCG5mA-y?dAVM> zv0i>ry1t>Mr6tG=BO_g)3fZ zE`@j@x4_pIZg5^PG@yV%reBd*pl_&Wpr4xy@)uZjaY;}r!Wmdq7l%|9r0NHy7U!21 zB?IFlO&O*c7&4a6BsFpIWGChrManjC7v#}N``KhE@mcELQzIuA3pXXG-V{>8N+0M5eNbXRN*pjDV2T4V;Yl6HfoGP~JYWtf0%nDl z$IT8542-ipT^vIyZoQdh?|nEx2lL}E%ltQI+V)i*$ZtE}L<;{?4t zD~?}`cm77ZuoQj@wmA0rf#%bzZRw9s@4hpKyWQP+)|2Vg#rNK3U$Qwr+3KiE&}IdL zMoymuCgB+eSkwwuocQ;vwfFFJb)L0c>)!rNOHb6ZGDs4;)$)rm@hq>c=)^?n{2jmf z%^ok+V>teEZP&7&JP?hX)AhQR8AiP*N{AM}C2P1|{OnIx?!4^&#uP&)Jp5%4w$V}$jm;dl|xA8r^#Ll-x^S!Y3 zsxuo5S7<+8BxEeRYKi*NY2{%LcXBO!xTjlU-oslf#S#Q(o>K}54S5l<_e+2E;wiUp z8QVcgCNXa_vaBVlc$>>$NO@(px)-`{*CVjOCn|=IxJ3O2q gLH7H|bOvUIWuL+)DW2T$4OH5By85}Sb4q9e022V|-2eap literal 0 HcmV?d00001 diff --git a/res/widgets/button.edc b/res/widgets/button.edc index 61e552b..c746e5a 100644 --- a/res/widgets/button.edc +++ b/res/widgets/button.edc @@ -16,6 +16,7 @@ #define STATE_NORMAL 0 #define STATE_SELECTED 1 +#define STATE_DISABLE 2 group { name, "elm/button/base/style.menu.button"; @@ -284,6 +285,15 @@ group { state, "default" 0.0; min, 0 64; } + description { + state, "focused" 0.0; + inherit, "default" 0.0; + color, 0 119 246 255; + } + description { + state, "disable" 0.0; + inherit, "default" 0.0; + } } part { @@ -341,6 +351,16 @@ group { align, 0.5 0.5; } } + description { + state, "focused" 0.0; + inherit, "default" 0.0; + color, 255 255 255 255; + } + description { + state, "disable" 0.0; + inherit, "default" 0.0; + color, 87 87 87 127; + } } part { @@ -359,6 +379,11 @@ group { align, 0.5 0.0; fixed, 0 1; } + description { + state, "disable" 0.0; + inherit, "default" 0.0; + color, 194 194 194 127; + } } part { @@ -380,6 +405,11 @@ group { align, 0.0 0.5; fixed, 1 0; } + description { + state, "disable" 0.0; + inherit, "default" 0.0; + color, 194 194 194 127; + } } part { @@ -398,6 +428,11 @@ group { align, 0.5 1.0; fixed, 0 1; } + description { + state, "disable" 0.0; + inherit, "default" 0.0; + color, 194 194 194 127; + } } part { @@ -419,6 +454,46 @@ group { align, 1.0 0.5; fixed, 1 0; } + description { + state, "disable" 0.0; + inherit, "default" 0.0; + color, 194 194 194 127; + } + } + } + + programs { + program { + name, SIG_FOCUSED; + signal, "elm,action,focus"; + source, "elm"; + action, STATE_SET "focused" 0.0; + target, "part.bg"; + target, "elm.text"; + transition, TRANSITION_FOCUS; + } + + program { + name, SIG_UNFOCUSED; + signal, "elm,action,unfocus"; + source, "elm"; + action, STATE_SET "default" 0.0; + target, "part.bg"; + target, "elm.text"; + transition, TRANSITION_FOCUS; + } + + program { + name, SIG_DISABLE; + signal, SIG_DISABLE; + source, SRC_LIVETV_BTN; + script { + set_state(PART:"elm.text", "disable", 0.0); + set_state(PART:"part.inside.line.up", "disable", 0.0); + set_state(PART:"part.inside.line.down", "disable", 0.0); + set_state(PART:"part.inside.line.left", "disable", 0.0); + set_state(PART:"part.inside.line.right", "disable", 0.0); + } } } } @@ -426,6 +501,10 @@ group { group { name, "elm/button/base/style.action.menu.button"; data.item, "focus_highlight" "on"; + script { + public cur_state; + } + parts { part { name, "part.bg"; @@ -435,6 +514,19 @@ group { state, "default" 0.0; min, 125 124; } + description { + state, "focused" 0.0; + inherit, "default" 0.0; + color, 0 119 246 255; + } + description { + state, "selected" 0.0; + inherit, "default" 0.0; + } + description { + state, "disable" 0.0; + inherit, "default" 0.0; + } } part { @@ -508,8 +600,8 @@ group { } part { - name, "elm.swallow.content"; - type, SWALLOW; + name, "part.icon"; + type, IMAGE; scale, 1; description { state, "default" 0.0; @@ -525,6 +617,18 @@ group { fixed, 1 1; min, 60 60; } + description { + state, "focused" 0.0; + inherit, "default" 0.0; + } + description { + state, "focused" 0.0; + inherit, "default" 0.0; + } + description { + state, "focused" 0.0; + inherit, "default" 0.0; + } } part { @@ -565,6 +669,247 @@ group { align, 0.5 0.5; } } + description { + state, "focused" 0.0; + inherit, "default" 0.0; + color, 255 255 255 255; + } + description { + state, "selected" 0.0; + inherit, "default" 0.0; + color, 64 136 211 255; + } + description { + state, "disable" 0.0; + inherit, "default" 0.0; + color, 104 104 104 127; + } + } + } + + programs{ + program { + name, SIG_FOCUSED; + signal, "elm,action,focus"; + source, "elm"; + script { + new state; + state = get_int(cur_state); + if (state != STATE_DISABLE) { + set_int(cur_state, STATE_NORMAL); + run_program(PROGRAM:"focused,anim"); + } + } + } + + program { + name, SIG_UNFOCUSED; + signal, "elm,action,unfocus"; + source, "elm"; + script { + new state; + state = get_int(cur_state); + if (state == STATE_SELECTED) { + set_state(PART:"part.bg", "selected", 0.0); + set_state(PART:"elm.text", "selected", 0.0); + set_state(PART:"part.icon", "selected", 0.0); + } else if (state != STATE_DISABLE) { + run_program(PROGRAM:"unfocused,anim"); + } + } + } + + program { + name, "focused,anim"; + action, STATE_SET "focused" 0.0; + target, "part.bg"; + target, "elm.text"; + target, "part.icon"; + transition, TRANSITION_FOCUS; + } + + program { + name, "unfocused,anim"; + action, STATE_SET "default" 0.0; + target, "part.bg"; + target, "elm.text"; + target, "part.icon"; + transition, TRANSITION_FOCUS; + } + + program { + name, SIG_SELECTED; + signal, SIG_SELECTED; + source, SRC_ACTION_BTN; + script { + new state; + state = get_int(cur_state); + if (state != STATE_DISABLE) { + set_int(cur_state, STATE_SELECTED); + set_state(PART:"part.bg", "selected", 0.0); + set_state(PART:"elm.text", "selected", 0.0); + set_state(PART:"part.icon", "selected", 0.0); + } + } + } + + program { + name, SIG_DISABLE; + signal, SIG_DISABLE; + source, SRC_ACTION_BTN; + script { + set_int(cur_state, STATE_DISABLE); + set_state(PART:"part.bg", "disable", 0.0); + set_state(PART:"elm.text", "disable", 0.0); + set_state(PART:"part.icon", "disable", 0.0); + } + } + } +} + +group { + name, "elm/button/base/style.action.menu.favorite.button"; + inherit, "elm/button/base/style.action.menu.button"; + data.item, "focus_highlight" "on"; + images { + image, ACTION_FAV_NOR_PNG COMP; + image, ACTION_FAV_FOC_PNG COMP; + image, ACTION_FAV_SEL_PNG COMP; + image, ACTION_FAV_DIS_PNG COMP; + } + parts { + part { + name, "part.icon"; + type, IMAGE; + scale, 1; + description { + state, "default" 0.0; + rel1 { + to, "part.icon.bg"; + relative, 0.5 0.5; + } + rel2 { + to, "part.icon.bg"; + relative, 0.5 0.5; + } + align, 0.5 0.5; + fixed, 1 1; + min, 60 60; + image.normal, ACTION_FAV_NOR_PNG; + } + description { + state, "focused" 0.0; + inherit, "default" 0.0; + image.normal, ACTION_FAV_FOC_PNG; + } + description { + state, "selected" 0.0; + inherit, "default" 0.0; + image.normal, ACTION_FAV_SEL_PNG; + } + description { + state, "disable" 0.0; + inherit, "default" 0.0; + image.normal, ACTION_FAV_DIS_PNG; + } + } + } +} + +group { + name, "elm/button/base/style.action.menu.lock.button"; + inherit, "elm/button/base/style.action.menu.button"; + data.item, "focus_highlight" "on"; + images { + image, ACTION_LOCK_NOR_PNG COMP; + image, ACTION_LOCK_FOC_PNG COMP; + image, ACTION_LOCK_SEL_PNG COMP; + image, ACTION_LOCK_DIS_PNG COMP; + } + parts { + part { + name, "part.icon"; + type, IMAGE; + scale, 1; + description { + state, "default" 0.0; + rel1 { + to, "part.icon.bg"; + relative, 0.5 0.5; + } + rel2 { + to, "part.icon.bg"; + relative, 0.5 0.5; + } + align, 0.5 0.5; + fixed, 1 1; + min, 60 60; + image.normal, ACTION_LOCK_NOR_PNG; + } + description { + state, "focused" 0.0; + inherit, "default" 0.0; + image.normal, ACTION_LOCK_FOC_PNG; + } + description { + state, "selected" 0.0; + inherit, "default" 0.0; + image.normal, ACTION_LOCK_SEL_PNG; + } + description { + state, "disable" 0.0; + inherit, "default" 0.0; + image.normal, ACTION_LOCK_DIS_PNG; + } + } + } +} + +group { + name, "elm/button/base/style.action.menu.share.button"; + inherit, "elm/button/base/style.action.menu.button"; + data.item, "focus_highlight" "on"; + images { + image, ACTION_SHARE_NOR_PNG COMP; + image, ACTION_SHARE_FOC_PNG COMP; + image, ACTION_SHARE_SEL_PNG COMP; + image, ACTION_SHARE_DIS_PNG COMP; + } + parts { + part { + name, "part.icon"; + type, IMAGE; + scale, 1; + description { + state, "default" 0.0; + rel1 { + to, "part.icon.bg"; + relative, 0.5 0.5; + } + rel2 { + to, "part.icon.bg"; + relative, 0.5 0.5; + } + align, 0.5 0.5; + fixed, 1 1; + min, 60 60; + image.normal, ACTION_SHARE_NOR_PNG; + } + description { + state, "focused" 0.0; + inherit, "default" 0.0; + image.normal, ACTION_SHARE_FOC_PNG; + } + description { + state, "selected" 0.0; + inherit, "default" 0.0; + image.normal, ACTION_SHARE_SEL_PNG; + } + description { + state, "disable" 0.0; + inherit, "default" 0.0; + image.normal, ACTION_SHARE_DIS_PNG; + } } } } diff --git a/src/view/view_action_menu.c b/src/view/view_action_menu.c index f260b05..4176a0c 100644 --- a/src/view/view_action_menu.c +++ b/src/view/view_action_menu.c @@ -15,6 +15,7 @@ #include #include +#include #include #include "define.h" @@ -23,7 +24,7 @@ struct _priv { Evas_Object *win; Evas_Object *base; - Evas_Object *box; + Evas_Object *live_btn; Evas_Object *menu_btn[COUNT_ACTION]; }; @@ -34,14 +35,35 @@ const char *str_action[] = { NULL }; -/* 'Lock' and 'Share' is not supported now, so the disable image is used. */ -const char *str_action_icon_png[] = { - ACTION_FAV_NOR_PNG, - ACTION_LOCK_DIS_PNG, - ACTION_SHARE_DIS_PNG, +const char *style_action[] = { + STYLE_ACTION_MENU_FAV_BTN, + STYLE_ACTION_MENU_LOCK_BTN, + STYLE_ACTION_MENU_SHARE_BTN, NULL }; +static void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, + Evas_Event_Mouse_Move *ev) +{ + if (!obj) { + _ERR("Invalid argument."); + return; + } + + if (!elm_object_focus_get(obj)) + elm_object_focus_set(obj, EINA_TRUE); +} + +static input_handler _livetv_input_handler = { + .mouse_move = _mouse_move_cb + /* It will be implemented later. */ +}; + +static input_handler _action_input_handler = { + .mouse_move = _mouse_move_cb + /* It will be implemented later. */ +}; + static bool _draw_top_area(struct _priv *priv) { Evas_Object *btn; @@ -58,12 +80,16 @@ static bool _draw_top_area(struct _priv *priv) return false; } + inputmgr_add_callback(btn, 0, &_livetv_input_handler, priv); + + priv->live_btn = btn; + return true; } static bool _draw_menu_area(struct _priv *priv) { - Evas_Object *box, *btn, *img; + Evas_Object *box, *btn; int i; if (!priv || !priv->base) { @@ -79,34 +105,32 @@ static bool _draw_menu_area(struct _priv *priv) for (i = 0; i < COUNT_ACTION; i++) { btn = utils_add_button(priv->base, NULL, str_action[i], - STYLE_ACTION_MENU_BTN); + style_action[i]); if (!btn) { _ERR("Add button failed."); evas_object_del(box); return false; } - img = elm_image_add(btn); - if (!img) { - _ERR("elm_image_add failed."); - evas_object_del(box); - return false; - } - - elm_image_file_set(img, str_action_icon_png[i], NULL); - evas_object_show(img); + inputmgr_add_callback(btn, i, &_action_input_handler, priv); - elm_object_part_content_set(btn, NULL, img); + /* 'Lock' and 'Share' is not supported, so emit disable. */ + if (i != 0) + elm_object_signal_emit(btn, + SIG_DISABLE, SRC_ACTION_BTN); elm_box_pack_end(box, btn); priv->menu_btn[i] = btn; } + /* 'Favorite' can only be focused now. */ + elm_object_focus_next_object_set(priv->menu_btn[0], + priv->menu_btn[0], ELM_FOCUS_LEFT); elm_object_focus_next_object_set(priv->menu_btn[0], - priv->menu_btn[COUNT_ACTION - 1], ELM_FOCUS_LEFT); - elm_object_focus_next_object_set(priv->menu_btn[COUNT_ACTION - 1], priv->menu_btn[0], ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(priv->live_btn, priv->menu_btn[0], + ELM_FOCUS_DOWN); return true; } @@ -194,6 +218,8 @@ static void _show(void *data) if (priv->base) evas_object_show(priv->base); + + elm_object_focus_set(priv->live_btn, EINA_TRUE); } static void _hide(void *data) -- 2.7.4 From 0c369731c9ec3193a1e1b64f0e0e9da4004cf680 Mon Sep 17 00:00:00 2001 From: Hyojung Jo Date: Mon, 17 Aug 2015 10:49:59 +0900 Subject: [PATCH 02/16] Block action menu temporarily Change-Id: I818158b0f74292a823a9dc52df57496470611657 Signed-off-by: Hyojung Jo --- src/view/view_base.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/view/view_base.c b/src/view/view_base.c index 8d1c63b..b5a39ed 100644 --- a/src/view/view_base.c +++ b/src/view/view_base.c @@ -291,9 +291,13 @@ static void _grid_key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, if (!strcmp(ev->keyname, KEY_BACK) || !strcmp(ev->keyname, KEY_BACK_REMOTE)) elm_object_focus_set(priv->menu[priv->cur_menu_id], EINA_TRUE); + + /* FIXME: The action menu is blocked temporarily. */ + /* else if (!strcmp(ev->keyname, KEY_MENU) || !strcmp(ev->keyname, KEY_MENU_REMOTE)) viewmgr_show_view(VIEW_ID_ACTION_MENU); + */ } static input_handler _menu_input_handler = { -- 2.7.4 From d80c181486e5b50f827efe3f9367cf672bd21906 Mon Sep 17 00:00:00 2001 From: Hyojung Jo Date: Wed, 19 Aug 2015 16:12:45 +0900 Subject: [PATCH 03/16] View: Fixed the action menu to use table instead of box Change-Id: I779cc5b383b4916e85b25cca7d15ef51a6b97ad0 Signed-off-by: Hyojung Jo --- include/define.h | 3 ++ include/utils.h | 2 + res/widgets/button.edc | 76 ++++++++----------------------- src/common/utils.c | 25 ++++++++++ src/view/view_action_menu.c | 108 ++++++++++++++++++++++++++++++-------------- 5 files changed, 124 insertions(+), 90 deletions(-) diff --git a/include/define.h b/include/define.h index f328d2b..d03a3f4 100644 --- a/include/define.h +++ b/include/define.h @@ -60,6 +60,7 @@ #define SIG_VISIBLE "visible" #define SIG_INVISIBLE "invisible" #define SIG_DISABLE "disable" +#define SIG_BTN_DISABLE "elm,state,disabled" /* Source */ #define SRC_EDC "edc" @@ -107,6 +108,8 @@ #define SIZE_BOX_PAD_V 0 #define SIZE_STR 1024 #define SIZE_APP_ICON_MAX 100 +#define SIZE_ACTION_TABLE_BORDER 0 +#define SIZE_COL_MAX 4 /* Count */ #define COUNT_MENU 6 diff --git a/include/utils.h b/include/utils.h index ac892a6..be99fb2 100644 --- a/include/utils.h +++ b/include/utils.h @@ -26,6 +26,8 @@ Evas_Object *utils_add_box(Evas_Object *parent, const char *part, Evas_Coord padding_v); Evas_Object *utils_add_button(Evas_Object *parent, const char *part, const char *text, const char *style); +Evas_Object *utils_add_table(Evas_Object *table, const char *part, + int padding_x, int padding_y); bool utils_launch_app(const char *appid, const char *key, const char *value); #endif /* __AIR_FAVORITE_UTILS_H__ */ diff --git a/res/widgets/button.edc b/res/widgets/button.edc index c746e5a..23516a2 100644 --- a/res/widgets/button.edc +++ b/res/widgets/button.edc @@ -499,12 +499,19 @@ group { } group { - name, "elm/button/base/style.action.menu.button"; + name, "elm/button/base/style.action.menu.favorite.button"; data.item, "focus_highlight" "on"; script { public cur_state; } + images { + image, ACTION_FAV_NOR_PNG COMP; + image, ACTION_FAV_FOC_PNG COMP; + image, ACTION_FAV_SEL_PNG COMP; + image, ACTION_FAV_DIS_PNG COMP; + } + parts { part { name, "part.bg"; @@ -605,6 +612,7 @@ group { scale, 1; description { state, "default" 0.0; + image.normal, ACTION_FAV_NOR_PNG; rel1 { to, "part.icon.bg"; relative, 0.5 0.5; @@ -620,14 +628,17 @@ group { description { state, "focused" 0.0; inherit, "default" 0.0; + image.normal, ACTION_FAV_FOC_PNG; } description { - state, "focused" 0.0; + state, "selected" 0.0; inherit, "default" 0.0; + image.normal, ACTION_FAV_SEL_PNG; } description { - state, "focused" 0.0; + state, "disable" 0.0; inherit, "default" 0.0; + image.normal, ACTION_FAV_DIS_PNG; } } @@ -754,9 +765,9 @@ group { } program { - name, SIG_DISABLE; - signal, SIG_DISABLE; - source, SRC_ACTION_BTN; + name, SIG_BTN_DISABLE; + signal, SIG_BTN_DISABLE; + source, "elm"; script { set_int(cur_state, STATE_DISABLE); set_state(PART:"part.bg", "disable", 0.0); @@ -768,57 +779,8 @@ group { } group { - name, "elm/button/base/style.action.menu.favorite.button"; - inherit, "elm/button/base/style.action.menu.button"; - data.item, "focus_highlight" "on"; - images { - image, ACTION_FAV_NOR_PNG COMP; - image, ACTION_FAV_FOC_PNG COMP; - image, ACTION_FAV_SEL_PNG COMP; - image, ACTION_FAV_DIS_PNG COMP; - } - parts { - part { - name, "part.icon"; - type, IMAGE; - scale, 1; - description { - state, "default" 0.0; - rel1 { - to, "part.icon.bg"; - relative, 0.5 0.5; - } - rel2 { - to, "part.icon.bg"; - relative, 0.5 0.5; - } - align, 0.5 0.5; - fixed, 1 1; - min, 60 60; - image.normal, ACTION_FAV_NOR_PNG; - } - description { - state, "focused" 0.0; - inherit, "default" 0.0; - image.normal, ACTION_FAV_FOC_PNG; - } - description { - state, "selected" 0.0; - inherit, "default" 0.0; - image.normal, ACTION_FAV_SEL_PNG; - } - description { - state, "disable" 0.0; - inherit, "default" 0.0; - image.normal, ACTION_FAV_DIS_PNG; - } - } - } -} - -group { name, "elm/button/base/style.action.menu.lock.button"; - inherit, "elm/button/base/style.action.menu.button"; + inherit, "elm/button/base/style.action.menu.favorite.button"; data.item, "focus_highlight" "on"; images { image, ACTION_LOCK_NOR_PNG COMP; @@ -867,7 +829,7 @@ group { group { name, "elm/button/base/style.action.menu.share.button"; - inherit, "elm/button/base/style.action.menu.button"; + inherit, "elm/button/base/style.action.menu.favorite.button"; data.item, "focus_highlight" "on"; images { image, ACTION_SHARE_NOR_PNG COMP; diff --git a/src/common/utils.c b/src/common/utils.c index 8da11a1..f3e7223 100644 --- a/src/common/utils.c +++ b/src/common/utils.c @@ -159,6 +159,31 @@ Evas_Object *utils_add_button(Evas_Object *parent, const char *part, return btn; } +Evas_Object *utils_add_table(Evas_Object *parent, const char *part, + int padding_x, int padding_y) +{ + Evas_Object *table; + + if (!parent) { + _ERR("Invalid argument."); + return NULL; + } + + table = elm_table_add(parent); + if (!table) { + _ERR("elm_table_add failed."); + return NULL; + } + + elm_table_padding_set(table, padding_x, padding_y); + evas_object_show(table); + + if (part) + elm_object_part_content_set(parent, part, table); + + return table; +} + bool utils_launch_app(const char *appid, const char *key, const char *value) { app_control_h app_ctrl; diff --git a/src/view/view_action_menu.c b/src/view/view_action_menu.c index 4176a0c..05ab27b 100644 --- a/src/view/view_action_menu.c +++ b/src/view/view_action_menu.c @@ -28,18 +28,28 @@ struct _priv { Evas_Object *menu_btn[COUNT_ACTION]; }; -const char *str_action[] = { - STR_FAVORITE, - STR_LOCK, - STR_SHARE, - NULL +struct _action_info { + const char *title; + const char *style; + Eina_Bool disable; }; -const char *style_action[] = { - STYLE_ACTION_MENU_FAV_BTN, - STYLE_ACTION_MENU_LOCK_BTN, - STYLE_ACTION_MENU_SHARE_BTN, - NULL +static struct _action_info action_info[] = { + { + .title = STR_FAVORITE, + .style = STYLE_ACTION_MENU_FAV_BTN, + .disable = EINA_FALSE + }, + { + .title = STR_LOCK, + .style = STYLE_ACTION_MENU_LOCK_BTN, + .disable = EINA_TRUE + }, + { + .title = STR_SHARE, + .style = STYLE_ACTION_MENU_SHARE_BTN, + .disable = EINA_TRUE + } }; static void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, @@ -54,17 +64,43 @@ static void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, elm_object_focus_set(obj, EINA_TRUE); } +static void _livetv_key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, + Evas_Event_Key_Down *ev) +{ + if (!ev) { + _ERR("Invalid argument."); + return; + } + + if (!strcmp(ev->keyname, KEY_BACK) + || !strcmp(ev->keyname, KEY_BACK_REMOTE)) + viewmgr_hide_view(VIEW_ID_ACTION_MENU); +} + +static void _action_key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, + Evas_Event_Key_Down *ev) +{ + if (!ev) { + _ERR("Invalid argument."); + return; + } + + if (!strcmp(ev->keyname, KEY_BACK) + || !strcmp(ev->keyname, KEY_BACK_REMOTE)) + viewmgr_hide_view(VIEW_ID_ACTION_MENU); +} + static input_handler _livetv_input_handler = { - .mouse_move = _mouse_move_cb - /* It will be implemented later. */ + .mouse_move = _mouse_move_cb, + .key_down = _livetv_key_down_cb }; static input_handler _action_input_handler = { - .mouse_move = _mouse_move_cb - /* It will be implemented later. */ + .mouse_move = _mouse_move_cb, + .key_down = _action_key_down_cb }; -static bool _draw_top_area(struct _priv *priv) +static bool _draw_livetv_area(struct _priv *priv) { Evas_Object *btn; @@ -82,6 +118,10 @@ static bool _draw_top_area(struct _priv *priv) inputmgr_add_callback(btn, 0, &_livetv_input_handler, priv); + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_UP); + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_RIGHT); + priv->live_btn = btn; return true; @@ -89,37 +129,39 @@ static bool _draw_top_area(struct _priv *priv) static bool _draw_menu_area(struct _priv *priv) { - Evas_Object *box, *btn; - int i; + Evas_Object *table, *btn; + int i, row = 0, col = 0; if (!priv || !priv->base) { _ERR("Invalid argument."); return false; } - box = utils_add_box(priv->base, PART_ACTION_MENU, EINA_TRUE, 0, 0); - if (!box) { - _ERR("Add box failed."); + table = utils_add_table(priv->base, PART_ACTION_MENU, + SIZE_ACTION_TABLE_BORDER, SIZE_ACTION_TABLE_BORDER); + if (!table) { + _ERR("Add table failed."); return false; } for (i = 0; i < COUNT_ACTION; i++) { - btn = utils_add_button(priv->base, NULL, str_action[i], - style_action[i]); + btn = utils_add_button(priv->base, NULL, action_info[i].title, + action_info[i].style); if (!btn) { _ERR("Add button failed."); - evas_object_del(box); + evas_object_del(table); return false; } inputmgr_add_callback(btn, i, &_action_input_handler, priv); - /* 'Lock' and 'Share' is not supported, so emit disable. */ - if (i != 0) - elm_object_signal_emit(btn, - SIG_DISABLE, SRC_ACTION_BTN); + if (action_info[i].disable) + elm_object_disabled_set(btn, EINA_TRUE); + + col = i % SIZE_COL_MAX; + row = i / SIZE_COL_MAX; - elm_box_pack_end(box, btn); + elm_table_pack(table, btn, col, row, 1, 1); priv->menu_btn[i] = btn; } @@ -135,7 +177,7 @@ static bool _draw_menu_area(struct _priv *priv) return true; } -static bool _draw_bottom_area(struct _priv *priv) +static bool _draw_favorite_area(struct _priv *priv) { if (!priv || !priv->base) { _ERR("Invalid argument."); @@ -154,8 +196,8 @@ static void _draw_view_content(struct _priv *priv) return; } - if (!_draw_top_area(priv)) { - _ERR("Draw top area failed."); + if (!_draw_livetv_area(priv)) { + _ERR("Draw livetv area failed."); return; } @@ -164,8 +206,8 @@ static void _draw_view_content(struct _priv *priv) return; } - if (!_draw_bottom_area(priv)) - _ERR("Draw bottom area failed."); + if (!_draw_favorite_area(priv)) + _ERR("Draw favorite area failed."); } static Evas_Object *_create(Evas_Object *win, void *data) -- 2.7.4 From 923a9ac527733c857a33ff71232d2298868fba98 Mon Sep 17 00:00:00 2001 From: Hyojung Jo Date: Wed, 19 Aug 2015 21:00:49 +0900 Subject: [PATCH 04/16] View: Enabled the buttons to be clicked Change-Id: I31e7350387e069646ed2ed361e3dee4c347f5049 Signed-off-by: Hyojung Jo --- include/define.h | 4 +-- res/widgets/button.edc | 50 ++++++++++++++++++++++++++++++-- src/view/view_action_menu.c | 70 +++++++++++++++++++++++++++++++++------------ 3 files changed, 99 insertions(+), 25 deletions(-) diff --git a/include/define.h b/include/define.h index d03a3f4..505fa8a 100644 --- a/include/define.h +++ b/include/define.h @@ -59,13 +59,11 @@ #define SIG_ITEM_SELECTED "item.selected" #define SIG_VISIBLE "visible" #define SIG_INVISIBLE "invisible" -#define SIG_DISABLE "disable" -#define SIG_BTN_DISABLE "elm,state,disabled" +#define SIG_DISABLE "elm,state,disabled" /* Source */ #define SRC_EDC "edc" #define SRC_MENU_BTN "menubtn" -#define SRC_LIVETV_BTN "source.livetv.btn" #define SRC_ACTION_BTN "source.action.btn" /* Transition */ diff --git a/res/widgets/button.edc b/res/widgets/button.edc index 23516a2..0782ec8 100644 --- a/res/widgets/button.edc +++ b/res/widgets/button.edc @@ -460,6 +460,20 @@ group { color, 194 194 194 127; } } + + part { + name, "event"; + type, RECT; + description { + state, "default" 0.0; + color, 0 0 0 0; + } + description { + state, "disable" 0.0; + inherit, "default" 0.0; + visible, 0; + } + } } programs { @@ -486,15 +500,23 @@ group { program { name, SIG_DISABLE; signal, SIG_DISABLE; - source, SRC_LIVETV_BTN; + source, "elm"; script { set_state(PART:"elm.text", "disable", 0.0); set_state(PART:"part.inside.line.up", "disable", 0.0); set_state(PART:"part.inside.line.down", "disable", 0.0); set_state(PART:"part.inside.line.left", "disable", 0.0); set_state(PART:"part.inside.line.right", "disable", 0.0); + set_state(PART:"event", "disable", 0.0); } } + + program { + name, "mouse_unclick_after"; + signal, "mouse,clicked,1"; + source, "event"; + action, SIGNAL_EMIT "elm,action,click" ""; + } } } @@ -696,6 +718,20 @@ group { color, 104 104 104 127; } } + + part { + name, "event"; + type, RECT; + description { + state, "default" 0.0; + color, 0 0 0 0; + } + description { + state, "disable" 0.0; + inherit, "default" 0.0; + visible, 0; + } + } } programs{ @@ -765,16 +801,24 @@ group { } program { - name, SIG_BTN_DISABLE; - signal, SIG_BTN_DISABLE; + name, SIG_DISABLE; + signal, SIG_DISABLE; source, "elm"; script { set_int(cur_state, STATE_DISABLE); set_state(PART:"part.bg", "disable", 0.0); set_state(PART:"elm.text", "disable", 0.0); set_state(PART:"part.icon", "disable", 0.0); + set_state(PART:"event", "disable", 0.0); } } + + program { + name, "mouse_unclick_after"; + signal, "mouse,clicked,1"; + source, "event"; + action, SIGNAL_EMIT "elm,action,click" ""; + } } } diff --git a/src/view/view_action_menu.c b/src/view/view_action_menu.c index 05ab27b..988442b 100644 --- a/src/view/view_action_menu.c +++ b/src/view/view_action_menu.c @@ -21,6 +21,13 @@ #include "define.h" #include "utils.h" +enum button_type { + BTN_LIVETV = 0, + BTN_FAVORITE, + BTN_LOCK, + BTN_SHARE, +}; + struct _priv { Evas_Object *win; Evas_Object *base; @@ -29,6 +36,7 @@ struct _priv { }; struct _action_info { + int id; const char *title; const char *style; Eina_Bool disable; @@ -36,16 +44,19 @@ struct _action_info { static struct _action_info action_info[] = { { + .id = BTN_FAVORITE, .title = STR_FAVORITE, .style = STYLE_ACTION_MENU_FAV_BTN, .disable = EINA_FALSE }, { + .id = BTN_LOCK, .title = STR_LOCK, .style = STYLE_ACTION_MENU_LOCK_BTN, .disable = EINA_TRUE }, { + .id = BTN_SHARE, .title = STR_SHARE, .style = STYLE_ACTION_MENU_SHARE_BTN, .disable = EINA_TRUE @@ -64,20 +75,42 @@ static void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, elm_object_focus_set(obj, EINA_TRUE); } -static void _livetv_key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, - Evas_Event_Key_Down *ev) +static void _favorite_selected(void *data, Evas_Object *obj) { - if (!ev) { - _ERR("Invalid argument."); - return; - } + /* It will be implemented later */ +} - if (!strcmp(ev->keyname, KEY_BACK) - || !strcmp(ev->keyname, KEY_BACK_REMOTE)) - viewmgr_hide_view(VIEW_ID_ACTION_MENU); +static void _livetv_selected(void *data, Evas_Object *obj) +{ + /* It will be implemented later */ } -static void _action_key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, +static void _clicked_cb(int id, void *data, Evas_Object *obj) +{ + + switch (id) { + case BTN_LIVETV: + _livetv_selected(data, obj); + break; + + case BTN_FAVORITE: + _favorite_selected(data, obj); + break; + + case BTN_LOCK: + /* It is not supported yet. */ + break; + + case BTN_SHARE: + /* It is not supported yet. */ + break; + + default: + _ERR("Unhandled action type."); + } +} + +static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { if (!ev) { @@ -90,14 +123,10 @@ static void _action_key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, viewmgr_hide_view(VIEW_ID_ACTION_MENU); } -static input_handler _livetv_input_handler = { - .mouse_move = _mouse_move_cb, - .key_down = _livetv_key_down_cb -}; - -static input_handler _action_input_handler = { +static input_handler _btn_input_handler = { .mouse_move = _mouse_move_cb, - .key_down = _action_key_down_cb + .clicked = _clicked_cb, + .key_down = _key_down_cb }; static bool _draw_livetv_area(struct _priv *priv) @@ -116,7 +145,7 @@ static bool _draw_livetv_area(struct _priv *priv) return false; } - inputmgr_add_callback(btn, 0, &_livetv_input_handler, priv); + inputmgr_add_callback(btn, BTN_LIVETV, &_btn_input_handler, priv); elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_UP); elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_LEFT); @@ -153,7 +182,8 @@ static bool _draw_menu_area(struct _priv *priv) return false; } - inputmgr_add_callback(btn, i, &_action_input_handler, priv); + inputmgr_add_callback(btn, action_info[i].id, + &_btn_input_handler, priv); if (action_info[i].disable) elm_object_disabled_set(btn, EINA_TRUE); @@ -171,6 +201,8 @@ static bool _draw_menu_area(struct _priv *priv) priv->menu_btn[0], ELM_FOCUS_LEFT); elm_object_focus_next_object_set(priv->menu_btn[0], priv->menu_btn[0], ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(priv->menu_btn[0], + priv->menu_btn[0], ELM_FOCUS_DOWN); elm_object_focus_next_object_set(priv->live_btn, priv->menu_btn[0], ELM_FOCUS_DOWN); -- 2.7.4 From 6da68aba338bf4a97c4d40c21a2227878acabae0 Mon Sep 17 00:00:00 2001 From: Hyojung Jo Date: Fri, 21 Aug 2015 21:03:38 +0900 Subject: [PATCH 05/16] View: Enable the favorite button to be selected Change-Id: I5339c9155b4b2151112f7230b4ad8c72a83fac82 Signed-off-by: Hyojung Jo --- include/datamgr.h | 8 +- include/define.h | 10 +- include/grid.h | 5 +- include/{view_action_menu.h => view.h} | 12 +- include/view_base.h | 22 --- res/images/btn_menu_share_dis.png | Bin 1270 -> 0 bytes res/images/btn_menu_share_foc.png | Bin 1325 -> 0 bytes res/images/btn_menu_share_sel.png | Bin 1370 -> 0 bytes ..._menu_share_nor.png => btn_menu_unlock_foc.png} | Bin 1332 -> 1390 bytes res/images/btn_menu_unlock_nor.png | Bin 0 -> 1445 bytes res/widgets/button.edc | 216 +++++++++++++-------- res/widgets/gengrid_apps.edc | 6 + res/widgets/gengrid_gallery.edc | 6 + res/widgets/gengrid_movie.edc | 6 + res/widgets/gengrid_music.edc | 6 + res/widgets/gengrid_tv.edc | 6 + res/widgets/gengrid_webs.edc | 6 + src/data/app.c | 25 ++- src/data/channel.c | 57 +++++- src/data/media.c | 39 +++- src/data/web.c | 2 +- src/grid/grid_apps.c | 15 +- src/grid/grid_gallery.c | 15 +- src/grid/grid_movie.c | 15 +- src/grid/grid_music.c | 15 +- src/grid/grid_tv.c | 14 +- src/grid/grid_webs.c | 1 - src/main.c | 3 +- src/view/view_action_menu.c | 113 +++++------ src/view/view_base.c | 55 +++--- 30 files changed, 422 insertions(+), 256 deletions(-) rename include/{view_action_menu.h => view.h} (77%) delete mode 100644 include/view_base.h delete mode 100644 res/images/btn_menu_share_dis.png delete mode 100644 res/images/btn_menu_share_foc.png delete mode 100644 res/images/btn_menu_share_sel.png rename res/images/{btn_menu_share_nor.png => btn_menu_unlock_foc.png} (51%) create mode 100644 res/images/btn_menu_unlock_nor.png diff --git a/include/datamgr.h b/include/datamgr.h index 1aba63f..be176d0 100644 --- a/include/datamgr.h +++ b/include/datamgr.h @@ -24,12 +24,18 @@ enum data_type { DATA_DURATION, }; +enum action_type { + ACTION_LAUNCH = 0, + ACTION_UPDATE_FAVORITE, + ACTION_UPDATE_LOCK, +}; + struct datamgr { Eina_List *(*get_favorites)(enum item_type type); void (*free_favorites)(Eina_List *list); int (*get_count)(enum item_type type); char *(*get_data)(void *data, enum data_type type); - bool (*action)(Elm_Object_Item *it); + bool (*action)(Elm_Object_Item *it, enum action_type type); }; struct datamgr *get_channel_datamgr(void); diff --git a/include/define.h b/include/define.h index 505fa8a..b34be59 100644 --- a/include/define.h +++ b/include/define.h @@ -49,7 +49,6 @@ #define STYLE_LIVETV_BTN "style.livetv.button" #define STYLE_ACTION_MENU_FAV_BTN "style.action.menu.favorite.button" #define STYLE_ACTION_MENU_LOCK_BTN "style.action.menu.lock.button" -#define STYLE_ACTION_MENU_SHARE_BTN "style.action.menu.share.button" /* Signal */ #define SIG_FOCUSED "focused" @@ -57,9 +56,11 @@ #define SIG_SELECTED "selected" #define SIG_UNSELECTED "unselected" #define SIG_ITEM_SELECTED "item.selected" +#define SIG_ITEM_FOCUSED "item_focused" #define SIG_VISIBLE "visible" #define SIG_INVISIBLE "invisible" #define SIG_DISABLE "elm,state,disabled" +#define SIG_TOGGLE "toggle" /* Source */ #define SRC_EDC "edc" @@ -73,7 +74,6 @@ /* Text */ #define STR_FAVORITE "Favorite" #define STR_LOCK "Lock" -#define STR_SHARE "Share" #define STR_NULL "(NULL)" #define STR_NO_CONTENTS "No Contents" #define STR_CNT_TV "channels" @@ -124,14 +124,12 @@ #define ACTION_FAV_FOC_PNG "btn_menu_favorite_foc.png" #define ACTION_FAV_SEL_PNG "btn_menu_favorite_sel.png" #define ACTION_FAV_DIS_PNG "btn_menu_favorite_dis.png" +#define ACTION_UNLOCK_NOR_PNG "btn_menu_unlock_nor.png" +#define ACTION_UNLOCK_FOC_PNG "btn_menu_unlock_foc.png" #define ACTION_LOCK_NOR_PNG "btn_menu_lock_nor.png" #define ACTION_LOCK_FOC_PNG "btn_menu_lock_foc.png" #define ACTION_LOCK_SEL_PNG "btn_menu_lock_sel.png" #define ACTION_LOCK_DIS_PNG "btn_menu_lock_dis.png" -#define ACTION_SHARE_NOR_PNG "btn_menu_share_nor.png" -#define ACTION_SHARE_FOC_PNG "btn_menu_share_foc.png" -#define ACTION_SHARE_SEL_PNG "btn_menu_share_sel.png" -#define ACTION_SHARE_DIS_PNG "btn_menu_share_dis.png" /* Path */ #define PATH_PLAY_ICON_PNG IMGDIR"/ic_thumbnail_play.png" diff --git a/include/grid.h b/include/grid.h index 984ab34..bc55ff6 100644 --- a/include/grid.h +++ b/include/grid.h @@ -17,6 +17,8 @@ #ifndef __AIR_FAVORITE_GRID_H__ #define __AIR_FAVORITE_GRID_H__ +#include "datamgr.h" + struct grid_data { const char *id; Evas_Object *grid; @@ -24,10 +26,11 @@ struct grid_data { int item_size_y; Eina_List *list; struct grid_class *gclass; + Elm_Object_Item *focused_item; Eina_List *(*create_item_list)(void); void (*destroy_item_list)(Eina_List *list); - void (*item_selected)(Elm_Object_Item *it); + bool (*item_action)(Elm_Object_Item *it, enum action_type type); }; struct grid_data *get_tv_grid_data(void); diff --git a/include/view_action_menu.h b/include/view.h similarity index 77% rename from include/view_action_menu.h rename to include/view.h index 4b44c54..a32afa3 100644 --- a/include/view_action_menu.h +++ b/include/view.h @@ -14,9 +14,15 @@ * limitations under the License. */ -#ifndef __AIR_FAVORITE_VIEW_ACTION_MENU_H__ -#define __AIR_FAVORITE_VIEW_ACTION_MENU_H__ +#ifndef __AIR_FAVORITE_VIEW_H__ +#define __AIR_FAVORITE_VIEW_H__ +view_class *view_base_get_vclass(void); view_class *view_action_menu_get_vclass(void); -#endif /* __AIR_FAVORITE_VIEW_ACTION_MENU_H__ */ +enum update_type { + UPDATE_DATA = 0, + UPDATE_GRID, +}; + +#endif /* __AIR_APPS_VIEW_H__ */ diff --git a/include/view_base.h b/include/view_base.h deleted file mode 100644 index 61608f2..0000000 --- a/include/view_base.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __AIR_FAVORITE_VIEW_BASE_H__ -#define __AIR_FAVORITE_VIEW_BASE_H__ - -view_class *view_base_get_vclass(void); - -#endif /* __AIR_FAVORITE_VIEW_BASE_H__ */ diff --git a/res/images/btn_menu_share_dis.png b/res/images/btn_menu_share_dis.png deleted file mode 100644 index 0a793aa571ce60a42a9e9666bcb4604a1a2db7d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1270 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ-L~|l`=yjN+NuHtdjF{^%6m9^eS=-fVzQ(*;f=KCTFLXC?ut( zXXe=|z2CiGNg*@ERw>-n*TA>HIW;5GqpB!1xXLdixhgx^GDXSWPQj+a3TQxXYDuC( zMQ%=Bu~mhw64+cTAR8pCucQE0Qj%?}1aVY^Z-9bxeo?A|sh+WJvVozYf|;3~p^2%P znW2t?k%6I+z5x)K=^C0?nVMM{nJYkn6417ylr*a#7dNO~K%T8qMoCG5mA-y?dAVM> zv0i>ry1t>Mr6tG=BO_g)3fZ zE`@j@w*YQzUNJP7fB~jokyxN_sAmB35=^15FMg%Dxp39RB|)hO_hL1;IHa;5RX-@T zIKQ+g85nVC${?!>telHd6HD@oLh|!-V4)b0kzbNuoRMFk;2dnGpb?&#my%yztO-`{ z>ucqiS6q^qmz?V9Vygr+K`%2i#mdsq)zZS!%+kof%+S!#)zrz@$kf@y)zsP0)yc@n z!V#v|B|o_|H#M&WrZ)wl*Ab^)P*TV(0NU)5T9jFqn&MWJpQ`}&vQ;K-x0vHJ52`l> zw_7Z5>eUB2MjsThND&Pa0;V1i6P|2=9C*S{%>$p=s@t74MH}gJlZ}wfhSLX1Q z4Cx1qMyam18NQ#fh%;K0Tl$hK`}?`#hZ_wxe^)Kq_p~PYeC_nQON-{5aAMzkO4F*u zWXha{v5ngohVN^>{9@+%2Vq(N?&?AR`MzuAqmQByRUYTK`eyFd zxf~S*^4yHFhZi^PS&?bfXnuZ^UQx!H(rMjZzkY8xz{ITsCu%(Yau_g_Y_yTRalt4V PR1$f*`njxgN@xNA!o|VM diff --git a/res/images/btn_menu_share_foc.png b/res/images/btn_menu_share_foc.png deleted file mode 100644 index 0bfcd196f8643fbc4e8cfb3ab6dd54ef5a238b0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1325 zcmb7EZA=?w9Pb!7#sohw68EAzk8RGl_Ih`{YkSbm(rclEGAsqUxhcop1HI6D@$Og) z1Gk}JQA8nG=7`ysMND*tATG{njCA`V(YQF5$Y2`OW@EmQEWTxP>T`v%eOQ)wxqII7 z`~Ci}&%IbzTUl7Jw!mVs6b7r_5v8qc0^Ryiq?kVZnxXiAP6f&SoKcX;F4BZFU=~jK<714HAF>5Ohv9m z=`cJf^mHKvNezXTgk^m(Q7~m#l2b90BF zmS)K?clS1A0--m|PECYG;o_{qcSt}sf~*I{18$afcqu#XbNYO&lkmC8fX|8B{glg2 zQQj=~P7YMF38KLGNXkxD1YCrja^kq3a=S>E%S{m^?kC)|gU)h;vTkrP4@`R|SG>)2 z-jmDtG{6~(7EzRVw(@l`#ZdH^q9VR}8rjk$%7T*6A2Z9c5G4yVaUT!@nj#^YyfWfl z>^lQ29Uw`9f*$xO9QU$>i=|1w*Fg~#tSf*na)tksD-1e;nayxVb7YTT$C=BeR)?FV z%K~J0Lo|35UP<2^w^)`*LDm~dPX9dpacz!wb>8gWV-L=4k*qJ54CPkGyO%$c8l0Mb zYItH@71t7*8#`Ayb{$(=Q2a}G!DqkMjBgZrx5^)ouYGqpEu1?$-aS10&E%MP6im_$ zn=Xx`$C`UrZq5wR;=c+f%hT04@g3{mJ8TRkQhl*UPVb(0f7?)#S3S-zfbuUtQG2}S z)`4%I-*Ekhqdix?yef&i9xCP2>(^YlX&Wkg5|n_PT@%NT-~gH?&?&^c7thDXF6{kx__`gn!?`wV&vbqjpEdbPtR{2O&(cx z;L(cy^zPK*y!n&Q6}{A-%q^}_e`~td@MHd4EC2bm@!GCeC%!uM$A&{a4-9~>&+K#@ kboVU=p9#)&_C`sw#dAjZe0a~M)8-E>=&xl*E1G-%1L>L3-2eap diff --git a/res/images/btn_menu_share_sel.png b/res/images/btn_menu_share_sel.png deleted file mode 100644 index 05e8f16e2a127e6bcfd15854b6325a99854bed9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1370 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ-L~|!!ko6N+NuHtdjF{^%6m9^eS=-fVzQ(*;f=KCTFLXC?ut( zXXe=|z2CiGNg*@ERw>-n*TA>HIW;5GqpB!1xXLdixhgx^GDXSWPQj+a3TQxXYDuC( zMQ%=Bu~mhw64+cTAR8pCucQE0Qj%?}1aVY^Z-9bxeo?A|sh+WJvVozYf|;3~p^2%P znW2t?k%6I+z5x)K=^C0?nVMM{nJYkn6417ylr*a#7dNO~K%T8qMoCG5mA-y?dAVM> zv0i>ry1t>Mr6tG=BO_g)3fZ zE`@j@x4_pIZg5^PG@yV%reBd*pl_&Wpr4xy@)uZjaY;}r!Wmdq7l%|9r0NHy7U!21 zB?IFlO&O*c7&4a6BsFpIWGChrManjC7v#}N``KhE@mcELQzIuA3pXXG-V{>8N+0M5eNbXRN*pjDV2T4V;Yl6HfoGP~JYWtf0%nDl z$IT8542-ipT^vIyZoQdh?|nEx2lL}E%ltQI+V)i*$ZtE}L<;{?4t zD~?}`cm77ZuoQj@wmA0rf#%bzZRw9s@4hpKyWQP+)|2Vg#rNK3U$Qwr+3KiE&}IdL zMoymuCgB+eSkwwuocQ;vwfFFJb)L0c>)!rNOHb6ZGDs4;)$)rm@hq>c=)^?n{2jmf z%^ok+V>teEZP&7&JP?hX)AhQR8AiP*N{AM}C2P1|{OnIx?!4^&#uP&)Jp5%4w$V}$jm;dl|xA8r^#Ll-x^S!Y3 zsxuo5S7<+8BxEeRYKi*NY2{%LcXBO!xTjlU-oslf#S#Q(o>K}54S5l<_e+2E;wiUp z8QVcgCNXa_vaBVlc$>>$NO@(px)-`{*CVjOCn|=IxJ3O2q gLH7H|bOvUIWuL+)DW2T$4OH5By85}Sb4q9e022V|-2eap diff --git a/res/images/btn_menu_share_nor.png b/res/images/btn_menu_unlock_foc.png similarity index 51% rename from res/images/btn_menu_share_nor.png rename to res/images/btn_menu_unlock_foc.png index bdea318f97c4eaf4935c9947c40ff7b88adf7182..8e354891076c2a5e5a61192c2a98a7eae3278f78 100644 GIT binary patch delta 603 zcmdnO^^R*p5L1kii-C)=lZA_ssf)9rp{uEri<_m3k)?rwk%^h5nT4y8LPc(YudkJ7 zUU5lcUUI6Zi>(q+L@zTl#R{s|8JFJ4>zEQ0OwA1qom?ypjLnTqT}=%QEnFPkEM1LE z4O|?ZEsYHfC+jhn)qiG>{m#I^xX#nXF{I+wn;G^VhaE)PrPog4>slQkQ}X(Wgg~JH z`@zVVt#@N&SVURHFNR*&I=PvP&#!COizgxGcU=PBX#Ei9Hv89SchK?RB%8~x|H{=o zS)f1t_l{?GpYAc>3D$GbY>7t%7x~*_jUv9}d>nwb*@gVB^VJ(_iTBw{9s%?VM)0g7m}37JIMb z7yPv%<3twc_QLF&DTlfrcy8-z`?;P~A#L8lAmukp?;m8f2%a}b@q+$U>x)`<`TPzx zZTcX^@q-WS#|=e2rvm*WZ~5xSu-tXJxOM-Q=S>9k zZNOl8-r{_{MLv1uG_kpvtWER3Y}ztu)!Z1iQ-_`v)NK_^o8j6G4mD^1>T%U`88B$1 V8*S%m@wv$W1fH&bF6*2UngEg6{}2EG delta 545 zcmaFIwS{X#5L1kkv#E=Vn}w^9fvLHnp{uEdql>YNtE01(q+L@zTl#R{s|1()8*>zEQ0%-vkf+>DKlOwEl9TuluP9bJqpT+EDJ z9ZgJ)oLns2ChIYm)$5&^830D1nZ}RK%2g(x4ACK?6 zcf|XTMc>}qRm}P4yAql>)n)*RZQ%#a*xM5|_yk-9t>>8kknQAsQh)o`1i#f?B@_62 zdovWi2OaRNRa`H1(0$HQupZM!?GrmUt>6FD^oQZ!JIj*i`NT~#3ze2so_@mM?sZo+ z56$JpTP9>{K45?HNW5(8+0SlIZ+z)>59<|qvth#jX)zA3XKcw6DKXl^{_@&MK6T+M zB9+r_WX3x0(kZQAXFET&wSJv)@sV;?okf=$TLV)?Wg~uRMmpbS`rletD7$7+ek`l` z)a&z4$QC`-s(AKl@0VSlx;fSp2{@rEg`VwTv+rA_`u_r(9oh=_mW0DAIy`pf@U zG>cYztTtC^oV<0-yvDS>o{aN78z|+;w JWt~$(69D$o;er4F diff --git a/res/images/btn_menu_unlock_nor.png b/res/images/btn_menu_unlock_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..fb89ee97bf98afdcfd0f50642e0c4b1039ed605d GIT binary patch literal 1445 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ-L~|!!ko6N+NuHtdjF{^%6m9^eS=-fVzQ(*;f=KCTFLXC?ut( zXXe=|z2CiGNg*@ERw>-n*TA>HIW;5GqpB!1xXLdixhgx^GDXSWPQj+a3TQxXYDuC( zMQ%=Bu~mhw64+cTAR8pCucQE0Qj%?}1aVY^Z-9bxeo?A|sh+WJvVozYf|;3~p^2%P znW2t?k%6I+z5x)K=^C0?nVMM{nJYkn6417ylr*a#7dNO~K%T8qMoCG5mA-y?dAVM> zv0i>ry1t>Mr6tG=BO_g)3fZ zE`@j@x4_pIZg5^PG@yV%reBd*pl_&Wpr4xy@)uZjaY;}r!Wmdq7l%|9r0NHy7U!21 zB?IFlO&O*c7&4a6BsFpIWGChrManjC7v#}N``KhE@mc=x;TbZ+}_is!{J$lP;;>HjSpTfQB_mjky9Xn(DSnm7ZS1<4Vv`l|y`F!?e%lKsL zzT}^pTsrevTQz+Wxq@dL5?NMoPw7Eg`on^V)6;v7Ce2A)&%N5`70c`gaw~+rh3+)z zUU*x!?WyY0%P!gxY>pEc)E~GlS?$REf+^5|rO#JPj* z9`Ba|5iHUR#NPZ>$Ua&8YOB=--f0IGWFDHDz$(*d_hFjj?C=ZBeh0Ny7@k~Gc)v(=el2uA6r+8ImcINY->3+o#Ggy;1ExaIhQ%>W~jE5W*(|B8yH-()_ z-d@2d92c=g?VzZ|^*O!1MmsL<7t>=(Pl(yP;n&J5pKTz)F>CSJUwU6vp8UJdecZ8C z;Cr;!?K%O!wc)LQ6lx|so44AeHMZk`eC@iklFJNQYt`TU@cnU8d-ax8issFhXAiB~ z^Z6ZXVrWQrgx;0eMiMt9^*Q{x-CEAtcYs6M021go=Kc^$VE8gI&-MB=(F9Pz>FMg{ Jvd$@?2>|?)1`_}P literal 0 HcmV?d00001 diff --git a/res/widgets/button.edc b/res/widgets/button.edc index 0782ec8..2a8ecee 100644 --- a/res/widgets/button.edc +++ b/res/widgets/button.edc @@ -17,6 +17,7 @@ #define STATE_NORMAL 0 #define STATE_SELECTED 1 #define STATE_DISABLE 2 +#define STATE_TOGGLE 3 group { name, "elm/button/base/style.menu.button"; @@ -736,66 +737,40 @@ group { programs{ program { - name, SIG_FOCUSED; - signal, "elm,action,focus"; - source, "elm"; + name, "load"; + signal, "load"; + source, ""; script { - new state; - state = get_int(cur_state); - if (state != STATE_DISABLE) { - set_int(cur_state, STATE_NORMAL); - run_program(PROGRAM:"focused,anim"); - } + set_int(cur_state, STATE_NORMAL); } } program { - name, SIG_UNFOCUSED; - signal, "elm,action,unfocus"; + name, SIG_FOCUSED; + signal, "elm,action,focus"; source, "elm"; script { new state; state = get_int(cur_state); - if (state == STATE_SELECTED) { - set_state(PART:"part.bg", "selected", 0.0); - set_state(PART:"elm.text", "selected", 0.0); - set_state(PART:"part.icon", "selected", 0.0); - } else if (state != STATE_DISABLE) { - run_program(PROGRAM:"unfocused,anim"); + if (state == STATE_NORMAL) { + set_state(PART:"part.bg", "focused", 0.0); + set_state(PART:"part.icon", "focused", 0.0); + set_state(PART:"elm.text", "focused", 0.0); } } } program { - name, "focused,anim"; - action, STATE_SET "focused" 0.0; - target, "part.bg"; - target, "elm.text"; - target, "part.icon"; - transition, TRANSITION_FOCUS; - } - - program { - name, "unfocused,anim"; - action, STATE_SET "default" 0.0; - target, "part.bg"; - target, "elm.text"; - target, "part.icon"; - transition, TRANSITION_FOCUS; - } - - program { - name, SIG_SELECTED; - signal, SIG_SELECTED; - source, SRC_ACTION_BTN; + name, SIG_UNFOCUSED; + signal, "elm,action,unfocus"; + source, "elm"; script { new state; state = get_int(cur_state); - if (state != STATE_DISABLE) { - set_int(cur_state, STATE_SELECTED); - set_state(PART:"part.bg", "selected", 0.0); - set_state(PART:"elm.text", "selected", 0.0); - set_state(PART:"part.icon", "selected", 0.0); + if (state == STATE_NORMAL) { + set_state(PART:"part.bg", "default", 0.0); + set_state(PART:"part.icon", "default", 0.0); + set_state(PART:"elm.text", "default", 0.0); } } } @@ -827,6 +802,8 @@ group { inherit, "elm/button/base/style.action.menu.favorite.button"; data.item, "focus_highlight" "on"; images { + image, ACTION_UNLOCK_NOR_PNG COMP; + image, ACTION_UNLOCK_FOC_PNG COMP; image, ACTION_LOCK_NOR_PNG COMP; image, ACTION_LOCK_FOC_PNG COMP; image, ACTION_LOCK_SEL_PNG COMP; @@ -850,11 +827,21 @@ group { align, 0.5 0.5; fixed, 1 1; min, 60 60; + image.normal, ACTION_UNLOCK_NOR_PNG; + } + description { + state, "default.toggle" 0.0; + inherit, "default" 0.0; image.normal, ACTION_LOCK_NOR_PNG; } description { state, "focused" 0.0; inherit, "default" 0.0; + image.normal, ACTION_UNLOCK_FOC_PNG; + } + description { + state, "focused.toggle" 0.0; + inherit, "default" 0.0; image.normal, ACTION_LOCK_FOC_PNG; } description { @@ -869,53 +856,116 @@ group { } } } -} -group { - name, "elm/button/base/style.action.menu.share.button"; - inherit, "elm/button/base/style.action.menu.favorite.button"; - data.item, "focus_highlight" "on"; - images { - image, ACTION_SHARE_NOR_PNG COMP; - image, ACTION_SHARE_FOC_PNG COMP; - image, ACTION_SHARE_SEL_PNG COMP; - image, ACTION_SHARE_DIS_PNG COMP; - } - parts { - part { - name, "part.icon"; - type, IMAGE; - scale, 1; - description { - state, "default" 0.0; - rel1 { - to, "part.icon.bg"; - relative, 0.5 0.5; + programs{ + program { + name, "load"; + signal, "load"; + source, ""; + script { + set_int(cur_state, STATE_NORMAL); + } + } + + program { + name, SIG_TOGGLE; + signal, SIG_TOGGLE; + source, SRC_ACTION_BTN; + script { + new state; + state = get_int(cur_state); + if (state == STATE_NORMAL) { + set_int(cur_state, STATE_TOGGLE); + set_state(PART:"part.icon", "default.toggle", 0.0); } - rel2 { - to, "part.icon.bg"; - relative, 0.5 0.5; + } + } + + program { + name, SIG_FOCUSED; + signal, "elm,action,focus"; + source, "elm"; + script { + new state; + state = get_int(cur_state); + if (state == STATE_NORMAL) { + set_state(PART:"part.icon", "focused", 0.0); + run_program(PROGRAM:"focused,anim"); + } else if (state == STATE_TOGGLE) { + set_state(PART:"part.icon", "focused.toggle", 0.0); + run_program(PROGRAM:"focused,anim"); } - align, 0.5 0.5; - fixed, 1 1; - min, 60 60; - image.normal, ACTION_SHARE_NOR_PNG; } - description { - state, "focused" 0.0; - inherit, "default" 0.0; - image.normal, ACTION_SHARE_FOC_PNG; + } + + program { + name, SIG_UNFOCUSED; + signal, "elm,action,unfocus"; + source, "elm"; + script { + new state; + state = get_int(cur_state); + if (state == STATE_NORMAL) { + set_state(PART:"part.icon", "default", 0.0); + run_program(PROGRAM:"unfocused,anim"); + } else if (state != STATE_DISABLE) { + set_state(PART:"part.icon", "default.toggle", 0.0); + run_program(PROGRAM:"unfocused,anim"); + } } - description { - state, "selected" 0.0; - inherit, "default" 0.0; - image.normal, ACTION_SHARE_SEL_PNG; + } + + program { + name, "focused,anim"; + action, STATE_SET "focused" 0.0; + target, "part.bg"; + target, "elm.text"; + transition, TRANSITION_FOCUS; + } + + program { + name, "unfocused,anim"; + action, STATE_SET "default" 0.0; + target, "part.bg"; + target, "elm.text"; + transition, TRANSITION_FOCUS; + } + + program { + name, SIG_SELECTED; + signal, SIG_SELECTED; + source, SRC_ACTION_BTN; + script { + new state; + state = get_int(cur_state); + if (state == STATE_NORMAL) { + set_int(cur_state, STATE_TOGGLE); + set_state(PART:"part.icon", "focused.toggle", 0.0); + } else if (state == STATE_TOGGLE) { + set_int(cur_state, STATE_NORMAL); + set_state(PART:"part.icon", "focused", 0.0); + } } - description { - state, "disable" 0.0; - inherit, "default" 0.0; - image.normal, ACTION_SHARE_DIS_PNG; + } + + program { + name, SIG_DISABLE; + signal, SIG_DISABLE; + source, "elm"; + script { + set_int(cur_state, STATE_DISABLE); + set_state(PART:"part.bg", "disable", 0.0); + set_state(PART:"elm.text", "disable", 0.0); + set_state(PART:"part.icon", "disable", 0.0); + set_state(PART:"event", "disable", 0.0); } } + + program { + name, "mouse_unclick_after"; + signal, "mouse,clicked,1"; + source, "event"; + action, SIGNAL_EMIT "elm,action,click" ""; + } } } diff --git a/res/widgets/gengrid_apps.edc b/res/widgets/gengrid_apps.edc index bfa714a..de5ddc5 100644 --- a/res/widgets/gengrid_apps.edc +++ b/res/widgets/gengrid_apps.edc @@ -376,6 +376,7 @@ group { target, "part.focus.down"; target, "part.focus.right"; transition, TRANSITION_FOCUS; + after, "item_focused"; } program { @@ -411,6 +412,11 @@ group { } program { + name, "item_focused"; + action, SIGNAL_EMIT SIG_ITEM_FOCUSED SRC_EDC; + } + + program { name, SIG_SELECTED; signal, "elm,state,selected"; source, "elm"; diff --git a/res/widgets/gengrid_gallery.edc b/res/widgets/gengrid_gallery.edc index 5efc967..27cf738 100644 --- a/res/widgets/gengrid_gallery.edc +++ b/res/widgets/gengrid_gallery.edc @@ -372,6 +372,7 @@ group { target, "part.focus.right"; target, PART_THUMB_TEXT; transition, TRANSITION_FOCUS; + after, "item_focused"; } program { @@ -401,6 +402,11 @@ group { } program { + name, "item_focused"; + action, SIGNAL_EMIT SIG_ITEM_FOCUSED SRC_EDC; + } + + program { name, SIG_SELECTED; signal, "elm,state,selected"; source, "elm"; diff --git a/res/widgets/gengrid_movie.edc b/res/widgets/gengrid_movie.edc index bd5214b..c58b196 100644 --- a/res/widgets/gengrid_movie.edc +++ b/res/widgets/gengrid_movie.edc @@ -406,6 +406,7 @@ group { target, "part.focus.right"; target, "part.focus.down"; transition, TRANSITION_FOCUS; + after, "item_focused"; } program { @@ -442,6 +443,11 @@ group { } program { + name, "item_focused"; + action, SIGNAL_EMIT SIG_ITEM_FOCUSED SRC_EDC; + } + + program { name, SIG_SELECTED; signal, "elm,state,selected"; source, "elm"; diff --git a/res/widgets/gengrid_music.edc b/res/widgets/gengrid_music.edc index d1ed4cf..0449a3b 100644 --- a/res/widgets/gengrid_music.edc +++ b/res/widgets/gengrid_music.edc @@ -564,6 +564,7 @@ group { name, "focus.in.anim.2"; action, STATE_SET "focused" 0.0; target, "part.default.text.bg"; + after, "item_focused"; } program { @@ -601,6 +602,11 @@ group { } program { + name, "item_focused"; + action, SIGNAL_EMIT SIG_ITEM_FOCUSED SRC_EDC; + } + + program { name, SIG_SELECTED; signal, "elm,state,selected"; source, "elm"; diff --git a/res/widgets/gengrid_tv.edc b/res/widgets/gengrid_tv.edc index a9f0526..b67e2c6 100644 --- a/res/widgets/gengrid_tv.edc +++ b/res/widgets/gengrid_tv.edc @@ -401,6 +401,7 @@ group { target, "part.focus.right"; target, "part.focus.down"; transition, TRANSITION_FOCUS; + after, "item_focused"; } program { @@ -437,6 +438,11 @@ group { } program { + name, "item_focused"; + action, SIGNAL_EMIT SIG_ITEM_FOCUSED SRC_EDC; + } + + program { name, SIG_SELECTED; signal, "elm,state,selected"; source, "elm"; diff --git a/res/widgets/gengrid_webs.edc b/res/widgets/gengrid_webs.edc index 09e1517..aa810a8 100644 --- a/res/widgets/gengrid_webs.edc +++ b/res/widgets/gengrid_webs.edc @@ -371,6 +371,7 @@ group { target, "part.focus.right"; target, "part.focus.down"; transition, TRANSITION_FOCUS; + after, "item_focused"; } program { @@ -406,6 +407,11 @@ group { } program { + name, "item_focused"; + action, SIGNAL_EMIT SIG_ITEM_FOCUSED SRC_EDC; + } + + program { name, SIG_SELECTED; signal, "elm,state,selected"; source, "elm"; diff --git a/src/data/app.c b/src/data/app.c index 016b246..75fd6ab 100644 --- a/src/data/app.c +++ b/src/data/app.c @@ -153,9 +153,10 @@ static void _free_favorites(Eina_List *list) } } -static bool _action(Elm_Object_Item *it) +static bool _action(Elm_Object_Item *it, enum action_type type) { struct app_data *adata; + int r; if (!it) { _ERR("Invalid argument."); @@ -166,8 +167,26 @@ static bool _action(Elm_Object_Item *it) if (!adata || !adata->id) return false; - if (!utils_launch_app(adata->id, NULL, NULL)) { - _ERR("Launch %s failed.", adata->id); + switch (type) { + case ACTION_LAUNCH: + if (!utils_launch_app(adata->id, NULL, NULL)) { + _ERR("Launch %s failed.", adata->id); + return false; + } + + break; + + case ACTION_UPDATE_FAVORITE: + r = app_contents_favorite_set(CONTENTS_APP, adata->id, false); + if (r != APP_CONTENTS_ERROR_NONE) { + _ERR("Favorite unset failed."); + return false; + } + + break; + + default: + _ERR("Unhandled action type."); return false; } diff --git a/src/data/channel.c b/src/data/channel.c index 4d98241..5d5cb50 100644 --- a/src/data/channel.c +++ b/src/data/channel.c @@ -100,11 +100,6 @@ static char *_get_channel_title(struct channel_data *cdata) { char str[SIZE_STR]; - if (!cdata || !cdata->name) { - _ERR("Invalid argument."); - return NULL; - } - if (cdata->minor > 0) snprintf(str, sizeof(str), "%ld-%ld %s", cdata->major, cdata->minor, cdata->name); @@ -156,7 +151,29 @@ static void _free_favorites(Eina_List *list) } } -static bool _action(Elm_Object_Item *it) +static bool _unset_favorite(struct channel_data *cdata) +{ + int r; + + r = tv_service_channel_info_create(); + if (r != TVS_ERROR_OK) { + _ERR("Tv Service channel info create failed."); + return false; + } + + r = tv_service_delete_favorite_channel(cdata->id); + if (r != TVS_ERROR_OK) { + _ERR("Tv Service delete favorite channel failed."); + tv_service_channel_info_destroy(); + return false; + } + + tv_service_channel_info_destroy(); + + return true; +} + +static bool _action(Elm_Object_Item *it, enum action_type type) { struct channel_data *cdata; char str[SIZE_STR]; @@ -170,10 +187,32 @@ static bool _action(Elm_Object_Item *it) if (!cdata) return false; - snprintf(str, sizeof(str), "%d", cdata->id); + switch (type) { + case ACTION_LAUNCH: + snprintf(str, sizeof(str), "%d", cdata->id); + + if (!utils_launch_app(STR_LIVETV_APP_ID, + STR_KEY_SERVICE_ID, str)) { + _ERR("Livetv launch failed."); + return false; + } + + break; + + case ACTION_UPDATE_FAVORITE: + if (!_unset_favorite(cdata)) { + _ERR("Unset favorite channel failed."); + return false; + } - if (!utils_launch_app(STR_LIVETV_APP_ID, STR_KEY_SERVICE_ID, str)) { - _ERR("Livetv launch failed."); + break; + + case ACTION_UPDATE_LOCK: + /* It will implemented later. */ + break; + + default: + _ERR("Unhandled action type."); return false; } diff --git a/src/data/media.c b/src/data/media.c index f82fc27..7e17bbb 100644 --- a/src/data/media.c +++ b/src/data/media.c @@ -102,7 +102,9 @@ static Eina_List *_get_favorites(enum item_type type) g_list_foreach(id_list, _media_favorite_list_foreach, &l); media_content_disconnect(); - app_contents_free_favorite_list(id_list); + + if (id_list) + app_contents_free_favorite_list(id_list); return l; } @@ -112,8 +114,7 @@ static char *_get_video_duration(app_media_info *minfo) int duration, h, m, s, sec; char str[SIZE_STR]; - if (!minfo || !minfo->video || - minfo->media_type != MEDIA_CONTENT_TYPE_VIDEO) + if (minfo->media_type != MEDIA_CONTENT_TYPE_VIDEO) return NULL; duration = minfo->video->duration; @@ -200,7 +201,9 @@ static int _get_count(enum item_type type) } cnt = g_list_length(id_list); - app_contents_free_favorite_list(id_list); + + if (id_list) + app_contents_free_favorite_list(id_list); return cnt; } @@ -220,10 +223,11 @@ static void _free_favorites(Eina_List *list) } } -static bool _action(Elm_Object_Item *it) +static bool _action(Elm_Object_Item *it, enum action_type type) { app_media *am; app_media_info *minfo; + int r; if (!it) { _ERR("Invalid argument."); @@ -243,9 +247,28 @@ static bool _action(Elm_Object_Item *it) if (!minfo->media_id) return false; - if (!utils_launch_app(STR_MEDIAHUB_APP_ID, STR_KEY_MEDIA_ID, - minfo->media_id)) { - _ERR("Mediahub launch failed."); + switch (type) { + case ACTION_LAUNCH: + if (!utils_launch_app(STR_MEDIAHUB_APP_ID, STR_KEY_MEDIA_ID, + minfo->media_id)) { + _ERR("Mediahub launch failed."); + return false; + } + + break; + + case ACTION_UPDATE_FAVORITE: + r = app_contents_favorite_set(CONTENTS_MEDIA, minfo->media_id, + false); + if (r != APP_CONTENTS_ERROR_NONE) { + _ERR("Favorite unset failed."); + return false; + } + + break; + + default: + _ERR("Unhandled action type."); return false; } diff --git a/src/data/web.c b/src/data/web.c index fd9b216..e58437e 100644 --- a/src/data/web.c +++ b/src/data/web.c @@ -125,7 +125,7 @@ static void _free_favorites(Eina_List *list) } } -static bool _action(Elm_Object_Item *it) +static bool _action(Elm_Object_Item *it, enum action_type type) { /* It will be implemented later. */ diff --git a/src/grid/grid_apps.c b/src/grid/grid_apps.c index 84c39f4..9ad702f 100644 --- a/src/grid/grid_apps.c +++ b/src/grid/grid_apps.c @@ -22,7 +22,6 @@ #include "define.h" #include "grid.h" -#include "datamgr.h" #define STR_APPS "Apps" #define STYLE_APPS "style.apps" @@ -155,21 +154,25 @@ static void _destroy_item_list(Eina_List *list) dmgr->free_favorites(list); } -static void _item_selected(Elm_Object_Item *it) +static bool _item_action(Elm_Object_Item *it, enum action_type type) { struct datamgr *dmgr; if (!it) { _ERR("Invalid argument."); - return; + return false; } dmgr = get_apps_datamgr(); if (!dmgr || !dmgr->action) - return; + return false; - if (!dmgr->action(it)) + if (!dmgr->action(it, type)) { _ERR("The item action failed."); + return false; + } + + return true; } static struct grid_data _gdata = { @@ -179,7 +182,7 @@ static struct grid_data _gdata = { .gclass = &_gclass, .create_item_list = _create_item_list, .destroy_item_list = _destroy_item_list, - .item_selected = _item_selected, + .item_action = _item_action, }; struct grid_data *get_apps_grid_data(void) diff --git a/src/grid/grid_gallery.c b/src/grid/grid_gallery.c index 448cb41..224ec41 100644 --- a/src/grid/grid_gallery.c +++ b/src/grid/grid_gallery.c @@ -22,7 +22,6 @@ #include "define.h" #include "grid.h" -#include "datamgr.h" #define STR_GALLERY "Gallery" #define STYLE_GALLERY "style.gallery" @@ -134,21 +133,25 @@ static void _destroy_item_list(Eina_List *list) dmgr->free_favorites(list); } -static void _item_selected(Elm_Object_Item *it) +static bool _item_action(Elm_Object_Item *it, enum action_type type) { struct datamgr *dmgr; if (!it) { _ERR("Invalid argument."); - return; + return false; } dmgr = get_media_datamgr(); if (!dmgr || !dmgr->action) - return; + return false; - if (!dmgr->action(it)) + if (!dmgr->action(it, type)) { _ERR("The item action failed."); + return false; + } + + return true; } static struct grid_data _gdata = { @@ -158,7 +161,7 @@ static struct grid_data _gdata = { .gclass = &_gclass, .create_item_list = _create_item_list, .destroy_item_list = _destroy_item_list, - .item_selected = _item_selected, + .item_action = _item_action, }; struct grid_data *get_gallery_grid_data(void) diff --git a/src/grid/grid_movie.c b/src/grid/grid_movie.c index 4c84b7d..959c1b1 100644 --- a/src/grid/grid_movie.c +++ b/src/grid/grid_movie.c @@ -21,7 +21,6 @@ #include "define.h" #include "grid.h" -#include "datamgr.h" #define STR_MOVIE "Movie" #define STYLE_MOVIE "style.movie" @@ -158,21 +157,25 @@ static void _destroy_item_list(Eina_List *list) dmgr->free_favorites(list); } -static void _item_selected(Elm_Object_Item *it) +static bool _item_action(Elm_Object_Item *it, enum action_type type) { struct datamgr *dmgr; if (!it) { _ERR("Invalid argument."); - return; + return false; } dmgr = get_media_datamgr(); if (!dmgr || !dmgr->action) - return; + return false; - if (!dmgr->action(it)) + if (!dmgr->action(it, type)) { _ERR("The item action failed."); + return false; + } + + return true; } static struct grid_data _gdata = { @@ -182,7 +185,7 @@ static struct grid_data _gdata = { .gclass = &_gclass, .create_item_list = _create_item_list, .destroy_item_list = _destroy_item_list, - .item_selected = _item_selected, + .item_action = _item_action, }; struct grid_data *get_movie_grid_data(void) diff --git a/src/grid/grid_music.c b/src/grid/grid_music.c index 5c10232..b723822 100644 --- a/src/grid/grid_music.c +++ b/src/grid/grid_music.c @@ -22,7 +22,6 @@ #include "define.h" #include "grid.h" -#include "datamgr.h" #define STR_MUSIC "Music" #define STYLE_MUSIC "style.music" @@ -132,21 +131,25 @@ static void _destroy_item_list(Eina_List *list) dmgr->free_favorites(list); } -static void _item_selected(Elm_Object_Item *it) +static bool _item_action(Elm_Object_Item *it, enum action_type type) { struct datamgr *dmgr; if (!it) { _ERR("Invalid argument."); - return; + return false; } dmgr = get_media_datamgr(); if (!dmgr || !dmgr->action) - return; + return false; - if (!dmgr->action(it)) + if (!dmgr->action(it, type)) { _ERR("The item action failed."); + return false; + } + + return true; } static struct grid_data _gdata = { @@ -156,7 +159,7 @@ static struct grid_data _gdata = { .gclass = &_gclass, .create_item_list = _create_item_list, .destroy_item_list = _destroy_item_list, - .item_selected = _item_selected, + .item_action = _item_action, }; struct grid_data *get_music_grid_data(void) diff --git a/src/grid/grid_tv.c b/src/grid/grid_tv.c index 96f7660..9849ff6 100644 --- a/src/grid/grid_tv.c +++ b/src/grid/grid_tv.c @@ -154,21 +154,25 @@ static void _destroy_item_list(Eina_List *list) dmgr->free_favorites(list); } -static void _item_selected(Elm_Object_Item *it) +static bool _item_action(Elm_Object_Item *it, enum action_type type) { struct datamgr *dmgr; if (!it) { _ERR("Invalid argument."); - return; + return false; } dmgr = get_channel_datamgr(); if (!dmgr || !dmgr->action) - return; + return false; - if (!dmgr->action(it)) + if (!dmgr->action(it, type)) { _ERR("The item action failed."); + return false; + } + + return true; } static struct grid_data _gdata = { @@ -178,7 +182,7 @@ static struct grid_data _gdata = { .gclass = &_gclass, .create_item_list = _create_item_list, .destroy_item_list = _destroy_item_list, - .item_selected = _item_selected, + .item_action = _item_action, }; struct grid_data *get_tv_grid_data(void) diff --git a/src/grid/grid_webs.c b/src/grid/grid_webs.c index a36998e..ee42d6b 100644 --- a/src/grid/grid_webs.c +++ b/src/grid/grid_webs.c @@ -21,7 +21,6 @@ #include "define.h" #include "grid.h" -#include "datamgr.h" #define STR_WEBS "Web" #define STYLE_WEBS "style.webs" diff --git a/src/main.c b/src/main.c index 18f124c..5fea085 100644 --- a/src/main.c +++ b/src/main.c @@ -21,8 +21,7 @@ #include "define.h" #include "utils.h" -#include "view_base.h" -#include "view_action_menu.h" +#include "view.h" SET_TAG(PACKAGE); diff --git a/src/view/view_action_menu.c b/src/view/view_action_menu.c index 988442b..6991151 100644 --- a/src/view/view_action_menu.c +++ b/src/view/view_action_menu.c @@ -16,16 +16,19 @@ #include #include #include +#include #include #include "define.h" #include "utils.h" +#include "view.h" +#include "grid.h" +#include "datamgr.h" enum button_type { BTN_LIVETV = 0, BTN_FAVORITE, BTN_LOCK, - BTN_SHARE, }; struct _priv { @@ -33,6 +36,7 @@ struct _priv { Evas_Object *base; Evas_Object *live_btn; Evas_Object *menu_btn[COUNT_ACTION]; + struct grid_data *gdata; }; struct _action_info { @@ -54,12 +58,6 @@ static struct _action_info action_info[] = { .title = STR_LOCK, .style = STYLE_ACTION_MENU_LOCK_BTN, .disable = EINA_TRUE - }, - { - .id = BTN_SHARE, - .title = STR_SHARE, - .style = STYLE_ACTION_MENU_SHARE_BTN, - .disable = EINA_TRUE } }; @@ -75,19 +73,39 @@ static void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, elm_object_focus_set(obj, EINA_TRUE); } -static void _favorite_selected(void *data, Evas_Object *obj) +static void _livetv_selected(void *data, Evas_Object *obj) { /* It will be implemented later */ } -static void _livetv_selected(void *data, Evas_Object *obj) +static void _favorite_selected(void *data, Evas_Object *obj) { - /* It will be implemented later */ + struct _priv *priv; + struct grid_data *gdata; + + if (!data) { + _ERR("Invalid argument."); + return; + } + priv = data; + + if (!priv->gdata) + return; + + gdata = priv->gdata; + + if (!gdata->item_action(gdata->focused_item, ACTION_UPDATE_FAVORITE)) { + _ERR("Unfavorite failed."); + return; + } + + /* FIXME: The base view will be reloaded later */ + + viewmgr_hide_view(VIEW_ID_ACTION_MENU); } static void _clicked_cb(int id, void *data, Evas_Object *obj) { - switch (id) { case BTN_LIVETV: _livetv_selected(data, obj); @@ -101,10 +119,6 @@ static void _clicked_cb(int id, void *data, Evas_Object *obj) /* It is not supported yet. */ break; - case BTN_SHARE: - /* It is not supported yet. */ - break; - default: _ERR("Unhandled action type."); } @@ -133,11 +147,6 @@ static bool _draw_livetv_area(struct _priv *priv) { Evas_Object *btn; - if (!priv || !priv->base) { - _ERR("Invalid argument."); - return false; - } - btn = utils_add_button(priv->base, PART_LIVETV_BTN, STR_LIVETV, STYLE_LIVETV_BTN); if (!btn) { @@ -156,16 +165,11 @@ static bool _draw_livetv_area(struct _priv *priv) return true; } -static bool _draw_menu_area(struct _priv *priv) +static bool _draw_action_area(struct _priv *priv) { Evas_Object *table, *btn; int i, row = 0, col = 0; - if (!priv || !priv->base) { - _ERR("Invalid argument."); - return false; - } - table = utils_add_table(priv->base, PART_ACTION_MENU, SIZE_ACTION_TABLE_BORDER, SIZE_ACTION_TABLE_BORDER); if (!table) { @@ -209,39 +213,6 @@ static bool _draw_menu_area(struct _priv *priv) return true; } -static bool _draw_favorite_area(struct _priv *priv) -{ - if (!priv || !priv->base) { - _ERR("Invalid argument."); - return false; - } - - /* It will be implemented later */ - - return true; -} - -static void _draw_view_content(struct _priv *priv) -{ - if (!priv) { - _ERR("Invalid argument."); - return; - } - - if (!_draw_livetv_area(priv)) { - _ERR("Draw livetv area failed."); - return; - } - - if (!_draw_menu_area(priv)) { - _ERR("Draw menu area failed."); - return; - } - - if (!_draw_favorite_area(priv)) - _ERR("Draw favorite area failed."); -} - static Evas_Object *_create(Evas_Object *win, void *data) { struct _priv *priv; @@ -275,7 +246,8 @@ static Evas_Object *_create(Evas_Object *win, void *data) return NULL; } - _draw_view_content(priv); + _draw_livetv_area(priv); + _draw_action_area(priv); return base; } @@ -288,7 +260,7 @@ static void _show(void *data) _ERR("Get data failed."); return; } - priv = (struct _priv *)data; + priv = data; if (priv->base) evas_object_show(priv->base); @@ -304,12 +276,26 @@ static void _hide(void *data) _ERR("Get data failed."); return; } - priv = (struct _priv *)data; + priv = data; if (priv->base) evas_object_hide(priv->base); } +static void _update(void *view_data, int update_type, void *data) +{ + struct _priv *priv; + + if (!view_data) { + _ERR("Get data failed."); + return; + } + priv = view_data; + + if (update_type == UPDATE_DATA) + priv->gdata = data; +} + static void _destroy(void *data) { struct _priv *priv; @@ -318,7 +304,7 @@ static void _destroy(void *data) _ERR("Get data failed."); return; } - priv = (struct _priv *)data; + priv = data; if (priv->base) evas_object_del(priv->base); @@ -331,6 +317,7 @@ static view_class _vclass = { .create = _create, .show = _show, .hide = _hide, + .update = _update, .destroy = _destroy, }; diff --git a/src/view/view_base.c b/src/view/view_base.c index b5a39ed..7390fdf 100644 --- a/src/view/view_base.c +++ b/src/view/view_base.c @@ -25,6 +25,7 @@ #include "utils.h" #include "grid.h" #include "datamgr.h" +#include "view.h" const char *str_count[] = { STR_CNT_TV, @@ -59,11 +60,6 @@ static void _draw_content_count(Evas_Object *base, int count, int id) struct datamgr *dmgr; char str[SIZE_STR]; - if (!base) { - _ERR("Invalid argument."); - return; - } - snprintf(str, sizeof(str), "%d %s", count, str_count[id]); elm_object_part_text_set(base, PART_CONTENTS_COUNT, str); elm_object_part_text_set(base, PART_CONTENTS_SUBCOUNT, ""); @@ -228,6 +224,20 @@ static void _grid_focused_cb(int id, void *data, Evas_Object *obj, SIG_SELECTED, SRC_MENU_BTN); } +static void _grid_item_focused_cb(void *data, Elm_Object_Item *it, + const char *emission, const char *source) +{ + struct grid_data *gdata; + + if (!data || !it) { + _ERR("Invalid argument."); + return; + } + gdata = data; + + gdata->focused_item = it; +} + static void _grid_item_selected_cb(void *data, Elm_Object_Item *it, const char *emission, const char *source) { @@ -239,8 +249,8 @@ static void _grid_item_selected_cb(void *data, Elm_Object_Item *it, } gdata = data; - if (gdata->item_selected) - gdata->item_selected(it); + if (gdata->item_action) + gdata->item_action(it, ACTION_LAUNCH); elm_gengrid_item_selected_set(it, EINA_FALSE); } @@ -250,7 +260,7 @@ static void _grid_realized_cb(int id, void *data, Evas_Object *obj, { struct grid_data *gdata; - if (!item) { + if (!data || !item) { _ERR("Invalid argument."); return; } @@ -261,6 +271,8 @@ static void _grid_realized_cb(int id, void *data, Evas_Object *obj, return; } + elm_object_item_signal_callback_add(item, SIG_ITEM_FOCUSED, + SRC_EDC, _grid_item_focused_cb, gdata); elm_object_item_signal_callback_add(item, SIG_ITEM_SELECTED, SRC_EDC, _grid_item_selected_cb, gdata); } @@ -273,6 +285,8 @@ static void _grid_unrealized_cb(int id, void *data, Evas_Object *obj, return; } + elm_object_item_signal_callback_del(item, SIG_ITEM_FOCUSED, + SRC_EDC, _grid_item_focused_cb); elm_object_item_signal_callback_del(item, SIG_ITEM_SELECTED, SRC_EDC, _grid_item_selected_cb); } @@ -281,6 +295,7 @@ static void _grid_key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { struct _priv *priv; + struct grid_data *gdata; if (!data || !ev) { _ERR("Invalid argument."); @@ -289,15 +304,17 @@ static void _grid_key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, priv = data; if (!strcmp(ev->keyname, KEY_BACK) - || !strcmp(ev->keyname, KEY_BACK_REMOTE)) + || !strcmp(ev->keyname, KEY_BACK_REMOTE)) { elm_object_focus_set(priv->menu[priv->cur_menu_id], EINA_TRUE); + } else if (!strcmp(ev->keyname, KEY_MENU) + || !strcmp(ev->keyname, KEY_MENU_REMOTE)) { + gdata = _get_grid_data[id](); + if (!gdata) + return; - /* FIXME: The action menu is blocked temporarily. */ - /* - else if (!strcmp(ev->keyname, KEY_MENU) - || !strcmp(ev->keyname, KEY_MENU_REMOTE)) + viewmgr_update_view(VIEW_ID_ACTION_MENU, UPDATE_DATA, gdata); viewmgr_show_view(VIEW_ID_ACTION_MENU); - */ + } } static input_handler _menu_input_handler = { @@ -320,11 +337,6 @@ static bool _draw_top_area(struct _priv *priv) struct grid_data *gdata; int i; - if (!priv || !priv->base) { - _ERR("Invalid argument."); - return false; - } - elm_object_part_text_set(priv->base, PART_TOP_TITLE, STR_FAVORITE); priv->box = utils_add_box(priv->base, PART_TOP_MENU, EINA_TRUE, @@ -370,11 +382,6 @@ static bool _add_grid(struct _priv *priv, int id) struct grid_data *gdata; Evas_Object *grid; - if (!priv || !priv->base || !priv->gmgr) { - _ERR("Invalid argument."); - return false; - } - gdata = _get_grid_data[id](); if (!gdata || !gdata->id || !gdata->gclass) { _ERR("Get grid data failed."); -- 2.7.4 From 13d61c71cb31c22268cdcfed58710b5f32e1e156 Mon Sep 17 00:00:00 2001 From: Hyojung Jo Date: Tue, 25 Aug 2015 14:26:51 +0900 Subject: [PATCH 06/16] View: Update base view when contents is unfavorited Change-Id: I3fdda1eded635a901b9bb8fee8ef09a8f3fe2a59 Signed-off-by: Hyojung Jo --- include/define.h | 2 +- res/favorite.edc | 2 +- src/view/view_action_menu.c | 39 +++++++++++++++++++-------------------- src/view/view_base.c | 29 +++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 22 deletions(-) diff --git a/include/define.h b/include/define.h index b34be59..cc46ce6 100644 --- a/include/define.h +++ b/include/define.h @@ -111,7 +111,7 @@ /* Count */ #define COUNT_MENU 6 -#define COUNT_ACTION 3 +#define COUNT_ACTION 2 /* Image */ #define PLAY_ICON_PNG "ic_thumbnail_play.png" diff --git a/res/favorite.edc b/res/favorite.edc index 128a83a..5942d58 100644 --- a/res/favorite.edc +++ b/res/favorite.edc @@ -455,7 +455,7 @@ collections { to, "padding.menu.divider.up"; relative, 0.0 1.0; } - min, 375 124; + min, 250 124; align, 0.0 0.0; fixed, 1 1; } diff --git a/src/view/view_action_menu.c b/src/view/view_action_menu.c index 6991151..0f063a5 100644 --- a/src/view/view_action_menu.c +++ b/src/view/view_action_menu.c @@ -73,46 +73,45 @@ static void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, elm_object_focus_set(obj, EINA_TRUE); } -static void _livetv_selected(void *data, Evas_Object *obj) +static void _livetv_selected(void) { - /* It will be implemented later */ -} - -static void _favorite_selected(void *data, Evas_Object *obj) -{ - struct _priv *priv; - struct grid_data *gdata; - - if (!data) { - _ERR("Invalid argument."); + if (!utils_launch_app(STR_LIVETV_APP_ID, NULL, NULL)) { + _ERR("Launch live tv failed."); return; } - priv = data; - - if (!priv->gdata) - return; - gdata = priv->gdata; + viewmgr_hide_view(VIEW_ID_ACTION_MENU); +} +static void _favorite_selected(struct grid_data *gdata) +{ if (!gdata->item_action(gdata->focused_item, ACTION_UPDATE_FAVORITE)) { _ERR("Unfavorite failed."); return; } - /* FIXME: The base view will be reloaded later */ - + viewmgr_update_view(VIEW_ID_BASE, UPDATE_GRID, gdata); viewmgr_hide_view(VIEW_ID_ACTION_MENU); } static void _clicked_cb(int id, void *data, Evas_Object *obj) { + struct _priv *priv; + + if (!data) + return; + priv = data; + + if (!priv->gdata) + return; + switch (id) { case BTN_LIVETV: - _livetv_selected(data, obj); + _livetv_selected(); break; case BTN_FAVORITE: - _favorite_selected(data, obj); + _favorite_selected(priv->gdata); break; case BTN_LOCK: diff --git a/src/view/view_base.c b/src/view/view_base.c index 7390fdf..c3ef441 100644 --- a/src/view/view_base.c +++ b/src/view/view_base.c @@ -500,6 +500,34 @@ static void _hide(void *data) evas_object_hide(priv->base); } +static void _update(void *view_data, int update_type, void *data) +{ + struct _priv *priv; + struct grid_data *gdata; + + if (!view_data || !data) { + _ERR("Get data failed."); + return; + } + priv = view_data; + gdata = data; + + if (update_type == UPDATE_GRID) { + if (!priv || !priv->gmgr || !priv->base) + return; + + gdata->list = gdata->create_item_list(); + if (!gdata->list) + elm_object_part_text_set(priv->base, PART_NO_CONTENTS, + STR_NO_CONTENTS); + else + gridmgr_append_list(priv->gmgr, gdata->id, gdata->list); + + _draw_content_count(priv->base, eina_list_count(gdata->list), + priv->cur_menu_id); + } +} + static void _destroy(void *data) { struct _priv *priv; @@ -532,6 +560,7 @@ static view_class _vclass = { .create = _create, .show = _show, .hide = _hide, + .update = _update, .destroy = _destroy, }; -- 2.7.4 From bad9bd9c939363172e2f1cf61ae1834868da5b81 Mon Sep 17 00:00:00 2001 From: Hyojung Jo Date: Tue, 25 Aug 2015 14:52:01 +0900 Subject: [PATCH 07/16] Add notify util function and edc code for notify style Change-Id: I5c5eebe38e8045eb238130aa1dda80efafb42bee Signed-off-by: Hyojung Jo --- include/utils.h | 3 + res/favorite-theme.edc | 2 + res/widgets/label.edc | 38 ++++++++ res/widgets/notify.edc | 209 ++++++++++++++++++++++++++++++++++++++++++++ src/common/utils.c | 45 ++++++++++ src/view/view_action_menu.c | 3 +- src/view/view_base.c | 46 ++++------ 7 files changed, 316 insertions(+), 30 deletions(-) create mode 100644 res/widgets/label.edc create mode 100644 res/widgets/notify.edc diff --git a/include/utils.h b/include/utils.h index be99fb2..975a8e3 100644 --- a/include/utils.h +++ b/include/utils.h @@ -28,6 +28,9 @@ Evas_Object *utils_add_button(Evas_Object *parent, const char *part, const char *text, const char *style); Evas_Object *utils_add_table(Evas_Object *table, const char *part, int padding_x, int padding_y); +Evas_Object *utils_add_notify(Evas_Object *parent, const char *text, + const char *noti_style, const char *label_style, + int timeout); bool utils_launch_app(const char *appid, const char *key, const char *value); #endif /* __AIR_FAVORITE_UTILS_H__ */ diff --git a/res/favorite-theme.edc b/res/favorite-theme.edc index 11f37c6..9cd2ad9 100644 --- a/res/favorite-theme.edc +++ b/res/favorite-theme.edc @@ -24,4 +24,6 @@ collections { #include "widgets/gengrid_apps.edc" #include "widgets/gengrid_webs.edc" #include "widgets/button.edc" + #include "widgets/notify.edc" + #include "widgets/label.edc" } diff --git a/res/widgets/label.edc b/res/widgets/label.edc new file mode 100644 index 0000000..df26f9f --- /dev/null +++ b/res/widgets/label.edc @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group { + name, "elm/label/base/style.toast"; + parts { + part { + name, "elm.text"; + type, TEXT; + scale, 1; + description { + state, "default" 0.0; + rel1.relative, 0.0 0.0; + rel2.relative, 1.0 1.0; + text { + font, FONT_TIZENSANS_LIGHT; + size, 28; + align, 0.5 0.5; + min, 0 1; + } + color, 51 51 51 255; + } + } + } +} diff --git a/res/widgets/notify.edc b/res/widgets/notify.edc new file mode 100644 index 0000000..c1756e5 --- /dev/null +++ b/res/widgets/notify.edc @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group { + name, "elm/notify/bottom_left/style.toast"; + parts { + part { + name, "padding.bottom.left"; + type, SPACER; + scale, 1; + description { + state, "default" 0.0; + min, 40 40; + rel1.relative, 0.0 1.0; + rel2.relative, 0.0 1.0; + align, 0.0 1.0; + fixed, 1 1; + } + } + + part { + name, "base"; + type, RECT; + scale, 1; + description { + state, "default" 0.0; + color, 255 255 255 255; + min, 536 70; + max, 536 70; + rel1 { + to, "padding.bottom.left"; + relative, 1.0 0.0; + } + rel2 { + to, "padding.bottom.left"; + relative, 1.0 0.0; + } + align, 0.0 1.0; + fixed, 1 1; + visible, 0; + } + description { + state, "visible" 0.0; + inherit, "default" 0.0; + visible, 1; + } + } + + part { + name, "part.inside.line.up"; + type, RECT; + scale, 1; + description { + state, "default" 0.0; + color, 194 194 194 255; + rel1.to, "base"; + rel2 { + to, "base"; + relative, 1.0 0.0; + } + min, 0 1; + align, 0.5 0.0; + fixed, 0 1; + visible, 0; + } + description { + state, "visible" 0.0; + inherit, "default" 0.0; + visible, 1; + } + } + + part { + name, "part.inside.line.left"; + type, RECT; + scale, 1; + description { + state, "default" 0.0; + color, 194 194 194 255; + rel1 { + to, "part.inside.line.up"; + relative, 0.0 1.0; + } + rel2 { + to, "base"; + relative, 0.0 1.0; + } + min, 1 0; + align, 0.0 0.5; + fixed, 1 0; + visible, 0; + } + description { + state, "visible" 0.0; + inherit, "default" 0.0; + visible, 1; + } + } + + part { + name, "part.inside.line.right"; + type, RECT; + scale, 1; + description { + state, "default" 0.0; + color, 194 194 194 255; + rel1 { + to, "part.inside.line.up"; + relative, 1.0 1.0; + } + rel2.to, "base"; + min, 1 0; + align, 1.0 0.5; + fixed, 1 0; + visible, 0; + } + description { + state, "visible" 0.0; + inherit, "default" 0.0; + visible, 1; + } + } + + part { + name, "part.inside.line.down"; + type, RECT; + scale, 1; + description { + state, "default" 0.0; + color, 194 194 194 255; + rel1 { + to, "part.inside.line.left"; + relative, 1.0 1.0; + } + rel2 { + to, "part.inside.line.right"; + relative, 0.0 1.0; + } + min, 0 1; + align, 0.5 1.0; + fixed, 0 1; + visible, 0; + } + description { + state, "visible" 0.0; + inherit, "default" 0.0; + visible, 1; + } + } + + part { + name, "elm.swallow.content"; + type, SWALLOW; + description { + state, "default" 0.0; + rel1.to, "base"; + rel2.to, "base"; + } + } + } + + programs { + program { + signal, "show"; + source, ""; + action, STATE_SET "visible" 0.0; + target, "base"; + target, "part.inside.line.up"; + target, "part.inside.line.left"; + target, "part.inside.line.right"; + target, "part.inside.line.down"; + transition, DECELERATE 0.5; + } + program { + signal, "hide"; + source, ""; + action, STATE_SET "default" 0.0; + target, "base"; + target, "part.inside.line.up"; + target, "part.inside.line.left"; + target, "part.inside.line.right"; + target, "part.inside.line.down"; + } + program { + signal, "elm,hide"; + source, "elm"; + action, STATE_SET "default" 0.0; + target, "base"; + target, "part.inside.line.up"; + target, "part.inside.line.left"; + target, "part.inside.line.right"; + target, "part.inside.line.down"; + transition, DECELERATE 0.5; + } + } +} diff --git a/src/common/utils.c b/src/common/utils.c index f3e7223..ed0958c 100644 --- a/src/common/utils.c +++ b/src/common/utils.c @@ -184,6 +184,51 @@ Evas_Object *utils_add_table(Evas_Object *parent, const char *part, return table; } +Evas_Object *utils_add_notify(Evas_Object *parent, const char *text, + const char *noti_style, const char *label_style, int timeout) +{ + Evas_Object *notify, *lbl; + + if (!parent) { + _ERR("Invalid argument."); + return NULL; + } + + notify = elm_notify_add(parent); + if (!notify) { + _ERR("elm_notify_add failed."); + return NULL; + } + + evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + elm_notify_align_set(notify, 0.0, 1.0); + elm_notify_timeout_set(notify, timeout); + + if (noti_style) + elm_object_style_set(notify, noti_style); + + lbl = elm_label_add(notify); + if (!lbl) { + _ERR("elm_label_add failed."); + evas_object_del(notify); + return NULL; + } + + elm_object_content_set(notify, lbl); + evas_object_show(lbl); + + if (label_style) + elm_object_style_set(lbl, label_style); + + if (text) + elm_object_text_set(lbl, text); + + evas_object_show(notify); + + return notify; +} + bool utils_launch_app(const char *appid, const char *key, const char *value) { app_control_h app_ctrl; diff --git a/src/view/view_action_menu.c b/src/view/view_action_menu.c index 0f063a5..52d8aed 100644 --- a/src/view/view_action_menu.c +++ b/src/view/view_action_menu.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include "define.h" @@ -75,7 +76,7 @@ static void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, static void _livetv_selected(void) { - if (!utils_launch_app(STR_LIVETV_APP_ID, NULL, NULL)) { + if (!utils_launch_app(APP_ID_LIVETV, NULL, NULL)) { _ERR("Launch live tv failed."); return; } diff --git a/src/view/view_base.c b/src/view/view_base.c index c3ef441..c39c01b 100644 --- a/src/view/view_base.c +++ b/src/view/view_base.c @@ -81,10 +81,22 @@ static void _draw_content_count(Evas_Object *base, int count, int id) } } +static void _update_grid_item_list(struct _priv *priv, struct grid_data *gdata) +{ + gdata->list = gdata->create_item_list(); + if (!gdata->list) { + elm_object_part_text_set(priv->base, PART_NO_CONTENTS, + STR_NO_CONTENTS); + return; + } + + if (!gridmgr_append_list(priv->gmgr, gdata->id, gdata->list)) + _ERR("Gridmgr append list failed."); +} + static bool _load_current_grid(struct _priv *priv, int id) { struct grid_data *gdata; - Eina_List *list = NULL; Evas_Object *prev_grid; if (!priv || !priv->gmgr || !priv->base) { @@ -100,27 +112,12 @@ static bool _load_current_grid(struct _priv *priv, int id) prev_grid = elm_object_part_content_unset(priv->base, PART_GENGRID); evas_object_hide(prev_grid); - if (!gdata->list) { - list = gdata->create_item_list(); - if (!list) { - elm_object_part_text_set(priv->base, PART_NO_CONTENTS, - STR_NO_CONTENTS); - _draw_content_count(priv->base, 0, id); - - return true; - } - - if (!gridmgr_append_list(priv->gmgr, gdata->id, list)) { - _ERR("Gridmgr append list failed."); - return false; - } - - gdata->list = list; - } - elm_object_part_content_set(priv->base, PART_GENGRID, gdata->grid); evas_object_show(gdata->grid); + if (!gdata->list) + _update_grid_item_list(priv, gdata); + _draw_content_count(priv->base, eina_list_count(gdata->list), id); return true; @@ -513,16 +510,7 @@ static void _update(void *view_data, int update_type, void *data) gdata = data; if (update_type == UPDATE_GRID) { - if (!priv || !priv->gmgr || !priv->base) - return; - - gdata->list = gdata->create_item_list(); - if (!gdata->list) - elm_object_part_text_set(priv->base, PART_NO_CONTENTS, - STR_NO_CONTENTS); - else - gridmgr_append_list(priv->gmgr, gdata->id, gdata->list); - + _update_grid_item_list(priv, gdata); _draw_content_count(priv->base, eina_list_count(gdata->list), priv->cur_menu_id); } -- 2.7.4 From 90d808f06df507306aacbbc4e73d5786ffd3db73 Mon Sep 17 00:00:00 2001 From: Hyojung Jo Date: Wed, 26 Aug 2015 17:43:21 +0900 Subject: [PATCH 08/16] Get favorite list everytime when menu is changed Change-Id: I25697a82cd5c53c89c4110387c9e9aa536360ed9 Signed-off-by: Hyojung Jo --- include/datamgr.h | 1 + include/grid.h | 1 + src/data/app.c | 14 ++++++++++ src/data/channel.c | 14 ++++++++++ src/data/media.c | 27 +++++++++++++++++++ src/grid/grid_apps.c | 12 +++++++++ src/grid/grid_gallery.c | 12 +++++++++ src/grid/grid_movie.c | 12 +++++++++ src/grid/grid_music.c | 12 +++++++++ src/grid/grid_tv.c | 12 +++++++++ src/view/view_base.c | 70 +++++++++++++++++++++++++++++-------------------- 11 files changed, 159 insertions(+), 28 deletions(-) diff --git a/include/datamgr.h b/include/datamgr.h index be176d0..ead6b10 100644 --- a/include/datamgr.h +++ b/include/datamgr.h @@ -36,6 +36,7 @@ struct datamgr { int (*get_count)(enum item_type type); char *(*get_data)(void *data, enum data_type type); bool (*action)(Elm_Object_Item *it, enum action_type type); + bool (*data_updated)(void *data1, void *data2); }; struct datamgr *get_channel_datamgr(void); diff --git a/include/grid.h b/include/grid.h index bc55ff6..924d89c 100644 --- a/include/grid.h +++ b/include/grid.h @@ -31,6 +31,7 @@ struct grid_data { Eina_List *(*create_item_list)(void); void (*destroy_item_list)(Eina_List *list); bool (*item_action)(Elm_Object_Item *it, enum action_type type); + bool (*item_updated)(void *pre_data, void *new_data); }; struct grid_data *get_tv_grid_data(void); diff --git a/src/data/app.c b/src/data/app.c index 75fd6ab..4ba5330 100644 --- a/src/data/app.c +++ b/src/data/app.c @@ -193,12 +193,26 @@ static bool _action(Elm_Object_Item *it, enum action_type type) return true; } +static bool _data_updated(void *data1, void *data2) +{ + struct app_data *adata1, *adata2; + + adata1 = data1; + adata2 = data2; + + if (!strcmp(adata1->id, adata2->id)) + return false; + + return true; +} + static struct datamgr _dmgr = { .get_data = _get_data, .get_count = NULL, .get_favorites = _get_favorites, .free_favorites = _free_favorites, .action = _action, + .data_updated = _data_updated, }; struct datamgr *get_apps_datamgr(void) diff --git a/src/data/channel.c b/src/data/channel.c index 5d5cb50..5c0a138 100644 --- a/src/data/channel.c +++ b/src/data/channel.c @@ -219,12 +219,26 @@ static bool _action(Elm_Object_Item *it, enum action_type type) return true; } +static bool _data_updated(void *data1, void *data2) +{ + struct channel_data *cdata1, *cdata2; + + cdata1 = data1; + cdata2 = data2; + + if (cdata1->id == cdata2->id) + return false; + + return true; +} + static struct datamgr _dmgr = { .get_data = _get_data, .get_count = NULL, .get_favorites = _get_favorites, .free_favorites = _free_favorites, .action = _action, + .data_updated = _data_updated, }; struct datamgr *get_channel_datamgr(void) diff --git a/src/data/media.c b/src/data/media.c index 7e17bbb..de3d126 100644 --- a/src/data/media.c +++ b/src/data/media.c @@ -275,12 +275,39 @@ static bool _action(Elm_Object_Item *it, enum action_type type) return true; } +static bool _data_updated(void *data1, void *data2) +{ + app_media *am1, *am2; + app_media_info *minfo1, *minfo2; + + am1 = data1; + am2 = data2; + + minfo1 = app_media_get_info(am1); + if (!minfo1) { + _ERR("Get app_media_info failed."); + return false; + } + + minfo2 = app_media_get_info(am2); + if (!minfo2) { + _ERR("Get app_media_info failed."); + return false; + } + + if (!strcmp(minfo1->media_id, minfo2->media_id)) + return false; + + return true; +} + static struct datamgr _dmgr = { .get_data = _get_data, .get_count = _get_count, .get_favorites = _get_favorites, .free_favorites = _free_favorites, .action = _action, + .data_updated = _data_updated, }; struct datamgr *get_media_datamgr(void) diff --git a/src/grid/grid_apps.c b/src/grid/grid_apps.c index 9ad702f..a7be106 100644 --- a/src/grid/grid_apps.c +++ b/src/grid/grid_apps.c @@ -175,6 +175,17 @@ static bool _item_action(Elm_Object_Item *it, enum action_type type) return true; } +static bool _item_updated(void *pre_data, void *new_data) +{ + struct datamgr *dmgr; + + dmgr = get_apps_datamgr(); + if (!dmgr || !dmgr->data_updated) + return false; + + return dmgr->data_updated(pre_data, new_data); +} + static struct grid_data _gdata = { .id = STR_APPS, .item_size_x = ITEM_APPS_X, @@ -183,6 +194,7 @@ static struct grid_data _gdata = { .create_item_list = _create_item_list, .destroy_item_list = _destroy_item_list, .item_action = _item_action, + .item_updated = _item_updated, }; struct grid_data *get_apps_grid_data(void) diff --git a/src/grid/grid_gallery.c b/src/grid/grid_gallery.c index 224ec41..be85c2c 100644 --- a/src/grid/grid_gallery.c +++ b/src/grid/grid_gallery.c @@ -154,6 +154,17 @@ static bool _item_action(Elm_Object_Item *it, enum action_type type) return true; } +static bool _item_updated(void *pre_data, void *new_data) +{ + struct datamgr *dmgr; + + dmgr = get_media_datamgr(); + if (!dmgr || !dmgr->data_updated) + return false; + + return dmgr->data_updated(pre_data, new_data); +} + static struct grid_data _gdata = { .id = STR_GALLERY, .item_size_x = ITEM_GALLERY_X, @@ -162,6 +173,7 @@ static struct grid_data _gdata = { .create_item_list = _create_item_list, .destroy_item_list = _destroy_item_list, .item_action = _item_action, + .item_updated = _item_updated, }; struct grid_data *get_gallery_grid_data(void) diff --git a/src/grid/grid_movie.c b/src/grid/grid_movie.c index 959c1b1..5ac0356 100644 --- a/src/grid/grid_movie.c +++ b/src/grid/grid_movie.c @@ -178,6 +178,17 @@ static bool _item_action(Elm_Object_Item *it, enum action_type type) return true; } +static bool _item_updated(void *pre_data, void *new_data) +{ + struct datamgr *dmgr; + + dmgr = get_media_datamgr(); + if (!dmgr || !dmgr->data_updated) + return false; + + return dmgr->data_updated(pre_data, new_data); +} + static struct grid_data _gdata = { .id = STR_MOVIE, .item_size_x = ITEM_MOVIE_X, @@ -186,6 +197,7 @@ static struct grid_data _gdata = { .create_item_list = _create_item_list, .destroy_item_list = _destroy_item_list, .item_action = _item_action, + .item_updated = _item_updated, }; struct grid_data *get_movie_grid_data(void) diff --git a/src/grid/grid_music.c b/src/grid/grid_music.c index b723822..e6090c6 100644 --- a/src/grid/grid_music.c +++ b/src/grid/grid_music.c @@ -152,6 +152,17 @@ static bool _item_action(Elm_Object_Item *it, enum action_type type) return true; } +static bool _item_updated(void *pre_data, void *new_data) +{ + struct datamgr *dmgr; + + dmgr = get_media_datamgr(); + if (!dmgr || !dmgr->data_updated) + return false; + + return dmgr->data_updated(pre_data, new_data); +} + static struct grid_data _gdata = { .id = STR_MUSIC, .item_size_x = ITEM_MUSIC_X, @@ -160,6 +171,7 @@ static struct grid_data _gdata = { .create_item_list = _create_item_list, .destroy_item_list = _destroy_item_list, .item_action = _item_action, + .item_updated = _item_updated, }; struct grid_data *get_music_grid_data(void) diff --git a/src/grid/grid_tv.c b/src/grid/grid_tv.c index 9849ff6..8ad32b4 100644 --- a/src/grid/grid_tv.c +++ b/src/grid/grid_tv.c @@ -175,6 +175,17 @@ static bool _item_action(Elm_Object_Item *it, enum action_type type) return true; } +static bool _item_updated(void *pre_data, void *new_data) +{ + struct datamgr *dmgr; + + dmgr = get_channel_datamgr(); + if (!dmgr || !dmgr->data_updated) + return false; + + return dmgr->data_updated(pre_data, new_data); +} + static struct grid_data _gdata = { .id = STR_TV, .item_size_x = ITEM_TV_X, @@ -183,6 +194,7 @@ static struct grid_data _gdata = { .create_item_list = _create_item_list, .destroy_item_list = _destroy_item_list, .item_action = _item_action, + .item_updated = _item_updated, }; struct grid_data *get_tv_grid_data(void) diff --git a/src/view/view_base.c b/src/view/view_base.c index c39c01b..d3b04de 100644 --- a/src/view/view_base.c +++ b/src/view/view_base.c @@ -81,44 +81,66 @@ static void _draw_content_count(Evas_Object *base, int count, int id) } } -static void _update_grid_item_list(struct _priv *priv, struct grid_data *gdata) +static bool _item_list_updated(struct grid_data *gdata, + Eina_List *pre_list, Eina_List *new_list) { - gdata->list = gdata->create_item_list(); - if (!gdata->list) { - elm_object_part_text_set(priv->base, PART_NO_CONTENTS, - STR_NO_CONTENTS); - return; + int pre_cnt, new_cnt; + void *pre_data, *new_data; + int i; + + pre_cnt = eina_list_count(pre_list); + new_cnt = eina_list_count(new_list); + + if (pre_cnt != new_cnt) + return true; + + for (i = 0; i < new_cnt; i++) { + pre_data = eina_list_nth(pre_list, i); + new_data = eina_list_nth(new_list, i); + + if (gdata->item_updated(pre_data, new_data)) + return true; } - if (!gridmgr_append_list(priv->gmgr, gdata->id, gdata->list)) - _ERR("Gridmgr append list failed."); + return false; } -static bool _load_current_grid(struct _priv *priv, int id) +static bool _update_current_grid(struct _priv *priv) { struct grid_data *gdata; Evas_Object *prev_grid; + Eina_List *pre_list; - if (!priv || !priv->gmgr || !priv->base) { + if (!priv->gmgr || !priv->base) { _ERR("Invalid argument."); return false; } - gdata = _get_grid_data[id](); + gdata = _get_grid_data[priv->cur_menu_id](); if (!gdata || !gdata->id || !gdata->grid) return false; + pre_list = gdata->list; + gdata->list = gdata->create_item_list(); + elm_object_part_text_set(priv->base, PART_NO_CONTENTS, ""); prev_grid = elm_object_part_content_unset(priv->base, PART_GENGRID); evas_object_hide(prev_grid); - elm_object_part_content_set(priv->base, PART_GENGRID, gdata->grid); - evas_object_show(gdata->grid); + if (!gdata->list) { + elm_object_part_text_set(priv->base, + PART_NO_CONTENTS, STR_NO_CONTENTS); + } else { + elm_object_part_content_set(priv->base, + PART_GENGRID, gdata->grid); + evas_object_show(gdata->grid); - if (!gdata->list) - _update_grid_item_list(priv, gdata); + if (_item_list_updated(gdata, pre_list, gdata->list)) + gridmgr_append_list(priv->gmgr, gdata->id, gdata->list); + } - _draw_content_count(priv->base, eina_list_count(gdata->list), id); + _draw_content_count(priv->base, eina_list_count(gdata->list), + priv->cur_menu_id); return true; } @@ -158,7 +180,7 @@ static void _menu_focused_cb(int id, void *data, Evas_Object *obj, priv->cur_menu_id = id; - if (!_load_current_grid(priv, id)) + if (!_update_current_grid(priv)) _ERR("Load current grid view failed."); } @@ -499,21 +521,13 @@ static void _hide(void *data) static void _update(void *view_data, int update_type, void *data) { - struct _priv *priv; - struct grid_data *gdata; - - if (!view_data || !data) { + if (!view_data) { _ERR("Get data failed."); return; } - priv = view_data; - gdata = data; - if (update_type == UPDATE_GRID) { - _update_grid_item_list(priv, gdata); - _draw_content_count(priv->base, eina_list_count(gdata->list), - priv->cur_menu_id); - } + if (update_type == UPDATE_GRID) + _update_current_grid(view_data); } static void _destroy(void *data) -- 2.7.4 From 73aa2f3310692f1754c8903476bdd3130e9e5747 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Fri, 28 Aug 2015 15:11:15 +0900 Subject: [PATCH 09/16] get name for launching app from app-utils Change-Id: I5730c8a91aadbae0486697ce9c9afb6798a25eea Signed-off-by: Minkyu Kang --- include/define.h | 5 ----- src/data/app.c | 3 ++- src/data/channel.c | 4 ++-- src/data/media.c | 3 ++- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/include/define.h b/include/define.h index cc46ce6..b0a87c9 100644 --- a/include/define.h +++ b/include/define.h @@ -84,12 +84,7 @@ #define STR_CNT_MUSIC "songs" #define STR_CNT_APPS "apps" #define STR_CNT_WEBS "bookmark" -#define STR_MEDIAHUB_APP_ID "org.tizen.mediahub" -#define STR_LIVETV_APP_ID "org.tizen.live-tv" -#define STR_KEY_MEDIA_ID "media_id" -#define STR_KEY_SERVICE_ID "service_id" #define STR_BROWSER "Web Browser" -#define STR_BROWSER_ID "org.tizen.browser" #define STR_LIVETV "Live TV" /* Font */ diff --git a/src/data/app.c b/src/data/app.c index 4ba5330..d73a69c 100644 --- a/src/data/app.c +++ b/src/data/app.c @@ -19,6 +19,7 @@ #include #include #include +#include #include "datamgr.h" #include "define.h" @@ -75,7 +76,7 @@ static void _app_favorite_list_foreach(gpointer data, gpointer user_data) adata->icon = strdup(icon); /* FIXME: The browser's name and icon is defined as GUI. */ - if (!strcmp(id, STR_BROWSER_ID)) { + if (!strcmp(id, APP_ID_BROWSER)) { adata->name = STR_BROWSER; adata->icon = BROWSER_ICON_PNG; } diff --git a/src/data/channel.c b/src/data/channel.c index 5c0a138..b18b6d0 100644 --- a/src/data/channel.c +++ b/src/data/channel.c @@ -18,6 +18,7 @@ #include #include #include +#include #include "define.h" #include "datamgr.h" @@ -191,8 +192,7 @@ static bool _action(Elm_Object_Item *it, enum action_type type) case ACTION_LAUNCH: snprintf(str, sizeof(str), "%d", cdata->id); - if (!utils_launch_app(STR_LIVETV_APP_ID, - STR_KEY_SERVICE_ID, str)) { + if (!utils_launch_app(APP_ID_LIVETV, PARAM_SERVICE_ID, str)) { _ERR("Livetv launch failed."); return false; } diff --git a/src/data/media.c b/src/data/media.c index de3d126..0cb365f 100644 --- a/src/data/media.c +++ b/src/data/media.c @@ -19,6 +19,7 @@ #include #include #include +#include #include "define.h" #include "datamgr.h" @@ -249,7 +250,7 @@ static bool _action(Elm_Object_Item *it, enum action_type type) switch (type) { case ACTION_LAUNCH: - if (!utils_launch_app(STR_MEDIAHUB_APP_ID, STR_KEY_MEDIA_ID, + if (!utils_launch_app(APP_ID_MEDIAHUB, PARAM_MEDIA_ID, minfo->media_id)) { _ERR("Mediahub launch failed."); return false; -- 2.7.4 From dd70b5ac9d5a208353c263fa532aa08c939eaf60 Mon Sep 17 00:00:00 2001 From: Hyojung Jo Date: Mon, 31 Aug 2015 15:45:07 +0900 Subject: [PATCH 10/16] View: Draw toast when contents is set to unfavorite Change-Id: I65416c18d1b715ca31eddb27cb56fa7db1cb3d6b Signed-off-by: Hyojung Jo --- include/define.h | 7 +++++-- include/view.h | 1 + src/main.c | 6 +++--- src/view/view_action_menu.c | 13 +++++++------ src/view/view_base.c | 30 ++++++++++++++++++++++++------ 5 files changed, 40 insertions(+), 17 deletions(-) diff --git a/include/define.h b/include/define.h index b0a87c9..449c5b2 100644 --- a/include/define.h +++ b/include/define.h @@ -18,8 +18,8 @@ #define __AIR_FAVORITE_DEFINE_H__ /* View ID */ -#define VIEW_ID_BASE "VIEW_ID_BASE" -#define VIEW_ID_ACTION_MENU "VIEW_ID_ACTION_MENU" +#define VIEW_BASE "VIEW_BASE" +#define VIEW_ACTION_MENU "VIEW_ACTION_MENU" /* Group */ #define GRP_VIEW_BASE "grp.view.base" @@ -49,6 +49,7 @@ #define STYLE_LIVETV_BTN "style.livetv.button" #define STYLE_ACTION_MENU_FAV_BTN "style.action.menu.favorite.button" #define STYLE_ACTION_MENU_LOCK_BTN "style.action.menu.lock.button" +#define STYLE_TOAST "style.toast" /* Signal */ #define SIG_FOCUSED "focused" @@ -86,6 +87,7 @@ #define STR_CNT_WEBS "bookmark" #define STR_BROWSER "Web Browser" #define STR_LIVETV "Live TV" +#define STR_REMOVE_FAVORITE "Removed from your favorite." /* Font */ #define FONT_TIZENSANS_REGULAR "TizenSans" @@ -103,6 +105,7 @@ #define SIZE_APP_ICON_MAX 100 #define SIZE_ACTION_TABLE_BORDER 0 #define SIZE_COL_MAX 4 +#define SIZE_TOAST_TIMEOUT 5.0 /* Count */ #define COUNT_MENU 6 diff --git a/include/view.h b/include/view.h index a32afa3..159fd2e 100644 --- a/include/view.h +++ b/include/view.h @@ -23,6 +23,7 @@ view_class *view_action_menu_get_vclass(void); enum update_type { UPDATE_DATA = 0, UPDATE_GRID, + UPDATE_SHOW_TOAST, }; #endif /* __AIR_APPS_VIEW_H__ */ diff --git a/src/main.c b/src/main.c index 5fea085..2f75d0e 100644 --- a/src/main.c +++ b/src/main.c @@ -89,8 +89,8 @@ static void _terminate(void *data) ad->win = NULL; } - viewmgr_remove_view(VIEW_ID_BASE); - viewmgr_remove_view(VIEW_ID_ACTION_MENU); + viewmgr_remove_view(VIEW_BASE); + viewmgr_remove_view(VIEW_ACTION_MENU); viewmgr_destroy(); } @@ -107,7 +107,7 @@ static void _app_control(app_control_h control, void *data) if (ad->win) elm_win_activate(ad->win); - if (!viewmgr_push_view(VIEW_ID_BASE)) + if (!viewmgr_push_view(VIEW_BASE)) _ERR("Push view failed."); } diff --git a/src/view/view_action_menu.c b/src/view/view_action_menu.c index 52d8aed..81cafdd 100644 --- a/src/view/view_action_menu.c +++ b/src/view/view_action_menu.c @@ -81,7 +81,7 @@ static void _livetv_selected(void) return; } - viewmgr_hide_view(VIEW_ID_ACTION_MENU); + viewmgr_hide_view(VIEW_ACTION_MENU); } static void _favorite_selected(struct grid_data *gdata) @@ -91,8 +91,9 @@ static void _favorite_selected(struct grid_data *gdata) return; } - viewmgr_update_view(VIEW_ID_BASE, UPDATE_GRID, gdata); - viewmgr_hide_view(VIEW_ID_ACTION_MENU); + viewmgr_update_view(VIEW_BASE, UPDATE_GRID, gdata); + viewmgr_update_view(VIEW_BASE, UPDATE_SHOW_TOAST, STR_REMOVE_FAVORITE); + viewmgr_hide_view(VIEW_ACTION_MENU); } static void _clicked_cb(int id, void *data, Evas_Object *obj) @@ -134,7 +135,7 @@ static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, if (!strcmp(ev->keyname, KEY_BACK) || !strcmp(ev->keyname, KEY_BACK_REMOTE)) - viewmgr_hide_view(VIEW_ID_ACTION_MENU); + viewmgr_hide_view(VIEW_ACTION_MENU); } static input_handler _btn_input_handler = { @@ -239,7 +240,7 @@ static Evas_Object *_create(Evas_Object *win, void *data) priv->win = win; priv->base = base; - if (!viewmgr_set_view_data(VIEW_ID_ACTION_MENU, priv)) { + if (!viewmgr_set_view_data(VIEW_ACTION_MENU, priv)) { _ERR("Set view data failed."); evas_object_del(base); free(priv); @@ -313,7 +314,7 @@ static void _destroy(void *data) } static view_class _vclass = { - .view_id = VIEW_ID_ACTION_MENU, + .view_id = VIEW_ACTION_MENU, .create = _create, .show = _show, .hide = _hide, diff --git a/src/view/view_base.c b/src/view/view_base.c index d3b04de..26cb993 100644 --- a/src/view/view_base.c +++ b/src/view/view_base.c @@ -43,6 +43,7 @@ struct _priv { Evas_Object *base; Evas_Object *box; Evas_Object *menu[COUNT_MENU]; + Evas_Object *notify; int cur_menu_id; }; @@ -331,8 +332,11 @@ static void _grid_key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, if (!gdata) return; - viewmgr_update_view(VIEW_ID_ACTION_MENU, UPDATE_DATA, gdata); - viewmgr_show_view(VIEW_ID_ACTION_MENU); + if (priv->notify) + evas_object_hide(priv->notify); + + viewmgr_update_view(VIEW_ACTION_MENU, UPDATE_DATA, gdata); + viewmgr_show_view(VIEW_ACTION_MENU); } } @@ -473,7 +477,7 @@ static Evas_Object *_create(Evas_Object *win, void *data) } } - if (!viewmgr_set_view_data(VIEW_ID_BASE, priv)) { + if (!viewmgr_set_view_data(VIEW_BASE, priv)) { _ERR("Set view data failed."); gridmgr_destroy(gmgr); goto err; @@ -521,13 +525,27 @@ static void _hide(void *data) static void _update(void *view_data, int update_type, void *data) { + struct _priv *priv; + if (!view_data) { _ERR("Get data failed."); return; } + priv = view_data; - if (update_type == UPDATE_GRID) - _update_current_grid(view_data); + switch (update_type) { + case UPDATE_GRID: + _update_current_grid(priv); + break; + + case UPDATE_SHOW_TOAST: + priv->notify = utils_add_notify(priv->base, (char *)data, + STYLE_TOAST, STYLE_TOAST, SIZE_TOAST_TIMEOUT); + break; + + default: + _ERR("Unhandled update type."); + } } static void _destroy(void *data) @@ -558,7 +576,7 @@ static void _destroy(void *data) } static view_class _vclass = { - .view_id = VIEW_ID_BASE, + .view_id = VIEW_BASE, .create = _create, .show = _show, .hide = _hide, -- 2.7.4 From fba77320058b840398771900021cdd317eb5d558 Mon Sep 17 00:00:00 2001 From: Hyojung Jo Date: Mon, 31 Aug 2015 17:49:20 +0900 Subject: [PATCH 11/16] View: Delete notify popup when toast is timeout Change-Id: I47fa408a8dcc8f1dd35b57347b5ede47b954b876 Signed-off-by: Hyojung Jo --- include/define.h | 1 + src/common/utils.c | 10 ++++++++++ src/view/view_base.c | 4 +--- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/include/define.h b/include/define.h index 449c5b2..1a5eadf 100644 --- a/include/define.h +++ b/include/define.h @@ -62,6 +62,7 @@ #define SIG_INVISIBLE "invisible" #define SIG_DISABLE "elm,state,disabled" #define SIG_TOGGLE "toggle" +#define SIG_TIMEOUT "timeout" /* Source */ #define SRC_EDC "edc" diff --git a/src/common/utils.c b/src/common/utils.c index ed0958c..a491626 100644 --- a/src/common/utils.c +++ b/src/common/utils.c @@ -184,6 +184,14 @@ Evas_Object *utils_add_table(Evas_Object *parent, const char *part, return table; } +static void _notify_timeout_cb(void *data, Evas_Object *obj, void *ei) +{ + if (!obj) + return; + + evas_object_del(obj); +} + Evas_Object *utils_add_notify(Evas_Object *parent, const char *text, const char *noti_style, const char *label_style, int timeout) { @@ -224,6 +232,8 @@ Evas_Object *utils_add_notify(Evas_Object *parent, const char *text, if (text) elm_object_text_set(lbl, text); + evas_object_smart_callback_add(notify, SIG_TIMEOUT, + _notify_timeout_cb, NULL); evas_object_show(notify); return notify; diff --git a/src/view/view_base.c b/src/view/view_base.c index 26cb993..4fe5bf3 100644 --- a/src/view/view_base.c +++ b/src/view/view_base.c @@ -332,9 +332,6 @@ static void _grid_key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, if (!gdata) return; - if (priv->notify) - evas_object_hide(priv->notify); - viewmgr_update_view(VIEW_ACTION_MENU, UPDATE_DATA, gdata); viewmgr_show_view(VIEW_ACTION_MENU); } @@ -541,6 +538,7 @@ static void _update(void *view_data, int update_type, void *data) case UPDATE_SHOW_TOAST: priv->notify = utils_add_notify(priv->base, (char *)data, STYLE_TOAST, STYLE_TOAST, SIZE_TOAST_TIMEOUT); + break; default: -- 2.7.4 From 65edcfb1cd1f99972e871803ec93e22ebba1e633 Mon Sep 17 00:00:00 2001 From: Hyojung Jo Date: Tue, 1 Sep 2015 16:00:36 +0900 Subject: [PATCH 12/16] View: Add pin view for locking favorited channel Change-Id: I3ca541eee93b9edb1159503d72e7b61c7c71c813 Signed-off-by: Hyojung Jo --- CMakeLists.txt | 2 + include/datamgr.h | 3 +- include/define.h | 13 +++ include/grid.h | 4 +- include/view.h | 1 + packaging/org.tizen.favorite.spec | 1 + src/data/app.c | 2 +- src/data/channel.c | 79 +++++++++++++- src/data/media.c | 2 +- src/data/web.c | 2 +- src/grid/grid_apps.c | 7 +- src/grid/grid_gallery.c | 7 +- src/grid/grid_movie.c | 7 +- src/grid/grid_music.c | 7 +- src/grid/grid_tv.c | 29 ++++- src/grid/grid_webs.c | 3 +- src/main.c | 15 +++ src/view/view_action_menu.c | 102 +++++++++++++----- src/view/view_base.c | 2 +- src/view/view_pin.c | 222 ++++++++++++++++++++++++++++++++++++++ 20 files changed, 456 insertions(+), 54 deletions(-) create mode 100644 src/view/view_pin.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 1bef08a..4300f1b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,6 +27,7 @@ pkg_check_modules(PKGS REQUIRED glib-2.0 capi-web-bookmark tv-service + ui-gadget-1 ) IF(NOT DEFINED PACKAGE_NAME) @@ -66,6 +67,7 @@ SET(SRCS src/common/utils.c src/view/view_base.c src/view/view_action_menu.c + src/view/view_pin.c src/grid/grid_tv.c src/grid/grid_movie.c src/grid/grid_gallery.c diff --git a/include/datamgr.h b/include/datamgr.h index ead6b10..c83e92f 100644 --- a/include/datamgr.h +++ b/include/datamgr.h @@ -35,8 +35,9 @@ struct datamgr { void (*free_favorites)(Eina_List *list); int (*get_count)(enum item_type type); char *(*get_data)(void *data, enum data_type type); - bool (*action)(Elm_Object_Item *it, enum action_type type); + bool (*action)(Elm_Object_Item *it, enum action_type type, void *data); bool (*data_updated)(void *data1, void *data2); + bool (*data_locked)(Elm_Object_Item *it, bool *locked); }; struct datamgr *get_channel_datamgr(void); diff --git a/include/define.h b/include/define.h index 1a5eadf..1a411b9 100644 --- a/include/define.h +++ b/include/define.h @@ -20,6 +20,15 @@ /* View ID */ #define VIEW_BASE "VIEW_BASE" #define VIEW_ACTION_MENU "VIEW_ACTION_MENU" +#define VIEW_PIN "VIEW_PIN" + +/* Grid ID */ +#define GRID_TV "TV" +#define GRID_MOVIE "Movie" +#define GRID_GALLERY "Gallery" +#define GRID_MUSIC "Music" +#define GRID_APP "Apps" +#define GRID_WEB "Web" /* Group */ #define GRP_VIEW_BASE "grp.view.base" @@ -89,6 +98,10 @@ #define STR_BROWSER "Web Browser" #define STR_LIVETV "Live TV" #define STR_REMOVE_FAVORITE "Removed from your favorite." +#define STR_SUCCESS "success" +#define STR_FAIL "fail" +#define STR_LOCKED "Content is locked." +#define STR_UNLOCKED "Content is unlocked." /* Font */ #define FONT_TIZENSANS_REGULAR "TizenSans" diff --git a/include/grid.h b/include/grid.h index 924d89c..6bf4b74 100644 --- a/include/grid.h +++ b/include/grid.h @@ -30,8 +30,10 @@ struct grid_data { Eina_List *(*create_item_list)(void); void (*destroy_item_list)(Eina_List *list); - bool (*item_action)(Elm_Object_Item *it, enum action_type type); + bool (*item_action)(Elm_Object_Item *it, + enum action_type type, void *data); bool (*item_updated)(void *pre_data, void *new_data); + bool (*item_locked)(Elm_Object_Item *it, bool *locked); }; struct grid_data *get_tv_grid_data(void); diff --git a/include/view.h b/include/view.h index 159fd2e..af49323 100644 --- a/include/view.h +++ b/include/view.h @@ -19,6 +19,7 @@ view_class *view_base_get_vclass(void); view_class *view_action_menu_get_vclass(void); +view_class *view_pin_get_vclass(void); enum update_type { UPDATE_DATA = 0, diff --git a/packaging/org.tizen.favorite.spec b/packaging/org.tizen.favorite.spec index 63df129..fd682bb 100644 --- a/packaging/org.tizen.favorite.spec +++ b/packaging/org.tizen.favorite.spec @@ -16,6 +16,7 @@ BuildRequires: pkgconfig(capi-content-media-content) BuildRequires: pkgconfig(glib-2.0) BuildRequires: pkgconfig(capi-web-bookmark) BuildRequires: pkgconfig(tv-service) +BuildRequires: pkgconfig(ui-gadget-1) %define _appdir /usr/apps/%{name} %define _bindir %{_appdir}/bin diff --git a/src/data/app.c b/src/data/app.c index d73a69c..6601d40 100644 --- a/src/data/app.c +++ b/src/data/app.c @@ -154,7 +154,7 @@ static void _free_favorites(Eina_List *list) } } -static bool _action(Elm_Object_Item *it, enum action_type type) +static bool _action(Elm_Object_Item *it, enum action_type type, void *data) { struct app_data *adata; int r; diff --git a/src/data/channel.c b/src/data/channel.c index b18b6d0..9697cbc 100644 --- a/src/data/channel.c +++ b/src/data/channel.c @@ -174,7 +174,43 @@ static bool _unset_favorite(struct channel_data *cdata) return true; } -static bool _action(Elm_Object_Item *it, enum action_type type) +static bool _update_lock(struct channel_data *cdata, void *data) +{ + TvServiceChannel channel; + char *pincode; + int r; + + if (!data) + return false; + + pincode = data; + + r = tv_service_channel_info_create(); + if (r != TVS_ERROR_OK) { + _ERR("Tv Service channel info create failed."); + return false; + } + + r = tv_service_get_channel(cdata->id, &channel); + if (r != TVS_ERROR_OK) { + tv_service_channel_info_destroy(); + return false; + } + + if (channel.locked) + r = tv_service_unlock_channel(cdata->id, pincode); + else + r = tv_service_lock_channel(cdata->id, pincode); + + tv_service_channel_info_destroy(); + + if (r < 0) + return false; + + return true; +} + +static bool _action(Elm_Object_Item *it, enum action_type type, void *data) { struct channel_data *cdata; char str[SIZE_STR]; @@ -208,7 +244,11 @@ static bool _action(Elm_Object_Item *it, enum action_type type) break; case ACTION_UPDATE_LOCK: - /* It will implemented later. */ + if (!_update_lock(cdata, data)) { + _ERR("Update lock status failed."); + return false; + } + break; default: @@ -232,6 +272,40 @@ static bool _data_updated(void *data1, void *data2) return true; } +static bool _data_locked(Elm_Object_Item *it, bool *locked) +{ + struct channel_data *cdata; + TvServiceChannel channel; + int r; + + if (!it) { + _ERR("Invalid argument."); + return false; + } + + cdata = elm_object_item_data_get(it); + if (!cdata) + return false; + + r = tv_service_channel_info_create(); + if (r != TVS_ERROR_OK) { + _ERR("Tv Service channel info create failed."); + return false; + } + + r = tv_service_get_channel(cdata->id, &channel); + if (r != TVS_ERROR_OK) { + tv_service_channel_info_destroy(); + return false; + } + + *locked = channel.locked; + + tv_service_channel_info_destroy(); + + return true; +} + static struct datamgr _dmgr = { .get_data = _get_data, .get_count = NULL, @@ -239,6 +313,7 @@ static struct datamgr _dmgr = { .free_favorites = _free_favorites, .action = _action, .data_updated = _data_updated, + .data_locked = _data_locked, }; struct datamgr *get_channel_datamgr(void) diff --git a/src/data/media.c b/src/data/media.c index 0cb365f..a4335da 100644 --- a/src/data/media.c +++ b/src/data/media.c @@ -224,7 +224,7 @@ static void _free_favorites(Eina_List *list) } } -static bool _action(Elm_Object_Item *it, enum action_type type) +static bool _action(Elm_Object_Item *it, enum action_type type, void *data) { app_media *am; app_media_info *minfo; diff --git a/src/data/web.c b/src/data/web.c index e58437e..da1733f 100644 --- a/src/data/web.c +++ b/src/data/web.c @@ -125,7 +125,7 @@ static void _free_favorites(Eina_List *list) } } -static bool _action(Elm_Object_Item *it, enum action_type type) +static bool _action(Elm_Object_Item *it, enum action_type type, void *data) { /* It will be implemented later. */ diff --git a/src/grid/grid_apps.c b/src/grid/grid_apps.c index a7be106..8cc220d 100644 --- a/src/grid/grid_apps.c +++ b/src/grid/grid_apps.c @@ -23,7 +23,6 @@ #include "define.h" #include "grid.h" -#define STR_APPS "Apps" #define STYLE_APPS "style.apps" #define ITEM_APPS_X (212 + 26) #define ITEM_APPS_Y (294 + 26) @@ -154,7 +153,7 @@ static void _destroy_item_list(Eina_List *list) dmgr->free_favorites(list); } -static bool _item_action(Elm_Object_Item *it, enum action_type type) +static bool _item_action(Elm_Object_Item *it, enum action_type type, void *data) { struct datamgr *dmgr; @@ -167,7 +166,7 @@ static bool _item_action(Elm_Object_Item *it, enum action_type type) if (!dmgr || !dmgr->action) return false; - if (!dmgr->action(it, type)) { + if (!dmgr->action(it, type, data)) { _ERR("The item action failed."); return false; } @@ -187,7 +186,7 @@ static bool _item_updated(void *pre_data, void *new_data) } static struct grid_data _gdata = { - .id = STR_APPS, + .id = GRID_APP, .item_size_x = ITEM_APPS_X, .item_size_y = ITEM_APPS_Y, .gclass = &_gclass, diff --git a/src/grid/grid_gallery.c b/src/grid/grid_gallery.c index be85c2c..d648caa 100644 --- a/src/grid/grid_gallery.c +++ b/src/grid/grid_gallery.c @@ -23,7 +23,6 @@ #include "define.h" #include "grid.h" -#define STR_GALLERY "Gallery" #define STYLE_GALLERY "style.gallery" #define ITEM_GALLERY_X (200 + 6) #define ITEM_GALLERY_Y (200 + 6) @@ -133,7 +132,7 @@ static void _destroy_item_list(Eina_List *list) dmgr->free_favorites(list); } -static bool _item_action(Elm_Object_Item *it, enum action_type type) +static bool _item_action(Elm_Object_Item *it, enum action_type type, void *data) { struct datamgr *dmgr; @@ -146,7 +145,7 @@ static bool _item_action(Elm_Object_Item *it, enum action_type type) if (!dmgr || !dmgr->action) return false; - if (!dmgr->action(it, type)) { + if (!dmgr->action(it, type, data)) { _ERR("The item action failed."); return false; } @@ -166,7 +165,7 @@ static bool _item_updated(void *pre_data, void *new_data) } static struct grid_data _gdata = { - .id = STR_GALLERY, + .id = GRID_GALLERY, .item_size_x = ITEM_GALLERY_X, .item_size_y = ITEM_GALLERY_Y, .gclass = &_gclass, diff --git a/src/grid/grid_movie.c b/src/grid/grid_movie.c index 5ac0356..c90ffe6 100644 --- a/src/grid/grid_movie.c +++ b/src/grid/grid_movie.c @@ -22,7 +22,6 @@ #include "define.h" #include "grid.h" -#define STR_MOVIE "Movie" #define STYLE_MOVIE "style.movie" #define ITEM_MOVIE_X (378 + 26) #define ITEM_MOVIE_Y (294 + 26) @@ -157,7 +156,7 @@ static void _destroy_item_list(Eina_List *list) dmgr->free_favorites(list); } -static bool _item_action(Elm_Object_Item *it, enum action_type type) +static bool _item_action(Elm_Object_Item *it, enum action_type type, void *data) { struct datamgr *dmgr; @@ -170,7 +169,7 @@ static bool _item_action(Elm_Object_Item *it, enum action_type type) if (!dmgr || !dmgr->action) return false; - if (!dmgr->action(it, type)) { + if (!dmgr->action(it, type, data)) { _ERR("The item action failed."); return false; } @@ -190,7 +189,7 @@ static bool _item_updated(void *pre_data, void *new_data) } static struct grid_data _gdata = { - .id = STR_MOVIE, + .id = GRID_MOVIE, .item_size_x = ITEM_MOVIE_X, .item_size_y = ITEM_MOVIE_Y, .gclass = &_gclass, diff --git a/src/grid/grid_music.c b/src/grid/grid_music.c index e6090c6..3a2aae4 100644 --- a/src/grid/grid_music.c +++ b/src/grid/grid_music.c @@ -23,7 +23,6 @@ #include "define.h" #include "grid.h" -#define STR_MUSIC "Music" #define STYLE_MUSIC "style.music" #define ITEM_MUSIC_X (488 + 26) #define ITEM_MUSIC_Y (134 + 26) @@ -131,7 +130,7 @@ static void _destroy_item_list(Eina_List *list) dmgr->free_favorites(list); } -static bool _item_action(Elm_Object_Item *it, enum action_type type) +static bool _item_action(Elm_Object_Item *it, enum action_type type, void *data) { struct datamgr *dmgr; @@ -144,7 +143,7 @@ static bool _item_action(Elm_Object_Item *it, enum action_type type) if (!dmgr || !dmgr->action) return false; - if (!dmgr->action(it, type)) { + if (!dmgr->action(it, type, data)) { _ERR("The item action failed."); return false; } @@ -164,7 +163,7 @@ static bool _item_updated(void *pre_data, void *new_data) } static struct grid_data _gdata = { - .id = STR_MUSIC, + .id = GRID_MUSIC, .item_size_x = ITEM_MUSIC_X, .item_size_y = ITEM_MUSIC_Y, .gclass = &_gclass, diff --git a/src/grid/grid_tv.c b/src/grid/grid_tv.c index 8ad32b4..a791221 100644 --- a/src/grid/grid_tv.c +++ b/src/grid/grid_tv.c @@ -23,7 +23,6 @@ #include "grid.h" #include "datamgr.h" -#define STR_TV "TV" #define STYLE_TV "style.tv" #define ITEM_TV_X (378 + 26) #define ITEM_TV_Y (294 + 26) @@ -154,7 +153,7 @@ static void _destroy_item_list(Eina_List *list) dmgr->free_favorites(list); } -static bool _item_action(Elm_Object_Item *it, enum action_type type) +static bool _item_action(Elm_Object_Item *it, enum action_type type, void *data) { struct datamgr *dmgr; @@ -167,7 +166,7 @@ static bool _item_action(Elm_Object_Item *it, enum action_type type) if (!dmgr || !dmgr->action) return false; - if (!dmgr->action(it, type)) { + if (!dmgr->action(it, type, data)) { _ERR("The item action failed."); return false; } @@ -186,8 +185,29 @@ static bool _item_updated(void *pre_data, void *new_data) return dmgr->data_updated(pre_data, new_data); } +static bool _item_locked(Elm_Object_Item *it, bool *locked) +{ + struct datamgr *dmgr; + + if (!it) { + _ERR("Invalid argument."); + return false; + } + + dmgr = get_channel_datamgr(); + if (!dmgr || !dmgr->data_locked) + return false; + + if (!dmgr->data_locked(it, locked)) { + _ERR("Get lock status failed."); + return false; + } + + return true; +} + static struct grid_data _gdata = { - .id = STR_TV, + .id = GRID_TV, .item_size_x = ITEM_TV_X, .item_size_y = ITEM_TV_Y, .gclass = &_gclass, @@ -195,6 +215,7 @@ static struct grid_data _gdata = { .destroy_item_list = _destroy_item_list, .item_action = _item_action, .item_updated = _item_updated, + .item_locked = _item_locked, }; struct grid_data *get_tv_grid_data(void) diff --git a/src/grid/grid_webs.c b/src/grid/grid_webs.c index ee42d6b..1414742 100644 --- a/src/grid/grid_webs.c +++ b/src/grid/grid_webs.c @@ -22,7 +22,6 @@ #include "define.h" #include "grid.h" -#define STR_WEBS "Web" #define STYLE_WEBS "style.webs" #define ITEM_WEBS_X (378 + 26) #define ITEM_WEBS_Y (294 + 26) @@ -148,7 +147,7 @@ static void _destroy_item_list(Eina_List *list) } static struct grid_data _gdata = { - .id = STR_WEBS, + .id = GRID_WEB, .item_size_x = ITEM_WEBS_X, .item_size_y = ITEM_WEBS_Y, .gclass = &_gclass, diff --git a/src/main.c b/src/main.c index 2f75d0e..6fd76e9 100644 --- a/src/main.c +++ b/src/main.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include "define.h" @@ -49,6 +50,12 @@ static bool _create(void *data) return false; } + if (ug_init_efl(win, UG_OPT_INDICATOR_ENABLE) < 0) { + _ERR("Fail to init ug"); + evas_object_del(win); + return false; + } + if (!viewmgr_create(win)) { _ERR("Create viewmgr failed."); evas_object_del(win); @@ -69,6 +76,13 @@ static bool _create(void *data) return false; } + if (!viewmgr_add_view(view_pin_get_vclass(), NULL)) { + _ERR("Add view faild."); + viewmgr_destroy(); + evas_object_del(win); + return false; + } + ad->win = win; return true; @@ -91,6 +105,7 @@ static void _terminate(void *data) viewmgr_remove_view(VIEW_BASE); viewmgr_remove_view(VIEW_ACTION_MENU); + viewmgr_remove_view(VIEW_PIN); viewmgr_destroy(); } diff --git a/src/view/view_action_menu.c b/src/view/view_action_menu.c index 81cafdd..9b20ebb 100644 --- a/src/view/view_action_menu.c +++ b/src/view/view_action_menu.c @@ -44,21 +44,18 @@ struct _action_info { int id; const char *title; const char *style; - Eina_Bool disable; }; static struct _action_info action_info[] = { { .id = BTN_FAVORITE, .title = STR_FAVORITE, - .style = STYLE_ACTION_MENU_FAV_BTN, - .disable = EINA_FALSE + .style = STYLE_ACTION_MENU_FAV_BTN }, { .id = BTN_LOCK, .title = STR_LOCK, - .style = STYLE_ACTION_MENU_LOCK_BTN, - .disable = EINA_TRUE + .style = STYLE_ACTION_MENU_LOCK_BTN } }; @@ -86,7 +83,8 @@ static void _livetv_selected(void) static void _favorite_selected(struct grid_data *gdata) { - if (!gdata->item_action(gdata->focused_item, ACTION_UPDATE_FAVORITE)) { + if (!gdata->item_action(gdata->focused_item, + ACTION_UPDATE_FAVORITE, NULL)) { _ERR("Unfavorite failed."); return; } @@ -96,6 +94,15 @@ static void _favorite_selected(struct grid_data *gdata) viewmgr_hide_view(VIEW_ACTION_MENU); } +static void _lock_selected(struct grid_data *gdata) +{ + if (!gdata->item_action || !gdata->item_locked) + return; + + viewmgr_update_view(VIEW_PIN, UPDATE_DATA, gdata); + viewmgr_show_view(VIEW_PIN); +} + static void _clicked_cb(int id, void *data, Evas_Object *obj) { struct _priv *priv; @@ -117,7 +124,7 @@ static void _clicked_cb(int id, void *data, Evas_Object *obj) break; case BTN_LOCK: - /* It is not supported yet. */ + _lock_selected(priv->gdata); break; default: @@ -157,15 +164,67 @@ static bool _draw_livetv_area(struct _priv *priv) inputmgr_add_callback(btn, BTN_LIVETV, &_btn_input_handler, priv); - elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_UP); - elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_LEFT); - elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_RIGHT); - priv->live_btn = btn; return true; } +static void _set_focus_policy(struct _priv *priv) +{ + int i; + + elm_object_focus_next_object_set(priv->live_btn, priv->live_btn, + ELM_FOCUS_UP); + elm_object_focus_next_object_set(priv->live_btn, priv->live_btn, + ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(priv->live_btn, priv->live_btn, + ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(priv->live_btn, priv->menu_btn[0], + ELM_FOCUS_DOWN); + + if (elm_object_disabled_get(priv->menu_btn[1])) { + elm_object_focus_next_object_set(priv->menu_btn[0], + priv->menu_btn[0], ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(priv->menu_btn[0], + priv->menu_btn[0], ELM_FOCUS_RIGHT); + } else { + elm_object_focus_next_object_set(priv->menu_btn[0], + priv->menu_btn[1], ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(priv->menu_btn[1], + priv->menu_btn[0], ELM_FOCUS_RIGHT); + } + + for (i = 0; i < COUNT_ACTION; i++) + elm_object_focus_next_object_set(priv->menu_btn[i], + priv->menu_btn[i], ELM_FOCUS_DOWN); +} + +static void _set_action_state(int idx, Evas_Object *btn, struct _priv *priv) +{ + struct grid_data *gdata; + bool locked; + + if (!priv->gdata) + return; + + gdata = priv->gdata; + + if (action_info[idx].id == BTN_LOCK) { + /* Channel can only be locked */ + if (!strcmp(gdata->id, GRID_TV) && gdata->item_locked) { + gdata->item_locked(gdata->focused_item, &locked); + + if (locked) + elm_object_signal_emit(btn, SIG_TOGGLE, + SRC_ACTION_BTN); + + return; + } + + elm_object_disabled_set(btn, EINA_TRUE); + } +} + static bool _draw_action_area(struct _priv *priv) { Evas_Object *table, *btn; @@ -190,8 +249,7 @@ static bool _draw_action_area(struct _priv *priv) inputmgr_add_callback(btn, action_info[i].id, &_btn_input_handler, priv); - if (action_info[i].disable) - elm_object_disabled_set(btn, EINA_TRUE); + _set_action_state(i, btn, priv); col = i % SIZE_COL_MAX; row = i / SIZE_COL_MAX; @@ -201,15 +259,7 @@ static bool _draw_action_area(struct _priv *priv) priv->menu_btn[i] = btn; } - /* 'Favorite' can only be focused now. */ - elm_object_focus_next_object_set(priv->menu_btn[0], - priv->menu_btn[0], ELM_FOCUS_LEFT); - elm_object_focus_next_object_set(priv->menu_btn[0], - priv->menu_btn[0], ELM_FOCUS_RIGHT); - elm_object_focus_next_object_set(priv->menu_btn[0], - priv->menu_btn[0], ELM_FOCUS_DOWN); - elm_object_focus_next_object_set(priv->live_btn, priv->menu_btn[0], - ELM_FOCUS_DOWN); + _set_focus_policy(priv); return true; } @@ -248,7 +298,6 @@ static Evas_Object *_create(Evas_Object *win, void *data) } _draw_livetv_area(priv); - _draw_action_area(priv); return base; } @@ -293,8 +342,13 @@ static void _update(void *view_data, int update_type, void *data) } priv = view_data; - if (update_type == UPDATE_DATA) + if (update_type == UPDATE_DATA) { + if (!data) + return; + priv->gdata = data; + _draw_action_area(priv); + } } static void _destroy(void *data) diff --git a/src/view/view_base.c b/src/view/view_base.c index 4fe5bf3..211bda5 100644 --- a/src/view/view_base.c +++ b/src/view/view_base.c @@ -270,7 +270,7 @@ static void _grid_item_selected_cb(void *data, Elm_Object_Item *it, gdata = data; if (gdata->item_action) - gdata->item_action(it, ACTION_LAUNCH); + gdata->item_action(it, ACTION_LAUNCH, NULL); elm_gengrid_item_selected_set(it, EINA_FALSE); } diff --git a/src/view/view_pin.c b/src/view/view_pin.c new file mode 100644 index 0000000..7a86e4e --- /dev/null +++ b/src/view/view_pin.c @@ -0,0 +1,222 @@ +/* Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include + +#include "grid.h" +#include "view.h" +#include "define.h" + +struct _priv { + Evas_Object *win; + ui_gadget_h ug; + struct grid_data *gdata; +}; + +static void _send_message(struct _priv *priv, const char *result) +{ + service_h service; + int r; + + r = service_create(&service); + if (r != SERVICE_ERROR_NONE) { + _ERR("Fail to create service"); + return; + } + + r = service_add_extra_data(service, PARAM_PIN, result); + if (r != SERVICE_ERROR_NONE) { + _ERR("Fail to add data"); + service_destroy(service); + return; + } + + ug_send_message(priv->ug, service); + service_destroy(service); +} + +static void _pincode_checked(struct _priv *priv, char *pincode) +{ + bool locked; + + if (!priv->gdata->item_action(priv->gdata->focused_item, + ACTION_UPDATE_LOCK, pincode)) { + _ERR("Update lock failed."); + _send_message(priv, STR_FAIL); + return; + } + + if (!priv->gdata->item_locked(priv->gdata->focused_item, &locked)) { + _ERR("Get lock status failed."); + goto end; + } + + if (locked) + viewmgr_update_view(VIEW_BASE, UPDATE_SHOW_TOAST, STR_LOCKED); + else + viewmgr_update_view(VIEW_BASE, UPDATE_SHOW_TOAST, STR_UNLOCKED); + +end: + viewmgr_hide_view(VIEW_PIN); + viewmgr_hide_view(VIEW_ACTION_MENU); +} + +static void _ug_result_cb(ui_gadget_h ug, service_h result, void *priv) +{ + char *pincode; + int r; + + if (!priv) { + _ERR("Invalid argument."); + return; + } + + r = service_get_extra_data(result, PARAM_PIN, &pincode); + if (r != SERVICE_ERROR_NONE || !pincode) { + _ERR("Fail to get data"); + return; + } + + _pincode_checked(priv, pincode); + + free(pincode); +} + +static void _ug_destroy_cb(ui_gadget_h ug, void *priv) +{ + viewmgr_hide_view(VIEW_PIN); +} + +static ui_gadget_h _load_pin_ug(struct _priv *priv) +{ + ui_gadget_h ug; + struct ug_cbs cbs = {0,}; + + cbs.result_cb = _ug_result_cb; + cbs.destroy_cb = _ug_destroy_cb; + cbs.priv = priv; + + ug = ug_create(NULL, UG_ID_PIN, UG_MODE_FRAMEVIEW, NULL, &cbs); + + return ug; +} + +static Evas_Object *_create(Evas_Object *win, void *data) +{ + struct _priv *priv; + + if (!win) { + _ERR("Get window object failed."); + return NULL; + } + + priv = calloc(1, sizeof(*priv)); + if (!priv) { + _ERR("Calloc failed."); + return NULL; + } + + priv->win = win; + + if (!viewmgr_set_view_data(VIEW_PIN, priv)) { + _ERR("Set view data failed."); + free(priv); + return NULL; + } + + return win; +} + +static void _show(void *data) +{ + struct _priv *priv; + ui_gadget_h ug; + + if (!data) { + _ERR("Get data failed."); + return; + } + priv = data; + + ug = _load_pin_ug(priv); + if (!ug) { + _ERR("Create pin ug failed."); + return; + } + + priv->ug = ug; +} + +static void _hide(void *data) +{ + struct _priv *priv; + + if (!data) { + _ERR("Get data failed."); + return; + } + priv = data; + + if (priv->ug) + ug_destroy(priv->ug); +} + +static void _update(void *view_data, int update_type, void *data) +{ + struct _priv *priv; + + if (!view_data) { + _ERR("Get data failed."); + return; + } + priv = view_data; + + if (update_type == UPDATE_DATA) + priv->gdata = data; +} + +static void _destroy(void *data) +{ + struct _priv *priv; + + if (!data) { + _ERR("Get data failed."); + return; + } + priv = data; + + if (priv->ug) + ug_destroy(priv->ug); + + free(priv); +} + +static view_class _vclass = { + .view_id = VIEW_PIN, + .create = _create, + .show = _show, + .hide = _hide, + .update = _update, + .destroy = _destroy, +}; + +view_class *view_pin_get_vclass(void) +{ + return &_vclass; +} -- 2.7.4 From 6ecaadda1fa00c4896d6755c398acd3baa2b2294 Mon Sep 17 00:00:00 2001 From: Hyojung Jo Date: Tue, 1 Sep 2015 20:35:53 +0900 Subject: [PATCH 13/16] Add info banner edc for channel contents Change-Id: Ic3139ef0079faef22f9f20ad67c12206a0d80636 Signed-off-by: Hyojung Jo --- res/favorite.edc | 178 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 178 insertions(+) diff --git a/res/favorite.edc b/res/favorite.edc index 5942d58..954d7dc 100644 --- a/res/favorite.edc +++ b/res/favorite.edc @@ -481,6 +481,184 @@ collections { fixed, 1 1; } } + + part { + name, "padding.info.banner"; + type, SPACER; + scale, 1; + description { + state, "default" 0.0; + min, 40 40; + rel2.relative, 0.0 0.0; + align, 0.0 0.0; + fixed, 1 1; + } + } + + part { + name, "part.info.banner"; + type, SWALLOW; + scale, 1; + description { + state, "default" 0.0; + min, 536 174; + rel1 { + to, "padding.info.banner"; + relative, 1.0 1.0; + } + rel2.to, "padding.info.banner"; + align, 0.0 0.0; + fixed, 1 1; + } + } + } + } + + group { + name, GRP_BANNER; + parts { + part { + name, "bg"; + type, RECT; + scale, 1; + description { + state, "default" 0.0; + color, 255 255 255 255; + } + } + + part { + name, "padding.title.left.top"; + type, SPACER; + scale, 1; + description { + state, "default" 0.0; + min, 28 26; + rel2.relative, 0.0 0.0; + align, 0.0 0.0; + fixed, 1 1; + } + } + + part { + name, "padding.title.right.top"; + type, SPACER; + scale, 1; + description { + state, "default" 0.0; + min, 28 26; + rel1.relative, 1.0 0.0; + rel2.relative, 1.0 0.0; + align, 1.0 0.0; + fixed, 1 1; + } + } + + part { + name, "part.title"; + type, TEXT; + scale, 1; + description { + state, "default" 0.0; + color, 51 51 51 255; + min, 0 32; + rel1 { + to, "padding.title.left.top"; + relative, 1.0 1.0; + } + rel2 { + to, "padding.title.right.top"; + relative, 0.0 1.0; + } + align, 0.5 0.0; + fixed, 0 1; + text { + font, FONT_TIZENSANS_LIGHT; + size, 28; + align, 0.0 0.5; + } + } + } + + part { + name, "padding.text"; + type, SPACER; + scale, 1; + description { + state, "default" 0.0; + min, 0 6; + rel1 { + to, "part.title"; + relative, 0.0 1.0; + } + rel2.to, "part.title"; + align, 0.5 0.0; + fixed, 0 1; + } + } + + part { + name, "part.subtitle"; + type, TEXT; + scale, 1; + description { + state, "default" 0.0; + color, 51 51 51 255; + min, 0 32; + rel1 { + to, "padding.text"; + relative, 0.0 1.0; + } + rel2.to, "padding.text"; + align, 0.5 0.0; + fixed, 0 1; + text { + font, FONT_TIZENSANS_LIGHT; + size, 28; + align, 0.0 0.5; + } + } + } + + part { + name, "padding.description"; + type, SPACER; + scale, 1; + description { + state, "default" 0.0; + min, 0 24; + rel1 { + to, "part.subtitle"; + relative, 0.0 1.0; + } + rel2.to, "part.subtitle"; + align, 0.5 0.0; + fixed, 0 1; + } + } + + part { + name, "part.description"; + type, TEXT; + scale, 1; + description { + state, "default" 0.0; + color, 112 112 112 255; + min, 0 28; + rel1 { + to, "padding.description"; + relative, 0.0 1.0; + } + rel2.to, "padding.description"; + align, 0.5 0.0; + fixed, 0 1; + text { + font, FONT_TIZENSANS_LIGHT; + size, 28; + align, 0.0 0.5; + } + } + } } } } -- 2.7.4 From 895c63d6d21bef3fc80c6ed8b1a6039f41a60d59 Mon Sep 17 00:00:00 2001 From: Hyojung Jo Date: Wed, 2 Sep 2015 14:37:10 +0900 Subject: [PATCH 14/16] View: Draw info banner of action menu Change-Id: Ie90434f33133b37927c0678c0a5cb31def092a26 Signed-off-by: Hyojung Jo --- include/datamgr.h | 2 ++ include/define.h | 6 ++++++ include/grid.h | 1 + include/utils.h | 3 ++- res/favorite.edc | 10 +++++----- src/common/utils.c | 13 +++++++++---- src/data/channel.c | 8 ++++++++ src/grid/grid_tv.c | 32 ++++++++++++++++++++++++++++++++ src/view/view_action_menu.c | 33 ++++++++++++++++++++++++++++++++- src/view/view_base.c | 2 +- 10 files changed, 98 insertions(+), 12 deletions(-) diff --git a/include/datamgr.h b/include/datamgr.h index c83e92f..d9dc358 100644 --- a/include/datamgr.h +++ b/include/datamgr.h @@ -22,6 +22,8 @@ enum data_type { DATA_ARTIST, DATA_ALBUM_NAME, DATA_DURATION, + DATA_SUBTITLE, + DATA_DESCRIPTION, }; enum action_type { diff --git a/include/define.h b/include/define.h index 1a411b9..4b1616d 100644 --- a/include/define.h +++ b/include/define.h @@ -33,6 +33,7 @@ /* Group */ #define GRP_VIEW_BASE "grp.view.base" #define GRP_VIEW_ACTION_MENU "grp.view.action.menu" +#define GRP_TV_BANNER "grp.tv.banner" /* Part for edc file */ #define PART_TOP_TITLE "part.top.title" @@ -52,6 +53,10 @@ #define PART_THUMB_DEFAULT_TV_ICON "part.thumb.default.tv.icon" #define PART_LIVETV_BTN "part.livetv.button" #define PART_ACTION_MENU "part.action.menu" +#define PART_BANNER "part.banner" +#define PART_TITLE "part.title" +#define PART_SUBTITLE "part.subtitle" +#define PART_DESCRIPT "part.description" /* Style */ #define STYLE_MENU_BTN "style.menu.button" @@ -124,6 +129,7 @@ /* Count */ #define COUNT_MENU 6 #define COUNT_ACTION 2 +#define COUNT_BANNER 1 /* Image */ #define PLAY_ICON_PNG "ic_thumbnail_play.png" diff --git a/include/grid.h b/include/grid.h index 6bf4b74..e4c1ebd 100644 --- a/include/grid.h +++ b/include/grid.h @@ -34,6 +34,7 @@ struct grid_data { enum action_type type, void *data); bool (*item_updated)(void *pre_data, void *new_data); bool (*item_locked)(Elm_Object_Item *it, bool *locked); + bool (*load_item_banner)(Evas_Object *banner, void *data); }; struct grid_data *get_tv_grid_data(void); diff --git a/include/utils.h b/include/utils.h index 975a8e3..ebe092b 100644 --- a/include/utils.h +++ b/include/utils.h @@ -18,7 +18,8 @@ #define __AIR_FAVORITE_UTILS_H__ Evas_Object *utils_add_window(const char *name); -Evas_Object *utils_add_layout(Evas_Object *parent, const char *group); +Evas_Object *utils_add_layout(Evas_Object *parent, const char *group, + Eina_Bool resize); Evas_Object *utils_add_gengrid(Evas_Object *parent, int item_size_x, int item_size_y); Evas_Object *utils_add_box(Evas_Object *parent, const char *part, diff --git a/res/favorite.edc b/res/favorite.edc index 954d7dc..13873fb 100644 --- a/res/favorite.edc +++ b/res/favorite.edc @@ -496,7 +496,7 @@ collections { } part { - name, "part.info.banner"; + name, PART_BANNER; type, SWALLOW; scale, 1; description { @@ -515,7 +515,7 @@ collections { } group { - name, GRP_BANNER; + name, GRP_TV_BANNER; parts { part { name, "bg"; @@ -555,7 +555,7 @@ collections { } part { - name, "part.title"; + name, PART_TITLE; type, TEXT; scale, 1; description { @@ -598,7 +598,7 @@ collections { } part { - name, "part.subtitle"; + name, PART_SUBTITLE; type, TEXT; scale, 1; description { @@ -638,7 +638,7 @@ collections { } part { - name, "part.description"; + name, PART_DESCRIPT; type, TEXT; scale, 1; description { diff --git a/src/common/utils.c b/src/common/utils.c index a491626..39628ed 100644 --- a/src/common/utils.c +++ b/src/common/utils.c @@ -19,6 +19,7 @@ #include #include "define.h" +#include "datamgr.h" Evas_Object *utils_add_window(const char *name) { @@ -43,11 +44,12 @@ Evas_Object *utils_add_window(const char *name) return win; } -Evas_Object *utils_add_layout(Evas_Object *parent, const char *group) +Evas_Object *utils_add_layout(Evas_Object *parent, const char *group, + Eina_Bool resize) { Evas_Object *layout; - if (!parent || !group) { + if (!parent) { _ERR("Invalid argument."); return NULL; } @@ -58,11 +60,14 @@ Evas_Object *utils_add_layout(Evas_Object *parent, const char *group) return NULL; } - elm_layout_file_set(layout, EDJEFILE, group); + if (group) + elm_layout_file_set(layout, EDJEFILE, group); evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_win_resize_object_add(parent, layout); + + if (resize) + elm_win_resize_object_add(parent, layout); return layout; } diff --git a/src/data/channel.c b/src/data/channel.c index 9697cbc..50b25ad 100644 --- a/src/data/channel.c +++ b/src/data/channel.c @@ -128,6 +128,14 @@ static char *_get_data(void *data, enum data_type type) /* It will fixed after tv-service's implementation */ return NULL; + case DATA_SUBTITLE: + /* It will be implemented as GUI guide */ + return NULL; + + case DATA_DESCRIPTION: + /* It will be implemented as GUI guide */ + return NULL; + default: _ERR("Invalid data type."); return NULL; diff --git a/src/grid/grid_tv.c b/src/grid/grid_tv.c index a791221..a6bee0f 100644 --- a/src/grid/grid_tv.c +++ b/src/grid/grid_tv.c @@ -206,6 +206,37 @@ static bool _item_locked(Elm_Object_Item *it, bool *locked) return true; } +static bool _load_item_banner(Evas_Object *banner, void *data) +{ + struct datamgr *dmgr; + char *title, *subtitle, *description; + + if (!banner || !data) { + _ERR("Invaild argument."); + return false; + } + + dmgr = get_channel_datamgr(); + if (!dmgr || !dmgr->get_data) + return false; + + elm_layout_file_set(banner, EDJEFILE, GRP_TV_BANNER); + + title = dmgr->get_data(data, DATA_NAME); + if (title) + elm_object_part_text_set(banner, PART_TITLE, title); + + subtitle = dmgr->get_data(data, DATA_SUBTITLE); + if (subtitle) + elm_object_part_text_set(banner, PART_SUBTITLE, subtitle); + + description = dmgr->get_data(data, DATA_DESCRIPTION); + if (description) + elm_object_part_text_set(banner, PART_DESCRIPT, description); + + return true; +} + static struct grid_data _gdata = { .id = GRID_TV, .item_size_x = ITEM_TV_X, @@ -216,6 +247,7 @@ static struct grid_data _gdata = { .item_action = _item_action, .item_updated = _item_updated, .item_locked = _item_locked, + .load_item_banner = _load_item_banner, }; struct grid_data *get_tv_grid_data(void) diff --git a/src/view/view_action_menu.c b/src/view/view_action_menu.c index 9b20ebb..c95366b 100644 --- a/src/view/view_action_menu.c +++ b/src/view/view_action_menu.c @@ -37,6 +37,7 @@ struct _priv { Evas_Object *base; Evas_Object *live_btn; Evas_Object *menu_btn[COUNT_ACTION]; + Evas_Object *banner; struct grid_data *gdata; }; @@ -264,6 +265,32 @@ static bool _draw_action_area(struct _priv *priv) return true; } +static bool _draw_banner_area(struct _priv *priv) +{ + Evas_Object *banner; + void *data; + + data = elm_object_item_data_get(priv->gdata->focused_item); + if (!data) + return false; + + banner = utils_add_layout(priv->base, NULL, EINA_FALSE); + if (!banner) { + _ERR("Add layout failed."); + return false; + } + + if (!priv->gdata->load_item_banner || + !priv->gdata->load_item_banner(banner, data)) + return false; + + elm_object_part_content_set(priv->base, PART_BANNER, banner); + + priv->banner = banner; + + return true; +} + static Evas_Object *_create(Evas_Object *win, void *data) { struct _priv *priv; @@ -280,7 +307,7 @@ static Evas_Object *_create(Evas_Object *win, void *data) return NULL; } - base = utils_add_layout(win, GRP_VIEW_ACTION_MENU); + base = utils_add_layout(win, GRP_VIEW_ACTION_MENU, EINA_TRUE); if (!base) { _ERR("Add layout failed."); free(priv); @@ -328,6 +355,9 @@ static void _hide(void *data) } priv = data; + if (priv->banner) + evas_object_del(priv->banner); + if (priv->base) evas_object_hide(priv->base); } @@ -348,6 +378,7 @@ static void _update(void *view_data, int update_type, void *data) priv->gdata = data; _draw_action_area(priv); + _draw_banner_area(priv); } } diff --git a/src/view/view_base.c b/src/view/view_base.c index 211bda5..7c41ebd 100644 --- a/src/view/view_base.c +++ b/src/view/view_base.c @@ -446,7 +446,7 @@ static Evas_Object *_create(Evas_Object *win, void *data) return NULL; } - base = utils_add_layout(win, GRP_VIEW_BASE); + base = utils_add_layout(win, GRP_VIEW_BASE, EINA_TRUE); if (!base) { _ERR("Add layout failed."); free(priv); -- 2.7.4 From e38a814bc73a49e0e2b4dd8f1a78d1715939d977 Mon Sep 17 00:00:00 2001 From: Hyojung Jo Date: Wed, 2 Sep 2015 17:18:50 +0900 Subject: [PATCH 15/16] View: Draw lock icon on thumbnail when contents is locked Change-Id: Id8d39b474d4b8dd7f71b5a64bb10ce2eb8862c24 Signed-off-by: Hyojung Jo --- include/define.h | 2 ++ include/view.h | 2 ++ res/images/ic_thumbnail_lock_01.png | Bin 0 -> 3289 bytes res/widgets/gengrid_tv.edc | 67 ++++++++++++++++++++++++++++++++++++ src/view/view_base.c | 22 ++++++++++++ src/view/view_pin.c | 8 +++-- 6 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 res/images/ic_thumbnail_lock_01.png diff --git a/include/define.h b/include/define.h index 4b1616d..b8b3263 100644 --- a/include/define.h +++ b/include/define.h @@ -82,6 +82,7 @@ #define SRC_EDC "edc" #define SRC_MENU_BTN "menubtn" #define SRC_ACTION_BTN "source.action.btn" +#define SRC_LOCK_ICON "source.lock.icon" /* Transition */ #define TRANSITION_FOCUS DECELERATE 0.20 @@ -148,6 +149,7 @@ #define ACTION_LOCK_FOC_PNG "btn_menu_lock_foc.png" #define ACTION_LOCK_SEL_PNG "btn_menu_lock_sel.png" #define ACTION_LOCK_DIS_PNG "btn_menu_lock_dis.png" +#define LOCK_ICON_PNG "ic_thumbnail_lock_01.png" /* Path */ #define PATH_PLAY_ICON_PNG IMGDIR"/ic_thumbnail_play.png" diff --git a/include/view.h b/include/view.h index af49323..88fbb88 100644 --- a/include/view.h +++ b/include/view.h @@ -25,6 +25,8 @@ enum update_type { UPDATE_DATA = 0, UPDATE_GRID, UPDATE_SHOW_TOAST, + UPDATE_LOCK, + UPDATE_UNLOCK, }; #endif /* __AIR_APPS_VIEW_H__ */ diff --git a/res/images/ic_thumbnail_lock_01.png b/res/images/ic_thumbnail_lock_01.png new file mode 100644 index 0000000000000000000000000000000000000000..cbd4267cdb7605252a2e252609468d97f96c1c33 GIT binary patch literal 3289 zcmV;~3?}o5P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00066Nkl76+FC|TNGp3SWN!qz- z-njKm+!I_EK}p6&=Q+S+GHJG2txxTC`+F2cs@Lm>jYi{frBZolDer-2fNmv%l1?Ql z48tqm_g$a{8~}H0I{<3F@4I0bUfF1#ZW6(@1xl($QS@8V-1EE>V1EU7-}Af^Nps7o zW-f3xo4uB#;c$2c>?PpuU0z~U*U94D6eb@f9VlsjoqPNr zXR)LY%SXfVR@;8k_K&*M{M7HD-Aa>TkWAVwHo4y7q8=;+S_DCG;W*B*<2c7b5L|3c zVccP@gm7K=2q*((*L9DS9ONax3lYP#AS?1S;18N2AesR*R3vfocused_item, SIG_VISIBLE, + SRC_LOCK_ICON); + + break; + + case UPDATE_UNLOCK: + if (!data) + return; + + gdata = data; + + elm_object_item_signal_emit(gdata->focused_item, SIG_INVISIBLE, + SRC_LOCK_ICON); + + break; default: _ERR("Unhandled update type."); } diff --git a/src/view/view_pin.c b/src/view/view_pin.c index 7a86e4e..253db24 100644 --- a/src/view/view_pin.c +++ b/src/view/view_pin.c @@ -67,10 +67,14 @@ static void _pincode_checked(struct _priv *priv, char *pincode) goto end; } - if (locked) + + if (locked) { + viewmgr_update_view(VIEW_BASE, UPDATE_LOCK, priv->gdata); viewmgr_update_view(VIEW_BASE, UPDATE_SHOW_TOAST, STR_LOCKED); - else + } else { + viewmgr_update_view(VIEW_BASE, UPDATE_UNLOCK, priv->gdata); viewmgr_update_view(VIEW_BASE, UPDATE_SHOW_TOAST, STR_UNLOCKED); + } end: viewmgr_hide_view(VIEW_PIN); -- 2.7.4 From 12bc19146da33b5e64df281969935178e873898d Mon Sep 17 00:00:00 2001 From: Hyojung Jo Date: Thu, 3 Sep 2015 16:29:09 +0900 Subject: [PATCH 16/16] Hide action menu view when app is paused Change-Id: Ia8451e30ea001f1aac85a45f82aad95cde3130ec Signed-off-by: Hyojung Jo --- src/main.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/main.c b/src/main.c index 6fd76e9..9330e02 100644 --- a/src/main.c +++ b/src/main.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -126,6 +127,26 @@ static void _app_control(app_control_h control, void *data) _ERR("Push view failed."); } +static void _pause(void *data) +{ + view_state state; + + state = viewmgr_get_view_state(VIEW_ACTION_MENU); + if (state == VIEW_STATE_VISIBLE) + viewmgr_hide_view(VIEW_ACTION_MENU); + + state = viewmgr_get_view_state(VIEW_PIN); + if (state == VIEW_STATE_VISIBLE) + viewmgr_hide_view(VIEW_PIN); + + inputmgr_enable(EINA_FALSE); +} + +static void _resume(void *data) +{ + inputmgr_enable(EINA_TRUE); +} + int main(int argc, char *argv[]) { struct _appdata ad; @@ -133,6 +154,8 @@ int main(int argc, char *argv[]) .create = _create, .terminate = _terminate, .app_control = _app_control, + .pause = _pause, + .resume = _resume, }; memset(&ad, 0x00, sizeof(ad)); -- 2.7.4