From 6012c2f6906fb19dc149b32845d33a888f487744 Mon Sep 17 00:00:00 2001 From: serr Date: Tue, 4 Feb 2025 19:06:51 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B2=D1=8B=D0=BD=D0=B5=D1=81=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=89=D1=83=D1=8E=20=D1=87=D0=B0=D1=81=D1=82=D1=8C=20match=20?= =?UTF-8?q?=D0=B2=D1=81=D0=B5=D1=85=20=D1=81=D1=82=D1=80=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D0=B3=D0=B8=D0=B9=20=D0=B2=20=D1=80=D0=BE=D0=B4=D0=B8=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D1=81=D0=BA=D0=B8=D0=B9=20=D0=BA=D0=BB=D0=B0?= =?UTF-8?q?=D1=81=D1=81=20BaseStrategy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mvc/controllers.py | 93 +++++++++++++++++++++++----------------------- mvc/models.py | 1 + 2 files changed, 48 insertions(+), 46 deletions(-) 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):