davemds pushed a commit to branch master.

http://git.enlightenment.org/enlightenment/modules/edgar.git/commit/?id=7cdd484427f44dd43239a4fd1e47c27ef53b37bc

commit 7cdd484427f44dd43239a4fd1e47c27ef53b37bc
Author: Dave Andreoli <d...@gurumeditation.it>
Date:   Sun Sep 13 16:23:14 2015 +0200

    Cpu gadget: add a popup with the list of running processes
---
 GADGETS/cpu/__init__.py | 98 +++++++++++++++++++++++++++++++++++++++++++++----
 GADGETS/cpu/cpu.edc     | 11 +-----
 2 files changed, 92 insertions(+), 17 deletions(-)

diff --git a/GADGETS/cpu/__init__.py b/GADGETS/cpu/__init__.py
index 53d0f7c..2cc6ca3 100644
--- a/GADGETS/cpu/__init__.py
+++ b/GADGETS/cpu/__init__.py
@@ -1,5 +1,6 @@
 # This python file use the following encoding: utf-8
 
+from operator import itemgetter
 import psutil
 
 import e
@@ -8,6 +9,8 @@ from efl import ecore
 from efl import evas
 from efl import edje
 from efl.evas import EXPAND_BOTH, FILL_BOTH
+from efl.elementary import Box, Label, Entry, Icon, Genlist, GenlistItemClass, 
\
+    ELM_OBJECT_SELECT_MODE_NONE, ELM_LIST_COMPRESS
 
 
 __gadget_name__ = 'CPU Monitor'
@@ -19,7 +22,6 @@ __gadget_vapi__ = 1
 __gadget_opts__ = { 'popup_on_desktop': False }
 
 
-
 class Gadget(e.Gadget):
 
     def __init__(self):
@@ -27,7 +29,11 @@ class Gadget(e.Gadget):
 
         self.num_cores = len(psutil.cpu_percent(interval=0, percpu=True))
         self.aspect = None
-        self.poller = None
+        self.main_poller = None
+        self.popups_poller = None
+        self.popups_itc = GenlistItemClass(item_style='default',
+                                           text_get_func=self.gl_text_get,
+                                           
content_get_func=self.gl_content_get)
 
     def instance_created(self, obj, site):
         super().instance_created(obj, site)
@@ -48,17 +54,17 @@ class Gadget(e.Gadget):
         obj.size_hint_aspect = (evas.EVAS_ASPECT_CONTROL_BOTH,
                                 self.aspect[0] * self.num_cores, 
self.aspect[1])
 
-        if self.poller is None:
-            self.poller = ecore.Poller(8, self.poller_cb, 
ecore.ECORE_POLLER_CORE)
+        if self.main_poller is None:
+            self.main_poller = ecore.Poller(8, self.main_poller_cb)
 
     def instance_destroyed(self, obj):
         super().instance_destroyed(obj)
 
-        if len(self._instances) < 1 and self.poller is not None:
-            self.poller.delete()
-            self.poller = None
+        if len(self._instances) < 1 and self.main_poller is not None:
+            self.main_poller.delete()
+            self.main_poller = None
 
-    def poller_cb(self):
+    def main_poller_cb(self):
         percents = psutil.cpu_percent(interval=0, percpu=True)
 
         for obj in self._instances:
@@ -66,3 +72,79 @@ class Gadget(e.Gadget):
                 bar.message_send(0, percents[i])
 
         return ecore.ECORE_CALLBACK_RENEW
+
+    def popup_created(self, popup):
+        super().popup_created(popup)
+
+        box = Box(popup)
+        popup.part_swallow('main.swallow', box)
+        box.show()
+
+        en = Entry(popup, single_line=True, editable=False)
+        en.text_style_user_push("DEFAULT='font_weight=Bold'")
+        box.pack_end(en)
+        en.show()
+        popup.data['head'] = en
+
+        li = Genlist(popup, homogeneous=True, mode=ELM_LIST_COMPRESS,
+                     select_mode=ELM_OBJECT_SELECT_MODE_NONE,
+                     size_hint_expand=EXPAND_BOTH, size_hint_fill=FILL_BOTH)
+        box.pack_end(li)
+        li.show()
+        popup.data['list'] = li
+
+        self.popups_poller_cb()
+        if self.popups_poller is None:
+            self.popups_poller = ecore.Poller(16, self.popups_poller_cb)
+
+    def popup_destroyed(self, popup):
+        super().popup_destroyed(popup)
+
+        if len(self._popups) < 1 and self.popups_poller is not None:
+            self.popups_poller.delete()
+            self.popups_poller = None
+        
+    def popups_poller_cb(self):
+        # build an orderd list of all running procs (pid, name, cpu_perc, 
mun_t)
+        self.top_procs = [ (p.pid, p.name(),
+                            p.cpu_percent(interval=0) / self.num_cores,
+                            p.num_threads())
+                           for p in psutil.process_iter() ]
+        self.top_procs.sort(key=itemgetter(2), reverse=True)
+
+        # update all the visible genlists
+        for popup in self._popups:
+            li = popup.data['list']
+
+            # adjust the size (items count) of the genlist
+            items_count = li.items_count()
+            procs_count = len(self.top_procs)
+            if procs_count > items_count:
+                for idx in range(items_count, procs_count):
+                    li.item_append(self.popups_itc, idx)
+            elif procs_count < items_count:
+                for idx in range(procs_count, items_count):
+                    li.last_item.delete()
+
+            # update visible list items and the header text
+            li.realized_items_update()
+            popup.data['head'].text = '{} Running 
processes'.format(procs_count)
+
+        return ecore.ECORE_CALLBACK_RENEW
+
+    def gl_text_get(self, gl, part, idx):
+        pid, name, cpu, num_t = self.top_procs[idx]
+        if num_t > 1:
+            return '[{}] {} ({} threads)'.format(pid, name, num_t)
+        else:
+            return '[{}] {}'.format(pid, name)
+
+    def gl_content_get(self, gl, part, idx):
+        pid, name, cpu, num_t = self.top_procs[idx]
+        if part == 'elm.swallow.end':
+            return Label(gl, text='{0:.1f} %'.format(cpu))
+        if part == 'elm.swallow.icon':
+            try:
+                return Icon(gl, standard=name)
+            except RuntimeWarning: # icon not found
+                return None
diff --git a/GADGETS/cpu/cpu.edc b/GADGETS/cpu/cpu.edc
index 6867cc4..ecc3f0e 100644
--- a/GADGETS/cpu/cpu.edc
+++ b/GADGETS/cpu/cpu.edc
@@ -149,20 +149,13 @@ collections {
 /**
  *  API [e/gadget/popup] This is the group that will be placed inside popups
  */
-/*
    group { name: "e/gadgets/cpu/popup";
-      min: 310 0;
+      min: 300 300;
       parts {
-         box { "popup.box";
+         swallow { "main.swallow";
             desc { "default";
-               box {
-                  layout: "vertical";
-                  padding: 0 6;
-                  min: 1 1;
-               }
             }
          }
       }
    }
-*/
 }

-- 


Reply via email to