efl_ui_tab_pager: make this compatible with Efl.Pack_Linear test suite

the testsuite now is happy with the behaviour in there. Additionally,
the internals are cleaned up, fields that are not used anymore are
deleted, and the logic maintaining them as well.

Reviewed-by: WooHyun Jung <woohyun0705@gmail.com>
Differential Revision: https://phab.enlightenment.org/D9732
This commit is contained in:
Marcel Hollerbach 2019-08-23 19:34:53 +02:00
parent 3cc427234e
commit 7f94410a90
3 changed files with 37 additions and 179 deletions

View File

@ -14,11 +14,7 @@
static void static void
_select(Eo *obj, int index) _select(Eo *obj, int index)
{ {
EFL_UI_TAB_PAGER_DATA_GET(obj, sd); Efl_Ui_Tab_Page *page = efl_pack_content_get(obj, index);
if (sd->cnt > index) sd->cur = index;
else sd->cur = 0;
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); efl_ui_selectable_selected_set(efl_ui_tab_page_tab_bar_item_get(page), EINA_TRUE);
} }
@ -26,23 +22,14 @@ _select(Eo *obj, int index)
static void static void
_tab_select_cb(void *data, const Efl_Event *event) _tab_select_cb(void *data, const Efl_Event *event)
{ {
Eina_List *n;
Efl_Ui_Tab_Page *p;
EFL_UI_TAB_PAGER_DATA_GET(data, sd); 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; Efl_Ui_Tab_Bar_Default_Item *selected;
int i = 0;
selected = efl_ui_single_selectable_last_selected_get(event->object); selected = efl_ui_single_selectable_last_selected_get(event->object);
EINA_LIST_FOREACH(sd->tab_pages, n, p) i = efl_pack_index_get(sd->tab_bar, selected);
{
if (efl_ui_tab_page_tab_bar_item_get(p) == selected)
{
if (efl_ui_spotlight_active_index_get(data) != i) if (efl_ui_spotlight_active_index_get(data) != i)
efl_ui_spotlight_active_index_set(data, i); efl_ui_spotlight_active_index_set(data, i);
}
i++;
}
} }
EOLIAN static Efl_Canvas_Object * EOLIAN static Efl_Canvas_Object *
@ -79,8 +66,6 @@ _efl_ui_tab_pager_efl_object_constructor(Eo *obj, Efl_Ui_Tab_Pager_Data *sd)
sd->tab_bar = efl_add(EFL_UI_TAB_BAR_CLASS, obj); sd->tab_bar = efl_add(EFL_UI_TAB_BAR_CLASS, obj);
efl_event_callback_add(sd->tab_bar, EFL_UI_EVENT_ITEM_SELECTED, _tab_select_cb, obj); efl_event_callback_add(sd->tab_bar, EFL_UI_EVENT_ITEM_SELECTED, _tab_select_cb, obj);
sd->cur = 0;
sd->cnt = 0;
return obj; return obj;
} }
@ -95,66 +80,30 @@ _efl_ui_tab_pager_efl_object_finalize(Eo *obj, Efl_Ui_Tab_Pager_Data *pd)
return obj; return obj;
} }
EOLIAN static int
_efl_ui_tab_pager_efl_container_content_count(Eo *obj EINA_UNUSED, Efl_Ui_Tab_Pager_Data *sd)
{
return sd->cnt;
}
EOLIAN static Eina_Bool EOLIAN static Eina_Bool
_efl_ui_tab_pager_efl_pack_pack_clear(Eo *obj, Efl_Ui_Tab_Pager_Data *sd) _efl_ui_tab_pager_efl_pack_pack_clear(Eo *obj, Efl_Ui_Tab_Pager_Data *sd)
{ {
if (sd->tab_bar) if (!efl_pack_clear(sd->tab_bar))
{
Eo *subobj;
Eina_List *l, *l_next;
EINA_LIST_FOREACH_SAFE(sd->tab_pages, l, l_next, subobj)
{
sd->tab_pages = eina_list_remove(sd->tab_pages, subobj);
sd->cnt--;
}
efl_pack_clear(sd->tab_bar);
efl_pack_clear(efl_super(obj, MY_CLASS));
return EINA_TRUE;
}
return EINA_FALSE; return EINA_FALSE;
return efl_pack_clear(efl_super(obj, MY_CLASS));
} }
EOLIAN static Eina_Bool EOLIAN static Eina_Bool
_efl_ui_tab_pager_efl_pack_unpack_all(Eo *obj, Efl_Ui_Tab_Pager_Data *sd) _efl_ui_tab_pager_efl_pack_unpack_all(Eo *obj, Efl_Ui_Tab_Pager_Data *sd)
{ {
if (sd->tab_bar) if (!efl_pack_unpack_all(sd->tab_bar))
{
Eo *subobj;
Eina_List *l, *l_next;
EINA_LIST_FOREACH_SAFE(sd->tab_pages, l, l_next, subobj)
{
sd->tab_pages = eina_list_remove(sd->tab_pages, subobj);
sd->cnt--;
}
efl_pack_unpack_all(sd->tab_bar);
efl_pack_unpack_all(efl_super(obj, MY_CLASS));
return EINA_TRUE;
}
return EINA_FALSE; return EINA_FALSE;
return efl_pack_unpack_all(efl_super(obj, MY_CLASS));
} }
#define ITEM(s) efl_ui_tab_page_tab_bar_item_get(s)
EOLIAN static Eina_Bool EOLIAN static Eina_Bool
_efl_ui_tab_pager_efl_pack_unpack(Eo *obj, Efl_Ui_Tab_Pager_Data *sd, Efl_Gfx_Entity *subobj) _efl_ui_tab_pager_efl_pack_unpack(Eo *obj, Efl_Ui_Tab_Pager_Data *sd, Efl_Gfx_Entity *subobj)
{ {
if (sd->tab_bar) if (!efl_pack_unpack(sd->tab_bar, ITEM(subobj)))
{
sd->tab_pages = eina_list_remove(sd->tab_pages, subobj);
sd->cnt--;
efl_pack_unpack(sd->tab_bar, efl_ui_tab_page_tab_bar_item_get(subobj));
efl_pack_unpack(efl_super(obj, MY_CLASS), subobj);
return EINA_TRUE;
}
return EINA_FALSE; return EINA_FALSE;
return efl_pack_unpack(efl_super(obj, MY_CLASS), subobj);
} }
EOLIAN static Eina_Bool EOLIAN static Eina_Bool
@ -162,20 +111,9 @@ _efl_ui_tab_pager_efl_pack_linear_pack_begin(Eo *obj,
Efl_Ui_Tab_Pager_Data *sd, Efl_Ui_Tab_Pager_Data *sd,
Efl_Gfx_Entity *subobj) Efl_Gfx_Entity *subobj)
{ {
if (sd->tab_bar) if (!efl_pack_begin(sd->tab_bar, ITEM(subobj)))
{ return EINA_FALSE;
return efl_pack_begin(efl_super(obj, MY_CLASS), subobj);
sd->tab_pages = eina_list_prepend(sd->tab_pages, subobj);
sd->cnt ++;
efl_pack_begin(sd->tab_bar, efl_ui_tab_page_tab_bar_item_get(subobj));
efl_pack_begin(efl_super(obj, MY_CLASS), subobj);
sd->cur ++;
return EINA_TRUE;
}
else return EINA_FALSE;
} }
EOLIAN static Eina_Bool EOLIAN static Eina_Bool
@ -183,17 +121,9 @@ _efl_ui_tab_pager_efl_pack_linear_pack_end(Eo *obj,
Efl_Ui_Tab_Pager_Data *sd, Efl_Ui_Tab_Pager_Data *sd,
Efl_Gfx_Entity *subobj) Efl_Gfx_Entity *subobj)
{ {
if (sd->tab_bar) if (!efl_pack_end(sd->tab_bar, ITEM(subobj)))
{ return EINA_FALSE;
sd->tab_pages = eina_list_append(sd->tab_pages, subobj); return efl_pack_end(efl_super(obj, MY_CLASS), subobj);
sd->cnt ++;
efl_pack_end(sd->tab_bar, efl_ui_tab_page_tab_bar_item_get(subobj));
efl_pack_end(efl_super(obj, MY_CLASS), subobj);
return EINA_TRUE;
}
else return EINA_FALSE;
} }
EOLIAN static Eina_Bool EOLIAN static Eina_Bool
@ -202,21 +132,9 @@ _efl_ui_tab_pager_efl_pack_linear_pack_before(Eo *obj,
Efl_Gfx_Entity *subobj, Efl_Gfx_Entity *subobj,
const Efl_Gfx_Entity *existing) const Efl_Gfx_Entity *existing)
{ {
if (sd->tab_bar) if (!efl_pack_before(sd->tab_bar, ITEM(subobj), ITEM(existing)))
{ return EINA_FALSE;
int before_index = eina_list_data_idx(sd->tab_pages, (void *)existing); return efl_pack_before(efl_super(obj, MY_CLASS), subobj, existing);
sd->tab_pages = eina_list_prepend_relative(sd->tab_pages, subobj, existing);
sd->cnt ++;
efl_pack_before(sd->tab_bar, efl_ui_tab_page_tab_bar_item_get(subobj), existing);
efl_pack_before(efl_super(obj, MY_CLASS), subobj, existing);
if (sd->cur >= before_index) sd->cur ++;
return EINA_TRUE;
}
else return EINA_FALSE;
} }
EOLIAN static Eina_Bool EOLIAN static Eina_Bool
@ -225,21 +143,9 @@ _efl_ui_tab_pager_efl_pack_linear_pack_after(Eo *obj,
Efl_Gfx_Entity *subobj, Efl_Gfx_Entity *subobj,
const Efl_Gfx_Entity *existing) const Efl_Gfx_Entity *existing)
{ {
if (sd->tab_bar) if (!efl_pack_after(sd->tab_bar, ITEM(subobj), ITEM(existing)))
{ return EINA_FALSE;
int after_index = eina_list_data_idx(sd->tab_pages, (void *)existing) + 1; return efl_pack_after(efl_super(obj, MY_CLASS), subobj, existing);
sd->tab_pages = eina_list_append_relative(sd->tab_pages, subobj, existing);
sd->cnt ++;
efl_pack_after(sd->tab_bar, efl_ui_tab_page_tab_bar_item_get(subobj), existing);
efl_pack_after(efl_super(obj, MY_CLASS), subobj, existing);
if (sd->cur > after_index) sd->cur ++;
return EINA_TRUE;
}
else return EINA_FALSE;
} }
EOLIAN static Eina_Bool EOLIAN static Eina_Bool
@ -248,58 +154,17 @@ _efl_ui_tab_pager_efl_pack_linear_pack_at(Eo *obj,
Efl_Gfx_Entity *subobj, Efl_Gfx_Entity *subobj,
int index) int index)
{ {
if (sd->tab_bar) if (!efl_pack_at(sd->tab_bar, ITEM(subobj), index))
{ return EINA_FALSE;
Efl_Gfx_Entity *existing = NULL; return efl_pack_at(efl_super(obj, MY_CLASS), subobj, index);
existing = eina_list_nth(sd->tab_pages, index);
sd->tab_pages = eina_list_prepend_relative(sd->tab_pages, subobj, existing);
sd->cnt ++;
efl_pack_at(sd->tab_bar, efl_ui_tab_page_tab_bar_item_get(subobj), index);
efl_pack_at(efl_super(obj, MY_CLASS), subobj, index);
if (sd->cur >= index) sd->cur ++;
return EINA_TRUE;
}
else return EINA_FALSE;
} }
EOLIAN static Efl_Gfx_Entity * EOLIAN static Efl_Gfx_Entity *
_efl_ui_tab_pager_efl_pack_linear_pack_unpack_at(Eo *obj, Efl_Ui_Tab_Pager_Data *sd, int index) _efl_ui_tab_pager_efl_pack_linear_pack_unpack_at(Eo *obj, Efl_Ui_Tab_Pager_Data *sd, int index)
{ {
if (sd->tab_bar) if (!efl_pack_unpack_at(sd->tab_bar, index))
{
Efl_Gfx_Entity *existing = NULL;
existing = eina_list_nth(sd->tab_pages, index);
if (!existing) return NULL;
sd->tab_pages = eina_list_remove(sd->tab_pages, existing);
sd->cnt--;
efl_pack_unpack_at(sd->tab_bar, index);
efl_pack_unpack_at(efl_super(obj, MY_CLASS), index);
return existing;
}
return NULL; return NULL;
} return efl_pack_unpack_at(efl_super(obj, MY_CLASS), index);
EOLIAN static Efl_Gfx_Entity *
_efl_ui_tab_pager_efl_pack_linear_pack_content_get(Eo *obj EINA_UNUSED,
Efl_Ui_Tab_Pager_Data *sd,
int index)
{
return eina_list_nth(sd->tab_pages, index);
}
EOLIAN static int
_efl_ui_tab_pager_efl_pack_linear_pack_index_get(Eo *obj EINA_UNUSED,
Efl_Ui_Tab_Pager_Data *sd,
const Efl_Gfx_Entity *subobj)
{
return eina_list_data_idx(sd->tab_pages, (void *)subobj);
} }
#include "efl_ui_tab_pager.eo.c" #include "efl_ui_tab_pager.eo.c"

