From 838825a5ec3694bb9c65775c2fc6991757569745 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Mon, 7 Sep 2009 11:10:13 +0000 Subject: [PATCH] more index work. not working yet. SVN revision: 42320 --- data/themes/default.edc | 156 ++++++++++++++++++++++++++++++ src/bin/test_index.c | 7 ++ src/lib/elm_index.c | 249 +++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 377 insertions(+), 35 deletions(-) diff --git a/data/themes/default.edc b/data/themes/default.edc index fbdd0c2..5034ccb 100644 --- a/data/themes/default.edc +++ b/data/themes/default.edc @@ -13067,4 +13067,160 @@ collections { } } } + +/////////////////////////////////////////////////////////////////////////////// + group { name: "elm/index/base/vertical/default"; + images { + image: "bt_base1.png" COMP; + image: "bt_base2.png" COMP; + image: "bt_hilight.png" COMP; + image: "bt_shine.png" COMP; + } + parts { + part { name: "0"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + rel1.to: "elm.swallow.index.0"; + rel1.offset: -1 -1; + rel2.to: "elm.swallow.index.0"; + rel2.offset: 0 0; + color: 0 100 0 50; + } + } + part { name: "1"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + rel1.to: "elm.swallow.index.1"; + rel1.offset: -1 -1; + rel2.to: "elm.swallow.index.1"; + rel2.offset: 0 0; + color: 100 0 0 50; + } + } + part { name: "elm.swallow.index.0"; + type: SWALLOW; + description { state: "default" 0.0; + align: 1.0 0.5; + rel1 { + relative: 1.0 0.0; + offset: -3 2; + } + rel2 { + relative: 1.0 1.0; + offset: -3 -3; + } + } + } + part { name: "elm.swallow.index.1"; + type: SWALLOW; + description { state: "default" 0.0; + align: 1.0 0.5; + rel1 { + to_x: "elm.swallow.index.0"; + relative: 0.0 0.0; + offset: -3 2; + } + rel2 { + to_x: "elm.swallow.index.0"; + relative: 0.0 1.0; + offset: -3 -3; + } + } + } + part { name: "button_image"; + mouse_events: 1; + description { state: "default" 0.0; + rel1 { + to: "elm.text"; + offset: -5 -5; + } + rel2 { + to: "elm.text"; + offset: 4 4; + } + image { + normal: "bt_base2.png"; + border: 7 7 7 7; + } + image.middle: SOLID; + } + } + part { name: "elm.text"; + type: TEXT; + effect: SOFT_SHADOW; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + align: 0.0 0.5; + rel1 { + to: "elm.swallow.index.1"; + relative: 0.0 0.5; + offset: -8 0; + } + rel2 { + to: "elm.swallow.index.1"; + relative: 0.0 0.5; + offset: -8 -1; + } + color: 224 224 224 255; + color3: 0 0 0 64; + text { + font: "Sans,Edje-Vera"; + size: 10; + min: 1 1; + align: 1.0 0.5; + } + } + } + part { name: "over1"; + mouse_events: 0; + description { state: "default" 0.0; + rel1 { + to: "button_image"; + } + rel2 { + to: "button_image"; + relative: 1.0 0.5; + } + image { + normal: "bt_hilight.png"; + border: 7 7 7 0; + } + } + } + part { name: "over2"; + mouse_events: 1; + repeat_events: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + rel1 { + to: "button_image"; + } + rel2 { + to: "button_image"; + } + image { + normal: "bt_shine.png"; + border: 7 7 7 7; + } + } + } + part { name: "elm.swallow.event"; + type: SWALLOW; + description { state: "default" 0.0; + align: 1.0 0.5; + rel1 { + relative: 1.0 0.0; + offset: -1 9; + } + rel2 { + relative: 1.0 1.0; + offset: -1 -1; + } + } + } + } + } } diff --git a/src/bin/test_index.c b/src/bin/test_index.c index 2c723c8..c77d302 100644 --- a/src/bin/test_index.c +++ b/src/bin/test_index.c @@ -49,6 +49,13 @@ test_index(void *data, Evas_Object *obj, void *event_info) it = elm_genlist_item_append(gl, &itci, i/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, NULL/* func */, NULL/* func data */); + if ((i % 10) == 0) + { + char buf[32]; + + snprintf(buf, sizeof(buf), "%i\n", i / 10); + elm_index_item_append(id, buf, it); + } } evas_object_resize(win, 320, 480); diff --git a/src/lib/elm_index.c b/src/lib/elm_index.c index 9c5ccfe..249cf40 100644 --- a/src/lib/elm_index.c +++ b/src/lib/elm_index.c @@ -14,25 +14,40 @@ */ typedef struct _Widget_Data Widget_Data; +typedef struct _Item Item; struct _Widget_Data { Evas_Object *base; Evas_Object *event; - Evas_Object *bx[2]; - const char *label; + Evas_Object *bx[2]; // 2 - for now all that's supported + Eina_List *items; // 1 list. yes N levels, but only 2 for now and # of items will be small + int level; Eina_Bool horizontal : 1; + Eina_Bool active : 1; + Eina_Bool down : 1; +}; + +struct _Item +{ + Evas_Object *obj; + const char *letter; + const void *data; + int level; + Evas_Object *base; + Eina_Bool selected : 1; }; static void _del_hook(Evas_Object *obj); static void _theme_hook(Evas_Object *obj); static void _sizing_eval(Evas_Object *obj); +static void _index_eval(Evas_Object *obj); static void _del_hook(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); - if (wd->label) eina_stringshare_del(wd->label); +// if (wd->label) eina_stringshare_del(wd->label); free(wd); } @@ -41,9 +56,9 @@ _theme_hook(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); if (wd->horizontal) - _elm_theme_set(wd->base, "index", "horizontal", elm_widget_style_get(obj)); + _elm_theme_set(wd->base, "index", "base/horizontal", elm_widget_style_get(obj)); else - _elm_theme_set(wd->base, "index", "vertical", elm_widget_style_get(obj)); + _elm_theme_set(wd->base, "index", "base/vertical", elm_widget_style_get(obj)); edje_object_part_swallow(wd->base, "elm.swallow.event", wd->event); edje_object_part_swallow(wd->base, "elm.swallow.content", wd->bx[0]); if (edje_object_part_exists(wd->base, "elm.swallow.content.sub")) @@ -65,8 +80,8 @@ _theme_hook(Evas_Object *obj) } edje_object_message_signal_process(wd->base); edje_object_scale_set(wd->base, elm_widget_scale_get(obj) * _elm_config->scale); - // FIXME: content and sub lists - eval _sizing_eval(obj); + if (wd->active) _index_eval(obj); } static void @@ -82,9 +97,53 @@ _sizing_eval(Evas_Object *obj) evas_object_size_hint_max_set(obj, maxw, maxh); } +static Item * +_item_new(Evas_Object *obj, const char *letter, const void *item) +{ + Widget_Data *wd = elm_widget_data_get(obj); + Item *it; + it = calloc(1, sizeof(Item)); + if (!it) return NULL; + it->obj = obj; + it->letter = eina_stringshare_add(letter); + it->data = item; + it->level = wd->level; + return it; +} + +static Item * +_item_find(Evas_Object *obj, const void *item) +{ + Widget_Data *wd = elm_widget_data_get(obj); + Eina_List *l; + Item *it; + EINA_LIST_FOREACH(wd->items, l, it) + { + if (it->data == item) return it; + } + return NULL; +} + +static void +_item_free(Item *it) +{ + Widget_Data *wd = elm_widget_data_get(it->obj); + wd->items = eina_list_remove(wd->items, it); + if (it->base) evas_object_del(it->base); + eina_stringshare_del(it->letter); + free(it); +} + +static void +_index_eval(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); +} + static void _wheel(void *data, Evas *e, Evas_Object *o, void *event_info) { + Widget_Data *wd = elm_widget_data_get(data); Evas_Event_Mouse_Wheel *ev = event_info; Evas_Object *obj = o; } @@ -92,22 +151,58 @@ _wheel(void *data, Evas *e, Evas_Object *o, void *event_info) static void _mouse_down(void *data, Evas *e, Evas_Object *o, void *event_info) { + Widget_Data *wd = elm_widget_data_get(data); Evas_Event_Mouse_Down *ev = event_info; Evas_Object *obj = o; + if (ev->button != 1) return; + wd->down = 1; + printf("down!\n"); } static void _mouse_up(void *data, Evas *e, Evas_Object *o, void *event_info) { + Widget_Data *wd = elm_widget_data_get(data); Evas_Event_Mouse_Up *ev = event_info; Evas_Object *obj = o; + if (ev->button != 1) return; + wd->down = 0; + printf("up!\n"); } static void _mouse_move(void *data, Evas *e, Evas_Object *o, void *event_info) { + Widget_Data *wd = elm_widget_data_get(data); Evas_Event_Mouse_Move *ev = event_info; Evas_Object *obj = o; + Evas_Coord x, y, w, h; + + if (!wd->down) return; + evas_object_geometry_get(o, &x, &y, &w, &h); + if (wd->horizontal) + { + } + else + { + if (ev->cur.canvas.x < x) + { + printf("%i\n", wd->level); + if (wd->level == 0) + { + printf("level up\n"); + wd->level = 1; + } + } + else + { + if (wd->level == 1) + { + printf("level down\n"); + wd->level = 0; + } + } + } } /** @@ -125,6 +220,7 @@ elm_index_add(Evas_Object *parent) Evas_Object *o; Evas *e; Widget_Data *wd; + Evas_Coord minw, minh; wd = ELM_NEW(Widget_Data); e = evas_object_evas_get(parent); @@ -138,12 +234,15 @@ elm_index_add(Evas_Object *parent) wd->horizontal = EINA_FALSE; wd->base = edje_object_add(e); - _elm_theme_set(wd->base, "index", "vertical", "default"); + _elm_theme_set(wd->base, "index", "base/vertical", "default"); elm_widget_resize_object_set(obj, wd->base); o = evas_object_rectangle_add(e); wd->event = o; evas_object_color_set(o, 0, 0, 0, 0); + minw = minh = 0; + elm_coords_finger_size_adjust(1, &minw, 1, &minh); + evas_object_size_hint_min_set(o, minw, minh); edje_object_part_swallow(wd->base, "elm.swallow.event", o); elm_widget_sub_object_add(obj, o); evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_WHEEL, _wheel, obj); @@ -173,54 +272,76 @@ elm_index_add(Evas_Object *parent) return obj; } -#if 0 /** - * Set the label of the index + * Set the active state of the index programatically * * @param obj The index object - * @param label The text label string in UTF-8 + * @param active The active starte * * @ingroup Index */ EAPI void -elm_index_label_set(Evas_Object *obj, const char *label) +elm_index_active_set(Evas_Object *obj, Eina_Bool active) { Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return; - if (wd->label) eina_stringshare_del(wd->label); - if (label) - { - wd->label = eina_stringshare_add(label); - edje_object_signal_emit(wd->base, "elm,state,text,visible", "elm"); - edje_object_message_signal_process(wd->base); - } - else - { - wd->label = NULL; - edje_object_signal_emit(wd->base, "elm,state,text,hidden", "elm"); - edje_object_message_signal_process(wd->base); - } - edje_object_part_text_set(wd->base, "elm.text", label); - _sizing_eval(obj); + if (wd->active == active) return; + wd->active = active; + _index_eval(obj); } /** - * Get the label of the index + * XXX * * @param obj The index object - * @return The text label string in UTF-8 * * @ingroup Index */ -EAPI const char * -elm_index_label_get(Evas_Object *obj) +EAPI void +elm_index_item_level_set(Evas_Object *obj, int level) { Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return NULL; + if (!wd) return; + if (wd->level == level) return; + wd->level = level; + _index_eval(obj); +} - return wd->label; +/** + * XXX + * + * @param obj The index object + * + * @ingroup Index + */ +EAPI int +elm_index_item_level_get(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return 0; + return wd->level; +} + +/** + * XXX + * + * @param obj The index object + * + * @ingroup Index + */ +EAPI const void * +elm_index_item_selected_get(Evas_Object *obj, int level) +{ + Widget_Data *wd = elm_widget_data_get(obj); + Eina_List *l; + Item *it; + if (!wd) return NULL; + EINA_LIST_FOREACH(wd->items, l, it) + { + if ((it->selected) && (it->level == level)) return it->data; + } + return NULL; } -#endif /** * XXX @@ -233,7 +354,12 @@ EAPI void elm_index_item_append(Evas_Object *obj, const char *letter, const void *item) { Widget_Data *wd = elm_widget_data_get(obj); + Item *it; if (!wd) return; + it = _item_new(obj, letter, item); + if (!it) return; + wd->items = eina_list_append(wd->items, it); + if (wd->active) _index_eval(obj); } /** @@ -247,7 +373,12 @@ EAPI void elm_index_item_prepend(Evas_Object *obj, const char *letter, const void *item) { Widget_Data *wd = elm_widget_data_get(obj); + Item *it; if (!wd) return; + it = _item_new(obj, letter, item); + if (!it) return; + wd->items = eina_list_prepend(wd->items, it); + if (wd->active) _index_eval(obj); } /** @@ -261,8 +392,23 @@ EAPI void elm_index_item_append_relative(Evas_Object *obj, const char *letter, const void *item, const void *relative) { Widget_Data *wd = elm_widget_data_get(obj); + Item *it, *it_rel; if (!wd) return; - if (!relative) elm_index_item_append(obj, letter, item); + if (!relative) + { + elm_index_item_append(obj, letter, item); + return; + } + it = _item_new(obj, letter, item); + it_rel = _item_find(obj, relative); + if (!it_rel) + { + elm_index_item_append(obj, letter, item); + return; + } + if (!it) return; + wd->items = eina_list_append_relative(wd->items, it, it_rel); + if (wd->active) _index_eval(obj); } /** @@ -276,7 +422,40 @@ EAPI void elm_index_item_prepend_relative(Evas_Object *obj, const char *letter, const void *item, const void *relative) { Widget_Data *wd = elm_widget_data_get(obj); + Item *it, *it_rel; if (!wd) return; - if (!relative) elm_index_item_prepend(obj, letter, item); + if (!relative) + { + elm_index_item_prepend(obj, letter, item); + return; + } + it = _item_new(obj, letter, item); + it_rel = _item_find(obj, relative); + if (!it_rel) + { + elm_index_item_append(obj, letter, item); + return; + } + if (!it) return; + wd->items = eina_list_prepend_relative(wd->items, it, it_rel); + if (wd->active) _index_eval(obj); } +/** + * XXX + * + * @param obj The index object + * + * @ingroup Index + */ +EAPI void +elm_index_item_del(Evas_Object *obj, const void *item) +{ + Widget_Data *wd = elm_widget_data_get(obj); + Item *it; + if (!wd) return; + it = _item_find(obj, item); + if (!it) return; + _item_free(it); + if (wd->active) _index_eval(obj); +} -- 2.7.4