forked from enlightenment/efl
genlist: Final fix for odd/even styles issue
The key was to emit & process the signal to the edje objects (item views) at the same time as we move them, ie. from the loop in _item_block_position(). Also the proper counting must be used at all times. Hidden items should not be counted. Tree effect may still have issues but otherwise there is no more blinking, double odd or even rows, etc... It all looks good (as long as there is no tree effect!). Fixes T3086 @fix
This commit is contained in:
parent
3574eb8c07
commit
726994d175
|
@ -1186,6 +1186,7 @@ _elm_genlist_item_position_state_update(Elm_Gen_Item *it)
|
|||
{
|
||||
unsigned idx = it->item->order_num_in;
|
||||
|
||||
if (!VIEW(it) && !it->deco_all_view) return;
|
||||
ELM_GENLIST_DATA_GET_FROM_ITEM(it, sd);
|
||||
|
||||
if (!it->item->nostacking)
|
||||
|
@ -1277,25 +1278,12 @@ _elm_genlist_item_position_state_update(Elm_Gen_Item *it)
|
|||
}
|
||||
|
||||
static void
|
||||
_item_order_update(Elm_Gen_Item *it_base, const int start)
|
||||
_item_order_update(Elm_Gen_Item *it, int index, Eina_Bool process)
|
||||
{
|
||||
Elm_Gen_Item *it;
|
||||
Item_Block *itb_base;
|
||||
int index = start;
|
||||
it->item->order_num_in = index;
|
||||
_elm_genlist_item_position_state_update(it);
|
||||
|
||||
itb_base = it_base->item->block;
|
||||
EINA_INLIST_FOREACH(EINA_INLIST_GET(it_base), it)
|
||||
{
|
||||
if (it->hide) continue;
|
||||
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);
|
||||
}
|
||||
if (process) edje_object_message_signal_process(VIEW(it));
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1796,7 +1784,7 @@ _item_realize(Elm_Gen_Item *it, const int index, Eina_Bool calc)
|
|||
{
|
||||
if (it->item->order_num_in != in)
|
||||
{
|
||||
_item_order_update(it, in);
|
||||
_item_order_update(it, in, EINA_TRUE);
|
||||
_elm_genlist_item_index_update(it);
|
||||
}
|
||||
return;
|
||||
|
@ -1813,7 +1801,7 @@ _item_realize(Elm_Gen_Item *it, const int index, Eina_Bool calc)
|
|||
/* access */
|
||||
if (_elm_config->access_mode) _access_widget_item_register(it);
|
||||
|
||||
_item_order_update(it, in);
|
||||
_item_order_update(it, in, EINA_FALSE);
|
||||
|
||||
if (sd->reorder_mode)
|
||||
edje_object_signal_emit(VIEW(it), SIGNAL_REORDER_MODE_SET, "elm");
|
||||
|
@ -2111,7 +2099,7 @@ _tree_effect_animator_cb(void *data, const Efl_Event *event EINA_UNUSED)
|
|||
|
||||
if (!it->realized && !it->item->queued)
|
||||
_item_realize(it, in, 0);
|
||||
in++;
|
||||
if (!it->hide) in++;
|
||||
|
||||
if (it != expanded_next_it)
|
||||
{
|
||||
|
@ -2303,8 +2291,7 @@ _reorder_item_space_get(Elm_Gen_Item *it)
|
|||
}
|
||||
|
||||
static void
|
||||
_item_block_position(Item_Block *itb,
|
||||
int in)
|
||||
_item_block_position(Item_Block *itb, const int blk_idx)
|
||||
{
|
||||
Elm_Gen_Item *it;
|
||||
Elm_Gen_Item *git;
|
||||
|
@ -2312,6 +2299,7 @@ _item_block_position(Item_Block *itb,
|
|||
Eina_Bool vis = EINA_FALSE;
|
||||
Evas_Coord y = 0, ox, oy, ow, oh, cvx, cvy, cvw, cvh;
|
||||
Elm_Genlist_Data *sd = NULL;
|
||||
int vis_count = 0;
|
||||
|
||||
evas_event_freeze(evas_object_evas_get((itb->sd)->obj));
|
||||
evas_object_geometry_get(itb->sd->pan_obj, &ox, &oy, &ow, &oh);
|
||||
|
@ -2343,7 +2331,11 @@ _item_block_position(Item_Block *itb,
|
|||
{
|
||||
if ((itb->realized) && (!it->realized))
|
||||
{
|
||||
if (vis) _item_realize(it, in, EINA_FALSE);
|
||||
if (vis) _item_realize(it, blk_idx + vis_count, EINA_FALSE);
|
||||
}
|
||||
if ((blk_idx + vis_count) != it->item->order_num_in)
|
||||
{
|
||||
_item_order_update(it, blk_idx + vis_count, EINA_TRUE);
|
||||
}
|
||||
if (it->realized)
|
||||
{
|
||||
|
@ -2416,7 +2408,7 @@ _item_block_position(Item_Block *itb,
|
|||
if (vis) it->item->want_realize = EINA_TRUE;
|
||||
}
|
||||
y += it->item->h;
|
||||
in++;
|
||||
vis_count++;
|
||||
}
|
||||
evas_event_thaw(evas_object_evas_get((itb->sd)->obj));
|
||||
evas_event_thaw_eval(evas_object_evas_get((itb->sd)->obj));
|
||||
|
@ -5202,9 +5194,7 @@ _item_unrealize(Elm_Gen_Item *it)
|
|||
}
|
||||
|
||||
static Eina_Bool
|
||||
_item_block_recalc(Item_Block *itb,
|
||||
int in,
|
||||
Eina_Bool qadd)
|
||||
_item_block_recalc(Item_Block *itb, const int blk_idx, Eina_Bool qadd)
|
||||
{
|
||||
const Eina_List *l;
|
||||
Elm_Gen_Item *it;
|
||||
|
@ -5214,7 +5204,7 @@ _item_block_recalc(Item_Block *itb,
|
|||
Item_Size *size = NULL;
|
||||
int vis_count = 0;
|
||||
|
||||
itb->num = in;
|
||||
itb->num = blk_idx;
|
||||
EINA_LIST_FOREACH(itb->items, l, it)
|
||||
{
|
||||
show_me |= it->item->show_me;
|
||||
|
@ -5225,7 +5215,6 @@ _item_block_recalc(Item_Block *itb,
|
|||
if (it->realized) evas_object_hide(VIEW(it));
|
||||
continue;
|
||||
}
|
||||
vis_count++;
|
||||
if (!itb->realized)
|
||||
{
|
||||
if (itb->sd->homogeneous &&
|
||||
|
@ -5238,7 +5227,7 @@ _item_block_recalc(Item_Block *itb,
|
|||
{
|
||||
if (!size || (it->item->expanded_depth != size->expanded_depth))
|
||||
{
|
||||
_item_realize(it, in, EINA_TRUE);
|
||||
_item_realize(it, blk_idx + vis_count, EINA_TRUE);
|
||||
_elm_genlist_item_unrealize(it, EINA_TRUE);
|
||||
}
|
||||
else
|
||||
|
@ -5261,7 +5250,7 @@ _item_block_recalc(Item_Block *itb,
|
|||
}
|
||||
else
|
||||
{
|
||||
_item_realize(it, in, EINA_TRUE);
|
||||
_item_realize(it, blk_idx + vis_count, EINA_TRUE);
|
||||
_elm_genlist_item_unrealize(it, EINA_TRUE);
|
||||
}
|
||||
}
|
||||
|
@ -5269,11 +5258,11 @@ _item_block_recalc(Item_Block *itb,
|
|||
else
|
||||
{
|
||||
if (!it->item->mincalcd) changed = EINA_TRUE;
|
||||
_item_realize(it, in, EINA_FALSE);
|
||||
_item_realize(it, blk_idx + vis_count, EINA_FALSE);
|
||||
}
|
||||
minh += it->item->minh;
|
||||
if (minw < it->item->minw) minw = it->item->minw;
|
||||
in++;
|
||||
vis_count++;
|
||||
it->x = 0;
|
||||
it->y = y;
|
||||
y += it->item->h;
|
||||
|
@ -5308,9 +5297,9 @@ _update_job(void *data)
|
|||
|
||||
if (!itb->updateme)
|
||||
{
|
||||
num += itb->count;
|
||||
if (position)
|
||||
_item_block_position(itb, num);
|
||||
num += itb->vis_count;
|
||||
continue;
|
||||
}
|
||||
num0 = num;
|
||||
|
@ -5337,7 +5326,7 @@ _update_job(void *data)
|
|||
if ((it->item->minw != itminw) || (it->item->minh != itminh))
|
||||
recalc = EINA_TRUE;
|
||||
}
|
||||
num++;
|
||||
if (!it->hide) num++;
|
||||
}
|
||||
itb->updateme = EINA_FALSE;
|
||||
if (recalc)
|
||||
|
@ -6171,6 +6160,7 @@ _elm_genlist_item_new(Elm_Genlist_Data *sd,
|
|||
it->item = ELM_NEW(Elm_Gen_Item_Type);
|
||||
it->item->wsd = sd;
|
||||
it->item->type = type;
|
||||
it->item->order_num_in = -1;
|
||||
|
||||
if (it->parent)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue