genlist: (Mostly) fix item index odd/even styles

This fixes the internal item order index.

Note that groups don't reset the odd/even styles. The
original code wasn't very clear on the intent (setting
to 0 in one case, not increasing the counter in another,
but that was not consistent all over the place). I believe
resetting the odd/even styles at a group boundary would
look great, but this might be for another patch :)

This amends part of another commit, but keeps its feature:
 b40a6eb85bf44a genlist: implement list position signals.

See T3086

PS: I've discovered more odd/even issues with the
    fileselector in particular. Still working on it...

@fix
This commit is contained in:
Jean-Philippe Andre 2017-02-23 17:10:16 +09:00
parent 519b782ff2
commit bb38083287
2 changed files with 27 additions and 34 deletions

View File

@ -781,7 +781,7 @@ _calc_job(void *data)
itb->w = minw; itb->w = minw;
itb->h = itb->minh; itb->h = itb->minh;
y += itb->h; y += itb->h;
in += itb->count; in += itb->vis_count;
if ((show_me) && (sd->show_item) && (!sd->show_item->item->queued)) if ((show_me) && (sd->show_item) && (!sd->show_item->item->queued))
sd->check_scroll = EINA_TRUE; sd->check_scroll = EINA_TRUE;
} }
@ -1277,33 +1277,25 @@ _elm_genlist_item_position_state_update(Elm_Gen_Item *it)
} }
static void static void
_item_order_update(const Eina_Inlist *l, _item_order_update(Elm_Gen_Item *it_base, const int start)
int start)
{ {
Elm_Gen_Item *it, *it2; Elm_Gen_Item *it;
Item_Block *itb_base;
int index = start;
/* itb_base = it_base->item->block;
* always update position state of previous item, it may have been EINA_INLIST_FOREACH(EINA_INLIST_GET(it_base), it)
* marked as "single" if it was the only element at the time, or
* "middle", "first" or "last" in the case of insert into different
* positions.
*/
if ((l->prev) && (start > 0))
{ {
it = ELM_GEN_ITEM_FROM_INLIST(l->prev); if (it->hide) continue;
it->item->order_num_in = start - 1; if (it->item->block != itb_base)
{
if (it->item->block && (it->item->block->num != index))
it->item->block->changed = EINA_TRUE;
break;
}
it->item->order_num_in = index++;
_elm_genlist_item_position_state_update(it); _elm_genlist_item_position_state_update(it);
} }
for (it = ELM_GEN_ITEM_FROM_INLIST(l); l; l = l->next,
it = ELM_GEN_ITEM_FROM_INLIST(l))
{
it->item->order_num_in = start++;
_elm_genlist_item_position_state_update(it);
it2 = ELM_GEN_ITEM_FROM_INLIST(l->next);
if (it2 && (it->item->order_num_in != it2->item->order_num_in))
return;
}
} }
static void static void
@ -1792,26 +1784,23 @@ _elm_genlist_item_focus_update(Elm_Gen_Item *it)
} }
static void static void
_item_realize(Elm_Gen_Item *it, _item_realize(Elm_Gen_Item *it, const int index, Eina_Bool calc)
int in,
Eina_Bool calc)
{ {
const char *treesize; const char *treesize;
Item_Size *size = NULL; Item_Size *size = NULL;
int tsize = 20; int tsize = 20;
int in = index;
ELM_GENLIST_DATA_GET_FROM_ITEM(it, sd); ELM_GENLIST_DATA_GET_FROM_ITEM(it, sd);
if (it->realized) if (it->realized)
{ {
if (it->item->order_num_in != in) if (it->item->order_num_in != in)
{ {
_item_order_update(EINA_INLIST_GET(it), in); _item_order_update(it, in);
_elm_genlist_item_state_update(it);
_elm_genlist_item_index_update(it); _elm_genlist_item_index_update(it);
} }
return; return;
} }
it->item->order_num_in = in;
if (sd->tree_effect_enabled || if (sd->tree_effect_enabled ||
(!_item_cache_find(it))) (!_item_cache_find(it)))
@ -1824,7 +1813,7 @@ _item_realize(Elm_Gen_Item *it,
/* access */ /* access */
if (_elm_config->access_mode) _access_widget_item_register(it); if (_elm_config->access_mode) _access_widget_item_register(it);
_item_order_update(EINA_INLIST_GET(it), in); _item_order_update(it, in);
if (sd->reorder_mode) if (sd->reorder_mode)
edje_object_signal_emit(VIEW(it), SIGNAL_REORDER_MODE_SET, "elm"); edje_object_signal_emit(VIEW(it), SIGNAL_REORDER_MODE_SET, "elm");
@ -2201,7 +2190,7 @@ _group_items_recalc(void *data)
{ {
if (git->item->want_realize) if (git->item->want_realize)
{ {
if (!git->realized) _item_realize(git, 0, EINA_FALSE); if (!git->realized) _item_realize(git, git->item->order_num_in, EINA_FALSE);
evas_object_resize(VIEW(git), sd->minw, git->item->h); evas_object_resize(VIEW(git), sd->minw, git->item->h);
evas_object_move(VIEW(git), git->item->scrl_x, git->item->scrl_y); evas_object_move(VIEW(git), git->item->scrl_x, git->item->scrl_y);
evas_object_stack_above(VIEW(git), sd->stack[1]); evas_object_stack_above(VIEW(git), sd->stack[1]);
@ -2421,13 +2410,13 @@ _item_block_position(Item_Block *itb,
_elm_genlist_item_unrealize(it, EINA_FALSE); _elm_genlist_item_unrealize(it, EINA_FALSE);
} }
} }
in++;
} }
else else
{ {
if (vis) it->item->want_realize = EINA_TRUE; if (vis) it->item->want_realize = EINA_TRUE;
} }
y += it->item->h; y += it->item->h;
in++;
} }
evas_event_thaw(evas_object_evas_get((itb->sd)->obj)); evas_event_thaw(evas_object_evas_get((itb->sd)->obj));
evas_event_thaw_eval(evas_object_evas_get((itb->sd)->obj)); evas_event_thaw_eval(evas_object_evas_get((itb->sd)->obj));
@ -2516,7 +2505,7 @@ _elm_genlist_pan_efl_canvas_group_group_calculate(Eo *obj, Elm_Genlist_Pan_Data
{ {
if (itb->realized) _item_block_unrealize(itb); if (itb->realized) _item_block_unrealize(itb);
} }
in += itb->count; in += itb->vis_count;
} }
if ((!sd->reorder_it) || (sd->reorder_pan_move)) if ((!sd->reorder_it) || (sd->reorder_pan_move))
_group_items_recalc(sd); _group_items_recalc(sd);
@ -5195,6 +5184,7 @@ _item_block_recalc(Item_Block *itb,
Eina_Bool show_me = EINA_FALSE, changed = EINA_FALSE; Eina_Bool show_me = EINA_FALSE, changed = EINA_FALSE;
Evas_Coord y = 0; Evas_Coord y = 0;
Item_Size *size = NULL; Item_Size *size = NULL;
int vis_count = 0;
itb->num = in; itb->num = in;
EINA_LIST_FOREACH(itb->items, l, it) EINA_LIST_FOREACH(itb->items, l, it)
@ -5207,6 +5197,7 @@ _item_block_recalc(Item_Block *itb,
if (it->realized) evas_object_hide(VIEW(it)); if (it->realized) evas_object_hide(VIEW(it));
continue; continue;
} }
vis_count++;
if (!itb->realized) if (!itb->realized)
{ {
if (itb->sd->homogeneous && if (itb->sd->homogeneous &&
@ -5264,6 +5255,7 @@ _item_block_recalc(Item_Block *itb,
itb->minh = minh; itb->minh = minh;
itb->changed = EINA_FALSE; itb->changed = EINA_FALSE;
itb->position_update = EINA_FALSE; itb->position_update = EINA_FALSE;
itb->vis_count = vis_count;
return show_me; return show_me;
} }

View File

@ -228,7 +228,7 @@ struct Elm_Gen_Item_Type
Eina_List *rel_revs; // FIXME: find better way not to use this Eina_List *rel_revs; // FIXME: find better way not to use this
Evas_Object *deco_it_view; Evas_Object *deco_it_view;
int expanded_depth; int expanded_depth;
int order_num_in; int order_num_in; // Written by _item_order_update()
Eina_Bool decorate_all_item_realized : 1; Eina_Bool decorate_all_item_realized : 1;
Eina_Bool tree_effect_finished : 1; /* tree effect */ Eina_Bool tree_effect_finished : 1; /* tree effect */
@ -255,6 +255,7 @@ struct _Item_Block
EINA_INLIST; EINA_INLIST;
int count; int count;
int vis_count;
int num; int num;
int reorder_offset; int reorder_offset;
Elm_Genlist_Data *sd; Elm_Genlist_Data *sd;