[tor-commits] [nyx/master] Added history validation in interpreter panel

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


commit d9bfc5df053567b3e3df55b46c0666a7a7486188
Author: Sambuddha Basu <sambuddhabasu1 at gmail.com>
Date:   Sat Jul 2 01:34:52 2016 -0700

    Added history validation in interpreter panel
---
 nyx/curses.py            | 39 +++++++++++++++++++++++++++++++++++++--
 nyx/panel/interpreter.py |  2 +-
 2 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/nyx/curses.py b/nyx/curses.py
index 53a2c43..21b7a42 100644
--- a/nyx/curses.py
+++ b/nyx/curses.py
@@ -244,7 +244,7 @@ def key_input(input_timeout = None):
   return KeyInput(CURSES_SCREEN.getch())
 
 
-def str_input(x, y, initial_text = ''):
+def str_input(x, y, initial_text = '', backlog=None):
   """
   Provides a text field where the user can input a string, blocking until
   they've done so and returning the result. If the user presses escape then
@@ -284,6 +284,38 @@ def str_input(x, y, initial_text = ''):
     else:
       return key
 
+  history_dict = {'selection_index': -1, 'custom_input': ''}
+
+  def handle_history_key(textbox, key):
+    if key in (curses.KEY_UP, curses.KEY_DOWN):
+      offset = 1 if key == curses.KEY_UP else -1
+      new_selection = history_dict['selection_index'] + offset
+
+      new_selection = max(-1, new_selection)
+      new_selection = min(len(backlog) - 1, new_selection)
+
+      if history_dict['selection_index'] == new_selection:
+        return None
+
+      if history_dict['selection_index'] == -1:
+        history_dict['custom_input'] = textbox.gather().strip()
+
+      if new_selection == -1:
+        new_input = history_dict['custom_input']
+      else:
+        new_input = backlog[new_selection]
+
+      y, _ = textbox.win.getyx()
+      _, max_x = textbox.win.getmaxyx()
+      textbox.win.clear()
+      textbox.win.addstr(y, 0, new_input[:max_x - 1])
+      textbox.win.move(y, min(len(new_input), max_x - 1))
+
+      history_dict['selection_index'] = new_selection
+      return None
+
+    return handle_key(textbox, key)
+
   with CURSES_LOCK:
     if HALT_ACTIVITY:
       return None
@@ -300,7 +332,10 @@ def str_input(x, y, initial_text = ''):
     curses_subwindow.addstr(0, 0, initial_text[:width - 1])
 
     textbox = curses.textpad.Textbox(curses_subwindow, insert_mode = True)
-    user_input = textbox.edit(lambda key: handle_key(textbox, key)).strip()
+    if backlog is not None:
+      user_input = textbox.edit(lambda key: handle_history_key(textbox, key)).strip()
+    else:
+      user_input = textbox.edit(lambda key: handle_key(textbox, key)).strip()
 
     try:
       curses.curs_set(0)  # hide cursor
diff --git a/nyx/panel/interpreter.py b/nyx/panel/interpreter.py
index 6b79770..8a48b34 100644
--- a/nyx/panel/interpreter.py
+++ b/nyx/panel/interpreter.py
@@ -96,7 +96,7 @@ class InterpreterPanel(panel.Panel):
         self.redraw(True)
         _scroll(nyx.curses.KeyInput(curses.KEY_END))
         page_height = self.get_preferred_size()[0] - 1
-        user_input = nyx.curses.str_input(len(PROMPT) + self._x_offset, self.top + len(PROMPT_LINE[-page_height:]))
+        user_input = nyx.curses.str_input(len(PROMPT) + self._x_offset, self.top + len(PROMPT_LINE[-page_height:]), '', list(reversed(self._backlog)))
         user_input, is_done = user_input.strip(), False
 
         if not user_input:





More information about the tor-commits mailing list