View File

@ -15,18 +15,15 @@ class @beta Efl.Ui.Tab_Pager extends Efl.Ui.Spotlight.Container
Efl.Object.constructor; Efl.Object.constructor;
Efl.Object.destructor; Efl.Object.destructor;
Efl.Object.finalize; Efl.Object.finalize;
Efl.Container.content_count; Efl.Pack.pack_clear;
Efl.Pack.pack_clear; // TODO Efl.Pack.unpack_all;
Efl.Pack.unpack_all; // TODO
Efl.Pack.unpack; Efl.Pack.unpack;
Efl.Pack_Linear.pack_begin; Efl.Pack_Linear.pack_begin;
Efl.Pack_Linear.pack_end; Efl.Pack_Linear.pack_end;
Efl.Pack_Linear.pack_before; Efl.Pack_Linear.pack_before;
Efl.Pack_Linear.pack_after; Efl.Pack_Linear.pack_after;
Efl.Pack_Linear.pack_at; Efl.Pack_Linear.pack_at;
Efl.Pack_Linear.pack_content_get; Efl.Pack_Linear.pack_unpack_at;
Efl.Pack_Linear.pack_index_get;
Efl.Pack_Linear.pack_unpack_at; // TODO
Efl.Ui.Spotlight.Container.active_index { set; } Efl.Ui.Spotlight.Container.active_index { set; }
} }
} }

View File

@ -6,10 +6,6 @@ typedef struct _Efl_Ui_Tab_Pager_Data Efl_Ui_Tab_Pager_Data;
struct _Efl_Ui_Tab_Pager_Data struct _Efl_Ui_Tab_Pager_Data
{ {
Eo *tab_bar; Eo *tab_bar;
int cnt;
int cur;
Eina_List *tab_pages;
}; };