From 381a56306777900153939b1b46f20e63322944c2 Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Sat, 21 Mar 2015 12:37:00 +1300 Subject: Status bar message expiry based on signals and Urwid main loop --- libmproxy/console/__init__.py | 8 +++++++- libmproxy/console/grideditor.py | 2 +- libmproxy/console/signals.py | 1 + libmproxy/console/statusbar.py | 21 ++++++++++++++------- 4 files changed, 23 insertions(+), 9 deletions(-) (limited to 'libmproxy') diff --git a/libmproxy/console/__init__.py b/libmproxy/console/__init__.py index b5c59ecf..aae7a9c4 100644 --- a/libmproxy/console/__init__.py +++ b/libmproxy/console/__init__.py @@ -212,6 +212,12 @@ class ConsoleMaster(flow.FlowMaster): if options.app: self.start_app(self.options.app_host, self.options.app_port) + signals.call_in.connect(self.sig_call_in) + + def sig_call_in(self, sender, seconds, callback, args=()): + def cb(*_): + return callback(*args) + self.loop.set_alarm_in(seconds, cb) def start_stream_to_path(self, path, mode="wb"): path = os.path.expanduser(path) @@ -576,7 +582,7 @@ class ConsoleMaster(flow.FlowMaster): self.prompt_done() msg = p(txt, *args) if msg: - signals.status_message.send(message=msg, expire=1000) + signals.status_message.send(message=msg, expire=1) def prompt_cancel(self): self.prompt_done() diff --git a/libmproxy/console/grideditor.py b/libmproxy/console/grideditor.py index 2d2754b1..0b563c52 100644 --- a/libmproxy/console/grideditor.py +++ b/libmproxy/console/grideditor.py @@ -132,7 +132,7 @@ class GridWalker(urwid.ListWalker): errors = self.lst[self.focus][1] emsg = self.editor.is_error(self.focus_col, val) if emsg: - signals.status_message.send(message = emsg, expire = 1000) + signals.status_message.send(message = emsg, expire = 1) errors.add(self.focus_col) else: errors.discard(self.focus_col) diff --git a/libmproxy/console/signals.py b/libmproxy/console/signals.py index a844ef8f..7b0ec937 100644 --- a/libmproxy/console/signals.py +++ b/libmproxy/console/signals.py @@ -2,3 +2,4 @@ import blinker status_message = blinker.Signal() +call_in = blinker.Signal() diff --git a/libmproxy/console/statusbar.py b/libmproxy/console/statusbar.py index 7ad78f03..a29767e4 100644 --- a/libmproxy/console/statusbar.py +++ b/libmproxy/console/statusbar.py @@ -1,4 +1,3 @@ - import time import urwid @@ -7,11 +6,14 @@ from . import pathedit, signals from .. import utils - class ActionBar(urwid.WidgetWrap): def __init__(self): - urwid.WidgetWrap.__init__(self, urwid.Text("")) - signals.status_message.connect(self.message) + urwid.WidgetWrap.__init__(self, None) + self.clear() + signals.status_message.connect(self.sig_message) + + def clear(self): + self._w = urwid.Text("") def selectable(self): return True @@ -22,9 +24,14 @@ class ActionBar(urwid.WidgetWrap): def prompt(self, prompt, text = ""): self._w = urwid.Edit(prompt, text or "") - def message(self, sender, message, expire=None): - self.expire = expire - self._w = urwid.Text(message) + def sig_message(self, sender, message, expire=None): + w = urwid.Text(message) + self._w = w + if expire: + def cb(*args): + if w == self._w: + self.clear() + signals.call_in.send(seconds=expire, callback=cb) class StatusBar(urwid.WidgetWrap): -- cgit v1.2.3