Gengrid: Added horizontal item loop feature.

Summary:
If item loop is enabled, the item moves infinitely in
         horizontal manner (from right to left and from left to
         right).
         Need to implement:
             -for reorder mode and horizontal mode.
         @feature

DEPENDs On D841

Test Plan: elementary_test -to gengrid2

Reviewers: seoz, eagleeye, SanghyeonLee, raster

CC: seoz, raster

Differential Revision: https://phab.enlightenment.org/D842

Conflicts:
	src/lib/elm_gengrid.c
This commit is contained in:
efl 2014-06-10 14:55:56 +09:00 committed by Carsten Haitzler (Rasterman)
parent ffcdbf20f5
commit b087e80e9b
4 changed files with 235 additions and 15 deletions

View File

@ -159,6 +159,21 @@ _horizontal_grid(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
elm_gengrid_horizontal_set(grid, elm_check_state_get(obj));
}
static void
_item_loop_enable_changed_cb(void *data, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
Evas_Object *grid = data;
elm_object_scroll_item_loop_enabled_set(grid, elm_check_state_get(obj));
}
static void
_focus_highlight_changed_cb(void *data, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
elm_win_focus_highlight_enabled_set(data, elm_check_state_get(obj));
}
static void
grid_drag_up(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
{
@ -819,6 +834,18 @@ test_gengrid2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_
elm_box_pack_end(hbx, ck);
evas_object_show(ck);
ck = elm_check_add(win);
elm_object_text_set(ck, "Item loop enable");
evas_object_smart_callback_add(ck, "changed", _item_loop_enable_changed_cb, grid);
elm_box_pack_end(hbx, ck);
evas_object_show(ck);
ck = elm_check_add(win);
elm_object_text_set(ck, "Focus Highlight Set");
evas_object_smart_callback_add(ck, "changed", _focus_highlight_changed_cb, win);
elm_box_pack_end(hbx, ck);
evas_object_show(ck);
gic = elm_gengrid_item_class_new();
gic->item_style = "default";
gic->func.text_get = grid_text_get;

View File

@ -1917,7 +1917,7 @@ _elm_gengrid_item_edge_check(Elm_Object_Item *it,
else
return EINA_TRUE;
}
if (dir == ELM_FOCUS_UP)
if ((dir == ELM_FOCUS_UP) || (!item && sd->reorder_mode))
return EINA_TRUE;
}
else if (((sd->horizontal) && (dir == ELM_FOCUS_DOWN)) ||
@ -1938,7 +1938,7 @@ _elm_gengrid_item_edge_check(Elm_Object_Item *it,
else
return EINA_TRUE;
}
if (dir == ELM_FOCUS_DOWN)
if ((dir == ELM_FOCUS_DOWN) || (!item && sd->reorder_mode))
return EINA_TRUE;
}
else if (((!sd->horizontal) && (dir == ELM_FOCUS_UP)) ||
@ -2059,7 +2059,6 @@ _anim_end(Elm_Gengrid_Data *sd)
{
Eina_Inlist *tmp = NULL;
Elm_Gen_Item *it1_prev = NULL, *it2_prev = NULL;
it1_prev = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(sd->reorder.it1)->prev);
it2_prev = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(sd->reorder.it2)->prev);
@ -2089,16 +2088,68 @@ _anim_end(Elm_Gengrid_Data *sd)
else if ((!sd->horizontal && (sd->reorder.dir == ELM_FOCUS_LEFT)) ||
(sd->horizontal && (sd->reorder.dir == ELM_FOCUS_UP)))
{
sd->items = eina_inlist_remove(sd->items, EINA_INLIST_GET(sd->reorder.it1));
sd->items = eina_inlist_prepend_relative(sd->items, EINA_INLIST_GET(sd->reorder.it1),
EINA_INLIST_GET(sd->reorder.it2));
if (!((Elm_Gen_Item *)sd->reorder.it2 == it1_prev))
{
sd->items = eina_inlist_remove(sd->items, EINA_INLIST_GET(sd->reorder.it1));
sd->items = eina_inlist_remove(sd->items, EINA_INLIST_GET(sd->reorder.it2));
if (it1_prev)
{
tmp = eina_inlist_find(sd->items, EINA_INLIST_GET(it1_prev));
sd->items = eina_inlist_append_relative(sd->items, EINA_INLIST_GET(sd->reorder.it2),
tmp);
}
else
sd->items = eina_inlist_prepend(sd->items, EINA_INLIST_GET(sd->reorder.it2));
if (it2_prev)
{
tmp = eina_inlist_find(sd->items, EINA_INLIST_GET(it2_prev));
sd->items = eina_inlist_append_relative(sd->items, EINA_INLIST_GET(sd->reorder.it1),
tmp);
}
else
sd->items = eina_inlist_prepend(sd->items, EINA_INLIST_GET(sd->reorder.it1));
}
else
{
sd->items = eina_inlist_remove(sd->items, EINA_INLIST_GET(sd->reorder.it1));
sd->items = eina_inlist_prepend_relative(sd->items, EINA_INLIST_GET(sd->reorder.it1),
EINA_INLIST_GET(sd->reorder.it2));
}
}
else if ((!sd->horizontal && (sd->reorder.dir == ELM_FOCUS_RIGHT)) ||
(sd->horizontal && (sd->reorder.dir == ELM_FOCUS_DOWN)))
{
sd->items = eina_inlist_remove(sd->items, EINA_INLIST_GET(sd->reorder.it1));
sd->items = eina_inlist_append_relative(sd->items, EINA_INLIST_GET(sd->reorder.it1),
EINA_INLIST_GET(sd->reorder.it2));
if (!((Elm_Gen_Item *)sd->reorder.it1 == it2_prev))
{
sd->items = eina_inlist_remove(sd->items, EINA_INLIST_GET(sd->reorder.it1));
sd->items = eina_inlist_remove(sd->items, EINA_INLIST_GET(sd->reorder.it2));
if (it1_prev)
{
tmp = eina_inlist_find(sd->items, EINA_INLIST_GET(it1_prev));
sd->items = eina_inlist_append_relative(sd->items, EINA_INLIST_GET(sd->reorder.it2),
tmp);
}
else
sd->items = eina_inlist_prepend(sd->items, EINA_INLIST_GET(sd->reorder.it2));
if (it2_prev)
{
tmp = eina_inlist_find(sd->items, EINA_INLIST_GET(it2_prev));
sd->items = eina_inlist_append_relative(sd->items, EINA_INLIST_GET(sd->reorder.it1),
tmp);
}
else
sd->items = eina_inlist_prepend(sd->items, EINA_INLIST_GET(sd->reorder.it1));
}
else
{
sd->items = eina_inlist_remove(sd->items, EINA_INLIST_GET(sd->reorder.it1));
sd->items = eina_inlist_append_relative(sd->items, EINA_INLIST_GET(sd->reorder.it1),
EINA_INLIST_GET(sd->reorder.it2));
}
}
_item_position_update(sd->items, 0);
@ -2185,6 +2236,78 @@ _swap_items(Elm_Gen_Item *it1, Elm_Gen_Item *it2, Elm_Focus_Direction dir)
ecore_animator_timeline_add(0.3, _item_move_cb, sd);
}
static Eina_Bool
_item_horizontal_loop(Evas_Object *obj, Elm_Focus_Direction dir)
{
ELM_GENGRID_DATA_GET(obj, sd);
Elm_Object_Item *item;
item = sd->focused_item;
unsigned int counter, i;
if (sd->horizontal)
{
if (dir == ELM_FOCUS_UP)
{
counter = 0;
while (!_elm_gengrid_item_edge_check(item, dir))
{
item = elm_gengrid_item_prev_get(item);
counter++;
}
item = elm_gengrid_first_item_get(obj);
for (i = 0; i < counter; i++)
item = elm_gengrid_item_next_get(item);
}
else
{
while (1)
{
if (_elm_gengrid_item_edge_check(item, dir))
break;
else
{
for (i = 0; i < sd->nmax; i++)
item = elm_gengrid_item_next_get(item);
}
}
}
}
else
{
if (dir == ELM_FOCUS_RIGHT)
{
while (!_elm_gengrid_item_edge_check(item, dir))
{
if (!elm_gengrid_item_next_get(item))
break;
item = elm_gengrid_item_next_get(item);
}
}
else if (dir == ELM_FOCUS_LEFT)
{
while (!_elm_gengrid_item_edge_check(item, dir))
{
if (!elm_gengrid_item_prev_get(item))
break;
item = elm_gengrid_item_prev_get(item);
}
}
else
return EINA_FALSE;
}
if (sd->reorder_mode && !(sd->focused_item == item))
{
_swap_items((Elm_Gen_Item *)sd->focused_item, (Elm_Gen_Item *)item, ELM_FOCUS_RIGHT);
return EINA_TRUE;
}
else
{
elm_gengrid_item_selected_set(item, EINA_TRUE);
return EINA_TRUE;
}
}
static Eina_Bool
_key_action_move(Evas_Object *obj, const char *params)
{
@ -2217,7 +2340,14 @@ _key_action_move(Evas_Object *obj, const char *params)
Elm_Gen_Item *left;
if (_elm_gengrid_item_edge_check(sd->focused_item, ELM_FOCUS_LEFT))
return EINA_TRUE;
{
if (sd->item_loop_enable)
{
if (_item_horizontal_loop(obj, ELM_FOCUS_RIGHT))
return EINA_TRUE;
}
return EINA_TRUE;
}
if (!sd->horizontal)
left = (Elm_Gen_Item *)elm_gengrid_item_prev_get(sd->focused_item);
else
@ -2230,6 +2360,15 @@ _key_action_move(Evas_Object *obj, const char *params)
}
if (sd->horizontal)
{
if (_elm_gengrid_item_edge_check(sd->focused_item, ELM_FOCUS_LEFT))
{
if (sd->item_loop_enable)
{
if (_item_horizontal_loop(obj, ELM_FOCUS_RIGHT))
return EINA_TRUE;
}
return EINA_TRUE;
}
if (!_elm_config->item_select_on_focus_disable)
{
return _item_single_select_up(sd);
@ -2239,8 +2378,16 @@ _key_action_move(Evas_Object *obj, const char *params)
}
else
{
if (_elm_gengrid_item_edge_check(sd->focused_item, ELM_FOCUS_LEFT))
return EINA_FALSE;
if (_elm_gengrid_item_edge_check(sd->focused_item, ELM_FOCUS_LEFT) ||
!elm_gengrid_item_prev_get(sd->focused_item))
{
if (sd->item_loop_enable)
{
if (_item_horizontal_loop(obj, ELM_FOCUS_RIGHT))
return EINA_TRUE;
}
return EINA_FALSE;
}
if (!_elm_config->item_select_on_focus_disable)
{
return _item_single_select_left(sd);
@ -2273,7 +2420,19 @@ _key_action_move(Evas_Object *obj, const char *params)
Elm_Gen_Item *right;
if (_elm_gengrid_item_edge_check(sd->focused_item, ELM_FOCUS_RIGHT))
return EINA_TRUE;
{
if (sd->item_loop_enable && !sd->horizontal)
{
if (_item_horizontal_loop(obj, ELM_FOCUS_LEFT))
return EINA_TRUE;
}
else
{
if (_item_horizontal_loop(obj, ELM_FOCUS_UP))
return EINA_TRUE;
}
return EINA_TRUE;
}
if (!sd->horizontal)
right = (Elm_Gen_Item *)elm_gengrid_item_next_get(sd->focused_item);
else
@ -2286,6 +2445,15 @@ _key_action_move(Evas_Object *obj, const char *params)
}
if (sd->horizontal)
{
if (_elm_gengrid_item_edge_check(sd->focused_item, ELM_FOCUS_RIGHT))
{
if (sd->item_loop_enable)
{
if (_item_horizontal_loop(obj, ELM_FOCUS_UP))
return EINA_TRUE;
}
return EINA_FALSE;
}
if (!_elm_config->item_select_on_focus_disable)
{
return _item_single_select_down(sd);
@ -2295,8 +2463,16 @@ _key_action_move(Evas_Object *obj, const char *params)
}
else
{
if (_elm_gengrid_item_edge_check(sd->focused_item, ELM_FOCUS_RIGHT))
return EINA_FALSE;
if (_elm_gengrid_item_edge_check(sd->focused_item, ELM_FOCUS_RIGHT) ||
!elm_gengrid_item_next_get(sd->focused_item))
{
if (sd->item_loop_enable)
{
if (_item_horizontal_loop(obj, ELM_FOCUS_LEFT))
return EINA_TRUE;
}
return EINA_FALSE;
}
if (!_elm_config->item_select_on_focus_disable)
{
return _item_single_select_right(sd);
@ -4368,6 +4544,19 @@ _elm_gengrid_elm_widget_focused_item_get(Eo *obj EINA_UNUSED, Elm_Gengrid_Data *
return sd->focused_item;
}
EOLIAN static void
_elm_gengrid_elm_widget_item_loop_enabled_set(Eo *obj EINA_UNUSED, Elm_Gengrid_Data *sd, Eina_Bool enable)
{
if (sd->item_loop_enable == enable) return;
sd->item_loop_enable = !!enable;
}
EOLIAN static Eina_Bool
_elm_gengrid_elm_widget_item_loop_enabled_get(Eo *obj EINA_UNUSED, Elm_Gengrid_Data *sd)
{
return sd->item_loop_enable;
}
EOLIAN static void
_elm_gengrid_wheel_disabled_set(Eo *obj, Elm_Gengrid_Data *sd, Eina_Bool disabled)
{

View File

@ -678,6 +678,8 @@ class Elm_Gengrid (Elm_Layout, Elm_Interface_Scrollable, Evas_Clickable_Interfac
Elm_Widget::event;
Elm_Widget::focus_highlight_geometry_get;
Elm_Widget::focused_item::get;
Elm_Widget::item_loop_enabled::set;
Elm_Widget::item_loop_enabled::get;
Elm_Layout::sizing_eval;
Elm_Interface_Scrollable::bounce_allow::set;
Elm_Interface_Scrollable::policy;

View File

@ -120,6 +120,8 @@ struct _Elm_Gengrid_Data
Eina_Bool bring_in : 1;
Eina_Bool mouse_down : 1; /**< a flag that mouse is down on the list at the moment. this flag is set to true on mouse and reset to false on mouse up */
Eina_Bool wheel_disabled : 1; /**< a flag that shows mouse wheel is disabled or not. */
/**< value whether item loop feature is enabled or not. */
Eina_Bool item_loop_enable : 1;
};
struct Elm_Gen_Item_Type