diff options
author | Samoilenko Roman <ttahabatt@gmail.com> | 2018-02-03 04:22:03 +0200 |
---|---|---|
committer | Maximilian Hils <git@maximilianhils.com> | 2018-02-03 03:22:03 +0100 |
commit | 957a630bb5d2fcd6a8ad7092863d19e38307f090 (patch) | |
tree | aa98315fb5971dc0f84f5b8f25423d43dc25a832 | |
parent | 6d8731e144eaec2aaf2120c21969c9228b7af95a (diff) | |
download | mitmproxy-957a630bb5d2fcd6a8ad7092863d19e38307f090.tar.gz mitmproxy-957a630bb5d2fcd6a8ad7092863d19e38307f090.tar.bz2 mitmproxy-957a630bb5d2fcd6a8ad7092863d19e38307f090.zip |
add shortcuts for console.choose, fix #2785
-rw-r--r-- | mitmproxy/tools/console/overlay.py | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/mitmproxy/tools/console/overlay.py b/mitmproxy/tools/console/overlay.py index 55acbfdd..d255bc8c 100644 --- a/mitmproxy/tools/console/overlay.py +++ b/mitmproxy/tools/console/overlay.py @@ -40,12 +40,17 @@ class SimpleOverlay(urwid.Overlay, layoutwidget.LayoutWidget): class Choice(urwid.WidgetWrap): - def __init__(self, txt, focus, current): + def __init__(self, txt, focus, current, shortcut): + if shortcut: + selection_type = "option_selected_key" if focus else "key" + txt = [(selection_type, shortcut), ") ", txt] + else: + txt = " " + txt if current: s = "option_active_selected" if focus else "option_active" else: s = "option_selected" if focus else "text" - return super().__init__( + super().__init__( urwid.AttrWrap( urwid.Padding(urwid.Text(txt)), s, @@ -60,6 +65,8 @@ class Choice(urwid.WidgetWrap): class ChooserListWalker(urwid.ListWalker): + shortcuts = "123456789abcdefghijklmnoprstuvwxyz" + def __init__(self, choices, current): self.index = 0 self.choices = choices @@ -67,7 +74,7 @@ class ChooserListWalker(urwid.ListWalker): def _get(self, idx, focus): c = self.choices[idx] - return Choice(c, focus, c == self.current) + return Choice(c, focus, c == self.current, self.shortcuts[idx:idx + 1]) def set_focus(self, index): self.index = index @@ -87,6 +94,12 @@ class ChooserListWalker(urwid.ListWalker): return None, None return self._get(pos, False), pos + def choice_by_shortcut(self, shortcut): + for i, choice in enumerate(self.choices): + if shortcut == self.shortcuts[i:i + 1]: + return choice + return None + class Chooser(urwid.WidgetWrap, layoutwidget.LayoutWidget): keyctx = "chooser" @@ -96,7 +109,8 @@ class Chooser(urwid.WidgetWrap, layoutwidget.LayoutWidget): self.choices = choices self.callback = callback choicewidth = max([len(i) for i in choices]) - self.width = max(choicewidth, len(title)) + 5 + self.width = max(choicewidth, len(title)) + 7 + self.walker = ChooserListWalker(choices, current) super().__init__( urwid.AttrWrap( @@ -105,7 +119,7 @@ class Chooser(urwid.WidgetWrap, layoutwidget.LayoutWidget): urwid.ListBox(self.walker), len(choices) ), - title= title + title=title ), "background" ) @@ -116,11 +130,16 @@ class Chooser(urwid.WidgetWrap, layoutwidget.LayoutWidget): def keypress(self, size, key): key = self.master.keymap.handle_only("chooser", key) + choice = self.walker.choice_by_shortcut(key) + if choice: + self.callback(choice) + signals.pop_view_state.send(self) + return if key == "m_select": self.callback(self.choices[self.walker.index]) signals.pop_view_state.send(self) return - elif key == "esc": + elif key in ["q", "esc"]: signals.pop_view_state.send(self) return |