[tor-commits] [nyx/master] Separate panel from descriptor dialog

atagar at torproject.org atagar at torproject.org
Sat Jun 27 21:20:49 UTC 2015


commit 34be51ee6ea48f8d8e1c124063a7c6a02f890a79
Author: Damian Johnson <atagar at torproject.org>
Date:   Sat Jun 27 13:41:20 2015 -0700

    Separate panel from descriptor dialog
    
    Abstracting the connection panel from the function for showing a descriptor
    dialog. This essentially moves the outer loop which handled connection panel
    navigation where it belongs.
---
 nyx/connections/conn_panel.py       |   25 ++++++++-
 nyx/connections/descriptor_popup.py |   96 ++++++++++++++---------------------
 2 files changed, 61 insertions(+), 60 deletions(-)

diff --git a/nyx/connections/conn_panel.py b/nyx/connections/conn_panel.py
index fe41507..c555a38 100644
--- a/nyx/connections/conn_panel.py
+++ b/nyx/connections/conn_panel.py
@@ -311,8 +311,29 @@ class ConnectionPanel(panel.Panel, threading.Thread):
         if selection != -1:
           self.set_listing_type(options[selection])
       elif key.match('d'):
-        # presents popup for raw consensus data
-        descriptor_popup.show_descriptor_popup(self)
+        self.set_title_visible(False)
+        self.redraw(True)
+
+        while True:
+          selection = self.get_selection()
+
+          if not selection:
+            break
+
+          color = nyx.connections.conn_entry.CATEGORY_COLOR[selection.get_type()]
+          fingerprint = None if selection.foreign.get_fingerprint() == 'UNKNOWN' else selection.foreign.get_fingerprint()
+          is_close_key = lambda key: key.is_selection() or key.match('d') or key.match('left') or key.match('right')
+          key = descriptor_popup.show_descriptor_popup(fingerprint, color, self.max_x, is_close_key)
+
+          if not key or key.is_selection() or key.match('d'):
+            break  # closes popup
+          elif key.match('left'):
+            self.handle_key(panel.KeyInput(curses.KEY_UP))
+          elif key.match('right'):
+            self.handle_key(panel.KeyInput(curses.KEY_DOWN))
+
+        self.set_title_visible(True)
+        self.redraw(True)
       elif key.match('c') and self.is_clients_allowed():
         count_popup.showCountDialog(count_popup.CountType.CLIENT_LOCALE, self._client_locale_usage)
       elif key.match('e') and self.is_exits_allowed():
diff --git a/nyx/connections/descriptor_popup.py b/nyx/connections/descriptor_popup.py
index 1d155c3..358784c 100644
--- a/nyx/connections/descriptor_popup.py
+++ b/nyx/connections/descriptor_popup.py
@@ -6,9 +6,8 @@ import math
 import curses
 
 import nyx.popups
-import nyx.connections.conn_entry
 
-from nyx.util import panel, tor_controller, ui_tools
+from nyx.util import tor_controller, ui_tools
 
 from stem.util import str_tools
 
@@ -22,70 +21,51 @@ UNRESOLVED_MSG = 'No consensus data available'
 ERROR_MSG = 'Unable to retrieve data'
 
 
-def show_descriptor_popup(conn_panel):
+def show_descriptor_popup(fingerprint, color, max_width, is_close_key):
   """
-  Presents consensus descriptor in popup window with the following controls:
-  Up, Down, Page Up, Page Down - scroll descriptor
-  Right, Left - next / previous connection
-  Enter, Space, d, D - close popup
+  Provides a dialog showing the descriptors for a given relay.
 
-  Arguments:
-    conn_panel - connection panel providing the dialog
+  :param str fingerprint: fingerprint of the relay to be shown
+  :param str color: text color of the dialog
+  :param int max_width: maximum width of the dialog
+  :param function is_close_key: method to indicate if a key should close the
+    dialog or not
+
+  :returns: :class:`~nyx.util.panel.KeyInput` for the keyboard input that
+    closed the dialog
   """
 
-  # hides the title of the connection panel
+  if fingerprint:
+    title = 'Consensus Descriptor:'
+    lines = _display_text(fingerprint)
+    show_line_numbers = True
+  else:
+    title = 'Consensus Descriptor (%s):' % fingerprint
+    lines = [UNRESOLVED_MSG]
+    show_line_numbers = False
+
+  popup_height, popup_width = _preferred_size(lines, max_width, show_line_numbers)
 
-  conn_panel.set_title_visible(False)
-  conn_panel.redraw(True)
+  with nyx.popups.popup_window(popup_height, popup_width) as (popup, _, height):
+    if not popup:
+      return None
 
-  control = nyx.controller.get_controller()
+    scroll, redraw = 0, True
 
-  with panel.CURSES_LOCK:
     while True:
-      selection = conn_panel.get_selection()
-
-      if not selection:
-        break
-
-      fingerprint = selection.foreign.get_fingerprint()
-
-      if fingerprint == 'UNKNOWN':
-        title = 'Consensus Descriptor (%s):' % fingerprint
-        lines = [UNRESOLVED_MSG]
-        show_line_numbers = False
-      else:
-        title = 'Consensus Descriptor:'
-        lines = _display_text(fingerprint)
-        show_line_numbers = True
-
-      color = nyx.connections.conn_entry.CATEGORY_COLOR[selection.get_type()]
-      popup_height, popup_width = _preferred_size(lines, conn_panel.max_x, show_line_numbers)
-
-      with nyx.popups.popup_window(popup_height, popup_width) as (popup, _, height):
-        if popup:
-          scroll = 0
-          _draw(popup, title, lines, color, scroll, show_line_numbers)
-
-          while True:
-            key = control.key_input()
-
-            if key.is_scroll():
-              new_scroll = ui_tools.get_scroll_position(key, scroll, height - 2, len(lines))
-
-              if scroll != new_scroll:
-                scroll = new_scroll
-                _draw(popup, title, lines, color, scroll, show_line_numbers)
-            elif key.is_selection() or key.match('d'):
-              return  # closes popup
-            elif key.match('left'):
-              conn_panel.handle_key(panel.KeyInput(curses.KEY_UP))
-              break
-            elif key.match('right'):
-              conn_panel.handle_key(panel.KeyInput(curses.KEY_DOWN))
-              break
-
-  conn_panel.set_title_visible(True)
-  conn_panel.redraw(True)
+      if redraw:
+        _draw(popup, title, lines, color, scroll, show_line_numbers)
+        redraw = False
+
+      key = nyx.controller.get_controller().key_input()
+
+      if key.is_scroll():
+        new_scroll = ui_tools.get_scroll_position(key, scroll, height - 2, len(lines))
+
+        if scroll != new_scroll:
+          scroll, redraw = new_scroll, True
+      elif is_close_key(key):
+        return key
 
 
 def _display_text(fingerprint):





More information about the tor-commits mailing list