From 671033fce8a94a034a2785f463e7303bb7cec7c5 Mon Sep 17 00:00:00 2001 From: Xuehai Pan Date: Tue, 27 Sep 2022 22:52:33 +0800 Subject: [PATCH] refactor(gui): refactor keymaps Signed-off-by: Xuehai Pan --- nvitop/gui/library/__init__.py | 1 + nvitop/gui/library/keybinding.py | 21 +++++++ nvitop/gui/screens/environ.py | 46 ++++++++------- nvitop/gui/screens/main/__init__.py | 90 +++++++++++++++-------------- nvitop/gui/screens/treeview.py | 50 ++++++++-------- 5 files changed, 118 insertions(+), 90 deletions(-) diff --git a/nvitop/gui/library/__init__.py b/nvitop/gui/library/__init__.py index 5b6c0fe..616b88d 100644 --- a/nvitop/gui/library/__init__.py +++ b/nvitop/gui/library/__init__.py @@ -14,6 +14,7 @@ from nvitop.gui.library.keybinding import ( SPECIAL_KEYS, KeyBuffer, KeyMaps, + normalize_keybinding, ) from nvitop.gui.library.libcurses import libcurses, setlocale_utf8 from nvitop.gui.library.mouse import MouseEvent diff --git a/nvitop/gui/library/keybinding.py b/nvitop/gui/library/keybinding.py index e26598d..13b0979 100644 --- a/nvitop/gui/library/keybinding.py +++ b/nvitop/gui/library/keybinding.py @@ -212,6 +212,21 @@ def construct_keybinding(keys): return ''.join(strings) +def normalize_keybinding(keybinding): + """Normalize a keybinding to a string + + >>> normalize_keybinding('lol') + 'lol' + + >>> normalize_keybinding('x') + 'x' + + >>> normalize_keybinding('x') + 'x' + """ + return construct_keybinding(parse_keybinding(keybinding)) + + class KeyMaps(dict): def __init__(self, keybuffer=None): super().__init__() @@ -224,6 +239,12 @@ class KeyMaps(dict): self.used_keymap = keymap_name self.keybuffer.clear() + def clear_keymap(self, keymap_name): + self[keymap_name] = {} + if self.used_keymap == keymap_name: + self.keybuffer.keymap = {} + self.keybuffer.clear() + def _clean_input(self, context, keys): try: pointer = self[context] diff --git a/nvitop/gui/screens/environ.py b/nvitop/gui/screens/environ.py index 679b2ef..a44f50f 100644 --- a/nvitop/gui/screens/environ.py +++ b/nvitop/gui/screens/environ.py @@ -221,25 +221,27 @@ class EnvironScreen(Displayable): # pylint: disable=too-many-instance-attribute def environ_move(direction): self.move(direction=direction) - self.root.keymaps.bind('environ', 'r', refresh_environ) - self.root.keymaps.copy('environ', 'r', 'R') - self.root.keymaps.copy('environ', 'r', '') - self.root.keymaps.copy('environ', 'r', '') - self.root.keymaps.bind('environ', '', environ_left) - self.root.keymaps.copy('environ', '', '') - self.root.keymaps.bind('environ', '', environ_right) - self.root.keymaps.copy('environ', '', '') - self.root.keymaps.bind('environ', '', environ_begin) - self.root.keymaps.copy('environ', '', '^') - self.root.keymaps.bind('environ', '', partial(environ_move, direction=-1)) - self.root.keymaps.copy('environ', '', '') - self.root.keymaps.copy('environ', '', '') - self.root.keymaps.copy('environ', '', '') - self.root.keymaps.copy('environ', '', '[') - self.root.keymaps.bind('environ', '', partial(environ_move, direction=+1)) - self.root.keymaps.copy('environ', '', '') - self.root.keymaps.copy('environ', '', '') - self.root.keymaps.copy('environ', '', '') - self.root.keymaps.copy('environ', '', ']') - self.root.keymaps.bind('environ', '', partial(environ_move, direction=-(1 << 20))) - self.root.keymaps.bind('environ', '', partial(environ_move, direction=+(1 << 20))) + keymaps = self.root.keymaps + + keymaps.bind('environ', 'r', refresh_environ) + keymaps.copy('environ', 'r', 'R') + keymaps.copy('environ', 'r', '') + keymaps.copy('environ', 'r', '') + keymaps.bind('environ', '', environ_left) + keymaps.copy('environ', '', '') + keymaps.bind('environ', '', environ_right) + keymaps.copy('environ', '', '') + keymaps.bind('environ', '', environ_begin) + keymaps.copy('environ', '', '^') + keymaps.bind('environ', '', partial(environ_move, direction=-1)) + keymaps.copy('environ', '', '') + keymaps.copy('environ', '', '') + keymaps.copy('environ', '', '') + keymaps.copy('environ', '', '[') + keymaps.bind('environ', '', partial(environ_move, direction=+1)) + keymaps.copy('environ', '', '') + keymaps.copy('environ', '', '') + keymaps.copy('environ', '', '') + keymaps.copy('environ', '', ']') + keymaps.bind('environ', '', partial(environ_move, direction=-(1 << 20))) + keymaps.bind('environ', '', partial(environ_move, direction=+(1 << 20))) diff --git a/nvitop/gui/screens/main/__init__.py b/nvitop/gui/screens/main/__init__.py index 4c906e2..b288f4d 100644 --- a/nvitop/gui/screens/main/__init__.py +++ b/nvitop/gui/screens/main/__init__.py @@ -223,56 +223,58 @@ class MainScreen(DisplayableContainer): # pylint: disable=too-many-instance-att def order_reverse(): sort_by(order=self.process_panel.order, reverse=(not self.process_panel.reverse)) - self.root.keymaps.bind('main', 'q', quit) - self.root.keymaps.copy('main', 'q', 'Q') - self.root.keymaps.bind('main', 'a', partial(change_mode, mode='auto')) - self.root.keymaps.bind('main', 'f', partial(change_mode, mode='full')) - self.root.keymaps.bind('main', 'c', partial(change_mode, mode='compact')) - self.root.keymaps.bind('main', 'r', force_refresh) - self.root.keymaps.copy('main', 'r', 'R') - self.root.keymaps.copy('main', 'r', '') - self.root.keymaps.copy('main', 'r', '') + keymaps = self.root.keymaps - self.root.keymaps.bind('main', '', partial(screen_move, direction=-1)) - self.root.keymaps.copy('main', '', '[') - self.root.keymaps.copy('main', '', '') - self.root.keymaps.bind('main', '', partial(screen_move, direction=+1)) - self.root.keymaps.copy('main', '', ']') - self.root.keymaps.copy('main', '', '') + keymaps.bind('main', 'q', quit) + keymaps.copy('main', 'q', 'Q') + keymaps.bind('main', 'a', partial(change_mode, mode='auto')) + keymaps.bind('main', 'f', partial(change_mode, mode='full')) + keymaps.bind('main', 'c', partial(change_mode, mode='compact')) + keymaps.bind('main', 'r', force_refresh) + keymaps.copy('main', 'r', 'R') + keymaps.copy('main', 'r', '') + keymaps.copy('main', 'r', '') - self.root.keymaps.bind('main', '', host_left) - self.root.keymaps.copy('main', '', '') - self.root.keymaps.bind('main', '', host_right) - self.root.keymaps.copy('main', '', '') - self.root.keymaps.bind('main', '', host_begin) - self.root.keymaps.copy('main', '', '^') - self.root.keymaps.bind('main', '', host_end) - self.root.keymaps.copy('main', '', '$') - self.root.keymaps.bind('main', '', partial(select_move, direction=-1)) - self.root.keymaps.copy('main', '', '') - self.root.keymaps.copy('main', '', '') - self.root.keymaps.bind('main', '', partial(select_move, direction=+1)) - self.root.keymaps.copy('main', '', '') - self.root.keymaps.copy('main', '', '') - self.root.keymaps.bind('main', '', partial(select_move, direction=-(1 << 20))) - self.root.keymaps.bind('main', '', partial(select_move, direction=+(1 << 20))) - self.root.keymaps.bind('main', '', select_clear) - self.root.keymaps.bind('main', '', tag) + keymaps.bind('main', '', partial(screen_move, direction=-1)) + keymaps.copy('main', '', '[') + keymaps.copy('main', '', '') + keymaps.bind('main', '', partial(screen_move, direction=+1)) + keymaps.copy('main', '', ']') + keymaps.copy('main', '', '') - self.root.keymaps.bind('main', 'T', terminate) - self.root.keymaps.bind('main', 'K', kill) - self.root.keymaps.bind('main', '', interrupt) - self.root.keymaps.copy('main', '', 'I') + keymaps.bind('main', '', host_left) + keymaps.copy('main', '', '') + keymaps.bind('main', '', host_right) + keymaps.copy('main', '', '') + keymaps.bind('main', '', host_begin) + keymaps.copy('main', '', '^') + keymaps.bind('main', '', host_end) + keymaps.copy('main', '', '$') + keymaps.bind('main', '', partial(select_move, direction=-1)) + keymaps.copy('main', '', '') + keymaps.copy('main', '', '') + keymaps.bind('main', '', partial(select_move, direction=+1)) + keymaps.copy('main', '', '') + keymaps.copy('main', '', '') + keymaps.bind('main', '', partial(select_move, direction=-(1 << 20))) + keymaps.bind('main', '', partial(select_move, direction=+(1 << 20))) + keymaps.bind('main', '', select_clear) + keymaps.bind('main', '', tag) - self.root.keymaps.bind('main', ',', order_previous) - self.root.keymaps.copy('main', ',', '<') - self.root.keymaps.bind('main', '.', order_next) - self.root.keymaps.copy('main', '.', '>') - self.root.keymaps.bind('main', '/', order_reverse) + keymaps.bind('main', 'T', terminate) + keymaps.bind('main', 'K', kill) + keymaps.bind('main', '', interrupt) + keymaps.copy('main', '', 'I') + + keymaps.bind('main', ',', order_previous) + keymaps.copy('main', ',', '<') + keymaps.bind('main', '.', order_next) + keymaps.copy('main', '.', '>') + keymaps.bind('main', '/', order_reverse) for order in ProcessPanel.ORDERS: - self.root.keymaps.bind( + keymaps.bind( 'main', 'o' + order[:1].lower(), partial(sort_by, order=order, reverse=False) ) - self.root.keymaps.bind( + keymaps.bind( 'main', 'o' + order[:1].upper(), partial(sort_by, order=order, reverse=True) ) diff --git a/nvitop/gui/screens/treeview.py b/nvitop/gui/screens/treeview.py index d7daca9..459d4dd 100644 --- a/nvitop/gui/screens/treeview.py +++ b/nvitop/gui/screens/treeview.py @@ -558,28 +558,30 @@ class TreeViewScreen(Displayable): # pylint: disable=too-many-instance-attribut def interrupt(): self.selection.interrupt() - self.root.keymaps.bind('treeview', '', tree_left) - self.root.keymaps.copy('treeview', '', '') - self.root.keymaps.bind('treeview', '', tree_right) - self.root.keymaps.copy('treeview', '', '') - self.root.keymaps.bind('treeview', '', tree_begin) - self.root.keymaps.copy('treeview', '', '^') - self.root.keymaps.bind('treeview', '', partial(select_move, direction=-1)) - self.root.keymaps.copy('treeview', '', '') - self.root.keymaps.copy('treeview', '', '') - self.root.keymaps.copy('treeview', '', '') - self.root.keymaps.copy('treeview', '', '[') - self.root.keymaps.bind('treeview', '', partial(select_move, direction=+1)) - self.root.keymaps.copy('treeview', '', '') - self.root.keymaps.copy('treeview', '', '') - self.root.keymaps.copy('treeview', '', '') - self.root.keymaps.copy('treeview', '', ']') - self.root.keymaps.bind('treeview', '', partial(select_move, direction=-(1 << 20))) - self.root.keymaps.bind('treeview', '', partial(select_move, direction=+(1 << 20))) - self.root.keymaps.bind('treeview', '', select_clear) - self.root.keymaps.bind('treeview', '', tag) + keymaps = self.root.keymaps - self.root.keymaps.bind('treeview', 'T', terminate) - self.root.keymaps.bind('treeview', 'K', kill) - self.root.keymaps.bind('treeview', '', interrupt) - self.root.keymaps.copy('treeview', '', 'I') + keymaps.bind('treeview', '', tree_left) + keymaps.copy('treeview', '', '') + keymaps.bind('treeview', '', tree_right) + keymaps.copy('treeview', '', '') + keymaps.bind('treeview', '', tree_begin) + keymaps.copy('treeview', '', '^') + keymaps.bind('treeview', '', partial(select_move, direction=-1)) + keymaps.copy('treeview', '', '') + keymaps.copy('treeview', '', '') + keymaps.copy('treeview', '', '') + keymaps.copy('treeview', '', '[') + keymaps.bind('treeview', '', partial(select_move, direction=+1)) + keymaps.copy('treeview', '', '') + keymaps.copy('treeview', '', '') + keymaps.copy('treeview', '', '') + keymaps.copy('treeview', '', ']') + keymaps.bind('treeview', '', partial(select_move, direction=-(1 << 20))) + keymaps.bind('treeview', '', partial(select_move, direction=+(1 << 20))) + keymaps.bind('treeview', '', select_clear) + keymaps.bind('treeview', '', tag) + + keymaps.bind('treeview', 'T', terminate) + keymaps.bind('treeview', 'K', kill) + keymaps.bind('treeview', '', interrupt) + keymaps.copy('treeview', '', 'I')