From f382576f6a490e0be79ee94d6c9526739f16b18f Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Thu, 8 Jan 2009 14:29:13 +0000 Subject: [PATCH] more list work - also some minimal safety stuff. SVN revision: 38503 --- legacy/elementary/data/themes/default.edc | 76 ++++++++++---- legacy/elementary/src/bin/test.c | 77 ++++++++++++-- legacy/elementary/src/lib/Elementary.h.in | 5 +- legacy/elementary/src/lib/elc_hoversel.c | 14 ++- legacy/elementary/src/lib/elm_button.c | 9 ++ legacy/elementary/src/lib/elm_icon.c | 9 ++ legacy/elementary/src/lib/elm_list.c | 121 ++++++++++++++++++---- 7 files changed, 255 insertions(+), 56 deletions(-) diff --git a/legacy/elementary/data/themes/default.edc b/legacy/elementary/data/themes/default.edc index 90c6fbcff4..287a7e3326 100644 --- a/legacy/elementary/data/themes/default.edc +++ b/legacy/elementary/data/themes/default.edc @@ -4411,47 +4411,47 @@ collections { /////////////////////////////////////////////////////////////////////////////// group { name: "elm/icon/home/default"; min: 32 32; images.image: "icon_home.png" COMP; parts { part { name: "base"; - description { state: "default" 0.0; aspect: 1.0 1.0; + description { state: "default" 0.0; aspect: 1.0 1.0; aspect_preference: BOTH; image.normal: "icon_home.png"; } } } } group { name: "elm/icon/close/default"; min: 32 32; images.image: "icon_close.png" COMP; parts { part { name: "base"; - description { state: "default" 0.0; aspect: 1.0 1.0; + description { state: "default" 0.0; aspect: 1.0 1.0; aspect_preference: BOTH; image.normal: "icon_close.png"; } } } } group { name: "elm/icon/apps/default"; min: 32 32; images.image: "icon_apps.png" COMP; parts { part { name: "base"; - description { state: "default" 0.0; aspect: 1.0 1.0; + description { state: "default" 0.0; aspect: 1.0 1.0; aspect_preference: BOTH; image.normal: "icon_apps.png"; } } } } group { name: "elm/icon/arrow_up/default"; min: 32 32; images.image: "icon_arrow_up.png" COMP; parts { part { name: "base"; - description { state: "default" 0.0; aspect: 1.0 1.0; + description { state: "default" 0.0; aspect: 1.0 1.0; aspect_preference: BOTH; image.normal: "icon_arrow_up.png"; } } } } group { name: "elm/icon/arrow_down/default"; min: 32 32; images.image: "icon_arrow_down.png" COMP; parts { part { name: "base"; - description { state: "default" 0.0; aspect: 1.0 1.0; + description { state: "default" 0.0; aspect: 1.0 1.0; aspect_preference: BOTH; image.normal: "icon_arrow_down.png"; } } } } group { name: "elm/icon/arrow_left/default"; min: 32 32; images.image: "icon_arrow_left.png" COMP; parts { part { name: "base"; - description { state: "default" 0.0; aspect: 1.0 1.0; + description { state: "default" 0.0; aspect: 1.0 1.0; aspect_preference: BOTH; image.normal: "icon_arrow_left.png"; } } } } group { name: "elm/icon/arrow_right/default"; min: 32 32; images.image: "icon_arrow_right.png" COMP; parts { part { name: "base"; - description { state: "default" 0.0; aspect: 1.0 1.0; + description { state: "default" 0.0; aspect: 1.0 1.0; aspect_preference: BOTH; image.normal: "icon_arrow_right.png"; } } } } group { name: "elm/icon/chat/default"; min: 32 32; images.image: "icon_chat.png" COMP; parts { part { name: "base"; - description { state: "default" 0.0; aspect: 1.0 1.0; + description { state: "default" 0.0; aspect: 1.0 1.0; aspect_preference: BOTH; image.normal: "icon_chat.png"; } } } } group { name: "elm/icon/clock/default"; min: 32 32; images.image: "icon_clock.png" COMP; parts { part { name: "base"; - description { state: "default" 0.0; aspect: 1.0 1.0; + description { state: "default" 0.0; aspect: 1.0 1.0; aspect_preference: BOTH; image.normal: "icon_clock.png"; } } } } group { name: "elm/icon/delete/default"; min: 32 32; images.image: "icon_delete.png" COMP; parts { part { name: "base"; - description { state: "default" 0.0; aspect: 1.0 1.0; + description { state: "default" 0.0; aspect: 1.0 1.0; aspect_preference: BOTH; image.normal: "icon_delete.png"; } } } } group { name: "elm/icon/edit/default"; min: 32 32; images.image: "icon_edit.png" COMP; parts { part { name: "base"; - description { state: "default" 0.0; aspect: 1.0 1.0; + description { state: "default" 0.0; aspect: 1.0 1.0; aspect_preference: BOTH; image.normal: "icon_edit.png"; } } } } /////////////////////////////////////////////////////////////////////////////// @@ -4885,8 +4885,6 @@ collections { 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; @@ -4897,6 +4895,22 @@ collections { } } } + part { + name: "elm.swallow.end"; + type: SWALLOW; + description { + state: "default" 0.0; + align: 1.0 0.5; + rel1 { + relative: 1.0 0.0; + offset: -5 4; + } + rel2 { + relative: 1.0 1.0; + offset: -5 -5; + } + } + } part { name: "elm.text"; type: TEXT; @@ -4909,11 +4923,12 @@ collections { rel1 { to_x: "elm.swallow.icon"; relative: 1.0 0.0; - offset: 4 4; + offset: 0 4; } rel2 { - relative: 1.0 1.0; - offset: -5 -5; + to_x: "elm.swallow.end"; + relative: 0.0 1.0; + offset: -1 -5; } color: 0 0 0 255; color3: 0 0 0 0; @@ -4971,6 +4986,7 @@ collections { part { name: "event"; type: RECT; + repeat_events: 1; description { state: "default" 0.0; color: 0 0 0 0; @@ -5020,6 +5036,7 @@ collections { normal: "ilist_2.png"; border: 2 2 2 2; } + fill.smooth: 0; } } part { name: "bg"; @@ -5039,7 +5056,6 @@ collections { normal: "bt_sm_base1.png"; border: 6 6 6 6; } - fill.smooth: 0; } description { state: "selected" 0.0; inherit: "default" 0.0; @@ -5061,8 +5077,6 @@ collections { 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; @@ -5073,6 +5087,22 @@ collections { } } } + part { + name: "elm.swallow.end"; + type: SWALLOW; + description { + state: "default" 0.0; + align: 1.0 0.5; + rel1 { + relative: 1.0 0.0; + offset: -5 4; + } + rel2 { + relative: 1.0 1.0; + offset: -5 -5; + } + } + } part { name: "elm.text"; type: TEXT; @@ -5085,11 +5115,12 @@ collections { rel1 { to_x: "elm.swallow.icon"; relative: 1.0 0.0; - offset: 4 4; + offset: 0 4; } rel2 { - relative: 1.0 1.0; - offset: -5 -5; + to_x: "elm.swallow.end"; + relative: 0.0 1.0; + offset: -1 -5; } color: 0 0 0 255; color3: 0 0 0 0; @@ -5147,6 +5178,7 @@ collections { part { name: "event"; type: RECT; + repeat_events: 1; description { state: "default" 0.0; color: 0 0 0 0; diff --git a/legacy/elementary/src/bin/test.c b/legacy/elementary/src/bin/test.c index f1ff1bf068..ad3b890943 100644 --- a/legacy/elementary/src/bin/test.c +++ b/legacy/elementary/src/bin/test.c @@ -1486,7 +1486,7 @@ my_bt_19(void *data, Evas_Object *obj, void *event_info) static void my_bt_20(void *data, Evas_Object *obj, void *event_info) { - Evas_Object *win, *bg, *li; + Evas_Object *win, *bg, *li, *ic, *ic2, *bx; char buf[PATH_MAX]; win = elm_win_add(NULL, "list", ELM_WIN_BASIC); @@ -1502,16 +1502,71 @@ my_bt_20(void *data, Evas_Object *obj, void *event_info) 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); + 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_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); + elm_list_item_append(li, "How", ic, ic2, NULL, NULL); + + bx = elm_box_add(win); + elm_box_horizontal_set(bx, 1); + + 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); + + 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.0, 1.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); + 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); + elm_list_item_append(li, "Here", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "are", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "some", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "more", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "items", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Is this label long enough?", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Maybe this one is even longer so we can test long long items.", NULL, NULL, NULL, NULL); + + elm_list_go(li); evas_object_show(li); diff --git a/legacy/elementary/src/lib/Elementary.h.in b/legacy/elementary/src/lib/Elementary.h.in index 671ae7259e..a9561b2cc5 100644 --- a/legacy/elementary/src/lib/Elementary.h.in +++ b/legacy/elementary/src/lib/Elementary.h.in @@ -408,7 +408,7 @@ extern "C" { } Elementary_List_Mode; typedef struct _Elm_List_Item Elm_List_Item; EAPI Evas_Object *elm_list_add(Evas_Object *parent); - 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); + EAPI Elm_List_Item *elm_list_item_append(Evas_Object *obj, const char *label, Evas_Object *icon, Evas_Object *end, void (*func) (void *data, Evas_Object *obj, void *event_info), const void *data); /* smart callbacks called: * "clicked" - when the user double-clicked an item */ @@ -426,13 +426,13 @@ extern "C" { // //// (incomplete - medium priority) // * entry selection conflicts with finger scroll (make selection start/stop work on signals?) - // * disabled not supported // * tab widget focusing (not useful for touchscreen tho...) // * on the fly theme changes - test (should work) // * need a hold-scroll counter in elm_widget // * add fullscreen mode on/off for windows // * hoversel only vertical right now - make horizontal +// * set scaling per widget (and if scaling should be inheited by children) // //// (more widgets/features - medium priority) // * biglist widget (restricted format label + icon intended for massive lists) @@ -455,6 +455,7 @@ extern "C" { // * imageview widget (for large not iconic images) // * tiled image + zoom widget (tiled map viewer) // * dialpad widget - need one with a phone dialpad +// * file selector widget // //// (improvements - low priority) // * use evas's new box instead of a box smart diff --git a/legacy/elementary/src/lib/elc_hoversel.c b/legacy/elementary/src/lib/elc_hoversel.c index 0157982fa5..fdbf53e571 100644 --- a/legacy/elementary/src/lib/elc_hoversel.c +++ b/legacy/elementary/src/lib/elc_hoversel.c @@ -18,7 +18,7 @@ struct _Item const char *icon_file; Elm_Icon_Type icon_type; void (*func) (void *data, Evas_Object *obj, void *event_info); - const void *data; + void *data; }; static void _del_pre_hook(Evas_Object *obj); @@ -38,6 +38,7 @@ static void _del_hook(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; elm_hoversel_hover_end(obj); free(wd); } @@ -46,6 +47,7 @@ static void _sizing_eval(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1; evas_object_size_hint_min_get(wd->btn, &minw, &minh); @@ -80,6 +82,7 @@ static void _button_clicked(void *data, Evas_Object *obj, void *event_info) { Widget_Data *wd = elm_widget_data_get(data); + if (!wd) return; Evas_Object *bt, *bx, *ic; Eina_List *l; wd->hover = elm_hover_add(data); @@ -129,6 +132,7 @@ static void _parent_del(void *data, Evas *e, Evas_Object *obj, void *event_info) { Widget_Data *wd = elm_widget_data_get(data); + if (!wd) return; wd->hover_parent = NULL; } @@ -160,6 +164,7 @@ EAPI void elm_hoversel_hover_parent_set(Evas_Object *obj, Evas_Object *parent) { Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; if (wd->hover_parent) evas_object_event_callback_del(wd->hover_parent, EVAS_CALLBACK_DEL, _parent_del); wd->hover_parent = parent; @@ -171,6 +176,7 @@ EAPI void elm_hoversel_label_set(Evas_Object *obj, const char *label) { Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; elm_button_label_set(wd->btn, label); } @@ -178,6 +184,7 @@ EAPI void elm_hoversel_icon_set(Evas_Object *obj, Evas_Object *icon) { Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; elm_button_icon_set(wd->btn, icon); } @@ -185,6 +192,7 @@ EAPI void elm_hoversel_hover_end(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; if (wd->hover) evas_object_del(wd->hover); wd->hover = NULL; evas_object_smart_callback_call(obj, "dismissed", NULL); @@ -194,6 +202,7 @@ EAPI Elm_Hoversel_Item * elm_hoversel_item_add(Evas_Object *obj, const char *label, const char *icon_file, Elm_Icon_Type icon_type, void (*func) (void *data, Evas_Object *obj, void *event_info), const void *data) { Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return NULL; Item *it = calloc(1, sizeof(Item)); if (!it) return NULL; wd->items = eina_list_append(wd->items, it); @@ -202,7 +211,7 @@ elm_hoversel_item_add(Evas_Object *obj, const char *label, const char *icon_file it->icon_file = eina_stringshare_add(icon_file); it->icon_type = icon_type; it->func = func; - it->data = data; + it->data = (void *)data; return (Elm_Hoversel_Item *)it; } @@ -211,6 +220,7 @@ elm_hoversel_item_del(Elm_Hoversel_Item *item) { Item *it = (Item *)item; Widget_Data *wd = elm_widget_data_get(it->obj); + if (!wd) return; elm_hoversel_hover_end(it->obj); wd->items = eina_list_remove(wd->items, it); eina_stringshare_del(it->label); diff --git a/legacy/elementary/src/lib/elm_button.c b/legacy/elementary/src/lib/elm_button.c index 2e3245b93f..c2bc1124da 100644 --- a/legacy/elementary/src/lib/elm_button.c +++ b/legacy/elementary/src/lib/elm_button.c @@ -22,6 +22,7 @@ static void _del_hook(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; if (wd->label) eina_stringshare_del(wd->label); if (wd->style) eina_stringshare_del(wd->style); free(wd); @@ -31,6 +32,7 @@ static void _theme_hook(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; if (wd->style) _elm_theme_set(wd->btn, "button", "base", wd->style); else _elm_theme_set(wd->btn, "button", "base", "default"); if (wd->icon) @@ -52,6 +54,7 @@ static void _sizing_eval(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1; edje_object_size_min_calc(wd->btn, &minw, &minh); @@ -63,6 +66,7 @@ static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info) { Widget_Data *wd = elm_widget_data_get(data); + if (!wd) return; if (obj != wd->icon) return; edje_object_part_swallow(wd->btn, "elm.swallow.content", obj); _sizing_eval(data); @@ -72,6 +76,7 @@ static void _sub_del(void *data, Evas_Object *obj, void *event_info) { Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; Evas_Object *sub = event_info; if (sub == wd->icon) { @@ -88,6 +93,7 @@ static void _signal_clicked(void *data, Evas_Object *obj, const char *emission, const char *source) { Widget_Data *wd = elm_widget_data_get(data); + if (!wd) return; evas_object_smart_callback_call(data, "clicked", NULL); } @@ -120,6 +126,7 @@ EAPI void elm_button_label_set(Evas_Object *obj, const char *label) { Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; Evas_Coord mw, mh; if (wd->label) eina_stringshare_del(wd->label); @@ -143,6 +150,7 @@ EAPI void elm_button_icon_set(Evas_Object *obj, Evas_Object *icon) { Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; if ((wd->icon != icon) && (wd->icon)) elm_widget_sub_object_del(obj, wd->icon); if ((icon) && (wd->icon != icon)) @@ -164,6 +172,7 @@ EAPI void elm_button_style_set(Evas_Object *obj, const char *style) { Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; if (wd->style) eina_stringshare_del(wd->style); if (style) wd->style = eina_stringshare_add(style); else wd->style = NULL; diff --git a/legacy/elementary/src/lib/elm_icon.c b/legacy/elementary/src/lib/elm_icon.c index a6a67b1a87..c71a135c0f 100644 --- a/legacy/elementary/src/lib/elm_icon.c +++ b/legacy/elementary/src/lib/elm_icon.c @@ -23,6 +23,7 @@ static void _del_hook(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; if (wd->stdicon) eina_stringshare_del(wd->stdicon); free(wd); } @@ -31,6 +32,7 @@ static void _theme_hook(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; if (wd->stdicon) _elm_theme_icon_set(wd->img, wd->stdicon, "default"); _sizing_eval(obj); @@ -40,6 +42,7 @@ static void _sizing_eval(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1; int w, h; @@ -107,6 +110,7 @@ EAPI void elm_icon_file_set(Evas_Object *obj, const char *file, const char *group) { Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; const char *p; if (!file) return; @@ -123,6 +127,7 @@ EAPI void elm_icon_standard_set(Evas_Object *obj, const char *name) { Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; if (!name) return; if (wd->stdicon) eina_stringshare_del(wd->stdicon); @@ -135,6 +140,7 @@ EAPI void elm_icon_smooth_set(Evas_Object *obj, Evas_Bool smooth) { Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; wd->smooth = smooth; _sizing_eval(obj); } @@ -143,6 +149,7 @@ EAPI void elm_icon_no_scale_set(Evas_Object *obj, Evas_Bool no_scale) { Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; wd->no_scale = no_scale; _sizing_eval(obj); } @@ -151,6 +158,7 @@ EAPI void elm_icon_scale_set(Evas_Object *obj, Evas_Bool scale_up, Evas_Bool scale_down) { Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; wd->scale_up = scale_up; wd->scale_down = scale_down; _sizing_eval(obj); @@ -160,6 +168,7 @@ EAPI void elm_icon_fill_outside_set(Evas_Object *obj, Evas_Bool fill_outside) { Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; wd->fill_outside = fill_outside; _sizing_eval(obj); } diff --git a/legacy/elementary/src/lib/elm_list.c b/legacy/elementary/src/lib/elm_list.c index e79feec232..eaa2975233 100644 --- a/legacy/elementary/src/lib/elm_list.c +++ b/legacy/elementary/src/lib/elm_list.c @@ -11,6 +11,7 @@ struct _Widget_Data Eina_List *selected; Elementary_List_Mode mode; Evas_Bool on_hold : 1; + Evas_Coord minw[2], minh[2]; }; struct _Item @@ -18,7 +19,7 @@ struct _Item Evas_Object *obj; Evas_Object *base; const char *label; - Evas_Object *icon, *indicator, *end; + Evas_Object *icon, *end; void (*func) (void *data, Evas_Object *obj, void *event_info); const void *data; Evas_Bool even : 1; @@ -78,7 +79,7 @@ _item_select(Item *it) if ((selectraise) && (!strcmp(selectraise, "on"))) evas_object_raise(it->base); it->selected = 1; - if (it->func) it->func(it->data, it->obj, it); + if (it->func) it->func((void *)it->data, it->obj, it); } static void @@ -120,7 +121,7 @@ _mouse_up(void *data, Evas *evas, Evas_Object *obj, void *event_info) } 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) +_item_new(Evas_Object *obj, const char *label, Evas_Object *icon, 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; @@ -129,7 +130,6 @@ _item_new(Evas_Object *obj, const char *label, Evas_Object *icon, Evas_Object *i it->obj = obj; it->label = eina_stringshare_add(label); it->icon = icon; - it->indicator = indicator; it->end = end; it->func = func; it->data = data; @@ -148,13 +148,41 @@ _fix_items(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); Eina_List *l; - int i; + Evas_Coord minw[2] = { 0, 0 }, minh[2] = { 0, 0 }; + int i, redo = 0; + for (l = wd->items; l; l = l->next) + { + Evas_Coord mw, mh; + Item *it = l->data; + if (it->icon) + { + evas_object_size_hint_min_get(it->icon, &mw, &mh); + if (mw > minw[0]) minw[0] = mw; + if (mh > minh[0]) minh[0] = mh; + } + if (it->end) + { + evas_object_size_hint_min_get(it->end, &mw, &mh); + if (mw > minw[1]) minw[1] = mw; + 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])) + { + wd->minw[0] = minw[0]; + wd->minw[1] = minw[1]; + wd->minh[0] = minh[0]; + wd->minh[1] = minh[1]; + redo = 1; + } + printf("%ix%i | %ix%i\n", minw[0], minh[0], minw[1], minh[1]); 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)) + if ((it->even != it->is_even) || (!it->fixed) || (redo)) { const char *stacking; if (it->even) @@ -170,6 +198,27 @@ _fix_items(Evas_Object *obj) evas_object_raise(it->base); } edje_object_part_text_set(it->base, "elm.text", it->label); + if ((!it->icon) && (minw[0] > 0)) + { + it->icon = evas_object_rectangle_add(evas_object_evas_get(it->base)); + evas_object_color_set(it->icon, 0, 0, 0, 0); + } + if ((!it->end) && (minw[1] > 0)) + { + it->end = evas_object_rectangle_add(evas_object_evas_get(it->base)); + evas_object_color_set(it->end, 0, 0, 0, 0); + } + if (it->icon) + { + edje_extern_object_min_size_set(it->icon, minw[0], minh[0]); + printf("|%s| %ix%i\n", it->label, minw[0], minh[0]); + edje_object_part_swallow(it->base, "elm.swallow.icon", it->icon); + } + if (it->end) + { + edje_extern_object_min_size_set(it->end, minw[1], minh[1]); + edje_object_part_swallow(it->base, "elm.swallow.end", it->end); + } if (!it->fixed) { Evas_Coord minw, minh; @@ -177,6 +226,7 @@ _fix_items(Evas_Object *obj) edje_object_message_signal_process(it->base); edje_object_size_min_calc(it->base, &minw, &minh); if (wd->mode == ELM_LIST_COMPRESS) minw = 0; + printf("-- %ix%i\n", minw, minh); evas_object_size_hint_min_set(it->base, minw, minh); evas_object_show(it->base); } @@ -206,66 +256,85 @@ elm_list_add(Evas_Object *parent) elm_widget_resize_object_set(obj, wd->scroller); wd->box = elm_box_add(parent); - + elm_box_homogenous_set(wd->box, 1); 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; + wd->mode = ELM_LIST_SCROLL; _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) +elm_list_item_append(Evas_Object *obj, const char *label, Evas_Object *icon, 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); + Item *it = _item_new(obj, label, icon, 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) +elm_list_item_prepend(Evas_Object *obj, const char *label, Evas_Object *icon, 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; + Item *it = _item_new(obj, label, icon, end, func, data); + wd->items = eina_list_prepend(wd->items, it); + elm_box_pack_start(wd->box, it->base); + return (Elm_List_Item *)it; } 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) +elm_list_item_insert_before(Evas_Object *obj, Elm_List_Item *before, const char *label, Evas_Object *icon, 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; + Item *it = _item_new(obj, label, icon, end, func, data); + wd->items = eina_list_prepend_relative(wd->items, it, before); + elm_box_pack_before(wd->box, it->base, ((Item *)before)->base); + return (Elm_List_Item *)it; } 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) +elm_list_item_insert_after(Evas_Object *obj, Elm_List_Item *after, const char *label, Evas_Object *icon, 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; + Item *it = _item_new(obj, label, icon, end, func, data); + wd->items = eina_list_append_relative(wd->items, it, after); + elm_box_pack_after(wd->box, it->base, ((Item *)after)->base); + return (Elm_List_Item *)it; +} + +EAPI void +elm_list_go(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + _fix_items(obj); } EAPI void elm_list_multi_select_set(Evas_Object *obj, Evas_Bool multi) { Widget_Data *wd = elm_widget_data_get(obj); + // FIXME: implement } EAPI void elm_list_horizontal_mode_set(Evas_Object *obj, Elementary_List_Mode mode) { Widget_Data *wd = elm_widget_data_get(obj); + if (wd->mode == mode) return; + wd->mode = mode; } EAPI const Elm_List_Item * elm_list_selected_item_get(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); + // FIXME: implement return NULL; } @@ -273,26 +342,40 @@ EAPI const Eina_List * elm_list_items_get(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); - return NULL; + if (wd->selected) return wd->selected; + return wd->items; } EAPI void elm_list_item_selected_set(Elm_List_Item *item, Evas_Bool selected) { + Item *it = (Item *)item; + Widget_Data *wd = elm_widget_data_get(it->obj); + Eina_List *l; + if (it->selected) return; + for (l = wd->items; l; l = l->next) + { + Item *it2 = l->data; + if ((it2 != it) && (it2->selected)) _item_unselect(it2); + } + _item_select(it); } EAPI void elm_list_item_show(Elm_List_Item *item) { + // FIXME: implement } EAPI void elm_list_item_del(Elm_List_Item *item) { + // FIXME: implement } EAPI const void * elm_list_item_data_get(Elm_List_Item *item) { - return NULL; + Item *it = (Item *)item; + return it->data; }