forked from enlightenment/efl
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:
parent
c54b7a4ab3
commit
f36880088b
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue