[tor-commits] [nyx/master] Notify all panels of pausing/unpausing

atagar at torproject.org atagar at torproject.org
Fri Sep 16 06:18:14 UTC 2016


commit f271985f7647e56b6737be689ceeb5329b1d492c
Author: Damian Johnson <atagar at torproject.org>
Date:   Mon Sep 12 10:33:36 2016 -0700

    Notify all panels of pausing/unpausing
    
    Initially I thought a listener pattern would make more sense, but just about
    all the panels need to be notified when we're paused or unpaused. As such
    adding a notification hook to the panel.
    
    This lets us drop get_pause_time() from the Interface since the two panels that
    care about this can now track it for themselves.
---
 nyx/__init__.py         | 24 +-----------------------
 nyx/panel/__init__.py   | 10 ++++++++++
 nyx/panel/connection.py |  7 ++++++-
 nyx/panel/graph.py      | 10 +++++-----
 nyx/panel/header.py     | 10 +++++++---
 nyx/panel/log.py        |  8 ++++----
 6 files changed, 33 insertions(+), 36 deletions(-)

diff --git a/nyx/__init__.py b/nyx/__init__.py
index 268c4ba..4a031c7 100644
--- a/nyx/__init__.py
+++ b/nyx/__init__.py
@@ -16,14 +16,12 @@ Tor curses monitoring application.
 
   Interface - overall nyx interface
     |- is_paused - checks if the interface is paused
-    |- pause_time - time when the interface was paused
     +- set_paused - sets paused state
 """
 
 import distutils.spawn
 import os
 import sys
-import time
 
 import stem.connection
 import stem.control
@@ -221,7 +219,6 @@ class Interface(object):
 
   def __init__(self):
     self._paused = False
-    self._pause_time = None
 
   def is_paused(self):
     """
@@ -232,16 +229,6 @@ class Interface(object):
 
     return self._paused
 
-  def get_pause_time(self):
-    """
-    Provides the time that we were last paused.
-
-    :returns: **float** with the unix timestamp for when we were last paused,
-      **None** if not paused
-    """
-
-    return self._pause_time
-
   def set_paused(self, is_pause):
     """
     Pauses or unpauses the interface.
@@ -252,18 +239,9 @@ class Interface(object):
 
     if is_pause != self._paused:
       self._paused = is_pause
-      self._pause_time = time.time() if is_pause else None
-
-      # Couple panels have their own pausing behavior. I'll later change this to
-      # a listener approach or someting else that's less hacky.
 
       for panel_impl in self.get_all_panels():
-        if isinstance(panel_impl, nyx.panel.graph.GraphPanel) or isinstance(panel_impl, nyx.panel.log.LogPanel):
-          panel_impl.set_paused(is_pause)
+        panel_impl.set_paused(is_pause)
 
       for panel_impl in self.get_display_panels():
         panel_impl.redraw()
-
-
-import nyx.panel.graph
-import nyx.panel.log
diff --git a/nyx/panel/__init__.py b/nyx/panel/__init__.py
index 5714db4..49c7e22 100644
--- a/nyx/panel/__init__.py
+++ b/nyx/panel/__init__.py
@@ -21,6 +21,7 @@ Panels consisting the nyx interface.
     |- get_height - height occupied by the panel
     |
     |- set_visible - toggles panel visiblity
+    |- set_paused - notified when interface pauses or unpauses
     |- key_handlers - keyboard input accepted by the panel
     |- submenu - submenu for the panel
     +- redraw - renders the panel content
@@ -133,6 +134,15 @@ class Panel(object):
 
     self._visible = is_visible
 
+  def set_paused(self, is_pause):
+    """
+    Notified when the interface pauses or unpauses.
+
+    :param bool is_pause: suspended if **True**, resumed otherwise
+    """
+
+    pass
+
   def key_handlers(self):
     """
     Provides keyboard input this panel supports.
diff --git a/nyx/panel/connection.py b/nyx/panel/connection.py
index f8c3a7d..cabba2d 100644
--- a/nyx/panel/connection.py
+++ b/nyx/panel/connection.py
@@ -265,6 +265,7 @@ class ConnectionPanel(nyx.panel.DaemonPanel):
     self._entries = []            # last fetched display entries
     self._show_details = False    # presents the details panel if true
     self._sort_order = CONFIG['features.connection.order']
+    self._pause_time = 0
 
     self._last_resource_fetch = -1  # timestamp of the last ConnectionResolver results used
 
@@ -308,6 +309,10 @@ class ConnectionPanel(nyx.panel.DaemonPanel):
       self._sort_order = results
       self._entries = sorted(self._entries, key = lambda entry: [entry.sort_value(attr) for attr in self._sort_order])
 
+  def set_paused(self, is_pause):
+    if is_pause:
+      self._pause_time = time.time()
+
   def key_handlers(self):
     def _scroll(key):
       page_height = self.get_height() - 1
