davemds pushed a commit to branch master.

http://git.enlightenment.org/apps/espionage.git/commit/?id=ca6a035a43f775189d487d240b0663bcb1e18261

commit ca6a035a43f775189d487d240b0663bcb1e18261
Author: davemds <d...@gurumeditation.it>
Date:   Thu Nov 28 22:35:57 2013 +0100

    Espionage new feature: activatable services
    
    A new group in the left list show all the services that can be activated on 
the bus.
    Clicking on a name will ask dbus to activate it and wait for the name to 
become
    active, once activation is completed the new name is introspected and showed
    on the right list.
---
 espionage/espionage.py | 63 +++++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 52 insertions(+), 11 deletions(-)

diff --git a/espionage/espionage.py b/espionage/espionage.py
index 342c04b..ce552f0 100644
--- a/espionage/espionage.py
+++ b/espionage/espionage.py
@@ -35,6 +35,7 @@ from efl.elementary.entry import Entry, \
 from efl.elementary.flipselector import FlipSelector
 from efl.elementary.label import Label
 from efl.elementary.panes import Panes
+from efl.elementary.progressbar import Progressbar
 from efl.elementary.popup import Popup
 from efl.elementary.separator import Separator
 from efl.elementary.table import Table
@@ -275,6 +276,8 @@ class NamesList(Genlist):
 
         self.win = parent
         self.sig1 = None
+        self.waiting_activation = None
+        self.waiting_popup = None
 
         # create the genlist
         Genlist.__init__(self, parent)
@@ -282,11 +285,17 @@ class NamesList(Genlist):
         self.itc_g = NamesListGroupItemClass()
         self.callback_selected_add(self.item_selected_cb)
 
-        # add private & public group items
+        # add public group item
         self.public_group = self.item_append(self.itc_g, "Public Services",
                                flags=ELM_GENLIST_ITEM_GROUP)
         self.public_group.select_mode_set(ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
 
+        # add activatables group item
+        self.activatable_group = self.item_append(self.itc_g, "Activatable 
Services",
+                               flags=ELM_GENLIST_ITEM_GROUP)
+        
self.activatable_group.select_mode_set(ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
+        
+        # add private group item
         if options.show_private_stuff:
             self.private_group = self.item_append(self.itc_g, "Private 
Services",
                                  flags=ELM_GENLIST_ITEM_GROUP)
@@ -296,9 +305,15 @@ class NamesList(Genlist):
         self.populate()
 
     def populate(self):
-        for name in bus.list_names():
+        active = set(bus.list_names())
+        activatables = set(bus.list_activatable_names()) - active
+
+        for name in active:
             self.service_add(name)
 
+        for name in activatables:
+            self.service_activatable_add(name)
+
         # keep the list updated when a name changes
         if self.sig1: self.sig1.remove()
         self.sig1 = bus.add_signal_receiver(self.name_owner_changed_cb, 
@@ -313,22 +328,50 @@ class NamesList(Genlist):
 
     def item_selected_cb(self, gl, item):
         name = item.data
-        self.win.detail_list.populate(name)
+
+        if item.parent is self.activatable_group:
+            # activate the service, async with a cool popup
+            bus.call_async("org.freedesktop.DBus", "/", "org.freedesktop.DBus",
+                           "StartServiceByName", "su", (name, 0), None, None)
+            spinner = Progressbar(self.win, style="wheel", pulse_mode=True)
+            spinner.pulse(True)
+            def stop_waiting_cb(btn):
+                self.waiting_popup.delete()
+                self.waiting_activation = None
+            button = Button(self.win, text="Stop waiting")
+            button.callback_clicked_add(stop_waiting_cb)
+            popup = Popup(self.win, content=spinner)
+            popup.part_text_set('title,text', 'Activating service...')
+            popup.part_content_set('button1', button)
+            popup.show()
+            self.waiting_activation = name
+            self.waiting_popup = popup
+        else:
+            self.win.detail_list.populate(name)
     
     def sort_cb(self, it1, it2):
         return 1 if it1.data.lower() < it2.data.lower() else -1
 
+    def service_activatable_add(self, name):
+        self.item_sorted_insert(self.itc, name, self.sort_cb,
+                                self.activatable_group, 0, None)
+
     def service_add(self, name):
-        # print("service_add('%s')" % name)
         if name.startswith(":"):
             if options.show_private_stuff:
-                self.item_sorted_insert(self.itc, name, self.sort_cb,
-                                        self.private_group, 0, None)
+                item = self.item_sorted_insert(self.itc, name, self.sort_cb,
+                                               self.private_group, 0, None)
         else:
-            self.item_sorted_insert(self.itc, name, self.sort_cb,
-                                    self.public_group, 0, None)
+            item = self.item_sorted_insert(self.itc, name, self.sort_cb,
+                                           self.public_group, 0, None)
+
+        if self.waiting_activation is not None and name == 
self.waiting_activation:
+            self.waiting_popup.delete()
+            self.waiting_activation = None
+            item.selected = True
+            item.show()
+
     def service_del(self, name):
-        # print("service_del('%s')" % name)
         item = self.first_item
         while item:
             if item.data == name:
@@ -337,8 +380,6 @@ class NamesList(Genlist):
             item = item.next
         
     def name_owner_changed_cb(self, name, old_owner, new_owner):
-        # print("NameOwnerChanged(name='%s', old_owner='%s', new_owner='%s')" %
-              # (name, old_owner, new_owner))
         if old_owner == '':
             self.service_add(name)
         elif new_owner == '':

-- 


Reply via email to