[tor-commits] [nyx/master] Format user input and fix scrollbar

atagar at torproject.org atagar at torproject.org
Sun Jul 31 23:32:40 UTC 2016


commit e8854801ef1f5161917328f36556407c8395e7b0
Author: Sambuddha Basu <sambuddhabasu1 at gmail.com>
Date:   Sat Jun 25 15:44:56 2016 -0700

    Format user input and fix scrollbar
---
 nyx/panel/interpreter.py | 63 +++++++++++++++++++++++++++++++-----------------
 1 file changed, 41 insertions(+), 22 deletions(-)

diff --git a/nyx/panel/interpreter.py b/nyx/panel/interpreter.py
index 7865c55..2877501 100644
--- a/nyx/panel/interpreter.py
+++ b/nyx/panel/interpreter.py
@@ -8,8 +8,9 @@ import nyx.curses
 import re
 
 from nyx.curses import BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, BOLD, HIGHLIGHT, NORMAL
-from nyx import panel, tor_interpreter
+from nyx import panel
 
+import stem
 import stem.connection
 import stem.interpreter.commands
 
@@ -28,11 +29,23 @@ def ansi_to_output(line, attrs):
     for attr in ansi_re[0].split(';'):
       new_attrs.append(ATTRS[attr])
     attrs = new_attrs
+
   line = ANSI_RE.sub('', line)
 
   return [(line, ) + tuple(attrs)], attrs
 
 
+def format_input(user_input):
+  user_input = user_input.split(' ', 1)
+  cmd = user_input[0].upper()
+  output = [(PROMPT, GREEN, BOLD), (cmd, GREEN, BOLD)]
+
+  if len(user_input) > 1:
+    output.append((' ' + user_input[1], CYAN, BOLD))
+
+  return output
+
+
 class InterpreterPanel(panel.Panel):
   """
   Renders the interpreter panel with a prompt providing raw control port
@@ -43,6 +56,7 @@ class InterpreterPanel(panel.Panel):
     panel.Panel.__init__(self, 'interpreter')
 
     self._is_input_mode = False
+    self._last_content_height = 0
     self._x_offset = 0
     self._scroller = nyx.curses.Scroller()
     self.controller = stem.connection.connect(
@@ -54,8 +68,8 @@ class InterpreterPanel(panel.Panel):
 
   def key_handlers(self):
     def _scroll(key):
-      page_height = self.get_preferred_size()[0]
-      is_changed = self._scroller.handle_key(key, len(PROMPT_LINE), page_height)
+      page_height = self.get_preferred_size()[0] - 1
+      is_changed = self._scroller.handle_key(key, self._last_content_height, page_height)
 
       if is_changed:
         self.redraw(True)
@@ -72,14 +86,17 @@ class InterpreterPanel(panel.Panel):
         if not user_input:
           is_done = True
 
-        response = self.interpreter.run_command(user_input)
-        color = None
-        if response:
-          PROMPT_LINE.insert(len(PROMPT_LINE) - 1, [(PROMPT, GREEN, BOLD), (user_input)])
-          attrs = []
-          for line in response.split('\n'):
-            line, attrs = ansi_to_output(line, attrs)
-            PROMPT_LINE.insert(len(PROMPT_LINE) - 1, line)
+        try:
+          response = self.interpreter.run_command(user_input)
+          color = None
+          if response:
+            PROMPT_LINE.insert(len(PROMPT_LINE) - 1, format_input(user_input))
+            attrs = []
+            for line in response.split('\n'):
+              line, attrs = ansi_to_output(line, attrs)
+              PROMPT_LINE.insert(len(PROMPT_LINE) - 1, line)
+        except stem.SocketClosed:
+          is_done = True
 
         if is_done:
           self._is_input_mode = False
@@ -91,30 +108,32 @@ class InterpreterPanel(panel.Panel):
     )
 
   def draw(self, width, height):
-    scroll = self._scroller.location(len(PROMPT_LINE), height)
+    scroll = self._scroller.location(self._last_content_height, height)
 
     usage_msg = ' (enter \"/help\" for usage or a blank line to stop)' if self._is_input_mode else ""
     self.addstr(0, 0, 'Control Interpreter%s:' % usage_msg, HIGHLIGHT)
 
-    is_scrollbar_visible = len(PROMPT_LINE) > height - 1
+    is_scrollbar_visible = self._last_content_height > height - 1
     if is_scrollbar_visible:
-      self.add_scroll_bar(scroll, scroll + height, len(PROMPT_LINE), 1)
+      self.add_scroll_bar(scroll, scroll + height, self._last_content_height, 1)
 
-    self._x_offset, draw_line = 2 if is_scrollbar_visible else 0, 1 - scroll
+    self._x_offset, y = 2 if is_scrollbar_visible else 0, 1 - scroll
     for entry in PROMPT_LINE:
       cursor = self._x_offset
 
       for line in entry:
-        if len(line) == 1:
-          self.addstr(draw_line, cursor, line[0])
-        elif len(line) == 2:
-          self.addstr(draw_line, cursor, line[0], line[1])
+        if len(line) == 2:
+          self.addstr(y, cursor, line[0], line[1])
         elif len(line) == 3:
-          self.addstr(draw_line, cursor, line[0], line[1], line[2])
-        self.addstr(draw_line, cursor, line)
+          self.addstr(y, cursor, line[0], line[1], line[2])
         try:
           cursor += len(line[0])
         except:
           pass
 
-      draw_line += 1
+      y += 1
+
+    new_content_height = y + scroll - 1
+    if new_content_height != self._last_content_height:
+      self._last_content_height = new_content_height
+      self.redraw(True)





More information about the tor-commits mailing list