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 --
