efl_ui_tab_bar: implement efl.ui.single_selectable

this is for now the simples way IMO, the one or another implementation
thing in efl_ui_tab_pager is a little bit clumsy, but that should be
able to be improved once Efl.Pack_Linear is implemented.

Reviewed-by: WooHyun Jung <woohyun0705@gmail.com>
Differential Revision: https://phab.enlightenment.org/D9729
This commit is contained in:
Marcel Hollerbach 2019-08-23 17:51:49 +02:00
parent f52a0b25f3
commit 3c317618e5
4 changed files with 68 additions and 22 deletions

View File

@ -11,19 +11,11 @@
#define MY_CLASS EFL_UI_TAB_BAR_CLASS #define MY_CLASS EFL_UI_TAB_BAR_CLASS
#define MY_CLASS_NAME "Efl.Ui.Tab_Bar" #define MY_CLASS_NAME "Efl.Ui.Tab_Bar"
EOLIAN static void
_efl_ui_tab_bar_current_tab_set(Eo *obj EINA_UNUSED, Efl_Ui_Tab_Bar_Data *sd, int index)
{
Efl_Ui_Item *item;
item = eina_list_nth(sd->tab_infos, index);
efl_ui_selectable_selected_set(item, EINA_TRUE); EOLIAN static Efl_Ui_Selectable*
} _efl_ui_tab_bar_efl_ui_single_selectable_last_selected_get(const Eo *obj EINA_UNUSED, Efl_Ui_Tab_Bar_Data *pd)
EOLIAN static int
_efl_ui_tab_bar_current_tab_get(const Eo *obj EINA_UNUSED, Efl_Ui_Tab_Bar_Data *sd)
{ {
return eina_list_data_idx(sd->tab_infos, sd->selected); return pd->selected;
} }
EOLIAN static unsigned int EOLIAN static unsigned int
@ -32,6 +24,20 @@ _efl_ui_tab_bar_tab_count(const Eo *obj EINA_UNUSED, Efl_Ui_Tab_Bar_Data *sd)
return sd->cnt; return sd->cnt;
} }
EOLIAN static void
_efl_ui_tab_bar_efl_ui_single_selectable_fallback_selection_set(Eo *obj EINA_UNUSED, Efl_Ui_Tab_Bar_Data *pd, Efl_Ui_Selectable *fallback)
{
pd->fallback_selection = fallback;
if (!pd->selected)
efl_ui_selectable_selected_set(pd->fallback_selection, EINA_TRUE);
}
EOLIAN static Efl_Ui_Selectable*
_efl_ui_tab_bar_efl_ui_single_selectable_fallback_selection_get(const Eo *obj EINA_UNUSED, Efl_Ui_Tab_Bar_Data *pd)
{
return pd->fallback_selection;
}
static void _remove_item(Eo *obj, Efl_Ui_Tab_Bar_Data *pd, Efl_Ui_Item *item); static void _remove_item(Eo *obj, Efl_Ui_Tab_Bar_Data *pd, Efl_Ui_Item *item);
static void static void
@ -45,15 +51,27 @@ _selelction_change_cb(void *data, const Efl_Event *ev)
{ {
pd->selected = NULL; pd->selected = NULL;
} }
//checkout if we want to do fallback handling
if (!pd->in_value_change)
{
if (!pd->selected && pd->fallback_selection)
efl_ui_selectable_selected_set(pd->fallback_selection, EINA_TRUE);
}
} }
else else
{ {
pd->in_value_change = EINA_TRUE;
if (pd->selected) if (pd->selected)
efl_ui_selectable_selected_set(pd->selected, EINA_FALSE); efl_ui_selectable_selected_set(pd->selected, EINA_FALSE);
pd->in_value_change = EINA_FALSE;
EINA_SAFETY_ON_FALSE_RETURN(!pd->selected); EINA_SAFETY_ON_FALSE_RETURN(!pd->selected);
pd->selected = ev->object; pd->selected = ev->object;
efl_event_callback_call(data, EFL_UI_EVENT_ITEM_SELECTED, NULL); efl_event_callback_call(data, EFL_UI_EVENT_ITEM_SELECTED, NULL);
} }
if (!pd->in_value_change)
{
efl_event_callback_call(data, EFL_UI_SINGLE_SELECTABLE_EVENT_SELECTION_CHANGED, NULL);
}
} }
static void static void

