[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