uint64_t offset;
uint64_t length;
- Eina_Bool model_requested : 1;
- Eina_Bool model_fetched : 1;
+ Eina_Bool need_size : 1;
Eina_Bool need_entity : 1;
Eina_Bool entity_requested : 1;
};
if ((*request)->offset + (*request)->length == index)
{
if (need_entity) (*request)->need_entity = EINA_TRUE;
+ if (!need_entity) (*request)->need_size = EINA_TRUE;
(*request)->length += 1;
return requests;
}
(*request)->offset = index;
(*request)->length = 1;
// At this point, we rely on the model caching ability to avoid recreating model
- (*request)->model_requested = EINA_TRUE;
(*request)->need_entity = !!need_entity;
+ (*request)->need_size = EINA_TRUE;
return requests;
}
unsigned int i, len;
Eina_Bool request_entity = EINA_FALSE;
- request->model_fetched = EINA_TRUE;
EINA_VALUE_ARRAY_FOREACH(&v, len, i, child)
{
Efl_Ui_Collection_Item_Lookup *insert;
}
if (request_entity)
- request->need_entity = EINA_TRUE;
+ {
+ request->need_entity = EINA_TRUE;
- if (request->need_entity &&
- !request->entity_requested)
- _entity_request(obj, request);
+ if (!request->entity_requested)
+ _entity_request(obj, request);
+ }
+ else if (request->need_size)
+ {
+ efl_ui_position_manager_entity_item_size_changed(pd->manager, request->offset,
+ request->offset + len);
+ }
return v;
}
// Currently position manager will flush its entire size cache on update, so only do
// it when necessary to improve performance.
- if (updated_size)
+ if (updated_size || request->need_size)
{
efl_ui_position_manager_entity_item_size_changed(pd->manager,
updated_size_start_id,
_entity_request(Efl_Ui_Collection_View *obj, Efl_Ui_Collection_Request *request)
{
if (request->entity_requested) return EINA_TRUE;
- if (request->model_fetched) return EINA_FALSE;
request->f = efl_future_then(obj, request->f,
.success_type = EINA_VALUE_TYPE_ARRAY,
.success = _entity_fetch_cb);
Efl_Ui_Collection_Request *request,
Efl_Ui_Collection_Request *inflight)
{
+ inflight->need_size |= request->need_size;
if (request->need_entity == EINA_FALSE) return EINA_TRUE;
return _entity_request(obj, inflight);
rn->offset = iend;
rn->length = rend - iend;
- rn->model_requested = request->model_requested;
rn->need_entity = request->need_entity;
+ rn->need_size = request->need_size;
requests = eina_list_append(requests, rn);
// We now have a request, time to trigger a fetch
// We assume here that we are always fetching the model (model_requested must be true)
- if (!request->model_requested)
- {
- CRI("Someone forgot to set model_requested for %" PRIu64 " to %" PRIu64 ".",
- request->offset, request->offset + request->length);
- request->model_requested = EINA_TRUE;
- }
request->f = efl_model_children_slice_get(model, request->offset, request->length);
request->f = efl_future_then(obj, request->f,
.success = _model_fetched_cb,
request->offset = lowerlimit_offset;
// This length work over multiple viewport as they are contiguous
request->length = lowerlimit_offset - pd->viewport[0]->offset;
- request->model_requested = EINA_TRUE;
+ request->need_size = EINA_TRUE;
request->need_entity = EINA_TRUE;
requests = eina_list_append(requests, request);
request->offset = upperlimit_offset;
// This length work over multiple viewport as they are contiguous
request->length = pd->viewport[2]->offset + pd->viewport[2]->count - upperlimit_offset;
- request->model_requested = EINA_TRUE;
+ request->need_size = EINA_TRUE;
request->need_entity = EINA_TRUE;
requests = eina_list_append(requests, request);
if (!request) break;
request->offset = ev->index;
request->length = 1;
- request->model_requested = EINA_TRUE;
+ request->need_size = EINA_TRUE;
request->need_entity = EINA_TRUE;
requests = eina_list_append(requests, request);
if (!request) break;
request->offset = pd->viewport[2]->offset + pd->viewport[i]->count - 1;
request->length = 1;
- request->model_requested = EINA_TRUE;
+ request->need_size = EINA_TRUE;
request->need_entity = EINA_TRUE;
requests = eina_list_append(requests, request);
request->offset = pd->viewport[i]->offset;
request->length = pd->viewport[i]->count;
- request->model_requested = EINA_TRUE;
+ request->need_size = EINA_TRUE;
request->need_entity = EINA_TRUE;
requests = eina_list_append(requests, request);