commit b6f25bcbd988a4c97562a2c41c533e894b75a389 Author: Damian Johnson atagar@torproject.org Date: Tue Jul 26 09:45:27 2016 -0700
Interpreter panel limited to two text attr
Why did we have this hardcoded size check? In practice it worked (we rarely have more than one color and one attribute), but the limitation is pointless.
Changing our draw entries to be (text, (attr...)) tuples as we do everywhere else. This is still far from nice code but getting there bit by bit... --- nyx/panel/interpreter.py | 43 ++++++++++++++++--------------------------- test/panel/interpreter.py | 19 ++++++++++--------- 2 files changed, 26 insertions(+), 36 deletions(-)
diff --git a/nyx/panel/interpreter.py b/nyx/panel/interpreter.py index 1dcb0e8..137ab9b 100644 --- a/nyx/panel/interpreter.py +++ b/nyx/panel/interpreter.py @@ -19,13 +19,12 @@ import stem.interpreter.autocomplete import stem.interpreter.commands
-USAGE_INFO = 'to use this panel press enter' -PROMPT = '>>> ' BACKLOG_LIMIT = 100 +PROMPT = [('>>> ', (GREEN, BOLD)), ('to use this panel press enter', (CYAN, BOLD))]
def format_input(user_input): - output = [(PROMPT, GREEN, BOLD)] + output = [('>>> ', (GREEN, BOLD))]
if ' ' in user_input: cmd, arg = user_input.split(' ', 1) @@ -33,11 +32,11 @@ def format_input(user_input): cmd, arg = user_input, ''
if cmd.startswith('/'): - output.append((user_input, MAGENTA, BOLD)) + output.append((user_input, (MAGENTA, BOLD))) else: - output.append((cmd + ' ', GREEN, BOLD)) + output.append((cmd + ' ', (GREEN, BOLD))) if arg: - output.append((arg, CYAN, BOLD)) + output.append((arg, (CYAN, BOLD)))
return output
@@ -60,7 +59,7 @@ class InterpreterPanel(panel.Panel): controller = tor_controller() self.autocompleter = stem.interpreter.autocomplete.Autocompleter(controller) self.interpreter = stem.interpreter.commands.ControlInterpretor(controller) - self.prompt_line = [[(PROMPT, GREEN, BOLD), (USAGE_INFO, CYAN, BOLD)]] + self._lines = []
def key_handlers(self): def _scroll(key): @@ -77,7 +76,7 @@ class InterpreterPanel(panel.Panel): self.redraw(True) _scroll(nyx.curses.KeyInput(curses.KEY_END)) page_height = self.get_height() - 1 - user_input = nyx.curses.str_input(len(PROMPT) + self._x_offset, self.get_top() + len(self.prompt_line[-page_height:]), '', list(reversed(self._backlog)), self.autocompleter.matches) + user_input = nyx.curses.str_input(4 + self._x_offset, self.get_top() + max(len(self._lines[-page_height:]), 1), '', list(reversed(self._backlog)), self.autocompleter.matches) user_input, is_done = user_input.strip(), False
if not user_input: @@ -104,16 +103,12 @@ class InterpreterPanel(panel.Panel): sys.stderr = old_stderr response = '\x1b[31;1m' + new_stderr.getvalue() sys.stderr = old_stderr + if response: - self.prompt_line.insert(len(self.prompt_line) - 1, format_input(user_input)) + self._lines.append(format_input(user_input))
for line in response.split('\n'): - new_line = [] - - for text, attr in nyx.curses.asci_to_curses(line): - new_line.append([text] + list(attr)) - - self.prompt_line.insert(len(self.prompt_line) - 1, new_line) + self._lines.append([(text, attr) for text, attr in nyx.curses.asci_to_curses(line)]) except stem.SocketClosed: is_done = True
@@ -134,18 +129,12 @@ class InterpreterPanel(panel.Panel): subwindow.scrollbar(1, scroll, self._last_content_height - 1)
y = 1 - scroll - for entry in self.prompt_line: - cursor = self._x_offset - - for line in entry: - if len(line) == 2: - subwindow.addstr(cursor, y, line[0], line[1]) - elif len(line) == 3: - subwindow.addstr(cursor, y, line[0], line[1], line[2]) - try: - cursor += len(line[0]) - except: - pass + + for line in self._lines + [PROMPT]: + x = self._x_offset + + for text, attr in line: + x = subwindow.addstr(x, y, text, *attr)
y += 1
diff --git a/test/panel/interpreter.py b/test/panel/interpreter.py index df42980..d036e32 100644 --- a/test/panel/interpreter.py +++ b/test/panel/interpreter.py @@ -24,6 +24,7 @@ EXPECTED_MULTILINE_PANEL = """ Control Interpreter:
GETINFO version
250-version=0.2.4.27 (git-412e3f7dc9c6c01a) +>>> to use this panel press enter """.strip()
EXPECTED_SCROLLBAR_PANEL = ' |>>> to use this panel press enter' @@ -34,21 +35,21 @@ class TestInterpreter(unittest.TestCase): user_input = 'getinfo' output = nyx.panel.interpreter.format_input(user_input) self.assertEqual(2, len(output)) - self.assertEqual(('>>> ', 'Green', 'Bold'), output[0]) - self.assertEqual(('getinfo ', 'Green', 'Bold'), output[1]) + self.assertEqual(('>>> ', ('Green', 'Bold')), output[0]) + self.assertEqual(('getinfo ', ('Green', 'Bold')), output[1])
user_input = 'getinfo version' output = nyx.panel.interpreter.format_input(user_input) self.assertEqual(3, len(output)) - self.assertEqual(('>>> ', 'Green', 'Bold'), output[0]) - self.assertEqual(('getinfo ', 'Green', 'Bold'), output[1]) - self.assertEqual(('version', 'Cyan', 'Bold'), output[2]) + self.assertEqual(('>>> ', ('Green', 'Bold')), output[0]) + self.assertEqual(('getinfo ', ('Green', 'Bold')), output[1]) + self.assertEqual(('version', ('Cyan', 'Bold')), output[2])
user_input = '/help' output = nyx.panel.interpreter.format_input(user_input) self.assertEqual(2, len(output)) - self.assertEqual(('>>> ', 'Green', 'Bold'), output[0]) - self.assertEqual(('/help', 'Magenta', 'Bold'), output[1]) + self.assertEqual(('>>> ', ('Green', 'Bold')), output[0]) + self.assertEqual(('/help', ('Magenta', 'Bold')), output[1])
@patch('nyx.panel.interpreter.tor_controller') def test_rendering_panel(self, tor_controller_mock): @@ -63,8 +64,8 @@ class TestInterpreter(unittest.TestCase): def test_rendering_multiline_panel(self, tor_controller_mock): tor_controller_mock()._handle_event = lambda event: None panel = nyx.panel.interpreter.InterpreterPanel() - panel.prompt_line = [[('>>> ', 'Green', 'Bold'), ('GETINFO', 'Green', 'Bold'), (' version', 'Cyan')]] - panel.prompt_line.append([('250-version=0.2.4.27 (git-412e3f7dc9c6c01a)', 'Blue')]) + panel._lines = [[('>>> ', ('Green', 'Bold')), ('GETINFO', ('Green', 'Bold')), (' version', ('Cyan',))]] + panel._lines.append([('250-version=0.2.4.27 (git-412e3f7dc9c6c01a)', ('Blue',))]) self.assertEqual(EXPECTED_MULTILINE_PANEL, test.render(panel._draw).content)
@patch('nyx.panel.interpreter.tor_controller')
tor-commits@lists.torproject.org