elm_genlist: fix item registration by correct realization

Summary:
there was a case when a block could be realized while a item that is
realized was brought from one block to the this new one. The block now
is simply realized using api instead of just setting the flag, this sets
the correct focus registrations. While fixing this the error of double
regiration of items came up, this is also fixed by unregistration and
reregistration in the correct block.

fix T7247

Reviewers: zmike, SanghyeonLee, YOhoho

Reviewed By: zmike

Subscribers: Hermet, cedric, #committers

Tags: #efl

Maniphest Tasks: T7247

Differential Revision: https://phab.enlightenment.org/D6737
This commit is contained in:
Marcel Hollerbach 2018-08-07 13:25:34 +09:00 committed by SangHyeon Jade Lee
parent c54b7a4ab3
commit f36880088b
2 changed files with 29 additions and 3 deletions

View File

@ -2542,6 +2542,8 @@ _item_block_realize(Item_Block *itb)
if (!itb->adapter)
{
itb->adapter = efl_add(EFL_UI_FOCUS_COMPOSITION_ADAPTER_CLASS, itb->sd->obj);
efl_ui_focus_composition_adapter_focus_manager_parent_set(itb->adapter, itb->sd->obj);
efl_ui_focus_composition_adapter_focus_manager_object_set(itb->adapter, itb->sd->obj);
efl_ui_focus_manager_calc_register_logical(itb->sd->obj, itb->adapter, itb->sd->obj, NULL);
_flush_block_order(itb->sd);
}
@ -3578,9 +3580,13 @@ _item_block_merge(Item_Block *left,
EINA_LIST_FOREACH(right->items, l, it2)
{
if (right->realized)
efl_ui_focus_manager_calc_unregister(right->sd->obj, EO_OBJ(it2));
it2->item->block = left;
left->count++;
left->changed = EINA_TRUE;
if (left->realized)
efl_ui_focus_manager_calc_register_logical(right->sd->obj, EO_OBJ(it2), left->adapter, NULL);
}
left->items = eina_list_merge(left->items, right->items);
}
@ -4576,8 +4582,10 @@ newblock:
itb->items = eina_list_remove_list
(itb->items, itb->items);
itb->count--;
efl_ui_focus_manager_calc_unregister(itb->sd->obj, EO_OBJ(it2));
itbp->items = eina_list_append(itbp->items, it2);
_update_block_registration(itbp, it2);
it2->item->block = itbp;
itbp->count++;
if (!it2->hide)
@ -4587,7 +4595,10 @@ newblock:
itbp->vis_count++;
}
if (it2->realized) itbp->realized = EINA_TRUE;
if (it2->realized)
{
_item_block_realize(itbp);
}
}
done = EINA_TRUE;
@ -4609,8 +4620,10 @@ newblock:
it2 = eina_list_data_get(l);
itb->items = eina_list_remove_list(itb->items, l);
itb->count--;
efl_ui_focus_manager_calc_unregister(itb->sd->obj, EO_OBJ(it2));
itbn->items = eina_list_prepend(itbn->items, it2);
_update_block_registration(itbn, it2);
it2->item->block = itbn;
itbn->count++;
if (!it2->hide)
@ -4621,7 +4634,10 @@ newblock:
itbn->vis_count++;
}
if (it2->realized) itbn->realized = EINA_TRUE;
if (it2->realized)
{
_item_block_realize(itbn);
}
}
done = EINA_TRUE;
@ -4646,8 +4662,10 @@ newblock:
it2 = l->data;
itb->items = eina_list_remove_list(itb->items, l);
itb->count--;
efl_ui_focus_manager_calc_unregister(itb->sd->obj, EO_OBJ(it2));
itb2->items = eina_list_prepend(itb2->items, it2);
_update_block_registration(itb2, it2);
it2->item->block = itb2;
itb2->count++;
if (!it2->hide)
@ -4658,7 +4676,10 @@ newblock:
itb2->h += it2->item->h;
}
if (it2->realized) itb2->realized = EINA_TRUE;
if (it2->realized)
{
_item_block_realize(itb2);
}
}
itb2->num = itb->num + itb->vis_count;

View File

@ -98,6 +98,11 @@ _elm_widget_item_static_focus_efl_ui_focus_object_prepare_logical_none_recursive
{
next_widget = NULL;
}
//check if this is the item block representation of genlist
else if (efl_isa(next_widget, EFL_UI_FOCUS_COMPOSITION_ADAPTER_CLASS) && efl_ui_focus_object_focus_parent_get(next_widget) == wpd->widget)
{
next_widget = NULL;
}
logical_child = next_widget;
}