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 <[email protected] <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
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel