davemds pushed a commit to branch master.

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

commit d35bf71a0867f0178b229167795dacabf4161197
Author: davemds <[email protected]>
Date:   Wed Nov 20 21:33:47 2013 +0100

    Espionage: add the new signal inspector.
    
    A new Pane at the bottom of the window show ALL the signals that
    transit on both buses. Double clicking on a received signal you can
    see its full content (parameters).
    
    Now Espionage have more features than d-feet...efl beats gnome one more 
time :D
---
 espionage/espionage.py | 139 ++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 120 insertions(+), 19 deletions(-)

diff --git a/espionage/espionage.py b/espionage/espionage.py
index ffd468a..b60ad00 100644
--- a/espionage/espionage.py
+++ b/espionage/espionage.py
@@ -38,6 +38,7 @@ from efl.elementary.panes import Panes
 from efl.elementary.popup import Popup
 from efl.elementary.separator import Separator
 from efl.elementary.table import Table
+from efl.elementary.frame import Frame
 from efl.elementary.genlist import Genlist, GenlistItem, GenlistItemClass
 from efl.dbus_mainloop import DBusEcoreMainLoop
 
@@ -48,6 +49,14 @@ class Options(object):
         self.show_introspect_stuff = False
         self.show_private_stuff = False
         self.pretty_output = True
+        self.scroll_on_signal = True
+
+
+def prettify_if_needed(data):
+    if options.pretty_output:
+        return utf8_to_markup(json.dumps(data, indent=2))
+    else:
+        return utf8_to_markup(str(data))
 
 
 ### connect to session and system buses, and set session as the current one
@@ -548,21 +557,103 @@ class MethodRunner(Popup):
         #      wrong params for example are raised later :/
 
     def reply_handler(self, *rets):
-        if rets:
-            if options.pretty_output:
-                s = utf8_to_markup(json.dumps(rets, indent=2))
-            else:
-                s = utf8_to_markup(str(rets))
-        else:
-            s = "Method executed successfully.<br>Nothing returned."
-        self._return_entry.entry = s
+        self._return_entry.entry = prettify_if_needed(rets) if rets \
+                else "Method executed successfully.<br>Nothing returned."
 
     def error_handler(self, *rets):
         self._return_entry.entry = 'Error executing method'
 
 
+### Signals receiver
+class SignalItemClass(GenlistItemClass):
+    def __init__(self):
+        GenlistItemClass.__init__(self, item_style='default_style')
+    def text_get(self, gl, part, data):
+        return '<b>%s</>  iface: <i>%s</> path: <i>%s</> sender: <i>%s</>' % \
+               (data['signal'], data['iface'], data['path'], data['sender'])
+
+class SignalReceiver(Frame):
+    def __init__(self, parent):
+        Frame.__init__(self, parent, text="Signals")
+        self._parent = parent
+
+        vbox = Box(self)
+        vbox.show()
+        self.content = vbox
+
+        self.siglist = Genlist(self, homogeneous=True, 
mode=elm.ELM_LIST_SCROLL)
+        self.siglist.size_hint_weight = EVAS_HINT_EXPAND, EVAS_HINT_EXPAND
+        self.siglist.size_hint_align = EVAS_HINT_FILL, EVAS_HINT_FILL
+        self.siglist.callback_clicked_double_add(self.signal_clicked_cb)
+        self.siglist.show()
+        vbox.pack_end(self.siglist)
+        self.itc = SignalItemClass()
+
+        hbox = Box(self, horizontal=True)
+        hbox.size_hint_align = 0.0, 0.5
+        hbox.show()
+        vbox.pack_end(hbox)
+
+        bt = Button(self, text='Clear')
+        bt.callback_clicked_add(lambda b: self.siglist.clear())
+        hbox.pack_end(bt)
+        bt.show()
+
+        def scroll_on_signal_clicked_cb(chk):
+            options.scroll_on_signal = chk.state
+        ck = Check(self, text='Scroll on signal')
+        ck.state = options.scroll_on_signal
+        ck.callback_changed_add(scroll_on_signal_clicked_cb)
+        hbox.pack_end(ck)
+        ck.show()
+
+        for b in session_bus, system_bus:
+            b.add_signal_receiver(self.signal_cb, sender_keyword='sender',
+                destination_keyword='dest', interface_keyword='iface',
+                member_keyword='signal',path_keyword='path')
+
+    def signal_cb(self, *args, **kargs):
+        # print('*** SIGNAL RECEIVED ***')
+        # print(json.dumps(args, indent=2))
+        # print(json.dumps(kargs, indent=2))
+
+        kargs['args'] = args
+        item = self.siglist.item_append(self.itc, kargs)
+        if options.scroll_on_signal is True:
+            item.bring_in()
+
+        if self.siglist.items_count > 200:
+            self.siglist.first_item.delete()
+
+    def signal_clicked_cb(self, gl, item):
+        pp = Popup(self._parent)
+        pp.part_text_set('title,text', 'Signal content')
+
+        en = Entry(self, text = prettify_if_needed(item.data['args']))
+        en.size_hint_weight = EVAS_HINT_EXPAND, EVAS_HINT_EXPAND
+        en.size_hint_align = EVAS_HINT_FILL, EVAS_HINT_FILL
+        en.size_hint_min = 800, 800 # TODO: this should be respected :/
+        en.editable = False
+        en.scrollable = True
+        pp.content = en
+
+        bt = Button(pp, text="Close")
+        bt.callback_clicked_add(lambda b: pp.delete())
+        pp.part_content_set('button2', bt)
+
+        def prettify_clicked_cb(chk):
+            options.pretty_output = chk.state
+            en.text = prettify_if_needed(item.data['args'])
+        ck = Check(pp, text="Prettify")
+        ck.state = options.pretty_output
+        ck.callback_changed_add(prettify_clicked_cb)
+        pp.part_content_set('button1', ck)
+
+        pp.show()
+
+
 ### The main window
-class MyWin(StandardWindow):
+class EspionageWin(StandardWindow):
     def __init__(self):
         StandardWindow.__init__(self, "espionage", "EFL DBus Spy - Espionage")
 
@@ -602,19 +693,29 @@ class MyWin(StandardWindow):
         tb.pack(chk, 2, 1, 1, 1)
         chk.show()
 
-        panes = Panes(self)
-        panes.size_hint_weight = EVAS_HINT_EXPAND, EVAS_HINT_EXPAND
-        panes.size_hint_align = EVAS_HINT_FILL, EVAS_HINT_FILL
-        panes.content_left_size = 1.0 / 3
-        box.pack_end(panes)
-        self.panes = panes
-        panes.show()
+        vpanes = Panes(self, horizontal=True)
+        vpanes.size_hint_weight = EVAS_HINT_EXPAND, EVAS_HINT_EXPAND
+        vpanes.size_hint_align = EVAS_HINT_FILL, EVAS_HINT_FILL
+        vpanes.content_left_size = 2.0 / 3
+        box.pack_end(vpanes)
+        vpanes.show()
+        
+        hpanes = Panes(self)
+        hpanes.size_hint_weight = EVAS_HINT_EXPAND, EVAS_HINT_EXPAND
+        hpanes.size_hint_align = EVAS_HINT_FILL, EVAS_HINT_FILL
+        hpanes.content_left_size = 1.0 / 3
+        vpanes.part_content_set("left", hpanes)
+        self.panes = hpanes
+        hpanes.show()
 
         self.names_list = NamesList(self)
-        panes.part_content_set("left", self.names_list)
+        hpanes.part_content_set("left", self.names_list)
 
         self.detail_list = DetailList(self)
-        panes.part_content_set("right", self.detail_list)
+        hpanes.part_content_set("right", self.detail_list)
+
+        self.sigs_receiver = SignalReceiver(self)
+        vpanes.part_content_set("right", self.sigs_receiver)
 
         self.resize(700, 500)
         self.show()
@@ -639,7 +740,7 @@ class MyWin(StandardWindow):
 
 def main():
     elm.init()
-    win = MyWin()
+    win = EspionageWin()
     elm.run()
     elm.shutdown()
     return 0

-- 


Reply via email to