summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2015-10-17 18:15:30 +0300
committerLars Wirzenius <liw@liw.fi>2015-10-17 18:19:24 +0300
commit242462fb7aed3305399ef2edd53a2db14c6e8ea2 (patch)
tree031db2251dcf527e0f03a7d8f11e58bd08c357ed
parent6e1263591b6dcf6451c457f27a64d497d5b26437 (diff)
downloadttystatus-242462fb7aed3305399ef2edd53a2db14c6e8ea2.tar.gz
Precompute interests
Rather than querying each method if it's interested in a variable, remember which widgets are interested in which variables.
-rw-r--r--ttystatus/status.py24
1 files changed, 18 insertions, 6 deletions
diff --git a/ttystatus/status.py b/ttystatus/status.py
index 09e0e9f..1760f8a 100644
--- a/ttystatus/status.py
+++ b/ttystatus/status.py
@@ -46,8 +46,16 @@ class TerminalStatus(object):
if not self._widget_rows:
self._widget_rows = [[]]
self._widget_rows[-1].append(widget)
- if not hasattr(widget, 'interested_in'):
- widget.interested_in = None
+ self._register_interests(widget)
+
+ def _register_interests(self, widget):
+ if getattr(widget, 'interested_in', None) is None:
+ self._unknown_interest.append(widget)
+ else:
+ for key in widget.interested_in:
+ widgets = self._interested_in.get(key, [])
+ widgets.append(widget)
+ self._interested_in[key] = widgets
def start_new_line(self): # pragma: no cover
'''Start a new line of widgets.'''
@@ -83,6 +91,7 @@ class TerminalStatus(object):
self._widget_rows = []
self._values = {}
self._interested_in = {}
+ self._unknown_interest = []
self._m.clear()
def __getitem__(self, key):
@@ -96,10 +105,13 @@ class TerminalStatus(object):
def __setitem__(self, key, value):
'''Set value for key.'''
self._values[key] = value
- for row in self._widget_rows:
- for w in row:
- if w.interested_in is None or key in w.interested_in:
- w.update(self)
+ widget_lists = [
+ self._interested_in.get(key, []),
+ self._unknown_interest,
+ ]
+ for widgets in widget_lists:
+ for w in widgets:
+ w.update(self)
if self._m.enabled and self._m.time_to_write():
self._write()