From eb89c43a9057f1c261ec619017fcda860010ae02 Mon Sep 17 00:00:00 2001 From: Heiko Nickerl Date: Fri, 6 Aug 2021 19:57:15 +0200 Subject: [PATCH] fix: fix urwid display error (#237) --- sodalite/core/action.py | 6 +++--- sodalite/core/hook.py | 2 +- sodalite/ui/control.py | 24 +++++++++++------------- sodalite/ui/entrylist.py | 3 +-- sodalite/ui/graphics.py | 3 +-- sodalite/ui/mmode.py | 32 -------------------------------- sodalite/ui/notify.py | 11 ++++------- sodalite/ui/theme.py | 2 +- sodalite/ui/viewmodel.py | 32 +++++++++++++++++++++++++++++++- sodalite/util/pubsub.py | 2 +- 10 files changed, 54 insertions(+), 63 deletions(-) delete mode 100644 sodalite/ui/mmode.py diff --git a/sodalite/core/action.py b/sodalite/core/action.py index 8e0c004..5c89995 100644 --- a/sodalite/core/action.py +++ b/sodalite/core/action.py @@ -1,9 +1,9 @@ from typing import Callable -import sodalite.ui.mmode from sodalite.core import config, action_def from sodalite.core.action_def import ActionName -from sodalite.ui.mmode import Mode +from sodalite.ui import viewmodel +from sodalite.ui.viewmodel import Mode class Action: @@ -17,7 +17,7 @@ def __init__(self, name: ActionName, action: Callable[[], None], modes: list[Mod def handle(self, key: str) -> bool: if key == self.keybinding: - if self.is_global or sodalite.ui.mmode.global_mode in self.modes: + if self.is_global or viewmodel.global_mode in self.modes: self.action() return True return False diff --git a/sodalite/core/hook.py b/sodalite/core/hook.py index abfd811..d529f86 100644 --- a/sodalite/core/hook.py +++ b/sodalite/core/hook.py @@ -5,7 +5,6 @@ from sodalite.core import config from sodalite.core.config import HooksConfig -from sodalite.ui import notify if TYPE_CHECKING: from sodalite.core.entry import Entry @@ -38,6 +37,7 @@ def trigger(self, entry: 'Entry') -> None: result = os.system(f"( {self.action} ) > /dev/tty < /dev/tty") logger.info(f"Result is {result}") if result != 0: + from sodalite.ui import notify notify.show_error(f"command failed with exit code {result}") from sodalite.ui import graphics if self.finally_exit: diff --git a/sodalite/ui/control.py b/sodalite/ui/control.py index 3d38b14..67564e5 100644 --- a/sodalite/ui/control.py +++ b/sodalite/ui/control.py @@ -5,16 +5,14 @@ import pyperclip -import sodalite.ui.mmode from sodalite.core import key as key_module, hook, buffer, operate, Navigator from sodalite.core.action import Action from sodalite.core.action_def import ActionName from sodalite.core.entry import Entry from sodalite.core.key import Key -from sodalite.ui import graphics, notify +from sodalite.ui import graphics, viewmodel, notify from sodalite.ui.entrylist import EntryList -from sodalite.ui.mmode import Mode -from sodalite.ui.viewmodel import ViewModel +from sodalite.ui.viewmodel import Mode, ViewModel from sodalite.util import pubsub if TYPE_CHECKING: @@ -118,17 +116,17 @@ def abort(self) -> None: graphics.exit() def enter_navigate_mode(self) -> None: - sodalite.ui.mmode.global_mode.mode = Mode.NAVIGATE + viewmodel.global_mode.mode = Mode.NAVIGATE self.list.render(self.list_size, True) def enter_assign_mode(self) -> None: if self.model.current_entry.is_dir: - sodalite.ui.mmode.global_mode.mode = Mode.ASSIGN_CHOOSE_ENTRY + viewmodel.global_mode.mode = Mode.ASSIGN_CHOOSE_ENTRY self.list.render(self.list_size, True) def enter_operate_mode(self) -> None: if self.model.current_entry.is_dir: - sodalite.ui.mmode.global_mode.mode = Mode.OPERATE + viewmodel.global_mode.mode = Mode.OPERATE self.list.render(self.list_size, True) def trigger_filter(self) -> None: @@ -244,25 +242,25 @@ def __init__(self, frame: 'MainFrame'): self.actions = actions def handle_key_individually(self, key): - if sodalite.ui.mmode.global_mode == Mode.ASSIGN_CHOOSE_ENTRY and self.navigator.is_navigation_key(key): + if viewmodel.global_mode == Mode.ASSIGN_CHOOSE_ENTRY and self.navigator.is_navigation_key(key): self.choose_entry(key) return True - elif sodalite.ui.mmode.global_mode == Mode.ASSIGN_CHOOSE_KEY and key_module.is_navigation_key(key): + elif viewmodel.global_mode == Mode.ASSIGN_CHOOSE_KEY and key_module.is_navigation_key(key): self.assign_key(key) return True def exit(self) -> None: - if sodalite.ui.mmode.global_mode == Mode.ASSIGN_CHOOSE_ENTRY: - sodalite.ui.mmode.global_mode.mode = Mode.ASSIGN_CHOOSE_KEY + if viewmodel.global_mode == Mode.ASSIGN_CHOOSE_ENTRY: + viewmodel.global_mode.mode = Mode.ASSIGN_CHOOSE_KEY def choose_entry(self, key: str) -> None: if key in key_module.get_all_keys(): entry = self.navigator.current_entry.get_child_for_key(Key(key)) assert entry self.list.select(entry) - sodalite.ui.mmode.global_mode.mode = Mode.ASSIGN_CHOOSE_KEY + viewmodel.global_mode.mode = Mode.ASSIGN_CHOOSE_KEY elif key == 'enter': - sodalite.ui.mmode.global_mode.mode = Mode.ASSIGN_CHOOSE_KEY + viewmodel.global_mode.mode = Mode.ASSIGN_CHOOSE_KEY def assign_key(self, key: str): if key_module.is_navigation_key(key): diff --git a/sodalite/ui/entrylist.py b/sodalite/ui/entrylist.py index 134f71c..f860599 100644 --- a/sodalite/ui/entrylist.py +++ b/sodalite/ui/entrylist.py @@ -5,7 +5,6 @@ import urwid from urwid import AttrSpec, ListBox -import sodalite.ui.mmode from sodalite.core.entry import Entry from sodalite.core.navigate import Navigator from sodalite.ui import theme, graphics, viewmodel @@ -83,7 +82,7 @@ def render(self, size, focus=False): caption = " " + key + " " text = self.entry.name display = caption + text - if focus and sodalite.ui.mmode.global_mode in viewmodel.ANY_ASSIGN_MODE: + if focus and viewmodel.global_mode in viewmodel.ANY_ASSIGN_MODE: color = AttrSpec(self.color.foreground + ',standout', self.color.background, colors=16) else: color = self.color diff --git a/sodalite/ui/graphics.py b/sodalite/ui/graphics.py index e93de1c..6019d3e 100644 --- a/sodalite/ui/graphics.py +++ b/sodalite/ui/graphics.py @@ -14,8 +14,7 @@ from sodalite.ui.help import HelpLauncher from sodalite.ui.hookbox import HookBox from sodalite.ui.mainpane import MainPane -from sodalite.ui.viewmodel import ViewModel -from sodalite.ui.mmode import Mode +from sodalite.ui.viewmodel import ViewModel, Mode from sodalite.util import env, pubsub logger = logging.getLogger(__name__) diff --git a/sodalite/ui/mmode.py b/sodalite/ui/mmode.py deleted file mode 100644 index 032f8e9..0000000 --- a/sodalite/ui/mmode.py +++ /dev/null @@ -1,32 +0,0 @@ -from enum import Enum - -from sodalite.util import pubsub - - -class Mode(Enum): - NAVIGATE = 1 - ASSIGN_CHOOSE_ENTRY = 2 - ASSIGN_CHOOSE_KEY = 3 - OPERATE = 4 - - -class GlobalMode: - - def __init__(self): - super().__init__() - self.mode = Mode.NAVIGATE - - @property - def mode(self): - return self._mode - - @mode.setter - def mode(self, mode: Mode): - self._mode = mode - pubsub.mode_send(self._mode) - - def __eq__(self, other): - return self._mode == other or super.__eq__(self, other) - - -global_mode = GlobalMode() diff --git a/sodalite/ui/notify.py b/sodalite/ui/notify.py index 9ba52a2..0920d34 100644 --- a/sodalite/ui/notify.py +++ b/sodalite/ui/notify.py @@ -5,9 +5,8 @@ import urwid from urwid import AttrSpec -import sodalite.ui.mmode -from sodalite.ui import theme, mmode -from sodalite.ui.mmode import Mode +from sodalite.ui import graphics, theme, viewmodel +from sodalite.ui.viewmodel import Mode from sodalite.util import pubsub txt = urwid.AttrMap(urwid.Text('', align='center'), urwid.DEFAULT) @@ -39,7 +38,6 @@ def show_error(message: str, duration: float = 1.5) -> None: def _show(message: Union[str, Tuple[AttrSpec, str]], duration: float) -> None: global _last_message global _original_footer - from sodalite.ui import graphics frame = graphics.frame if _notify_lock.locked() and _last_message == message: return @@ -59,16 +57,15 @@ def _show(message: Union[str, Tuple[AttrSpec, str]], duration: float) -> None: def clear() -> None: - from sodalite.ui import graphics if graphics.frame and graphics.frame.footer == _notify_box: graphics.frame.footer = None graphics.draw_screen() def trigger_notifications(mode: Mode) -> None: - if mmode.global_mode == Mode.ASSIGN_CHOOSE_ENTRY: + if viewmodel.global_mode == Mode.ASSIGN_CHOOSE_ENTRY: show("choose entry", duration=0) - elif sodalite.ui.mmode.global_mode == Mode.ASSIGN_CHOOSE_KEY: + elif viewmodel.global_mode == Mode.ASSIGN_CHOOSE_KEY: show("choose new key", duration=0) else: clear() diff --git a/sodalite/ui/theme.py b/sodalite/ui/theme.py index 01a3326..24efdf3 100644 --- a/sodalite/ui/theme.py +++ b/sodalite/ui/theme.py @@ -1,7 +1,7 @@ import urwid from pygments import token -from sodalite.ui.mmode import Mode +from sodalite.ui.viewmodel import Mode from sodalite.util import pubsub file = urwid.WHITE diff --git a/sodalite/ui/viewmodel.py b/sodalite/ui/viewmodel.py index fac9af6..ee2bfeb 100644 --- a/sodalite/ui/viewmodel.py +++ b/sodalite/ui/viewmodel.py @@ -1,20 +1,50 @@ import logging import re import sre_constants +from enum import Enum from re import Pattern from typing import Optional from sodalite.core.entry import Entry from sodalite.ui import highlighting from sodalite.ui.highlighting import HighlightedLine -from sodalite.ui.mmode import Mode from sodalite.util import pubsub logger = logging.getLogger(__name__) + +class Mode(Enum): + NAVIGATE = 1 + ASSIGN_CHOOSE_ENTRY = 2 + ASSIGN_CHOOSE_KEY = 3 + OPERATE = 4 + + ANY_ASSIGN_MODE = (Mode.ASSIGN_CHOOSE_KEY, Mode.ASSIGN_CHOOSE_ENTRY) +class GlobalMode: + + def __init__(self): + super().__init__() + self.mode = Mode.NAVIGATE + + @property + def mode(self): + return self._mode + + @mode.setter + def mode(self, mode: Mode): + self._mode = mode + pubsub.mode_send(self._mode) + + def __eq__(self, other): + return self._mode == other or super.__eq__(self, other) + + +global_mode = GlobalMode() + + class ViewModel: def __init__(self) -> None: diff --git a/sodalite/util/pubsub.py b/sodalite/util/pubsub.py index d35dc6c..fa2e3fc 100644 --- a/sodalite/util/pubsub.py +++ b/sodalite/util/pubsub.py @@ -4,7 +4,7 @@ if TYPE_CHECKING: from sodalite.core.entry import Entry - from sodalite.ui.mmode import Mode + from sodalite.ui.viewmodel import Mode from sodalite.ui.highlighting import HighlightedLine