proclist: delayed del.

This commit is contained in:
Alastair Poole 2021-03-03 16:43:06 +00:00
parent 70188d59d7
commit eca697853d
3 changed files with 38 additions and 1 deletions

View File

@ -11,6 +11,8 @@ evisum_ui_item_cache_new(Evas_Object *parent,
cache->item_create_cb = create_cb;
cache->inactive = cache->active = NULL;
cache->size = size;
cache->pending = NULL;
cache->pending_timer = NULL;
for (int i = 0; i < size; i++)
{
@ -61,6 +63,23 @@ evisum_ui_item_cache_steal(Evisum_Ui_Cache *cache, Eina_List *objs)
}
}
static Eina_Bool
_pending_triggered_cb(void *data)
{
Eina_List *l, *l_next;
Evas_Object *o;
Evisum_Ui_Cache *cache = data;
EINA_LIST_FOREACH_SAFE(cache->pending, l, l_next, o)
{
cache->pending = eina_list_remove_list(cache->pending, l);
evas_object_del(o);
}
cache->pending_timer = NULL;
return 0;
}
Item_Cache *
evisum_ui_item_cache_item_get(Evisum_Ui_Cache *cache)
{
@ -91,10 +110,12 @@ evisum_ui_item_cache_reset(Evisum_Ui_Cache *cache)
EINA_LIST_FREE(cache->active, it)
{
cache->pending = eina_list_append(cache->pending, it->obj);
free(it);
}
EINA_LIST_FREE(cache->inactive, it)
{
cache->pending = eina_list_append(cache->pending, it->obj);
free(it);
}
for (int i = 0; i < cache->size; i++)
@ -108,6 +129,13 @@ evisum_ui_item_cache_reset(Evisum_Ui_Cache *cache)
}
}
void
evisum_ui_item_cache_pending_del(Evisum_Ui_Cache *cache)
{
if (!cache->pending_timer)
cache->pending_timer = ecore_timer_add(0.5, _pending_triggered_cb, cache);
}
Eina_Bool
evisum_ui_item_cache_item_release(Evisum_Ui_Cache *cache, Evas_Object *obj)
{
@ -153,5 +181,7 @@ evisum_ui_item_cache_free(Evisum_Ui_Cache *cache)
free(it);
EINA_LIST_FREE(cache->inactive, it)
free(it);
eina_list_free(cache->pending);
free(cache);
}

View File

@ -3,6 +3,7 @@
#include <Eina.h>
#include <Evas.h>
#include <Ecore.h>
typedef struct _Evisum_Ui_Cache {
Eina_List *inactive;
@ -10,6 +11,8 @@ typedef struct _Evisum_Ui_Cache {
Evas_Object *parent;
Evas_Object *(*item_create_cb)(Evas_Object *);
int size;
Ecore_Timer *pending_timer;
Eina_List *pending;
} Evisum_Ui_Cache;
typedef struct _Item_Cache {
@ -34,5 +37,7 @@ evisum_ui_item_cache_reset(Evisum_Ui_Cache *cache);
void
evisum_ui_item_cache_steal(Evisum_Ui_Cache *cache, Eina_List *objs);
void
evisum_ui_item_cache_pending_del(Evisum_Ui_Cache *cache);
#endif

View File

@ -176,9 +176,9 @@ _content_reset(Ui_Data *pd)
}
elm_table_pack(pd->tb_content, pd->glist, 0, 1, j, 1);
elm_table_pack(pd->tb_content, pd->summary.fr, 0, 2, j, 1);
elm_genlist_clear(pd->glist);
if (pd->cache)
evisum_ui_item_cache_reset(pd->cache);
elm_genlist_clear(pd->glist);
}
static void
@ -991,6 +991,7 @@ _process_list_feedback_cb(void *data, Ecore_Thread *thread EINA_UNUSED,
if (!pd->poll_count)
ecore_timer_add(1.0, _bring_in, pd);
pd->poll_count++;
}
static void
@ -1020,6 +1021,7 @@ _btn_clicked_state_save(Ui_Data *pd, Evas_Object *btn)
if (pd->fields_menu)
{
evisum_ui_item_cache_pending_del(pd->cache);
evas_object_del(pd->fields_menu);
pd->fields_menu = NULL;
return;