From 7d4f42fe00abd10591fb4e56e597b8f3b035e266 Mon Sep 17 00:00:00 2001 From: Gustavo Lima Chaves Date: Tue, 19 Oct 2010 20:19:12 +0000 Subject: [PATCH] New list layout: horizontal. Now one can set lists to dispose its items horizontally, too. elm_list_horizontal_mode_set(), whose name was bogus and would conflict with the new methods, got renamed to elm_mode_set(), along with the getters. This is coming along to help a widget using lists which has a horizontal mode. The default theme for horizontal items is kinda ugly for default lists, but one can always improve it :) (in a hurry now). Also, I'm introducing a new mode for Elementary lists: expand. SVN revision: 53640 --- legacy/elementary/data/themes/default.edc | 808 ++++++++++++++++++ legacy/elementary/data/themes/ilist_1_h.png | Bin 0 -> 1222 bytes legacy/elementary/data/themes/ilist_2_h.png | Bin 0 -> 1384 bytes .../data/themes/ilist_item_shadow_h.png | Bin 0 -> 350 bytes legacy/elementary/src/bin/test.c | 2 + legacy/elementary/src/bin/test_list.c | 135 ++- .../elementary/src/edje_externals/elm_list.c | 42 +- legacy/elementary/src/lib/Elementary.h.in | 9 +- legacy/elementary/src/lib/elm_list.c | 417 +++++---- 9 files changed, 1241 insertions(+), 172 deletions(-) create mode 100644 legacy/elementary/data/themes/ilist_1_h.png create mode 100644 legacy/elementary/data/themes/ilist_2_h.png create mode 100644 legacy/elementary/data/themes/ilist_item_shadow_h.png diff --git a/legacy/elementary/data/themes/default.edc b/legacy/elementary/data/themes/default.edc index fe4108bd87..a73b401af4 100644 --- a/legacy/elementary/data/themes/default.edc +++ b/legacy/elementary/data/themes/default.edc @@ -11523,6 +11523,814 @@ collections { } } +/////////////////////////////////////////////////////////////////////////////// + group { name: "elm/list/h_item/default"; + data.item: "stacking" "above"; + images { + image: "bt_sm_base1.png" COMP; + image: "bt_sm_shine.png" COMP; + image: "bt_sm_hilight.png" COMP; + image: "ilist_1_h.png" COMP; + image: "ilist_item_shadow_h.png" COMP; + } + parts { + part { + name: "event"; + type: RECT; + repeat_events: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + } + part { + name: "base_sh"; + mouse_events: 0; + description { + state: "default" 0.0; + align: 0.0 0.0; + min: 10 0; + fixed: 1 1; + rel1 { + to: "base"; + relative: 1.0 0.0; + offset: 0 0; + } + rel2 { + to: "base"; + relative: 1.0 1.0; + offset: 0 -1; + } + image { + normal: "ilist_item_shadow_h.png"; + } + fill.smooth: 0; + } + } + part { + name: "base"; + mouse_events: 0; + description { + state: "default" 0.0; + image { + normal: "ilist_1_h.png"; + border: 2 2 2 2; + } + fill.smooth: 0; + } + } + part { name: "bg"; + mouse_events: 0; + description { state: "default" 0.0; + visible: 0; + color: 255 255 255 0; + rel1 { + relative: 0.0 0.0; + offset: -5 -5; + } + rel2 { + relative: 1.0 1.0; + offset: 4 4; + } + image { + normal: "bt_sm_base1.png"; + border: 6 6 6 6; + } + image.middle: SOLID; + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 255 255 255 255; + rel1 { + relative: 0.0 0.0; + offset: -2 -2; + } + rel2 { + relative: 1.0 1.0; + offset: 1 1; + } + } + } + part { name: "elm.swallow.icon"; + type: SWALLOW; + description { state: "default" 0.0; + fixed: 0 1; + align: 0.5 0.0; + rel1 { + relative: 0.0 0.0; + offset: 4 4; + } + rel2 { + relative: 1.0 0.0; + offset: -5 4; + } + } + } + part { name: "elm.swallow.end"; + type: SWALLOW; + description { state: "default" 0.0; + fixed: 0 1; + align: 0.5 1.0; + rel1 { + relative: 0.0 1.0; + offset: 4 -5; + } + rel2 { + relative: 1.0 1.0; + offset: -5 -5; + } + } + } + part { name: "elm.text"; + type: TEXT; + effect: SOFT_SHADOW; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + fixed: 0 1; + rel1 { + to_x: "elm.swallow.icon"; + relative: 0.0 1.0; + offset: 4 4; + } + rel2 { + to_x: "elm.swallow.end"; + relative: 1.0 0.0; + offset: -5 -1; + } + color: 0 0 0 255; + color3: 0 0 0 0; + text { + font: "Sans"; + size: 10; + min: 1 1; + align: 0.5 0.5; + } + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + color: 224 224 224 255; + color3: 0 0 0 64; + } + } + part { name: "fg1"; + mouse_events: 0; + description { state: "default" 0.0; + visible: 0; + color: 255 255 255 0; + rel1.to: "bg"; + rel2.relative: 1.0 0.5; + rel2.to: "bg"; + image { + normal: "bt_sm_hilight.png"; + border: 6 6 6 0; + } + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 255 255 255 255; + } + } + part { name: "fg2"; + mouse_events: 0; + description { state: "default" 0.0; + visible: 0; + color: 255 255 255 0; + rel1.to: "bg"; + rel2.to: "bg"; + image { + normal: "bt_sm_shine.png"; + border: 6 6 6 0; + } + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 255 255 255 255; + } + } + } + programs { + program { + name: "go_active"; + signal: "elm,state,selected"; + source: "elm"; + action: STATE_SET "selected" 0.0; + target: "bg"; + target: "fg1"; + target: "fg2"; + target: "elm.text"; + } + program { + name: "go_passive"; + signal: "elm,state,unselected"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "fg1"; + target: "fg2"; + target: "elm.text"; + transition: LINEAR 0.1; + } + } + } + group { name: "elm/list/h_item_odd/default"; + data.item: "stacking" "below"; + data.item: "selectraise" "on"; + images { + image: "bt_sm_base1.png" COMP; + image: "bt_sm_shine.png" COMP; + image: "bt_sm_hilight.png" COMP; + image: "ilist_2_h.png" COMP; + } + parts { + part { + name: "event"; + type: RECT; + repeat_events: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + } + part { + name: "base"; + mouse_events: 0; + description { + state: "default" 0.0; + image { + normal: "ilist_2_h.png"; + border: 2 2 2 2; + } + fill.smooth: 0; + } + } + part { name: "bg"; + mouse_events: 0; + description { state: "default" 0.0; + visible: 0; + color: 255 255 255 0; + rel1 { + relative: 0.0 0.0; + offset: -5 -5; + } + rel2 { + relative: 1.0 1.0; + offset: 4 4; + } + image { + normal: "bt_sm_base1.png"; + border: 6 6 6 6; + } + image.middle: SOLID; + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 255 255 255 255; + rel1 { + relative: 0.0 0.0; + offset: -2 -2; + } + rel2 { + relative: 1.0 1.0; + offset: 1 1; + } + } + } + part { + name: "elm.swallow.icon"; + type: SWALLOW; + description { state: "default" 0.0; + fixed: 0 1; + align: 0.5 0.0; + rel1 { + relative: 0.0 0.0; + offset: 4 4; + } + rel2 { + relative: 1.0 0.0; + offset: -5 4; + } + } + } + part { + name: "elm.swallow.end"; + type: SWALLOW; + description { state: "default" 0.0; + fixed: 0 1; + align: 0.5 1.0; + rel1 { + relative: 0.0 1.0; + offset: 4 -5; + } + rel2 { + relative: 1.0 1.0; + offset: -5 -5; + } + } + } + part { name: "elm.text"; + type: TEXT; + effect: SOFT_SHADOW; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 1; + rel1 { + to_x: "elm.swallow.icon"; + relative: 0.0 1.0; + offset: 4 4; + } + rel2 { + to_x: "elm.swallow.end"; + relative: 1.0 0.0; + offset: -5 -1; + } + color: 0 0 0 255; + color3: 0 0 0 0; + text { + font: "Sans"; + size: 10; + min: 1 1; + align: 0.5 0.5; + } + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + color: 224 224 224 255; + color3: 0 0 0 64; + } + } + part { name: "fg1"; + mouse_events: 0; + description { state: "default" 0.0; + visible: 0; + color: 255 255 255 0; + rel1.to: "bg"; + rel2.relative: 1.0 0.5; + rel2.to: "bg"; + image { + normal: "bt_sm_hilight.png"; + border: 6 6 6 0; + } + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 255 255 255 255; + } + } + part { name: "fg2"; + mouse_events: 0; + description { state: "default" 0.0; + visible: 0; + color: 255 255 255 0; + rel1.to: "bg"; + rel2.to: "bg"; + image { + normal: "bt_sm_shine.png"; + border: 6 6 6 0; + } + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 255 255 255 255; + } + } + } + programs { + program { + name: "go_active"; + signal: "elm,state,selected"; + source: "elm"; + action: STATE_SET "selected" 0.0; + target: "bg"; + target: "fg1"; + target: "fg2"; + target: "elm.text"; + } + program { + name: "go_passive"; + signal: "elm,state,unselected"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "fg1"; + target: "fg2"; + target: "elm.text"; + transition: LINEAR 0.1; + } + } + } + group { name: "elm/list/h_item_compress/default"; + data.item: "stacking" "above"; + data.item: "selectraise" "on"; + images { + image: "bt_sm_base1.png" COMP; + image: "bt_sm_shine.png" COMP; + image: "bt_sm_hilight.png" COMP; + image: "ilist_1_h.png" COMP; + image: "ilist_item_shadow_h.png" COMP; + } + parts { + part { + name: "event"; + type: RECT; + repeat_events: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + } + part { + name: "base_sh"; + mouse_events: 0; + description { state: "default" 0.0; + fixed: 1 1; + align: 0.0 0.0; + min: 10 0; + rel1 { + to: "base"; + relative: 1.0 0.0; + offset: 0 0; + } + rel2 { + to: "base"; + relative: 1.0 1.0; + offset: 0 -1; + } + image { + normal: "ilist_item_shadow_h.png"; + } + fill.smooth: 0; + } + } + part { + name: "base"; + mouse_events: 0; + description { + state: "default" 0.0; + image { + normal: "ilist_1_h.png"; + border: 2 2 2 2; + } + fill.smooth: 0; + } + } + part { name: "bg"; + mouse_events: 0; + description { state: "default" 0.0; + visible: 0; + color: 255 255 255 0; + rel1 { + relative: 0.0 0.0; + offset: -5 -5; + } + rel2 { + relative: 1.0 1.0; + offset: 4 4; + } + image { + normal: "bt_sm_base1.png"; + border: 6 6 6 6; + } + image.middle: SOLID; + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 255 255 255 255; + rel1 { + relative: 0.0 0.0; + offset: -2 -2; + } + rel2 { + relative: 1.0 1.0; + offset: 1 1; + } + } + } + part { name: "elm.swallow.icon"; + type: SWALLOW; + description { state: "default" 0.0; + fixed: 0 1; + align: 0.5 0.0; + rel1 { + relative: 0.0 0.0; + offset: 4 4; + } + rel2 { + relative: 1.0 0.0; + offset: -5 4; + } + } + } + part { name: "elm.swallow.end"; + type: SWALLOW; + description { state: "default" 0.0; + fixed: 0 1; + align: 0.5 1.0; + rel1 { + relative: 0.0 1.0; + offset: 4 -5; + } + rel2 { + relative: 1.0 1.0; + offset: -5 -5; + } + } + } + part { + name: "elm.text"; + type: TEXT; + effect: SOFT_SHADOW; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + fixed: 1 1; + rel1 { + to_x: "elm.swallow.icon"; + relative: 0.0 1.0; + offset: 4 4; + } + rel2 { + to_x: "elm.swallow.end"; + relative: 1.0 0.0; + offset: -5 -1; + } + color: 0 0 0 255; + color3: 0 0 0 0; + text { + font: "Sans"; + size: 10; + min: 1 1; + align: 0.5 0.5; + } + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + color: 224 224 224 255; + color3: 0 0 0 64; + } + } + part { name: "fg1"; + mouse_events: 0; + description { state: "default" 0.0; + visible: 0; + color: 255 255 255 0; + rel1.to: "bg"; + rel2.relative: 1.0 0.5; + rel2.to: "bg"; + image { + normal: "bt_sm_hilight.png"; + border: 6 6 6 0; + } + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 255 255 255 255; + } + } + part { name: "fg2"; + mouse_events: 0; + description { state: "default" 0.0; + visible: 0; + color: 255 255 255 0; + rel1.to: "bg"; + rel2.to: "bg"; + image { + normal: "bt_sm_shine.png"; + border: 6 6 6 0; + } + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 255 255 255 255; + } + } + } + programs { + program { + name: "go_active"; + signal: "elm,state,selected"; + source: "elm"; + action: STATE_SET "selected" 0.0; + target: "bg"; + target: "fg1"; + target: "fg2"; + target: "elm.text"; + } + program { + name: "go_passive"; + signal: "elm,state,unselected"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "fg1"; + target: "fg2"; + target: "elm.text"; + transition: LINEAR 0.1; + } + } + } + group { name: "elm/list/h_item_compress_odd/default"; + data.item: "stacking" "below"; + data.item: "selectraise" "on"; + images { + image: "bt_sm_base1.png" COMP; + image: "bt_sm_shine.png" COMP; + image: "bt_sm_hilight.png" COMP; + image: "ilist_2_h.png" COMP; + } + parts { + part { + name: "event"; + type: RECT; + repeat_events: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + } + part { + name: "base"; + mouse_events: 0; + description { + state: "default" 0.0; + image { + normal: "ilist_2_h.png"; + border: 2 2 2 2; + } + fill.smooth: 0; + } + } + part { name: "bg"; + mouse_events: 0; + description { state: "default" 0.0; + visible: 0; + color: 255 255 255 0; + rel1 { + relative: 0.0 0.0; + offset: -5 -5; + } + rel2 { + relative: 1.0 1.0; + offset: 4 4; + } + image { + normal: "bt_sm_base1.png"; + border: 6 6 6 6; + } + image.middle: SOLID; + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 255 255 255 255; + rel1 { + relative: 0.0 0.0; + offset: -2 -2; + } + rel2 { + relative: 1.0 1.0; + offset: 1 1; + } + } + } + part { name: "elm.swallow.icon"; + type: SWALLOW; + description { state: "default" 0.0; + fixed: 0 1; + align: 0.5 0.0; + rel1 { + relative: 0.0 0.0; + offset: 4 4; + } + rel2 { + relative: 1.0 0.0; + offset: -5 4; + } + } + } + part { name: "elm.swallow.end"; + type: SWALLOW; + description { state: "default" 0.0; + fixed: 0 1; + align: 0.5 1.0; + rel1 { + relative: 0.0 1.0; + offset: 4 -5; + } + rel2 { + relative: 1.0 1.0; + offset: -5 -5; + } + } + } + part { name: "elm.text"; + type: TEXT; + effect: SOFT_SHADOW; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 1; + rel1 { + to_x: "elm.swallow.icon"; + relative: 0.0 1.0; + offset: 4 4; + } + rel2 { + to_x: "elm.swallow.end"; + relative: 1.0 0.0; + offset: -5 -1; + } + color: 0 0 0 255; + color3: 0 0 0 0; + text { + font: "Sans"; + size: 10; + min: 1 1; + align: 0.5 0.5; + } + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + color: 224 224 224 255; + color3: 0 0 0 64; + } + } + part { name: "fg1"; + mouse_events: 0; + description { state: "default" 0.0; + visible: 0; + color: 255 255 255 0; + rel1.to: "bg"; + rel2.relative: 1.0 0.5; + rel2.to: "bg"; + image { + normal: "bt_sm_hilight.png"; + border: 6 6 6 0; + } + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 255 255 255 255; + } + } + part { name: "fg2"; + mouse_events: 0; + description { state: "default" 0.0; + visible: 0; + color: 255 255 255 0; + rel1.to: "bg"; + rel2.to: "bg"; + image { + normal: "bt_sm_shine.png"; + border: 6 6 6 0; + } + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 255 255 255 255; + } + } + } + programs { + program { + name: "go_active"; + signal: "elm,state,selected"; + source: "elm"; + action: STATE_SET "selected" 0.0; + target: "bg"; + target: "fg1"; + target: "fg2"; + target: "elm.text"; + } + program { + name: "go_passive"; + signal: "elm,state,unselected"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "fg1"; + target: "fg2"; + target: "elm.text"; + transition: LINEAR 0.1; + } + } + } + /////////////////////////////////////////////////////////////////////////////// group { name: "elm/slider/horizontal/default"; images { diff --git a/legacy/elementary/data/themes/ilist_1_h.png b/legacy/elementary/data/themes/ilist_1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..bd2fd15d9fca511d8db852f0dc917cb00ffffbd5 GIT binary patch literal 1222 zcmV;%1UdVOP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RV3JnbnE7oB_%K!iX8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b1T#rQK~z}7wOC7X1t|=ZsJ{OlbBe6e zng#d=<|S1#^A<@r4aOf?Hc)yc03eC~`uFwq^#BAU>3v^)_`R@A~vg z`2PMLwwYQL>L?)zAV96J%3nc2Tnm>!M*8e4Vs(s?@PAlhd?%MdaJqVM{T|ml+TxqjdFG)$e1$&6OBqmcpl7sU7N9pZOvCSA`3Dkz9z{o{n5tl+c*)S%LT`C*zclsWKvS$@*az#^9 z!y0C=v4pYKKY^mp#a{ceWuX7b`_1RZvE%!OYAIMlT~wvz9En&IQB{~K2Tr~X6_9B7+yhR81vBI$!<62W1`bPHR8ud@DwttP z#uf14FRr_e94n2N&VI4&Z=y-6J&1vZ4ulwYHR(pMQ{ScpT`NI5w34p{ zigdjpLTQz&N!?lDJWo80>vg-5;tsUgKWULiel7=bQq3U*mHTc-=$bvdp?^6i3DmUT+4cb-lMa>Hw}R*Ig#}cSmajv?kmZ zeKxUbC+WfGC>u&nQIQIr5)Opt1o)NpZgW`9)thGPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RV3Jnbp6jCt`bN~PV8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b1l37IK~z}7wOC7*+b|3RnB4!8vuiIf zi;2($KcZwgd3~?-VkVYli3C9sGJpU6B>@0Q{OjxM>+1;+kfbq&@`4ZbYYagWB>6n- z(}sow44gHcp_k=wN%z(`9gF zCMwi@v&@dm&=Itw$s~irGa1`Vf#lOCY3O4xPO)*8838fFB?a4zNmIRx!M5>sYtxT( z%Wv|({nc_Cl80MiOOBu^fzhHrW&xSdEs;Ng78MVV;Amwsxqws^?Tzhk{8*rKh=jt8 zRrpA@Qq8~GX>McoBnb&Ha4dC5vmLZ7Eo6d9?UyjTnn^>mKw+zH%=Gzy(q*uEj}~ui z=`R<`@{k=lMs!TB_)Hdc+Pv$UX}bUp$ZISIMM)qS$)*mJW&bcpByXOiGnD%gXU|Sjy zJ;H*J<(f;DH6iB@ln%FdXxrcI`Fq$kAt%>ln~*{l%RJjqOkJRc*xG&;Mwaw0p*+dhT4w8#%A%;2 zO-qVGV&!#}8G2$V>x&<*#*m@c>%|!@Ja2<+c|Oqt_jU$kv0GYlPN_Du%Ls0P*?MV% zj7V)t53WwV(uq-NmEJR?Y1V$!Z5}=)F@n7Fr)=LC!L4GKv(0gAYRVeyRnP=%ht;a@ z+n&`|I058Ucrn{*c0SFLk?1i>=|lpdCBRf>4oWWPWy)?E;i+I=$+gYzU9$@>oru}b zS$*uN@9H!#;Yw1KsyH0J>ijqxN~wo-{;vE&Jg#3+8bKY7IO5tpcbhxU)&tHYA(N)$ z2_&5>e&S2)$G?L;&LXY&Hi4cvTm@g0_4!7{rW#yhk#5f2&9qI3aSQSNspNTpUbhGR zooKD-a{av=LtEGJvz2u&SwBt0nQp2eHVQN-hT~A(S7x1qH(pnG4;0C-F5t%8N5T5V~m4BdH<13nzi=R^(F=% qz98*i15QABsn*@Ie{vcA^YsT_8Nw!>!1I;>0000F~y3C>6$mL@9q-(ElElXBg?<5tYR3(v^cB;gt;N{1RiHDP` zPQ0+lH(Dmc*e|E4Bq{e(zTaN<(z}#^g)1ZvrOM9S*UEjsHFn*sy&^%qDGMSFERIQD r_4>*h@w~*0xBRn1o-cEm@`fdD^*)uY&(A9Yy~W_^>gTe~DWM4fhTwzZ literal 0 HcmV?d00001 diff --git a/legacy/elementary/src/bin/test.c b/legacy/elementary/src/bin/test.c index e749fbf039..b97aa53703 100644 --- a/legacy/elementary/src/bin/test.c +++ b/legacy/elementary/src/bin/test.c @@ -34,6 +34,7 @@ void test_anchorblock(void *data, Evas_Object *obj, void *event_info); void test_toolbar(void *data, Evas_Object *obj, void *event_info); void test_hoversel(void *data, Evas_Object *obj, void *event_info); void test_list(void *data, Evas_Object *obj, void *event_info); +void test_list_horizontal(void *data, Evas_Object *obj, void *event_info); void test_list2(void *data, Evas_Object *obj, void *event_info); void test_list3(void *data, Evas_Object *obj, void *event_info); void test_list4(void *data, Evas_Object *obj, void *event_info); @@ -250,6 +251,7 @@ my_win_main(char *autorun) ADD_TEST("Toolbar", test_toolbar); ADD_TEST("Hoversel", test_hoversel); ADD_TEST("List", test_list); + ADD_TEST("List - Horizontal", test_list_horizontal); ADD_TEST("List 2", test_list2); ADD_TEST("List 3", test_list3); ADD_TEST("List 4", test_list4); diff --git a/legacy/elementary/src/bin/test_list.c b/legacy/elementary/src/bin/test_list.c index 3324ef3d74..ca06f69426 100644 --- a/legacy/elementary/src/bin/test_list.c +++ b/legacy/elementary/src/bin/test_list.c @@ -27,6 +27,7 @@ test_list(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info _ li = elm_list_add(win); elm_win_resize_object_add(win, li); + elm_list_mode_set(li, ELM_LIST_LIMIT); evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); ic = elm_icon_add(win); @@ -148,6 +149,132 @@ test_list(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info _ evas_object_show(win); } +void +test_list_horizontal(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *win, *bg, *li, *ic, *ic2, *bx, *tb2, *bt; + char buf[PATH_MAX]; + Elm_List_Item *it1, *it2, *it3, *it4; + + win = elm_win_add(NULL, "list", ELM_WIN_BASIC); + elm_win_title_set(win, "List"); + elm_win_autodel_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + li = elm_list_add(win); + elm_list_horizontal_set(li, EINA_TRUE); + elm_list_mode_set(li, ELM_LIST_LIMIT); + elm_win_resize_object_add(win, li); + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 1, 1); + it1 = elm_list_item_append(li, "Hello", ic, NULL, NULL, NULL); + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR); + elm_icon_scale_set(ic, 0, 0); + elm_icon_file_set(ic, buf, NULL); + elm_list_item_append(li, "world", ic, NULL, NULL, NULL); + ic = elm_icon_add(win); + elm_icon_standard_set(ic, "edit"); + elm_icon_scale_set(ic, 0, 0); + elm_list_item_append(li, ".", ic, NULL, NULL, NULL); + + ic = elm_icon_add(win); + elm_icon_standard_set(ic, "delete"); + elm_icon_scale_set(ic, 0, 0); + ic2 = elm_icon_add(win); + elm_icon_standard_set(ic2, "clock"); + elm_icon_scale_set(ic2, 0, 0); + it2 = elm_list_item_append(li, "How", ic, ic2, NULL, NULL); + + bx = elm_box_add(win); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_align_set(ic, 0.5, 0.5); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_align_set(ic, 0.5, 0.0); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + elm_list_item_append(li, "are", bx, NULL, NULL, NULL); + + elm_list_item_append(li, "you", NULL, NULL, NULL, NULL); + it3 = elm_list_item_append(li, "doing", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "out", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "there", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "today", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "?", NULL, NULL, NULL, NULL); + + it4 = elm_list_item_append(li, "And", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "here", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "we", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "are", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "done", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "with", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "items.", NULL, NULL, NULL, NULL); + + elm_list_go(li); + + evas_object_show(li); + + tb2 = elm_table_add(win); + evas_object_size_hint_weight_set(tb2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, tb2); + + bt = elm_button_add(win); + elm_button_label_set(bt, "Hello"); + evas_object_smart_callback_add(bt, "clicked", my_show_it, it1); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.5, 0.9); + elm_table_pack(tb2, bt, 0, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_button_label_set(bt, "How"); + evas_object_smart_callback_add(bt, "clicked", my_show_it, it2); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.5, 0.9); + elm_table_pack(tb2, bt, 1, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_button_label_set(bt, "doing"); + evas_object_smart_callback_add(bt, "clicked", my_show_it, it3); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.5, 0.9); + elm_table_pack(tb2, bt, 2, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_button_label_set(bt, "And"); + evas_object_smart_callback_add(bt, "clicked", my_show_it, it4); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.5, 0.9); + elm_table_pack(tb2, bt, 3, 0, 1, 1); + evas_object_show(bt); + + evas_object_show(tb2); + + evas_object_resize(win, 320, 300); + evas_object_show(win); +} + /***********/ static void @@ -190,7 +317,7 @@ test_list2(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info li = elm_list_add(win); evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_list_horizontal_mode_set(li, ELM_LIST_LIMIT); + elm_list_mode_set(li, ELM_LIST_LIMIT); // elm_list_multi_select_set(li, 1); ic = elm_icon_add(win); @@ -307,7 +434,7 @@ test_list3(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info li = elm_list_add(win); elm_win_resize_object_add(win, li); evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_list_horizontal_mode_set(li, ELM_LIST_COMPRESS); + elm_list_mode_set(li, ELM_LIST_COMPRESS); ic = elm_icon_add(win); snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR); @@ -469,7 +596,7 @@ test_list4(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info li = elm_list_add(win); evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_list_horizontal_mode_set(li, ELM_LIST_COMPRESS); + elm_list_mode_set(li, ELM_LIST_COMPRESS); evas_object_smart_callback_add(li, "swipe", test_list4_swipe, &info); elm_pager_content_push(pager, li); @@ -585,7 +712,7 @@ test_list5(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info li = elm_list_add(win); evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_list_horizontal_mode_set(li, ELM_LIST_COMPRESS); + elm_list_mode_set(li, ELM_LIST_COMPRESS); evas_object_smart_callback_add(li, "swipe", test_list5_swipe, NULL); elm_win_resize_object_add(win, li); evas_object_show(li); diff --git a/legacy/elementary/src/edje_externals/elm_list.c b/legacy/elementary/src/edje_externals/elm_list.c index f1306c1470..1d5e7a5961 100644 --- a/legacy/elementary/src/edje_externals/elm_list.c +++ b/legacy/elementary/src/edje_externals/elm_list.c @@ -6,7 +6,7 @@ typedef struct _Elm_Params_List { const char *policy_h; const char *policy_v; - const char *horizontal_mode; + const char *mode; Eina_Bool multi : 1; Eina_Bool multi_exists : 1; Eina_Bool always_select : 1; @@ -20,8 +20,7 @@ typedef struct _Elm_Params_List return i static const char *scroller_policy_choices[] = {"auto", "on", "off", NULL}; -static const char *list_horizontal_mode_choices[] = {"compress", "scroll", - "limit", NULL}; +static const char *list_mode_choices[] = {"compress", "scroll", "limit", NULL}; static Elm_Scroller_Policy _scroller_policy_choices_setting_get(const char *policy_str) @@ -33,11 +32,11 @@ _scroller_policy_choices_setting_get(const char *policy_str) } static Elm_List_Mode -_list_horizontal_mode_setting_get(const char *horizontal_mode_str) +_list_mode_setting_get(const char *mode_str) { - assert(sizeof(list_horizontal_mode_choices)/ - sizeof(list_horizontal_mode_choices[0]) == ELM_LIST_LAST + 1); - CHOICE_GET(list_horizontal_mode_choices, horizontal_mode_str); + assert(sizeof(list_mode_choices)/sizeof(list_mode_choices[0]) == + ELM_LIST_LAST + 1); + CHOICE_GET(list_mode_choices, mode_str); return ELM_LIST_LAST; } @@ -52,13 +51,12 @@ external_list_state_set(void *data __UNUSED__, Evas_Object *obj, const void *fro else if (from_params) p = from_params; else return; - if (p->horizontal_mode) + if (p->mode) { - Elm_List_Mode set = _list_horizontal_mode_setting_get( - p->horizontal_mode); + Elm_List_Mode set = _list_mode_setting_get(p->mode); if (set != ELM_LIST_LAST) - elm_list_horizontal_mode_set(obj, set); + elm_list_mode_set(obj, set); } if ((p->policy_h) && (p->policy_v)) @@ -95,9 +93,9 @@ external_list_param_set(void *data __UNUSED__, Evas_Object *obj, const Edje_Exte { if (param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE) { - Elm_List_Mode set = _list_horizontal_mode_setting_get(param->s); + Elm_List_Mode set = _list_mode_setting_get(param->s); if (set == ELM_LIST_LAST) return EINA_FALSE; - elm_list_horizontal_mode_set(obj, set); + elm_list_mode_set(obj, set); return EINA_TRUE; } } @@ -189,16 +187,16 @@ external_list_param_get(void *data __UNUSED__, const Evas_Object *obj, Edje_Exte return EINA_TRUE; } } - else if (!strcmp(param->name, "horizontal mode")) + else if (!strcmp(param->name, "list mode")) { if (param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE) { - Elm_List_Mode m = elm_list_horizontal_mode_get(obj); + Elm_List_Mode m = elm_list_mode_get(obj); if (m == ELM_LIST_LAST) return EINA_FALSE; - param->s = list_horizontal_mode_choices[m]; + param->s = list_mode_choices[m]; return EINA_TRUE; } } @@ -236,8 +234,8 @@ external_list_params_parse(void *data __UNUSED__, Evas_Object *obj __UNUSED__, c mem->policy_h = eina_stringshare_add(param->s); else if (!strcmp(param->name, "scroll vertical")) mem->policy_v = eina_stringshare_add(param->s); - else if (!strcmp(param->name, "horizontal mode")) - mem->horizontal_mode = eina_stringshare_add(param->s); + else if (!strcmp(param->name, "list mode")) + mem->mode = eina_stringshare_add(param->s); } return mem; } @@ -254,8 +252,8 @@ external_list_params_free(void *params) { Elm_Params_List *mem = params; - if (mem->horizontal_mode) - eina_stringshare_del(mem->horizontal_mode); + if (mem->mode) + eina_stringshare_del(mem->mode); if (mem->policy_h) eina_stringshare_del(mem->policy_h); if (mem->policy_v) @@ -265,8 +263,8 @@ external_list_params_free(void *params) } static Edje_External_Param_Info external_list_params[] = { - EDJE_EXTERNAL_PARAM_INFO_CHOICE_FULL("horizontal mode", "scroll", - list_horizontal_mode_choices), + EDJE_EXTERNAL_PARAM_INFO_CHOICE_FULL("list mode", "scroll", + list_mode_choices), EDJE_EXTERNAL_PARAM_INFO_CHOICE_FULL("scroll horizontal", "auto", scroller_policy_choices), EDJE_EXTERNAL_PARAM_INFO_CHOICE_FULL("scroll vertical", "auto", diff --git a/legacy/elementary/src/lib/Elementary.h.in b/legacy/elementary/src/lib/Elementary.h.in index 722fc3da2d..4dcce59035 100644 --- a/legacy/elementary/src/lib/Elementary.h.in +++ b/legacy/elementary/src/lib/Elementary.h.in @@ -1252,6 +1252,7 @@ extern "C" { ELM_LIST_COMPRESS = 0, ELM_LIST_SCROLL, ELM_LIST_LIMIT, + ELM_LIST_EXPAND, ELM_LIST_LAST } Elm_List_Mode; typedef struct _Elm_List_Item Elm_List_Item; /**< Item of Elm_List. Sub-type of Elm_Widget_Item */ @@ -1264,9 +1265,11 @@ extern "C" { EAPI void elm_list_clear(Evas_Object *obj); EAPI void elm_list_go(Evas_Object *obj); EAPI void elm_list_multi_select_set(Evas_Object *obj, Eina_Bool multi); - EAPI Eina_Bool elm_list_multi_select_get(const Evas_Object *obj); - EAPI void elm_list_horizontal_mode_set(Evas_Object *obj, Elm_List_Mode mode); - EAPI Elm_List_Mode elm_list_horizontal_mode_get(const Evas_Object *obj); + EAPI Eina_Bool elm_list_multi_select_get(const Evas_Object *obj); + EAPI void elm_list_mode_set(Evas_Object *obj, Elm_List_Mode mode); + EAPI Elm_List_Mode elm_list_mode_get(const Evas_Object *obj); + EAPI void elm_list_horizontal_set(Evas_Object *obj, Eina_Bool horizontal); + EAPI Eina_Bool elm_list_horizontal_get(Evas_Object *obj); EAPI void elm_list_always_select_mode_set(Evas_Object *obj, Eina_Bool always_select); EAPI Eina_Bool elm_list_always_select_mode_get(const Evas_Object *obj); EAPI const Eina_List *elm_list_items_get(const Evas_Object *obj); diff --git a/legacy/elementary/src/lib/elm_list.c b/legacy/elementary/src/lib/elm_list.c index f6478e7b1a..bbb23437ee 100644 --- a/legacy/elementary/src/lib/elm_list.c +++ b/legacy/elementary/src/lib/elm_list.c @@ -18,6 +18,7 @@ struct _Widget_Data Eina_List *items, *selected, *to_delete; Elm_List_Item *last_selected_item; Elm_List_Mode mode; + Elm_List_Mode h_mode; Evas_Coord minw[2], minh[2]; Eina_Bool scr_minw : 1; Eina_Bool scr_minh : 1; @@ -75,18 +76,16 @@ static Eina_Bool _item_single_select_down(Widget_Data *wd); static Eina_Bool _event_hook(Evas_Object *obj, Evas_Object *src, Evas_Callback_Type type, void *event_info); -#define ELM_LIST_ITEM_CHECK_DELETED_RETURN(it, ...) \ - if (!it) \ - { \ - fprintf(stderr, "ERROR: %s:%d:%s() "#it" is NULL.\n", \ - __FILE__, __LINE__, __FUNCTION__); \ - return __VA_ARGS__; \ - } \ - else if (it->deleted) \ - { \ - fprintf(stderr, "ERROR: %s:%d:%s() "#it" has been DELETED.\n",\ - __FILE__, __LINE__, __FUNCTION__); \ - return __VA_ARGS__; \ +#define ELM_LIST_ITEM_CHECK_DELETED_RETURN(it, ...) \ + if (!it) \ + { \ + ERR("ERROR: "#it" is NULL.\n"); \ + return __VA_ARGS__; \ + } \ + else if (it->deleted) \ + { \ + ERR("ERROR: "#it" has been DELETED.\n"); \ + return __VA_ARGS__; \ } static inline void @@ -144,6 +143,7 @@ _event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type ty elm_smart_scroller_page_size_get(wd->scr, &page_x, &page_y); elm_smart_scroller_child_viewport_size_get(wd->scr, &v_w, &v_h); + /* TODO: fix logic for horizontal mode */ if (!strcmp(ev->keyname, "Left") || !strcmp(ev->keyname, "KP_Left")) { x -= step_x; @@ -312,8 +312,8 @@ _elm_list_walk(Widget_Data *wd) { if (wd->walking < 0) { - fprintf(stderr, "ERROR: walking was negative. fixed!\n"); - wd->walking = 0; + ERR("ERROR: walking was negative. fixed!\n"); + wd->walking = 0; } wd->walking++; } @@ -324,8 +324,8 @@ _elm_list_unwalk(Widget_Data *wd) wd->walking--; if (wd->walking < 0) { - fprintf(stderr, "ERROR: walking became negative. fixed!\n"); - wd->walking = 0; + ERR("ERROR: walking became negative. fixed!\n"); + wd->walking = 0; } if (wd->walking) @@ -351,12 +351,13 @@ _del_hook(Evas_Object *obj) if (!wd) return; if (wd->walking != 0) - fprintf(stderr, "ERROR: list deleted while walking.\n"); + ERR("ERROR: list deleted while walking.\n"); _elm_list_walk(wd); EINA_LIST_FOREACH(wd->items, n, it) elm_widget_item_pre_notify_del(it); _elm_list_unwalk(wd); - if (wd->to_delete) fprintf(stderr, "ERROR: leaking nodes!\n"); + if (wd->to_delete) + ERR("ERROR: leaking nodes!\n"); EINA_LIST_FREE(wd->items, it) _elm_list_item_free(it); eina_list_free(wd->selected); @@ -405,6 +406,13 @@ _sizing_eval(Evas_Object *obj) &vmw, &vmh); if (wd->scr_minw) w = vmw + minw; if (wd->scr_minh) h = vmh + minh; + + evas_object_size_hint_max_get(obj, &maxw, &maxh); + if (maxw > 0 && w > maxw) + w = maxw; + if (maxh > 0 && h > maxh) + h = maxh; + evas_object_size_hint_min_set(obj, w, h); } @@ -820,6 +828,39 @@ _item_new(Evas_Object *obj, const char *label, Evas_Object *icon, Evas_Object *e return it; } +static void +_elm_list_mode_set_internal(Widget_Data *wd) +{ + if (!wd->scr) + return; + + if (wd->mode == ELM_LIST_LIMIT) + { + if (!wd->h_mode) + { + wd->scr_minw = EINA_TRUE; + wd->scr_minh = EINA_FALSE; + } + else + { + wd->scr_minw = EINA_FALSE; + wd->scr_minh = EINA_TRUE; + } + } + else if (wd->mode == ELM_LIST_EXPAND) + { + wd->scr_minw = EINA_TRUE; + wd->scr_minh = EINA_TRUE; + } + else + { + wd->scr_minw = EINA_FALSE; + wd->scr_minh = EINA_FALSE; + } + + _sizing_eval(wd->self); +} + static void _fix_items(Evas_Object *obj) { @@ -830,6 +871,10 @@ _fix_items(Evas_Object *obj) Evas_Coord mw, mh; int i, redo = 0; const char *style = elm_widget_style_get(obj); + const char *it_plain = wd->h_mode ? "h_item" : "item"; + const char *it_odd = wd->h_mode ? "h_item_odd" : "item_odd"; + const char *it_compress = wd->h_mode ? "h_item_compress" : "item_compress"; + const char *it_compress_odd = wd->h_mode ? "h_item_compress_odd" : "item_compress_odd"; if (!wd) return; if (wd->walking) @@ -856,6 +901,7 @@ _fix_items(Evas_Object *obj) if (mh > minh[1]) minh[1] = mh; } } + if ((minw[0] != wd->minw[0]) || (minw[1] != wd->minw[1]) || (minw[0] != wd->minh[0]) || (minh[1] != wd->minh[1])) { @@ -868,115 +914,113 @@ _fix_items(Evas_Object *obj) i = 0; EINA_LIST_FOREACH(wd->items, l, it) { - if (it->deleted) continue; - it->even = i & 0x1; - if ((it->even != it->is_even) || (!it->fixed) || (redo)) - { - const char *stacking; + if (it->deleted) + continue; - if (it->is_separator) - _elm_theme_object_set(obj, it->base.view, "list", "separator", style); - else if (wd->mode == ELM_LIST_COMPRESS) - { - if (it->even) - _elm_theme_object_set(obj, it->base.view, "list", "item_compress", style); - else - _elm_theme_object_set(obj, it->base.view, "list", "item_compress_odd", style); - } - else - { - if (it->even) - _elm_theme_object_set(obj, it->base.view, "list", "item", style); - else - _elm_theme_object_set(obj, it->base.view, "list", "item_odd", style); - } - stacking = edje_object_data_get(it->base.view, "stacking"); - if (stacking) - { - if (!strcmp(stacking, "below")) - evas_object_lower(it->base.view); - else if (!strcmp(stacking, "above")) - evas_object_raise(it->base.view); - } - edje_object_part_text_set(it->base.view, "elm.text", it->label); - if ((!it->icon) && (minh[0] > 0)) - { - it->icon = evas_object_rectangle_add(evas_object_evas_get(it->base.view)); - evas_object_color_set(it->icon, 0, 0, 0, 0); - it->dummy_icon = EINA_TRUE; - } - if ((!it->end) && (minh[1] > 0)) - { - it->end = evas_object_rectangle_add(evas_object_evas_get(it->base.view)); - evas_object_color_set(it->end, 0, 0, 0, 0); - it->dummy_end = EINA_TRUE; - } - if (it->icon) - { - evas_object_size_hint_min_set(it->icon, minw[0], minh[0]); - evas_object_size_hint_max_set(it->icon, 99999, 99999); - edje_object_part_swallow(it->base.view, "elm.swallow.icon", it->icon); - } - if (it->end) - { - evas_object_size_hint_min_set(it->end, minw[1], minh[1]); - evas_object_size_hint_max_set(it->end, 99999, 99999); - edje_object_part_swallow(it->base.view, "elm.swallow.end", it->end); - } - if (!it->fixed) - { - // this may call up user and it may modify the list item - // but we're safe as we're flagged as walking. - // just don't process further - edje_object_message_signal_process(it->base.view); - if (it->deleted) - continue; - mw = mh = -1; - elm_coords_finger_size_adjust(1, &mw, 1, &mh); - edje_object_size_min_restricted_calc(it->base.view, &mw, &mh, mw, mh); - elm_coords_finger_size_adjust(1, &mw, 1, &mh); - evas_object_size_hint_min_set(it->base.view, mw, mh); - evas_object_show(it->base.view); - } - if ((it->selected) || (it->hilighted)) - { - const char *selectraise; + it->even = i & 0x1; + if ((it->even != it->is_even) || (!it->fixed) || (redo)) + { + const char *stacking; - // this may call up user and it may modify the list item - // but we're safe as we're flagged as walking. - // just don't process further - edje_object_signal_emit(it->base.view, "elm,state,selected", "elm"); - if (it->deleted) - continue; + /* FIXME: separators' themes seem to be b0rked */ + if (it->is_separator) + _elm_theme_object_set(obj, it->base.view, "separator", + wd->h_mode ? "horizontal" : "vertical", + style); + else if (wd->mode == ELM_LIST_COMPRESS) + { + if (it->even) + _elm_theme_object_set(obj, it->base.view, "list", + it_compress, style); + else + _elm_theme_object_set(obj, it->base.view, "list", + it_compress_odd, style); + } + else + { + if (it->even) + _elm_theme_object_set(obj, it->base.view, "list", it_plain, + style); + else + _elm_theme_object_set(obj, it->base.view, "list", it_odd, + style); + } + stacking = edje_object_data_get(it->base.view, "stacking"); + if (stacking) + { + if (!strcmp(stacking, "below")) + evas_object_lower(it->base.view); + else if (!strcmp(stacking, "above")) + evas_object_raise(it->base.view); + } + edje_object_part_text_set(it->base.view, "elm.text", it->label); - selectraise = edje_object_data_get(it->base.view, "selectraise"); - if ((selectraise) && (!strcmp(selectraise, "on"))) - evas_object_raise(it->base.view); - } - it->fixed = EINA_TRUE; - it->is_even = it->even; - } - i++; + if ((!it->icon) && (minh[0] > 0)) + { + it->icon = evas_object_rectangle_add(evas_object_evas_get(it->base.view)); + evas_object_color_set(it->icon, 0, 0, 0, 0); + it->dummy_icon = EINA_TRUE; + } + if ((!it->end) && (minh[1] > 0)) + { + it->end = evas_object_rectangle_add(evas_object_evas_get(it->base.view)); + evas_object_color_set(it->end, 0, 0, 0, 0); + it->dummy_end = EINA_TRUE; + } + if (it->icon) + { + evas_object_size_hint_min_set(it->icon, minw[0], minh[0]); + evas_object_size_hint_max_set(it->icon, 99999, 99999); + edje_object_part_swallow(it->base.view, "elm.swallow.icon", it->icon); + } + if (it->end) + { + evas_object_size_hint_min_set(it->end, minw[1], minh[1]); + evas_object_size_hint_max_set(it->end, 99999, 99999); + edje_object_part_swallow(it->base.view, "elm.swallow.end", it->end); + } + if (!it->fixed) + { + // this may call up user and it may modify the list item + // but we're safe as we're flagged as walking. + // just don't process further + edje_object_message_signal_process(it->base.view); + if (it->deleted) + continue; + mw = mh = -1; + elm_coords_finger_size_adjust(1, &mw, 1, &mh); + edje_object_size_min_restricted_calc(it->base.view, &mw, &mh, mw, mh); + elm_coords_finger_size_adjust(1, &mw, 1, &mh); + evas_object_size_hint_min_set(it->base.view, mw, mh); + evas_object_show(it->base.view); + } + if ((it->selected) || (it->hilighted)) + { + const char *selectraise; + + // this may call up user and it may modify the list item + // but we're safe as we're flagged as walking. + // just don't process further + edje_object_signal_emit(it->base.view, "elm,state,selected", "elm"); + if (it->deleted) + continue; + + selectraise = edje_object_data_get(it->base.view, "selectraise"); + if ((selectraise) && (!strcmp(selectraise, "on"))) + evas_object_raise(it->base.view); + } + it->fixed = EINA_TRUE; + it->is_even = it->even; + } + i++; } _elm_list_unwalk(wd); mw = 0; mh = 0; evas_object_size_hint_min_get(wd->box, &mw, &mh); - if (wd->scr) - { - if (wd->mode == ELM_LIST_LIMIT) - { - wd->scr_minw = 1; - wd->scr_minh = 0; - } - else - { - wd->scr_minw = 0; - wd->scr_minh = 0; - } - } - _sizing_eval(obj); + + _elm_list_mode_set_internal(wd); } static void @@ -1349,54 +1393,141 @@ elm_list_multi_select_get(const Evas_Object *obj) } /** - * Enables/disables horizontal mode of the list + * Set which mode to use for the list with. * * @param obj The list object - * @param mode If true, horizontale mode is enabled + * @param mode One of @c ELM_LIST_COMPRESS, @c ELM_LIST_SCROLL or @c + * ELM_LIST_LIMIT. + * + * @note Default value is @c ELM_LIST_SCROLL. At this mode, the list + * object won't set any of its size hints to inform how a possible + * container should resize it. Then, if it's not created as a "resize + * object", it might end with zero dimensions. The list will respect + * the container's geometry and, if any of its items won't fit into + * its transverse axis, one will be able to scroll it in that + * direction. @c ELM_LIST_COMPRESS is the same as the previous, except + * that it won't let one scroll in the transverse axis, on + * those cases (large items will get cropped). @c ELM_LIST_LIMIT will + * actually set a minimun size hint on the list object, so that + * containers may respect it (and resize itself to fit the child + * properly). More specifically, a minimum size hint will be set for + * its transverse axis, so that the largest item in that + * direction fits well. @c ELM_LIST_EXPAND, besides setting a minimum + * size on the transverse axis, just like the previous mode, will set + * a minimum size on the longitudinal axis too, trying to reserve + * space to all its children to be visible at a time. The last two + * modes can always have effects bounded by setting the list object's + * maximum size hints, though. * * @ingroup List */ EAPI void -elm_list_horizontal_mode_set(Evas_Object *obj, Elm_List_Mode mode) +elm_list_mode_set(Evas_Object *obj, Elm_List_Mode mode) { ELM_CHECK_WIDTYPE(obj, widtype); - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return; - if (wd->mode == mode) return; + + Widget_Data *wd; + + wd = elm_widget_data_get(obj); + if (!wd) + return; + if (wd->mode == mode) + return; wd->mode = mode; - if (wd->scr) - { - if (wd->mode == ELM_LIST_LIMIT) - { - wd->scr_minw = 1; - wd->scr_minh = 0; - } - else - { - wd->scr_minw = 0; - wd->scr_minh = 0; - } - _sizing_eval(obj); - } + + _elm_list_mode_set_internal(wd); } /** - * Gets the state of horizontal mode of the list + * Get the mode the list is at. * * @param obj The list object - * @return If true, horizontale mode is enabled + * @return mode One of @c ELM_LIST_COMPRESS, @c ELM_LIST_SCROLL or @c + * ELM_LIST_LIMIT (@c ELM_LIST_LAST on errors). + * + * @note see elm_list_mode_set() for more information. * * @ingroup List */ EAPI Elm_List_Mode -elm_list_horizontal_mode_get(const Evas_Object *obj) +elm_list_mode_get(const Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) ELM_LIST_SCROLL; + ELM_CHECK_WIDTYPE(obj, widtype) ELM_LIST_LAST; Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return ELM_LIST_SCROLL; + if (!wd) return ELM_LIST_LAST; return wd->mode; } +/** + * Enables/disables horizontal mode of the list. + * + * @param obj The list object + * @param mode If true, horizontale mode is enabled + * + * @note Bounce options for the list will be reset to default values + * with this funcion. Re-call elm_list_bounce_set() once more after + * this one, if you had custom values. + * + * @ingroup List + */ +EAPI void +elm_list_horizontal_set(Evas_Object *obj, Eina_Bool horizontal) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + + Widget_Data *wd; + + wd = elm_widget_data_get(obj); + if (!wd) + return; + + if (wd->h_mode == horizontal) + return; + + wd->h_mode = horizontal; + elm_box_horizontal_set(wd->box, horizontal); + + if (horizontal) + { + evas_object_size_hint_weight_set(wd->box, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(wd->box, 0.0, EVAS_HINT_FILL); + elm_smart_scroller_bounce_allow_set(wd->scr, EINA_TRUE, EINA_FALSE); + } + else + { + evas_object_size_hint_weight_set(wd->box, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(wd->box, EVAS_HINT_FILL, 0.0); + elm_smart_scroller_bounce_allow_set(wd->scr, EINA_FALSE, EINA_TRUE); + } + + _elm_list_mode_set_internal(wd); +} + +/** + * Retrieve whether horizontal mode is enabled for a list. + * + * @param obj The list object + * @return @c EINA_TRUE, if horizontal mode is enabled and @c + * EINA_FALSE, otherwise. + * + * @note see elm_list_horizontal_set() for more information. + * + * @ingroup List + */ +EAPI Eina_Bool +elm_list_horizontal_get(Evas_Object *obj) +{ + ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; + + Widget_Data *wd; + + wd = elm_widget_data_get(obj); + if (!wd) + return EINA_FALSE; + + return wd->h_mode; +} + /** * Enables/disables the state of always_select, meaning that * an item will always be selected.