On Wednesday, November 20, 2013, davemds wrote: > davemds pushed a commit to branch master. > > > http://git.enlightenment.org/apps/espionage.git/commit/?id=d35bf71a0867f0178b229167795dacabf4161197 > > commit d35bf71a0867f0178b229167795dacabf4161197 > Author: davemds <d...@gurumeditation.it <javascript:;>> > 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
Just need better GUI and GFX, we know u can do it better > --- > 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 > > -- > > > -- Gustavo Sverzut Barbieri -------------------------------------- Mobile: +55 (19) 9225-2202 Contact: http://www.gustavobarbieri.com.br/contact ------------------------------------------------------------------------------ Shape the Mobile Experience: Free Subscription Software experts and developers: Be at the forefront of tech innovation. Intel(R) Software Adrenaline delivers strategic insight and game-changing conversations that shape the rapidly evolving mobile landscape. Sign up now. http://pubads.g.doubleclick.net/gampad/clk?id=63431311&iu=/4140/ostg.clktrk _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel