From ef3d88dfc9b78f65851167fa3ccaf6c50ea176e9 Mon Sep 17 00:00:00 2001 From: Marcel Hollerbach Date: Thu, 29 Aug 2019 21:07:47 +0900 Subject: [PATCH] introduce efl_ui_tab_bar_default_item Summary: Tab bar used a direct layout to implement all this functionality by its own. However, it seems that we can reuse a lot of object functionality that is already part of efl.ui.item. With this commit the features that are not part of Efl.Ui.Item are moved to Efl.Ui.Tab_Bar_Default_Item. The tab bar is changed in a way that you do not need to pass the icon and label by hand anymore, you can rather just pass the tab_bar default item. Additionally, the item for a tab_page can now directly be generated from a page. This is the first commit in order to cleanup efl_ui_tab_bar, tab_page & tab_pager. The goal is also to implement our interfaces for inserting elements on those objects. So our common test suites can also be used. Reviewers: zmike, segfaultxavi, cedric, woohyun, bowonryu Reviewed By: woohyun Subscribers: #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D9726 --- data/elementary/themes/edc/efl/tab_bar.edc | 30 +- src/bin/elementary/test_ui_items.c | 12 + src/lib/elementary/Efl_Ui.h | 5 + src/lib/elementary/Elementary.h | 4 - src/lib/elementary/efl_ui_tab_bar.c | 322 +++--------------- src/lib/elementary/efl_ui_tab_bar.eo | 18 +- .../elementary/efl_ui_tab_bar_default_item.c | 74 ++++ .../elementary/efl_ui_tab_bar_default_item.eo | 18 + src/lib/elementary/efl_ui_tab_bar_private.h | 16 +- src/lib/elementary/efl_ui_tab_page.c | 18 +- src/lib/elementary/efl_ui_tab_page.eo | 13 + src/lib/elementary/efl_ui_tab_page_private.h | 3 +- src/lib/elementary/efl_ui_tab_pager.c | 60 +--- src/lib/elementary/meson.build | 2 + 14 files changed, 213 insertions(+), 382 deletions(-) create mode 100644 src/lib/elementary/efl_ui_tab_bar_default_item.c create mode 100644 src/lib/elementary/efl_ui_tab_bar_default_item.eo diff --git a/data/elementary/themes/edc/efl/tab_bar.edc b/data/elementary/themes/edc/efl/tab_bar.edc index e9f0b913db..d48ed8589f 100644 --- a/data/elementary/themes/edc/efl/tab_bar.edc +++ b/data/elementary/themes/edc/efl/tab_bar.edc @@ -70,7 +70,7 @@ group { "efl/tab_bar/tab"; #define LABEL 2 #define MASK 3 #define DISABLE 4 - script { + script { public btmode; public eval_mode(m) { new m1 = m & MASK; @@ -216,10 +216,10 @@ group { "efl/tab_bar/tab"; desc { "default"; align: 0.5 0.5; rel1.relative: 0.0 0.0; - rel1.offset: 2 2; + rel1.offset: 5 5; rel2.to_y: "efl.text"; rel2.relative: 1.0 0.0; - rel2.offset: -3 -1; + rel2.offset: -6 -4; } desc { "noicon"; inherit: "default" 0.0; @@ -417,12 +417,22 @@ group { "efl/tab_bar/tab"; } } rect { "event"; - ignore_flags: ON_HOLD; desc { "default"; color: 0 0 0 0; } } + swallow { "efl.extra"; + desc { "default"; + fixed: 1 1; + align: 1.0 0.0; + rel1.relative: 1.0 0.0; + rel1.offset: -3 2; + rel2.relative: 1.0 0.0; + rel2.offset: -3 2; + } + } programs { + EFL_UI_CLICKABLE_PART_BIND(event) program { signal: "efl,orient,horizontal"; source: "efl"; action: STATE_SET "default" 0.0; @@ -461,10 +471,6 @@ group { "efl/tab_bar/tab"; target: "bar"; target: "bend"; } - program { - signal: "mouse,up,1"; source: "event"; - action: SIGNAL_EMIT "efl,action,click" "efl"; - } program { signal: "efl,highlight,on"; source: "efl"; action: STATE_SET "selected" 0.0; @@ -475,14 +481,6 @@ group { "efl/tab_bar/tab"; action: STATE_SET "default" 0.0; target: "highlight"; } - program { - signal: "mouse,in"; source: "event"; - action: SIGNAL_EMIT "efl,mouse,in" "efl"; - } - program { name: "mouse,out"; - signal: "mouse,out"; source: "event"; - action: SIGNAL_EMIT "efl,mouse,out" "efl"; - } program { name: "st1"; signal: "efl,state,text,unset"; source: "efl"; script { diff --git a/src/bin/elementary/test_ui_items.c b/src/bin/elementary/test_ui_items.c index 901226a3b3..54dcb64767 100644 --- a/src/bin/elementary/test_ui_items.c +++ b/src/bin/elementary/test_ui_items.c @@ -92,5 +92,17 @@ void test_efl_ui_item(void *data EINA_UNUSED, o = _item_add(box, EFL_UI_GROUP_ITEM_CLASS, 6); efl_gfx_hint_size_min_set(o, EINA_SIZE2D(40, 40)); efl_ui_widget_disabled_set(o, EINA_TRUE); + + o = _item_add(box, EFL_UI_TAB_BAR_DEFAULT_ITEM_CLASS, 5); + efl_gfx_hint_size_min_set(o, EINA_SIZE2D(40, 40+40)); + efl_pack_end(box, o); + + o = _item_add(box, EFL_UI_TAB_BAR_DEFAULT_ITEM_CLASS, 6); + efl_gfx_hint_size_min_set(o, EINA_SIZE2D(40, 40)); + efl_ui_widget_disabled_set(o, EINA_TRUE); + efl_pack_end(box, o); + o = _item_add(box, EFL_UI_TAB_BAR_DEFAULT_ITEM_CLASS, 5); + efl_ui_tab_bar_default_item_icon_set(o, "folder"); + efl_gfx_hint_size_min_set(o, EINA_SIZE2D(40, 40+40)); efl_pack_end(box, o); } diff --git a/src/lib/elementary/Efl_Ui.h b/src/lib/elementary/Efl_Ui.h index 7f61098473..502df1a269 100644 --- a/src/lib/elementary/Efl_Ui.h +++ b/src/lib/elementary/Efl_Ui.h @@ -272,6 +272,11 @@ typedef Eo Efl_Ui_Spotlight_Indicator; # include # include # include +# include +# include +# include +# include +# include /** * Initialize Elementary * diff --git a/src/lib/elementary/Elementary.h b/src/lib/elementary/Elementary.h index d7d959e6ea..07f7edab89 100644 --- a/src/lib/elementary/Elementary.h +++ b/src/lib/elementary/Elementary.h @@ -349,10 +349,6 @@ typedef Eo Efl_Ui_Focus_Manager; # include # include # include -# include -# include -# include -# include /* include deprecated calls last of all */ #include diff --git a/src/lib/elementary/efl_ui_tab_bar.c b/src/lib/elementary/efl_ui_tab_bar.c index 0bcd5d3c0b..f094687c74 100644 --- a/src/lib/elementary/efl_ui_tab_bar.c +++ b/src/lib/elementary/efl_ui_tab_bar.c @@ -3,7 +3,7 @@ #endif -#include +#include #include "elm_priv.h" #include "efl_ui_tab_bar_private.h" #include "els_box.h" @@ -11,51 +11,19 @@ #define MY_CLASS EFL_UI_TAB_BAR_CLASS #define MY_CLASS_NAME "Efl.Ui.Tab_Bar" -static const char PART_NAME_TAB[] = "tab"; - -static void _tab_select(Efl_Ui_Tab_Bar_Data *sd, Tab_Info *ti); - -static Eina_Bool _key_action_select(Evas_Object *obj, const char *params); - -static const Elm_Action key_actions[] = { - {"select", _key_action_select}, - {NULL, NULL} -}; - -static Eina_Bool -_key_action_select(Evas_Object *obj, const char *params EINA_UNUSED) -{ - EFL_UI_TAB_BAR_DATA_GET(obj, sd); - - if (!sd->tab_infos) return EINA_FALSE; - - Tab_Info *ti; - Eina_List *l, *l_next; - EINA_LIST_FOREACH_SAFE(sd->tab_infos, l, l_next, ti) - { - if (efl_ui_focus_object_focus_get(ti->tab)) - { - _tab_select(sd, ti); - return EINA_TRUE; - } - } - - return EINA_FALSE; -} - EOLIAN static void _efl_ui_tab_bar_current_tab_set(Eo *obj EINA_UNUSED, Efl_Ui_Tab_Bar_Data *sd, int index) { - Tab_Info *ti; - ti = eina_list_nth(sd->tab_infos, index); + Efl_Ui_Item *item; + item = eina_list_nth(sd->tab_infos, index); - _tab_select(sd, ti); + efl_ui_selectable_selected_set(item, EINA_TRUE); } EOLIAN static int _efl_ui_tab_bar_current_tab_get(const Eo *obj EINA_UNUSED, Efl_Ui_Tab_Bar_Data *sd) { - return sd->cur; + return eina_list_data_idx(sd->tab_infos, sd->selected); } EOLIAN static unsigned int @@ -64,228 +32,75 @@ _efl_ui_tab_bar_tab_count(const Eo *obj EINA_UNUSED, Efl_Ui_Tab_Bar_Data *sd) return sd->cnt; } -static void -_tab_icon_update(Tab_Info *ti) -{ - Eo *old_icon = - efl_content_get(efl_part(ti->tab, "efl.icon")); - - _elm_widget_sub_object_redirect_to_top(ti->tab, old_icon); - efl_content_unset(efl_part(ti->tab, "efl.icon")); - efl_content_set(efl_part(ti->tab, "efl.icon"), ti->icon); - - efl_del(old_icon); -} +static void _remove_item(Eo *obj, Efl_Ui_Tab_Bar_Data *pd, Efl_Ui_Item *item); static void -_tab_icon_set_cb(void *data, - Eo *obj, - const char *emission, - const char *source) +_selelction_change_cb(void *data, const Efl_Event *ev) { - Tab_Info *ti = data; - _tab_icon_update(ti); + Efl_Ui_Tab_Bar_Data *pd = efl_data_scope_safe_get(data, MY_CLASS); - efl_layout_signal_callback_del(obj, emission, source, ti, _tab_icon_set_cb, NULL); - efl_layout_signal_emit(ti->tab, "efl,state,icon,reset", "efl"); -} - -static void -_tab_icon_obj_set(Eo *obj, - Tab_Info *ti, - Eo *icon_obj, - const char *icon_str) -{ - Eo *old_icon; - const char *s; - - if (icon_str) - eina_stringshare_replace(&ti->icon_str, icon_str); - else + if (!efl_ui_selectable_selected_get(ev->object)) { - eina_stringshare_del(ti->icon_str); - ti->icon_str = NULL; - } - - ti->icon = icon_obj; - if (icon_obj) - { - efl_gfx_entity_visible_set(ti->icon, EINA_TRUE); - elm_widget_sub_object_add(obj, ti->icon); - } - - s = elm_layout_data_get(ti->tab, "transition_animation_on"); - if ((s) && (atoi(s))) - { - old_icon = efl_content_get - (efl_part(ti->tab, "efl.icon_new")); - if (old_icon) + if (pd->selected == ev->object) { - _elm_widget_sub_object_redirect_to_top(ti->tab, old_icon); - efl_gfx_entity_visible_set(old_icon, EINA_FALSE); + pd->selected = NULL; } - efl_content_set - (efl_part(ti->tab, "efl.icon_new"), ti->icon); - efl_layout_signal_emit(ti->tab, "efl,state,icon_new,set", "efl"); - efl_layout_signal_callback_add - (ti->tab, "efl,state,icon_set,done", "efl", ti, _tab_icon_set_cb, NULL); - } - else - _tab_icon_update(ti); -} - -static Eina_Bool -_tab_icon_set(Eo *icon_obj, - const char *type, - const char *icon) -{ - char icon_str[512]; - - if ((!type) || (!*type)) goto end; - if ((!icon) || (!*icon)) return EINA_FALSE; - if ((snprintf(icon_str, sizeof(icon_str), "%s%s", type, icon) > 0) - && (elm_icon_standard_set(icon_obj, icon_str))) - return EINA_TRUE; -end: - if (elm_icon_standard_set(icon_obj, icon)) - return EINA_TRUE; - - WRN("couldn't find icon definition for '%s'", icon); - return EINA_FALSE; -} - -static void -_tab_unselect(Efl_Ui_Tab_Bar_Data *sd, Tab_Info *ti) -{ - if ((!ti->tab) || (!ti->selected)) return; - - ti->selected = EINA_FALSE; - - efl_layout_signal_emit(ti->tab, "efl,state,unselected", "efl"); - if (ti->icon) - elm_widget_signal_emit(ti->icon, "efl,state,unselected", "efl"); - - sd->cur = -1; -} - -static void -_tab_select(Efl_Ui_Tab_Bar_Data *sd, Tab_Info *ti) -{ - if (!ti->selected) - { - Eo *tp; - tp = efl_parent_get(ti->tab); - int index; - - _tab_unselect(sd, sd->selected_tab); - ti->selected = EINA_TRUE; - sd->selected_tab = ti; - - efl_layout_signal_emit(ti->tab, "efl,state,selected", "efl"); - if (ti->icon) - elm_widget_signal_emit(ti->icon, "efl,state,selected", "efl"); - - index = eina_list_data_idx(sd->tab_infos, ti); - - sd->cur = index; - - efl_event_callback_call(tp, EFL_UI_EVENT_ITEM_SELECTED, NULL); - } -} - -static void -_action_click_cb(void *data, - Eo *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - Eo *tb; - Tab_Info *ti; - ti = data; - tb = efl_parent_get(ti->tab); - EFL_UI_TAB_BAR_DATA_GET(tb, sd); - - _tab_select(sd, ti); -} - -static Tab_Info * -_tab_add(Eo *obj, const char *label, const char *icon) -{ - Eo *tab, *icon_obj; - Tab_Info *ti; - Eina_Error theme_apply; - - ti = calloc(1, sizeof(*ti)); - - ti->tab = NULL; - ti->label = eina_stringshare_add(label); - - tab = efl_add(EFL_UI_LAYOUT_CLASS, obj, - efl_gfx_hint_align_set(efl_added, EVAS_HINT_FILL, EVAS_HINT_FILL)); - /* FIXME: This is for tab sizing issue. - * Recently, the size_hint_fill API has been added, - * but currently tab_bar is not available because it uses evas_object_box. - * This should be removed after the box in tab_bar has been replaced by efl.ui.box */ - - icon_obj = elm_icon_add(tab); - - if (_tab_icon_set(icon_obj, "toolbar/", icon)) - { - ti->icon = icon_obj; - ti->icon_str = eina_stringshare_add(icon); } else { - ti->icon = NULL; - ti->icon_str = NULL; - efl_del(icon_obj); + if (pd->selected) + efl_ui_selectable_selected_set(pd->selected, EINA_FALSE); + EINA_SAFETY_ON_FALSE_RETURN(!pd->selected); + pd->selected = ev->object; + efl_event_callback_call(data, EFL_UI_EVENT_ITEM_SELECTED, NULL); } +} - theme_apply = elm_widget_element_update(obj, tab, PART_NAME_TAB); +static void +_invalidate_cb(void *data, const Efl_Event *ev) +{ + Efl_Ui_Tab_Bar_Data *pd = efl_data_scope_safe_get(data, MY_CLASS); - if (theme_apply == EFL_UI_THEME_APPLY_ERROR_GENERIC) - CRI("Failed to set layout!"); + EINA_SAFETY_ON_NULL_RETURN(pd); + _remove_item(data, pd, ev->object); +} - efl_layout_signal_callback_add - (tab, "efl,action,click", "efl", ti,_action_click_cb, NULL); +EFL_CALLBACKS_ARRAY_DEFINE(item_listeners, + {EFL_UI_EVENT_SELECTED_CHANGED, _selelction_change_cb}, + {EFL_EVENT_INVALIDATE, _invalidate_cb}, +) - if (ti->icon) - efl_content_set(efl_part(tab, "efl.icon"), ti->icon); +static void +_remove_item(Eo *obj, Efl_Ui_Tab_Bar_Data *pd, Efl_Ui_Item *item) +{ + pd->tab_infos = eina_list_remove(pd->tab_infos, item); - if (ti->label) - efl_text_set(efl_part(tab, "efl.text"), ti->label); + if (pd->selected == item) + pd->selected = NULL; - efl_ui_widget_focus_allow_set(tab, EINA_TRUE); - - ti->tab = tab; - - return ti; + efl_event_callback_array_del(item, item_listeners(), obj); } EOLIAN static void _efl_ui_tab_bar_tab_add(Eo *obj, Efl_Ui_Tab_Bar_Data *sd, - int index, const char *label, const char *icon) + int index, Efl_Ui_Tab_Bar_Default_Item *tab) { - Tab_Info *ti; - ti = _tab_add(obj, label, icon); - - efl_parent_set(ti->tab, obj); - efl_ui_widget_sub_object_add(obj, ti->tab); - + efl_ui_item_container_set(tab, obj); + efl_ui_widget_sub_object_add(obj, tab); + efl_event_callback_array_add(tab, item_listeners(), obj); + efl_gfx_hint_align_set(tab, EVAS_HINT_FILL, EVAS_HINT_FILL); if (sd->cnt > index) { - Tab_Info *existing_ti; + Efl_Ui_Item *existing_ti; existing_ti = eina_list_nth(sd->tab_infos, index); - sd->tab_infos = eina_list_prepend_relative(sd->tab_infos, ti, existing_ti); - evas_object_box_insert_before(sd->bx, ti->tab, existing_ti->tab); - - if (sd->cur >= index) sd->cur ++; + sd->tab_infos = eina_list_prepend_relative(sd->tab_infos, tab, existing_ti); + evas_object_box_insert_before(sd->bx, tab, existing_ti); } else { - sd->tab_infos = eina_list_append(sd->tab_infos, ti); - evas_object_box_append(sd->bx, ti->tab); + sd->tab_infos = eina_list_append(sd->tab_infos, tab); + evas_object_box_append(sd->bx, tab); } sd->cnt ++; @@ -296,45 +111,10 @@ _efl_ui_tab_bar_tab_remove(Eo *obj EINA_UNUSED, Efl_Ui_Tab_Bar_Data *sd, int ind { if ((sd->cnt > 0) && (sd->cnt > index) && (index >= 0)) { - Tab_Info *ti; + Efl_Ui_Item *ti; ti = eina_list_nth(sd->tab_infos, index); - _tab_unselect(sd, ti); - evas_object_box_remove(sd->bx, ti->tab); - efl_del(ti->tab); - - sd->tab_infos = eina_list_remove(sd->tab_infos, ti); - sd->cnt --; - } -} - -EOLIAN static void -_efl_ui_tab_bar_tab_label_set(Eo *obj EINA_UNUSED, Efl_Ui_Tab_Bar_Data *sd, int index, const char *label) -{ - Tab_Info *ti; - ti = eina_list_nth(sd->tab_infos, index); - eina_stringshare_replace(&ti->label, label); - - efl_text_set(efl_part(ti->tab, "efl.text"), ti->label); -} - -EOLIAN static void -_efl_ui_tab_bar_tab_icon_set(Eo *obj, Efl_Ui_Tab_Bar_Data *sd, int index, const char *icon) -{ - Eo *icon_obj; - Tab_Info *ti; - ti = eina_list_nth(sd->tab_infos, index); - - if ((icon) && (ti->icon_str) && (!strcmp(icon, ti->icon_str))) return; - - icon_obj = elm_icon_add(obj); - if (!icon_obj) return; - if (_tab_icon_set(icon_obj, "toolbar/", icon)) - _tab_icon_obj_set(obj, ti, icon_obj, icon); - else - { - _tab_icon_obj_set(obj, ti, NULL, NULL); - efl_del(icon_obj); + efl_del(ti); } } @@ -386,16 +166,8 @@ _efl_ui_tab_bar_efl_object_constructor(Eo *obj, Efl_Ui_Tab_Bar_Data *sd) efl_content_set(efl_part(obj, "efl.content"), sd->bx); sd->cnt = 0; - sd->cur = -1; - - Tab_Info *ti = calloc(1, sizeof(*ti)); - sd->selected_tab = ti; return obj; } -/* Standard widget overrides */ - -ELM_WIDGET_KEY_DOWN_DEFAULT_IMPLEMENT(efl_ui_tab_bar, Efl_Ui_Tab_Bar_Data) - #include "efl_ui_tab_bar.eo.c" diff --git a/src/lib/elementary/efl_ui_tab_bar.eo b/src/lib/elementary/efl_ui_tab_bar.eo index c0be2aa90c..b65c5ff72c 100644 --- a/src/lib/elementary/efl_ui_tab_bar.eo +++ b/src/lib/elementary/efl_ui_tab_bar.eo @@ -1,4 +1,4 @@ -class @beta Efl.Ui.Tab_Bar extends Efl.Ui.Layout_Base +class @beta Efl.Ui.Tab_Bar extends Efl.Ui.Layout_Base implements Efl.Ui.Single_Selectable { [[Tab Bar class]] methods { @@ -13,8 +13,7 @@ class @beta Efl.Ui.Tab_Bar extends Efl.Ui.Layout_Base tab_add @beta { params { @in index: int; - @in label: string; - @in icon: string; + @in icon : Efl.Ui.Tab_Bar_Default_Item; } } tab_remove @beta { @@ -22,22 +21,9 @@ class @beta Efl.Ui.Tab_Bar extends Efl.Ui.Layout_Base @in index: int; } } - tab_label_set @beta { - params { - @in index: int; - @in label: string; - } - } - tab_icon_set @beta { - params { - @in index: int; - @in icon: string; - } - } } implements { Efl.Object.constructor; Efl.Object.destructor; - Efl.Ui.Widget.widget_input_event_handler; } } diff --git a/src/lib/elementary/efl_ui_tab_bar_default_item.c b/src/lib/elementary/efl_ui_tab_bar_default_item.c new file mode 100644 index 0000000000..b289a5d5c5 --- /dev/null +++ b/src/lib/elementary/efl_ui_tab_bar_default_item.c @@ -0,0 +1,74 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif + +#include + +#include "elm_priv.h" +#include "elm_part_helper.h" + +#define MY_CLASS EFL_UI_TAB_BAR_DEFAULT_ITEM_CLASS + +typedef struct { + Efl_Gfx_Image *icon; + const char *icon_name; +} Efl_Ui_Tab_Bar_Default_Item_Data; + +static void +_tab_icon_set_cb(void *data, + Eo *obj, + const char *emission, + const char *source) +{ + Efl_Ui_Item *ti = data; + + Efl_Ui_Image *new_img = efl_content_get(efl_part(obj, "efl.icon_new")); + efl_content_set(efl_part(obj, "efl.icon"), new_img); //this must be efl.icon here as obj is the edje object + + efl_layout_signal_callback_del(obj, emission, source, ti, _tab_icon_set_cb, NULL); + efl_layout_signal_emit(obj, "efl,state,icon,reset", "efl"); +} + +EOLIAN static void +_efl_ui_tab_bar_default_item_icon_set(Eo *obj, Efl_Ui_Tab_Bar_Default_Item_Data *pd, const char *standard_name) +{ + eina_stringshare_replace(&pd->icon_name, standard_name); + + //if there is a already a icon, create a animation + if (pd->icon) + { + Efl_Ui_Image *new_icon = efl_add(EFL_UI_IMAGE_CLASS, obj); + efl_content_set(efl_part(obj, "efl.icon_new"), new_icon); + efl_ui_image_icon_set(new_icon, standard_name); + efl_layout_signal_emit(obj, "efl,state,icon_new,set", "efl"); + efl_layout_signal_callback_add + (obj, "efl,state,icon_set,done", "efl", obj, _tab_icon_set_cb, NULL); + } + else + { + pd->icon = efl_add(EFL_UI_IMAGE_CLASS, obj); + efl_content_set(efl_part(obj,"icon"), pd->icon); + efl_ui_image_icon_set(pd->icon, standard_name); + } +} + +EOLIAN static const char* +_efl_ui_tab_bar_default_item_icon_get(const Eo *obj EINA_UNUSED, Efl_Ui_Tab_Bar_Default_Item_Data *pd) +{ + return pd->icon_name; +} + +EOLIAN static Efl_Object * +_efl_ui_tab_bar_default_item_efl_object_constructor(Eo *obj, Efl_Ui_Tab_Bar_Default_Item_Data *pd EINA_UNUSED) +{ + Eo *eo; + + eo = efl_constructor(efl_super(obj, MY_CLASS)); + + if (!elm_widget_theme_klass_get(obj)) + elm_widget_theme_klass_set(obj, "tab_bar/tab"); + + return eo; +} + +#include "efl_ui_tab_bar_default_item.eo.c" diff --git a/src/lib/elementary/efl_ui_tab_bar_default_item.eo b/src/lib/elementary/efl_ui_tab_bar_default_item.eo new file mode 100644 index 0000000000..22034d8957 --- /dev/null +++ b/src/lib/elementary/efl_ui_tab_bar_default_item.eo @@ -0,0 +1,18 @@ +class @beta Efl.Ui.Tab_Bar_Default_Item extends Efl.Ui.Default_Item +{ + [[ A icon that represents the default parts in the appearance of the tab bar. ]] + methods { + @property icon { + [[Set the content of the default item as a image. + + The content will be re-set (means, the old content is deleted). + ]] + values { + standard_name : string; [[The icon name, names are defined as standard free desktop icon names.]] + } + } + } + implements { + Efl.Object.constructor; + } +} diff --git a/src/lib/elementary/efl_ui_tab_bar_private.h b/src/lib/elementary/efl_ui_tab_bar_private.h index 04000fa406..41c243cc37 100644 --- a/src/lib/elementary/efl_ui_tab_bar_private.h +++ b/src/lib/elementary/efl_ui_tab_bar_private.h @@ -2,31 +2,17 @@ #define EFL_UI_TAB_BAR_PRIVATE_H typedef struct _Efl_Ui_Tab_Bar_Data Efl_Ui_Tab_Bar_Data; -typedef struct _Tab_Info Tab_Info; struct _Efl_Ui_Tab_Bar_Data { Efl_Canvas_Object *bx; int cnt; - int cur; Efl_Ui_Layout_Orientation dir; Eina_List *tab_infos; - Tab_Info *selected_tab; + Efl_Ui_Item *selected; }; -struct _Tab_Info -{ - Eo *tab; - - const char *label; - const char *icon_str; - Eo *icon; - - Eina_Bool selected : 1; -}; - - #define EFL_UI_TAB_BAR_DATA_GET(o, sd) \ Efl_Ui_Tab_Bar_Data *sd = efl_data_scope_get(o, EFL_UI_TAB_BAR_CLASS) diff --git a/src/lib/elementary/efl_ui_tab_page.c b/src/lib/elementary/efl_ui_tab_page.c index cb17b98bcf..becadca5cc 100644 --- a/src/lib/elementary/efl_ui_tab_page.c +++ b/src/lib/elementary/efl_ui_tab_page.c @@ -4,7 +4,7 @@ #define EFL_PART_PROTECTED -#include +#include #include "elm_priv.h" #include "efl_ui_tab_page_private.h" #include "elm_part_helper.h" @@ -110,6 +110,7 @@ _efl_ui_tab_page_part_tab_icon_set(Eo *obj, void *_pd EINA_UNUSED, const char *p Efl_Ui_Tab_Page_Data *sd = efl_data_scope_get(pd->obj, EFL_UI_TAB_PAGE_CLASS); eina_stringshare_replace(&sd->tab_icon, path); + efl_ui_tab_bar_default_item_icon_set(sd->tab_bar_icon, sd->tab_icon); Efl_Ui_Tab_Page_Tab_Changed_Event event; event.changed_info = EFL_UI_TAB_PAGE_TAB_CHANGED_ICON; @@ -133,6 +134,7 @@ _efl_ui_tab_page_part_tab_efl_text_text_set(Eo *obj, void *_pd EINA_UNUSED, cons Efl_Ui_Tab_Page_Data *sd = efl_data_scope_get(pd->obj, EFL_UI_TAB_PAGE_CLASS); eina_stringshare_replace(&sd->tab_label, text); + efl_text_set(sd->tab_bar_icon, sd->tab_label); Efl_Ui_Tab_Page_Tab_Changed_Event event; event.changed_info = EFL_UI_TAB_PAGE_TAB_CHANGED_LABEL; @@ -149,6 +151,20 @@ _efl_ui_tab_page_part_tab_efl_text_text_get(const Eo *obj, void *_pd EINA_UNUSED return sd->tab_label; } +EOLIAN static Efl_Ui_Tab_Bar_Default_Item* +_efl_ui_tab_page_tab_bar_item_get(const Eo *obj, Efl_Ui_Tab_Page_Data *pd) +{ + if (!pd->tab_bar_icon) + { + pd->tab_bar_icon = efl_add(EFL_UI_TAB_BAR_DEFAULT_ITEM_CLASS, (Eo*)obj); + efl_text_set(pd->tab_bar_icon, pd->tab_label); + efl_ui_tab_bar_default_item_icon_set(pd->tab_bar_icon, pd->tab_icon); + } + + return pd->tab_bar_icon; +} + + #include "efl_ui_tab_page_part_tab.eo.c" /* Efl.Part end */ diff --git a/src/lib/elementary/efl_ui_tab_page.eo b/src/lib/elementary/efl_ui_tab_page.eo index 8542eb0e12..0841417345 100644 --- a/src/lib/elementary/efl_ui_tab_page.eo +++ b/src/lib/elementary/efl_ui_tab_page.eo @@ -13,6 +13,19 @@ class @beta Efl.Ui.Tab_Page extends Efl.Ui.Layout_Base implements Efl.Content { [[Tab Page class]] methods { + @property tab_bar_item { + [[Get this page represented as a @Efl.Ui.Tab_Bar_Default_Item + + The object returned here will reflect all the properties from the part here. Properties will be automatically updated. + This property is unique per @Efl.Ui.Tab_Page + ]] + get { + + } + values { + item : Efl.Ui.Tab_Bar_Default_Item; [[The @Efl.Ui.Tab_Bar_Default_Item for the tab bar]] + } + } } parts { tab: Efl.Ui.Tab_Page_Part_Tab; diff --git a/src/lib/elementary/efl_ui_tab_page_private.h b/src/lib/elementary/efl_ui_tab_page_private.h index 44153647c4..4aaf23390d 100644 --- a/src/lib/elementary/efl_ui_tab_page_private.h +++ b/src/lib/elementary/efl_ui_tab_page_private.h @@ -8,6 +8,7 @@ struct _Efl_Ui_Tab_Page_Data Eo *content; const char *tab_label; const char *tab_icon; + Eo *tab_bar_icon; }; @@ -25,4 +26,4 @@ struct _Efl_Ui_Tab_Page_Data #include "efl_ui_tab_page_part_tab.eo.h" -#endif \ No newline at end of file +#endif diff --git a/src/lib/elementary/efl_ui_tab_pager.c b/src/lib/elementary/efl_ui_tab_pager.c index 99f78b75aa..5e03d6df80 100644 --- a/src/lib/elementary/efl_ui_tab_pager.c +++ b/src/lib/elementary/efl_ui_tab_pager.c @@ -3,7 +3,7 @@ #endif -#include +#include #include "elm_priv.h" #include "efl_ui_tab_pager_private.h" @@ -29,31 +29,6 @@ _tab_select_cb(void *data, const Efl_Event *event) efl_ui_spotlight_active_index_set(data, index); } -static void -_tab_changed_cb(void *data, const Efl_Event *event) -{ - Efl_Ui_Tab_Page_Tab_Changed_Event *ev = event->info; - int index; - - EFL_UI_TAB_PAGER_DATA_GET(data, sd); - EFL_UI_TAB_PAGE_DATA_GET(event->object, pd); - index = eina_list_data_idx(sd->tab_pages, event->object); - - switch (ev->changed_info) - { - case EFL_UI_TAB_PAGE_TAB_CHANGED_LABEL: - efl_ui_tab_bar_tab_label_set(sd->tab_bar, index, pd->tab_label); - break; - - case EFL_UI_TAB_PAGE_TAB_CHANGED_ICON: - efl_ui_tab_bar_tab_icon_set(sd->tab_bar, index, pd->tab_icon); - break; - - default: - break; - } -} - EOLIAN static void _efl_ui_tab_pager_tab_bar_set(Eo *obj, Efl_Ui_Tab_Pager_Data *sd, Efl_Canvas_Object *tab_bar) { @@ -125,8 +100,6 @@ _efl_ui_tab_pager_efl_pack_pack_clear(Eo *obj, Efl_Ui_Tab_Pager_Data *sd) int begin_index = 0; EINA_LIST_FOREACH_SAFE(sd->tab_pages, l, l_next, subobj) { - efl_event_callback_del(subobj, EFL_UI_TAB_PAGE_EVENT_TAB_CHANGED, _tab_changed_cb, obj); - sd->tab_pages = eina_list_remove(sd->tab_pages, subobj); sd->cnt--; @@ -149,8 +122,6 @@ _efl_ui_tab_pager_efl_pack_unpack_all(Eo *obj, Efl_Ui_Tab_Pager_Data *sd) int begin_index = 0; EINA_LIST_FOREACH_SAFE(sd->tab_pages, l, l_next, subobj) { - efl_event_callback_del(subobj, EFL_UI_TAB_PAGE_EVENT_TAB_CHANGED, _tab_changed_cb, obj); - sd->tab_pages = eina_list_remove(sd->tab_pages, subobj); sd->cnt--; @@ -168,8 +139,6 @@ _efl_ui_tab_pager_efl_pack_unpack(Eo *obj, Efl_Ui_Tab_Pager_Data *sd, Efl_Gfx_En { if (sd->tab_bar) { - efl_event_callback_del(subobj, EFL_UI_TAB_PAGE_EVENT_TAB_CHANGED, _tab_changed_cb, obj); - int index = eina_list_data_idx(sd->tab_pages, (void *)subobj); sd->tab_pages = eina_list_remove(sd->tab_pages, subobj); @@ -191,19 +160,16 @@ _efl_ui_tab_pager_efl_pack_linear_pack_begin(Eo *obj, { if (sd->tab_bar) { - EFL_UI_TAB_PAGE_DATA_GET(subobj, pd); int begin_index = 0; sd->tab_pages = eina_list_prepend(sd->tab_pages, subobj); sd->cnt ++; - efl_ui_tab_bar_tab_add(sd->tab_bar, begin_index, pd->tab_label, pd->tab_icon); + efl_ui_tab_bar_tab_add(sd->tab_bar, begin_index, efl_ui_tab_page_tab_bar_item_get(subobj)); efl_pack_begin(efl_super(obj, MY_CLASS), subobj); sd->cur ++; - efl_event_callback_add(subobj, EFL_UI_TAB_PAGE_EVENT_TAB_CHANGED, _tab_changed_cb, obj); - return EINA_TRUE; } else return EINA_FALSE; @@ -216,17 +182,14 @@ _efl_ui_tab_pager_efl_pack_linear_pack_end(Eo *obj, { if (sd->tab_bar) { - EFL_UI_TAB_PAGE_DATA_GET(subobj, pd); int end_index = efl_ui_tab_bar_tab_count(sd->tab_bar); sd->tab_pages = eina_list_append(sd->tab_pages, subobj); sd->cnt ++; - efl_ui_tab_bar_tab_add(sd->tab_bar, end_index, pd->tab_label, pd->tab_icon); + efl_ui_tab_bar_tab_add(sd->tab_bar, end_index, efl_ui_tab_page_tab_bar_item_get(subobj)); efl_pack_end(efl_super(obj, MY_CLASS), subobj); - efl_event_callback_add(subobj, EFL_UI_TAB_PAGE_EVENT_TAB_CHANGED, _tab_changed_cb, obj); - return EINA_TRUE; } else return EINA_FALSE; @@ -240,19 +203,16 @@ _efl_ui_tab_pager_efl_pack_linear_pack_before(Eo *obj, { if (sd->tab_bar) { - EFL_UI_TAB_PAGE_DATA_GET(subobj, pd); int before_index = eina_list_data_idx(sd->tab_pages, (void *)existing); sd->tab_pages = eina_list_prepend_relative(sd->tab_pages, subobj, existing); sd->cnt ++; - efl_ui_tab_bar_tab_add(sd->tab_bar, before_index, pd->tab_label, pd->tab_icon); + efl_ui_tab_bar_tab_add(sd->tab_bar, before_index, efl_ui_tab_page_tab_bar_item_get(subobj)); efl_pack_before(efl_super(obj, MY_CLASS), subobj, existing); if (sd->cur >= before_index) sd->cur ++; - efl_event_callback_add(subobj, EFL_UI_TAB_PAGE_EVENT_TAB_CHANGED, _tab_changed_cb, obj); - return EINA_TRUE; } else return EINA_FALSE; @@ -266,19 +226,16 @@ _efl_ui_tab_pager_efl_pack_linear_pack_after(Eo *obj, { if (sd->tab_bar) { - EFL_UI_TAB_PAGE_DATA_GET(subobj, pd); int after_index = eina_list_data_idx(sd->tab_pages, (void *)existing) + 1; sd->tab_pages = eina_list_append_relative(sd->tab_pages, subobj, existing); sd->cnt ++; - efl_ui_tab_bar_tab_add(sd->tab_bar, after_index, pd->tab_label, pd->tab_icon); + efl_ui_tab_bar_tab_add(sd->tab_bar, after_index, efl_ui_tab_page_tab_bar_item_get(subobj)); efl_pack_after(efl_super(obj, MY_CLASS), subobj, existing); if (sd->cur > after_index) sd->cur ++; - efl_event_callback_add(subobj, EFL_UI_TAB_PAGE_EVENT_TAB_CHANGED, _tab_changed_cb, obj); - return EINA_TRUE; } else return EINA_FALSE; @@ -293,19 +250,16 @@ _efl_ui_tab_pager_efl_pack_linear_pack_at(Eo *obj, if (sd->tab_bar) { Efl_Gfx_Entity *existing = NULL; - EFL_UI_TAB_PAGE_DATA_GET(subobj, pd); existing = eina_list_nth(sd->tab_pages, index); sd->tab_pages = eina_list_prepend_relative(sd->tab_pages, subobj, existing); sd->cnt ++; - efl_ui_tab_bar_tab_add(sd->tab_bar, index, pd->tab_label, pd->tab_icon); + efl_ui_tab_bar_tab_add(sd->tab_bar, index, efl_ui_tab_page_tab_bar_item_get(subobj)); efl_pack_at(efl_super(obj, MY_CLASS), subobj, index); if (sd->cur >= index) sd->cur ++; - efl_event_callback_add(subobj, EFL_UI_TAB_PAGE_EVENT_TAB_CHANGED, _tab_changed_cb, obj); - return EINA_TRUE; } else return EINA_FALSE; @@ -320,8 +274,6 @@ _efl_ui_tab_pager_efl_pack_linear_pack_unpack_at(Eo *obj, Efl_Ui_Tab_Pager_Data existing = eina_list_nth(sd->tab_pages, index); if (!existing) return NULL; - efl_event_callback_del(existing, EFL_UI_TAB_PAGE_EVENT_TAB_CHANGED, _tab_changed_cb, obj); - sd->tab_pages = eina_list_remove(sd->tab_pages, existing); sd->cnt--; diff --git a/src/lib/elementary/meson.build b/src/lib/elementary/meson.build index 3722efef0d..ba052457c9 100644 --- a/src/lib/elementary/meson.build +++ b/src/lib/elementary/meson.build @@ -182,6 +182,7 @@ pub_eo_files = [ 'efl_ui_multi_selectable.eo', 'efl_ui_single_selectable.eo', 'efl_ui_position_manager_data_access_v1.eo', + 'efl_ui_tab_bar_default_item.eo', ] foreach eo_file : pub_eo_files @@ -939,6 +940,7 @@ elementary_src = [ 'efl_ui_position_manager_entity.c', 'efl_ui_position_manager_list.c', 'efl_ui_position_manager_grid.c', + 'efl_ui_tab_bar_default_item.c' ] elementary_deps = [emile, eo, efl, edje, ethumb, ethumb_client, emotion, ecore_imf, ecore_con, eldbus, efreet, efreet_mime, efreet_trash, eio, atspi, dl, intl]