diff --git a/mvc/controllers.py b/mvc/controllers.py index 74efc90..05edbf9 100644 --- a/mvc/controllers.py +++ b/mvc/controllers.py @@ -1,41 +1,18 @@ from abc import ABC, abstractmethod - from mvc.views import CursesAdapter from mvc.models import VimModel, ReturnCode def isAscii(symbolCode: int) -> bool: - if symbolCode > 126 or symbolCode < 32: return False - else: return True + return 32 <= symbolCode <= 126 -class Strategy(ABC): +class BaseStrategy(ABC): def __init__(self, model: VimModel, adapter: CursesAdapter, mode: str): self.model = model self.adapter = adapter self.mode = model.mode = mode - def isAscii(symbolCode: int) -> bool: - if symbolCode > 126 or symbolCode < 32: return False - else: return True - - @abstractmethod - def HandleInput(self, symbolCode: int) -> int: - pass - -class Controller: - def __init__(self, strategy: Strategy): - self.strategy = strategy - def SetStrategy(self, strategy: Strategy): - self.strategy = strategy - def HandleInput(self, symbolCode: int): - return self.strategy.HandleInput(symbolCode) - -class CommandStrategy(Strategy): - """Режим ввода коман""" - def __init__(self, model: VimModel, adapter: CursesAdapter): - super().__init__(model, adapter, mode="COMMAND") - - def HandleInput(self, symbolCode) -> int: - """Обработка ввода пользователя""" + def handle_common_input(self, symbolCode: int) -> int: + """Обработка общих для всех стратегий действий""" match symbolCode: case self.adapter.KEY_ESCAPE: return ReturnCode.SET_BASIC_MODE case self.adapter.KEY_LEFT: self.model.MoveLeft() @@ -43,9 +20,39 @@ class CommandStrategy(Strategy): case self.adapter.KEY_UP: self.model.MoveUp() case self.adapter.KEY_DOWN: self.model.MoveDown() case self.adapter.KEY_CTRL_S: self.model.SaveFile() + case _: return ReturnCode.CONTINUE # Не обрабатываем, передаем дальше + + self.model.Scroll(self.adapter.lines, self.adapter.cols) + return ReturnCode.GOOD + + @abstractmethod + def HandleInput(self, symbolCode: int) -> int: + pass + +class Controller: + def __init__(self, strategy: BaseStrategy): + self.strategy = strategy + + def SetStrategy(self, strategy: BaseStrategy): + self.strategy = strategy + + def HandleInput(self, symbolCode: int): + return self.strategy.HandleInput(symbolCode) + +class CommandStrategy(BaseStrategy): + """Режим ввода команд""" + def __init__(self, model: VimModel, adapter: CursesAdapter): + super().__init__(model, adapter, mode="COMMAND") + + def HandleInput(self, symbolCode) -> int: + """Обработка ввода пользователя""" + result = self.handle_common_input(symbolCode) + if result != ReturnCode.CONTINUE: return result + + match symbolCode: case self.adapter.KEY_ENTER: return self.model.EnterCommand() - case self.adapter.KEY_BACKSPACE_1: self.model.BackspaceCommand() - case self.adapter.KEY_BACKSPACE_2: self.model.BackspaceCommand() + case self.adapter.KEY_BACKSPACE_1 | self.adapter.KEY_BACKSPACE_2: + self.model.BackspaceCommand() case _: if not isAscii(symbolCode): return ReturnCode.GOOD self.model.InsertCommandSymbol(symbolCode) @@ -53,44 +60,38 @@ class CommandStrategy(Strategy): self.model.Scroll(self.adapter.lines, self.adapter.cols) return ReturnCode.GOOD - -class EditStrategy(Strategy): +class EditStrategy(BaseStrategy): """Режим редактирования""" def __init__(self, model: VimModel, adapter: CursesAdapter): super().__init__(model, adapter, mode="EDIT") def HandleInput(self, symbolCode) -> int: """Обработка ввода пользователя""" + result = self.handle_common_input(symbolCode) + if result != ReturnCode.CONTINUE: return result + match symbolCode: - case self.adapter.KEY_ESCAPE: return ReturnCode.SET_BASIC_MODE - case self.adapter.KEY_LEFT: self.model.MoveLeft() - case self.adapter.KEY_RIGHT: self.model.MoveRight() - case self.adapter.KEY_UP: self.model.MoveUp() - case self.adapter.KEY_DOWN: self.model.MoveDown() case self.adapter.KEY_ENTER: self.model.Enter() - case self.adapter.KEY_BACKSPACE_1: self.model.Backspace() - case self.adapter.KEY_BACKSPACE_2: self.model.Backspace() - case self.adapter.KEY_CTRL_S: self.model.SaveFile() + case self.adapter.KEY_BACKSPACE_1 | self.adapter.KEY_BACKSPACE_2: + self.model.Backspace() case _: if not isAscii(symbolCode): return ReturnCode.GOOD self.model.InsertSymbol(symbolCode) self.model.Scroll(self.adapter.lines, self.adapter.cols) return ReturnCode.GOOD - -class NormalStrategy(Strategy): + +class NormalStrategy(BaseStrategy): """Режим навигации""" def __init__(self, model: VimModel, adapter: CursesAdapter): super().__init__(model, adapter, mode="NORMAL") def HandleInput(self, symbolCode) -> int: """Обработка ввода пользователя""" + result = self.handle_common_input(symbolCode) + if result != ReturnCode.CONTINUE: return result + match symbolCode: - case self.adapter.KEY_LEFT: self.model.MoveLeft() - case self.adapter.KEY_RIGHT: self.model.MoveRight() - case self.adapter.KEY_UP: self.model.MoveUp() - case self.adapter.KEY_DOWN: self.model.MoveDown() - case self.adapter.KEY_CTRL_S: self.model.SaveFile() case self.adapter.KEY_TWO_DOTS: return ReturnCode.SET_COMMAND_MODE self.model.Scroll(self.adapter.lines, self.adapter.cols) diff --git a/mvc/models.py b/mvc/models.py index 02d5c72..f47b2f6 100644 --- a/mvc/models.py +++ b/mvc/models.py @@ -6,6 +6,7 @@ class ReturnCode(Enum): SET_BASIC_MODE = -99 SET_COMMAND_MODE = -98 SET_EDIT_MODE = -97 + CONTINUE = -96 class VimModel: def __init__(self):