netstar pushed a commit to branch master.

http://git.enlightenment.org/apps/evisum.git/commit/?id=9ca8502015076a36ba4dc450db11b64990a1317c

commit 9ca8502015076a36ba4dc450db11b64990a1317c
Author: Alastair Poole <nets...@gmail.com>
Date:   Fri Mar 26 08:35:32 2021 +0000

    proclist: Actually defer field changes.
    
    Extremely expensive to "DO IT LIVE!" Defer until the popup is
    dismissed.
---
 src/bin/ui/ui_process_list.c | 66 ++++++++++++++++++++++++++++----------------
 1 file changed, 42 insertions(+), 24 deletions(-)

diff --git a/src/bin/ui/ui_process_list.c b/src/bin/ui/ui_process_list.c
index bbb3c4c..38a1734 100644
--- a/src/bin/ui/ui_process_list.c
+++ b/src/bin/ui/ui_process_list.c
@@ -177,32 +177,15 @@ _cache_reset_done_cb(void *data)
      pd->fields_timer = ecore_timer_add(1.0, _fields_update_timer_cb, pd);
 }
 
-// Updating fields is a heavy exercise. We both offset the
-// cache clearing and delay the initial update for a better
-// experience.
 static void
-_content_reset(Data *pd)
+_fields_update(Data *pd)
 {
-   int j = 0;
-   elm_table_clear(pd->tb_main, 0);
-   elm_table_pack(pd->tb_main, pd->btn_menu, j++, 0, 1, 1);
-   for (int i = j; i < PROC_FIELD_MAX; i++)
+   for (int i = PROC_FIELD_CMD; i < PROC_FIELD_MAX; i++)
      {
-        Field *f = &_fields[i];
-        if (!f->enabled)
-          {
-             evas_object_hide(f->btn);
-             continue;
-          }
-        pd->field_max = i;
-        elm_table_pack(pd->tb_main, f->btn, j++, 0, 1, 1);
-        evas_object_show(f->btn);
+        _fields[i].enabled = 1;
+        if ((i != PROC_FIELD_CMD) && (!(pd->ui->proc.fields & (1UL << i))))
+          _fields[i].enabled = 0;
      }
-   elm_table_pack(pd->tb_main, pd->glist, 0, 1, j, 1);
-   elm_table_pack(pd->tb_main, pd->summary.fr, 0, 2, j, 1);
-   evas_object_show(pd->summary.fr);
-   elm_genlist_clear(pd->glist);
-   evisum_ui_item_cache_reset(pd->cache, _cache_reset_done_cb, pd);
 }
 
 static void
@@ -216,8 +199,9 @@ _field_menu_check_changed_cb(void *data, Evas_Object *obj, 
void *event_info)
    ui = pd->ui;
 
    f = data;
-   f->enabled = !f->enabled;
-   _content_reset(pd);
+   // Updating here is far too expensive. Maybe in 10 years time. :)
+   // f->enabled = !f->enabled;
+   // _content_reset(pd);
    ui->proc.fields ^= (1 << f->id);
 }
 
@@ -305,6 +289,38 @@ _fields_init(Data *pd)
      }
 }
 
+// Updating fields is a heavy exercise. We both offset the
+// cache clearing and delay the initial update for a better
+// experience.
+static void
+_content_reset(Data *pd)
+{
+   int j = 0;
+
+   // Update fields from bitmask.
+   _fields_update(pd);
+
+   elm_table_clear(pd->tb_main, 0);
+   elm_table_pack(pd->tb_main, pd->btn_menu, j++, 0, 1, 1);
+   for (int i = j; i < PROC_FIELD_MAX; i++)
+     {
+        Field *f = &_fields[i];
+        if (!f->enabled)
+          {
+             evas_object_hide(f->btn);
+             continue;
+          }
+        pd->field_max = i;
+        elm_table_pack(pd->tb_main, f->btn, j++, 0, 1, 1);
+        evas_object_show(f->btn);
+     }
+   elm_table_pack(pd->tb_main, pd->glist, 0, 1, j, 1);
+   elm_table_pack(pd->tb_main, pd->summary.fr, 0, 2, j, 1);
+   evas_object_show(pd->summary.fr);
+   elm_genlist_clear(pd->glist);
+   evisum_ui_item_cache_reset(pd->cache, _cache_reset_done_cb, pd);
+}
+
 static void
 _item_unrealized_cb(void *data, Evas_Object *obj EINA_UNUSED,
                     void *event_info EINA_UNUSED)
@@ -1109,6 +1125,8 @@ _btn_clicked_state_save(Data *pd, Evas_Object *btn)
      {
         evas_object_del(pd->fields_menu);
         pd->fields_menu = NULL;
+        // Postpone field changes until the user dismisses the popup.
+        _content_reset(pd);
         return;
      }
    _btn_icon_state_update(btn, ui->proc.sort_reverse, 0);

-- 


Reply via email to