@@ -426,7 +431,7 @@ class ConnectionPanel(nyx.panel.DaemonPanel):
     selected, scroll = self._scroller.selection(lines, subwindow.height - details_offset - 1)
 
     if interface.is_paused():
-      current_time = interface.get_pause_time()
+      current_time = self._pause_time()
     elif not controller.is_alive():
       current_time = controller.connection_time()
     else:
diff --git a/nyx/panel/graph.py b/nyx/panel/graph.py
index 76d4bfa..5266e3f 100644
--- a/nyx/panel/graph.py
+++ b/nyx/panel/graph.py
@@ -498,6 +498,11 @@ class GraphPanel(nyx.panel.Panel):
       finally:
         nyx.controller.show_message()
 
+  def set_paused(self, is_pause):
+    if is_pause:
+      self._accounting_stats_paused = copy.copy(self._accounting_stats)
+      self._stats_paused = dict([(key, type(self._stats[key])(self._stats[key])) for key in self._stats])
+
   def key_handlers(self):
     def _pick_stats():
       available_stats = sorted(self.stat_options())
@@ -546,11 +551,6 @@ class GraphPanel(nyx.panel.Panel):
       Submenu('Bounds', [RadioMenuItem(opt, bounds_group, opt) for opt in Bounds]),
     ])
 
-  def set_paused(self, is_pause):
-    if is_pause:
-      self._accounting_stats_paused = copy.copy(self._accounting_stats)
-      self._stats_paused = dict([(key, type(self._stats[key])(self._stats[key])) for key in self._stats])
-
   def _draw(self, subwindow):
     if not self._displayed_stat:
       return
diff --git a/nyx/panel/header.py b/nyx/panel/header.py
index 2165c3a..8b270b3 100644
--- a/nyx/panel/header.py
+++ b/nyx/panel/header.py
@@ -49,6 +49,7 @@ class HeaderPanel(nyx.panel.DaemonPanel):
 
     self._last_width = nyx.curses.screen_size().width
     self._reported_inactive = False
+    self._pause_time = 0
 
     self._message = None
     self._message_attr = []
@@ -115,6 +116,10 @@ class HeaderPanel(nyx.panel.DaemonPanel):
     if not self.is_wide():
       self.show_message('Requesting a new identity', HIGHLIGHT, max_wait = 1)
 
+  def set_paused(self, is_pause):
+    if is_pause:
+      self._pause_time = time.time()
+
   def key_handlers(self):
     def _reconnect():
       if self._vals.is_connected:
@@ -153,7 +158,6 @@ class HeaderPanel(nyx.panel.DaemonPanel):
     interface = nyx_interface()
     left_width = max(subwindow.width / 2, 77) if is_wide else subwindow.width
     right_width = subwindow.width - left_width
-    pause_time = interface.get_pause_time() if interface.is_paused() else None
 
     _draw_platform_section(subwindow, 0, 0, left_width, vals)
 
@@ -163,7 +167,7 @@ class HeaderPanel(nyx.panel.DaemonPanel):
       _draw_disconnected(subwindow, 0, 1, vals.last_heartbeat)
 
     if is_wide:
-      _draw_resource_usage(subwindow, left_width, 0, right_width, vals, pause_time)
+      _draw_resource_usage(subwindow, left_width, 0, right_width, vals, self._pause_time)
 
       if vals.is_relay:
         _draw_fingerprint_and_fd_usage(subwindow, left_width, 1, right_width, vals)
@@ -172,7 +176,7 @@ class HeaderPanel(nyx.panel.DaemonPanel):
       elif vals.is_connected:
         _draw_newnym_option(subwindow, left_width, 1, vals.newnym_wait)
     else:
-      _draw_resource_usage(subwindow, 0, 2, left_width, vals, pause_time)
+      _draw_resource_usage(subwindow, 0, 2, left_width, vals, self._pause_time)
 
       if vals.is_relay:
         _draw_fingerprint_and_fd_usage(subwindow, 0, 3, left_width, vals)
diff --git a/nyx/panel/log.py b/nyx/panel/log.py
index ca331ab..2cc41c7 100644
--- a/nyx/panel/log.py
+++ b/nyx/panel/log.py
@@ -189,6 +189,10 @@ class LogPanel(nyx.panel.DaemonPanel):
       except Exception as exc:
         raise IOError("unable to write to '%s': %s" % (path, exc))
 
+  def set_paused(self, is_pause):
+    if is_pause:
+      self._event_log_paused = self._event_log.clone()
+
   def key_handlers(self):
     def _scroll(key):
       page_height = self.get_height() - 1
@@ -256,10 +260,6 @@ class LogPanel(nyx.panel.DaemonPanel):
       ]),
     ])
 
-  def set_paused(self, is_pause):
-    if is_pause:
-      self._event_log_paused = self._event_log.clone()
-
   def _draw(self, subwindow):
     scroll = self._scroller.location(self._last_content_height, subwindow.height - 1)
 





More information about the tor-commits mailing list