New list layout: horizontal.
authorGustavo Lima Chaves <glima@profusion.mobi>
Tue, 19 Oct 2010 20:19:12 +0000 (20:19 +0000)
committerGustavo Lima Chaves <glima@profusion.mobi>
Tue, 19 Oct 2010 20:19:12 +0000 (20:19 +0000)
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

data/themes/default.edc
data/themes/ilist_1_h.png [new file with mode: 0644]
data/themes/ilist_2_h.png [new file with mode: 0644]
data/themes/ilist_item_shadow_h.png [new file with mode: 0644]
src/bin/test.c
src/bin/test_list.c
src/edje_externals/elm_list.c
src/lib/Elementary.h.in
src/lib/elm_list.c

index fe4108bd8733e498fcf29597b6626349d0549167..a73b401af412d1c1e413b9c761abf1f041d07dba 100644 (file)
@@ -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/data/themes/ilist_1_h.png b/data/themes/ilist_1_h.png
new file mode 100644 (file)
index 0000000..bd2fd15
Binary files /dev/null and b/data/themes/ilist_1_h.png differ
diff --git a/data/themes/ilist_2_h.png b/data/themes/ilist_2_h.png
new file mode 100644 (file)
index 0000000..6ab252e
Binary files /dev/null and b/data/themes/ilist_2_h.png differ
diff --git a/data/themes/ilist_item_shadow_h.png b/data/themes/ilist_item_shadow_h.png
new file mode 100644 (file)
index 0000000..fb21bc5
Binary files /dev/null and b/data/themes/ilist_item_shadow_h.png differ
index e749fbf0398d970d1860002dfbadc8d1e8567401..b97aa537038305e9a19624bf3f868bce9044398d 100644 (file)
@@ -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);
index 3324ef3d74f83719323fc4ac2dc20845485ea81d..ca06f69426d052cb9c234e7d556d6668ce84658d 100644 (file)
@@ -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);
index f1306c14702288af07173e0edac5aa2d28d1382b..1d5e7a5961fda56ac87a8fe9d88463039eb0bb1b 100644 (file)
@@ -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",
index 722fc3da2daa032cf0f70ad73e3e3c01b2128293..4dcce59035e6b3f17f1d32afec502c5a818e18ae 100644 (file)
@@ -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);
index f6478e7b1a4f9a78379f38da4483ff8faedba107..bbb23437ee18aaa1dbb2f3024347ac4cb183e30f 100644 (file)
@@ -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->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;
-
-                  // 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++;
+       if (it->deleted)
+          continue;
+
+       it->even = i & 0x1;
+       if ((it->even != it->is_even) || (!it->fixed) || (redo))
+         {
+            const char *stacking;
+
+             /* 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);
+
+            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 <b>won't</b> 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 <b>largest</b> 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.