}
}
+///////////////////////////////////////////////////////////////////////////////
+ group { name: "elm/list/item/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.png" COMP;
+ image: "ilist_item_shadow.png" COMP;
+ }
+ parts {
+ part {
+ name: "base_sh";
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+// aspect: 6.4 6.4;
+// aspect_preference: HORIZONTAL;
+ align: 0.0 0.0;
+ min: 0 10;
+ rel1 {
+ to: "base";
+ relative: 0.0 1.0;
+ offset: 0 0;
+ }
+ rel2 {
+ to: "base";
+ relative: 1.0 1.0;
+ offset: -1 0;
+ }
+ image {
+ normal: "ilist_item_shadow.png";
+ }
+ fill.smooth: 0;
+ }
+ }
+ part {
+ name: "base";
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ image {
+ normal: "ilist_1.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;
+ }
+ }
+ 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;
+ align: 0.0 0.5;
+ aspect: 1.0 1.0;
+ aspect_preference: VERTICAL;
+ rel1 {
+ relative: 0.0 0.0;
+ offset: 4 4;
+ }
+ rel2 {
+ relative: 0.0 1.0;
+ offset: 4 -5;
+ }
+ }
+ }
+ part {
+ name: "elm.text";
+ type: TEXT;
+ effect: SOFT_SHADOW;
+ mouse_events: 0;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ min: 16 16;
+ rel1 {
+ to_x: "elm.swallow.icon";
+ relative: 1.0 0.0;
+ offset: 4 4;
+ }
+ rel2 {
+ relative: 1.0 1.0;
+ offset: -5 -5;
+ }
+ color: 0 0 0 255;
+ color3: 0 0 0 0;
+ text {
+ font: "Sans";
+ size: 10;
+ min: 1 1;
+// min: 0 1;
+ align: 0.0 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;
+ }
+ }
+ part {
+ name: "event";
+ type: RECT;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 0;
+ }
+ }
+ }
+ 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/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.png" COMP;
+ }
+ parts {
+ part {
+ name: "base";
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ image {
+ normal: "ilist_2.png";
+ border: 2 2 2 2;
+ }
+ }
+ }
+ 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;
+ }
+ fill.smooth: 0;
+ }
+ 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;
+ align: 0.0 0.5;
+ aspect: 1.0 1.0;
+ aspect_preference: VERTICAL;
+ rel1 {
+ relative: 0.0 0.0;
+ offset: 4 4;
+ }
+ rel2 {
+ relative: 0.0 1.0;
+ offset: 4 -5;
+ }
+ }
+ }
+ part {
+ name: "elm.text";
+ type: TEXT;
+ effect: SOFT_SHADOW;
+ mouse_events: 0;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ min: 16 16;
+ rel1 {
+ to_x: "elm.swallow.icon";
+ relative: 1.0 0.0;
+ offset: 4 4;
+ }
+ rel2 {
+ relative: 1.0 1.0;
+ offset: -5 -5;
+ }
+ color: 0 0 0 255;
+ color3: 0 0 0 0;
+ text {
+ font: "Sans";
+ size: 10;
+ min: 1 1;
+// min: 0 1;
+ align: 0.0 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;
+ }
+ }
+ part {
+ name: "event";
+ type: RECT;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 0;
+ }
+ }
+ }
+ 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;
+ }
+ }
+ }
}
}
static void
+my_bt_20(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *win, *bg, *li;
+ char buf[PATH_MAX];
+
+ win = elm_win_add(NULL, "list", ELM_WIN_BASIC);
+ elm_win_title_set(win, "List");
+ elm_win_autodel_set(win, 1);
+
+ bg = elm_bg_add(win);
+ elm_win_resize_object_add(win, bg);
+ evas_object_size_hint_weight_set(bg, 1.0, 1.0);
+ evas_object_show(bg);
+
+ li = elm_list_add(win);
+ elm_win_resize_object_add(win, li);
+ evas_object_size_hint_weight_set(li, 1.0, 1.0);
+
+ elm_list_item_append(li, "Hello", NULL, NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "World", NULL, NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "How", NULL, NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "Are", NULL, NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "You", NULL, NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "Doing", NULL, NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "Out", NULL, NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "There", NULL, NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "?", NULL, NULL, NULL, NULL, NULL);
+ elm_list_item_append(li, "Is this label long enough?", NULL, NULL, NULL, NULL, NULL);
+
+ evas_object_show(li);
+
+ evas_object_resize(win, 320, 300);
+ evas_object_show(win);
+}
+
+static void
my_win_main(void)
{
Evas_Object *win, *bg, *bx0, *lb, *bx, *bt, *sc, *fr;
elm_box_pack_end(bx, bt);
evas_object_show(bt);
+ bt = elm_button_add(win);
+ elm_button_label_set(bt, "List");
+ evas_object_smart_callback_add(bt, "clicked", my_bt_20, NULL);
+ evas_object_size_hint_align_set(bt, -1.0, 0.0);
+ elm_box_pack_end(bx, bt);
+ evas_object_show(bt);
+
/* set an initial window size */
evas_object_resize(win, 320, 520);
/* show the window */
--- /dev/null
+#include <Elementary.h>
+#include "elm_priv.h"
+
+typedef struct _Widget_Data Widget_Data;
+typedef struct _Item Item;
+
+struct _Widget_Data
+{
+ Evas_Object *scroller, *box;
+ Eina_List *items;
+ Eina_List *selected;
+ Elementary_List_Mode mode;
+ Evas_Bool on_hold : 1;
+};
+
+struct _Item
+{
+ Evas_Object *obj;
+ Evas_Object *base;
+ const char *label;
+ Evas_Object *icon, *indicator, *end;
+ void (*func) (void *data, Evas_Object *obj, void *event_info);
+ const void *data;
+ Evas_Bool even : 1;
+ Evas_Bool is_even : 1;
+ Evas_Bool fixed : 1;
+ Evas_Bool selected : 1;
+};
+
+static void _del_hook(Evas_Object *obj);
+static void _sizing_eval(Evas_Object *obj);
+static void _on_focus_hook(void *data, Evas_Object *obj);
+
+static void
+_del_hook(Evas_Object *obj)
+{
+ Widget_Data *wd = elm_widget_data_get(obj);
+ free(wd);
+}
+
+static void
+_sizing_eval(Evas_Object *obj)
+{
+ Widget_Data *wd = elm_widget_data_get(obj);
+ Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
+
+ evas_object_size_hint_min_set(obj, minw, minh);
+ evas_object_size_hint_max_set(obj, maxw, maxh);
+}
+
+static void
+_on_focus_hook(void *data, Evas_Object *obj)
+{
+ Widget_Data *wd = elm_widget_data_get(obj);
+// if (elm_widget_focus_get(obj))
+// elm_widget_focus_steal(wd->entry);
+}
+
+static void
+_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_info)
+{
+ Item *it = data;
+ Widget_Data *wd = elm_widget_data_get(it->obj);
+ Evas_Event_Mouse_Down *ev = event_info;
+ if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) wd->on_hold = 1;
+ else wd->on_hold = 0;
+ if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
+ evas_object_smart_callback_call(it->obj, "clicked", it);
+}
+
+static void
+_item_select(Item *it)
+{
+ const char *selectraise;
+ if (it->selected) return;
+ edje_object_signal_emit(it->base, "elm,state,selected", "elm");
+ selectraise = edje_object_data_get(it->base, "selectraise");
+ if ((selectraise) && (!strcmp(selectraise, "on")))
+ evas_object_raise(it->base);
+ it->selected = 1;
+ if (it->func) it->func(it->data, it->obj, it);
+}
+
+static void
+_item_unselect(Item *it)
+{
+ const char *stacking, *selectraise;
+ if (!it->selected) return;
+ edje_object_signal_emit(it->base, "elm,state,unselected", "elm");
+ stacking = edje_object_data_get(it->base, "stacking");
+ selectraise = edje_object_data_get(it->base, "selectraise");
+ if ((selectraise) && (!strcmp(selectraise, "on")))
+ {
+ if ((stacking) && (!strcmp(stacking, "below")))
+ evas_object_lower(it->base);
+ }
+ it->selected = 0;
+}
+
+static void
+_mouse_up(void *data, Evas *evas, Evas_Object *obj, void *event_info)
+{
+ Item *it = data;
+ Widget_Data *wd = elm_widget_data_get(it->obj);
+ Evas_Event_Mouse_Up *ev = event_info;
+ Eina_List *l;
+ if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) wd->on_hold = 1;
+ else wd->on_hold = 0;
+ if (wd->on_hold)
+ {
+ wd->on_hold = 0;
+ return;
+ }
+ for (l = wd->items; l; l = l->next)
+ {
+ Item *it2 = l->data;
+ if ((it2 != it) && (it2->selected)) _item_unselect(it2);
+ }
+ if (!it->selected) _item_select(it);
+}
+
+static Item *
+_item_new(Evas_Object *obj, const char *label, Evas_Object *icon, Evas_Object *indicator, Evas_Object *end, void (*func) (void *data, Evas_Object *obj, void *event_info), const void *data)
+{
+ Widget_Data *wd = elm_widget_data_get(obj);
+ Item *it;
+
+ it = calloc(1, sizeof(Item));
+ it->obj = obj;
+ it->label = eina_stringshare_add(label);
+ it->icon = icon;
+ it->indicator = indicator;
+ it->end = end;
+ it->func = func;
+ it->data = data;
+ it->base = edje_object_add(evas_object_evas_get(obj));
+ evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_DOWN,
+ _mouse_down, it);
+ evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_UP,
+ _mouse_up, it);
+ evas_object_size_hint_weight_set(it->base, 1.0, 1.0);
+ evas_object_size_hint_align_set(it->base, -1.0, -1.0);
+ return it;
+}
+
+static void
+_fix_items(Evas_Object *obj)
+{
+ Widget_Data *wd = elm_widget_data_get(obj);
+ Eina_List *l;
+ int i;
+
+ for (i = 0, l = wd->items; l; l = l->next, i++)
+ {
+ Item *it = l->data;
+ it->even = i & 0x1;
+ if ((it->even != it->is_even) || (!it->fixed))
+ {
+ const char *stacking;
+ if (it->even)
+ _elm_theme_set(it->base, "list", "item", "default");
+ else
+ _elm_theme_set(it->base, "list", "item_odd", "default");
+ stacking = edje_object_data_get(it->base, "stacking");
+ if (stacking)
+ {
+ if (!strcmp(stacking, "below"))
+ evas_object_lower(it->base);
+ else if (!strcmp(stacking, "above"))
+ evas_object_raise(it->base);
+ }
+ edje_object_part_text_set(it->base, "elm.text", it->label);
+ if (!it->fixed)
+ {
+ Evas_Coord minw, minh;
+
+ edje_object_message_signal_process(it->base);
+ edje_object_size_min_calc(it->base, &minw, &minh);
+ if (wd->mode == ELM_LIST_COMPRESS) minw = 0;
+ evas_object_size_hint_min_set(it->base, minw, minh);
+ evas_object_show(it->base);
+ }
+ it->fixed = 1;
+ it->is_even = it->even;
+ }
+ }
+ _sizing_eval(obj);
+}
+
+EAPI Evas_Object *
+elm_list_add(Evas_Object *parent)
+{
+ Evas_Object *obj;
+ Evas *e;
+ Widget_Data *wd;
+
+ wd = ELM_NEW(Widget_Data);
+ e = evas_object_evas_get(parent);
+ obj = elm_widget_add(e);
+ elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL);
+ elm_widget_data_set(obj, wd);
+ elm_widget_del_hook_set(obj, _del_hook);
+ elm_widget_can_focus_set(obj, 1);
+
+ wd->scroller = elm_scroller_add(parent);
+ elm_widget_resize_object_set(obj, wd->scroller);
+
+ wd->box = elm_box_add(parent);
+
+ evas_object_size_hint_weight_set(wd->box, 1.0, 0.0);
+ evas_object_size_hint_align_set(wd->box, -1.0, 0.0);
+ elm_scroller_content_set(wd->scroller, wd->box);
+ evas_object_show(wd->box);
+
+ wd->mode = ELM_LIST_COMPRESS;
+
+ _sizing_eval(obj);
+ return obj;
+}
+
+EAPI Elm_List_Item *
+elm_list_item_append(Evas_Object *obj, const char *label, Evas_Object *icon, Evas_Object *indicator, Evas_Object *end, void (*func) (void *data, Evas_Object *obj, void *event_info), const void *data)
+{
+ Widget_Data *wd = elm_widget_data_get(obj);
+ Item *it = _item_new(obj, label, icon, indicator, end, func, data);
+ wd->items = eina_list_append(wd->items, it);
+ elm_box_pack_end(wd->box, it->base);
+ _fix_items(obj);
+ return (Elm_List_Item *)it;
+}
+
+EAPI Elm_List_Item *
+elm_list_item_prepend(Evas_Object *obj, const char *label, Evas_Object *icon, Evas_Object *indicator, Evas_Object *end, void (*func) (void *data, Evas_Object *obj, void *event_info), const void *data)
+{
+ Widget_Data *wd = elm_widget_data_get(obj);
+ return NULL;
+}
+
+EAPI Elm_List_Item *
+elm_list_item_insert_before(Evas_Object *obj, Elm_List_Item *before, const char *label, Evas_Object *icon, Evas_Object *indicator, Evas_Object *end, void (*func) (void *data, Evas_Object *obj, void *event_info), const void *data)
+{
+ Widget_Data *wd = elm_widget_data_get(obj);
+ return NULL;
+}
+
+EAPI Elm_List_Item *
+elm_list_item_insert_after(Evas_Object *obj, Elm_List_Item *after, const char *label, Evas_Object *icon, Evas_Object *indicator, Evas_Object *end, void (*func) (void *data, Evas_Object *obj, void *event_info), const void *data)
+{
+ Widget_Data *wd = elm_widget_data_get(obj);
+ return NULL;
+}
+
+EAPI void
+elm_list_multi_select_set(Evas_Object *obj, Evas_Bool multi)
+{
+ Widget_Data *wd = elm_widget_data_get(obj);
+}
+
+EAPI void
+elm_list_horizontal_mode_set(Evas_Object *obj, Elementary_List_Mode mode)
+{
+ Widget_Data *wd = elm_widget_data_get(obj);
+}
+
+EAPI const Elm_List_Item *
+elm_list_selected_item_get(Evas_Object *obj)
+{
+ Widget_Data *wd = elm_widget_data_get(obj);
+ return NULL;
+}
+
+EAPI const Eina_List *
+elm_list_items_get(Evas_Object *obj)
+{
+ Widget_Data *wd = elm_widget_data_get(obj);
+ return NULL;
+}
+
+EAPI void
+elm_list_item_selected_set(Elm_List_Item *item, Evas_Bool selected)
+{
+}
+
+EAPI void
+elm_list_item_show(Elm_List_Item *item)
+{
+}
+
+EAPI void
+elm_list_item_del(Elm_List_Item *item)
+{
+}
+
+EAPI const void *
+elm_list_item_data_get(Elm_List_Item *item)
+{
+ return NULL;
+}