View File

@ -2,11 +2,6 @@ class @beta Efl.Ui.Tab_Bar extends Efl.Ui.Layout_Base implements Efl.Ui.Single_S
{ {
[[Tab Bar class]] [[Tab Bar class]]
methods { methods {
@property current_tab {
values {
index: int;
}
}
tab_count @const { tab_count @const {
return: uint; return: uint;
} }
@ -25,5 +20,22 @@ class @beta Efl.Ui.Tab_Bar extends Efl.Ui.Layout_Base implements Efl.Ui.Single_S
implements { implements {
Efl.Object.constructor; Efl.Object.constructor;
Efl.Object.destructor; Efl.Object.destructor;
Efl.Ui.Single_Selectable.last_selected {get;}
Efl.Ui.Single_Selectable.fallback_selection {get; set;}
Efl.Pack.pack;
Efl.Pack.pack_clear;
Efl.Pack.unpack_all;
Efl.Pack.unpack;
Efl.Pack_Linear.pack_unpack_at;
Efl.Pack_Linear.pack_begin;
Efl.Pack_Linear.pack_end;
Efl.Pack_Linear.pack_before;
Efl.Pack_Linear.pack_after;
Efl.Pack_Linear.pack_at;
Efl.Container.content_count;
Efl.Container.content_iterate;
}
composite {
Efl.Pack_Linear;
} }
} }

View File

@ -8,9 +8,9 @@ struct _Efl_Ui_Tab_Bar_Data
Efl_Canvas_Object *bx; Efl_Canvas_Object *bx;
int cnt; int cnt;
Efl_Ui_Layout_Orientation dir; Efl_Ui_Layout_Orientation dir;
Eina_List *tab_infos; Eina_List *tab_infos;
Efl_Ui_Item *selected; Efl_Ui_Item *selected, *fallback_selection;
Eina_Bool in_value_change;
}; };
#define EFL_UI_TAB_BAR_DATA_GET(o, sd) \ #define EFL_UI_TAB_BAR_DATA_GET(o, sd) \

View File

@ -18,15 +18,31 @@ _select(Eo *obj, int index)
if (sd->cnt > index) sd->cur = index; if (sd->cnt > index) sd->cur = index;
else sd->cur = 0; else sd->cur = 0;
efl_ui_tab_bar_current_tab_set(sd->tab_bar, sd->cur); Efl_Ui_Tab_Page *page = eina_list_nth(sd->tab_pages, sd->cur);
efl_ui_selectable_selected_set(efl_ui_tab_page_tab_bar_item_get(page), EINA_TRUE);
} }
static void static void
_tab_select_cb(void *data, const Efl_Event *event) _tab_select_cb(void *data, const Efl_Event *event)
{ {
int index = efl_ui_tab_bar_current_tab_get(event->object); Eina_List *n;
if (efl_ui_spotlight_active_index_get(data) != index) Efl_Ui_Tab_Page *p;
efl_ui_spotlight_active_index_set(data, index); EFL_UI_TAB_PAGER_DATA_GET(data, sd);
int i = 0;
//FIXME this is super clumsy, this can be improved later on
Efl_Ui_Tab_Bar_Default_Item *selected;
selected = efl_ui_single_selectable_last_selected_get(event->object);
EINA_LIST_FOREACH(sd->tab_pages, n, p)
{
if (efl_ui_tab_page_tab_bar_item_get(p) == selected)
{
if (efl_ui_spotlight_active_index_get(data) != i)
efl_ui_spotlight_active_index_set(data, i);
}
i++;
}
} }
EOLIAN static void EOLIAN static void