вынес общую часть match всех стратегий в родительский класс BaseStrategy

master
serr 2025-02-04 19:06:51 +03:00
parent 620efdbaaf
commit 6012c2f690
2 changed files with 48 additions and 46 deletions

View File

@ -1,41 +1,18 @@
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from mvc.views import CursesAdapter from mvc.views import CursesAdapter
from mvc.models import VimModel, ReturnCode from mvc.models import VimModel, ReturnCode
def isAscii(symbolCode: int) -> bool: def isAscii(symbolCode: int) -> bool:
if symbolCode > 126 or symbolCode < 32: return False return 32 <= symbolCode <= 126
else: return True
class Strategy(ABC): class BaseStrategy(ABC):
def __init__(self, model: VimModel, adapter: CursesAdapter, mode: str): def __init__(self, model: VimModel, adapter: CursesAdapter, mode: str):
self.model = model self.model = model
self.adapter = adapter self.adapter = adapter
self.mode = model.mode = mode self.mode = model.mode = mode
def isAscii(symbolCode: int) -> bool: def handle_common_input(self, symbolCode: int) -> int:
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:
"""Обработка ввода пользователя"""
match symbolCode: match symbolCode:
case self.adapter.KEY_ESCAPE: return ReturnCode.SET_BASIC_MODE case self.adapter.KEY_ESCAPE: return ReturnCode.SET_BASIC_MODE
case self.adapter.KEY_LEFT: self.model.MoveLeft() 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_UP: self.model.MoveUp()
case self.adapter.KEY_DOWN: self.model.MoveDown() case self.adapter.KEY_DOWN: self.model.MoveDown()
case self.adapter.KEY_CTRL_S: self.model.SaveFile() 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_ENTER: return self.model.EnterCommand()
case self.adapter.KEY_BACKSPACE_1: self.model.BackspaceCommand() case self.adapter.KEY_BACKSPACE_1 | self.adapter.KEY_BACKSPACE_2:
case self.adapter.KEY_BACKSPACE_2: self.model.BackspaceCommand() self.model.BackspaceCommand()
case _: case _:
if not isAscii(symbolCode): return ReturnCode.GOOD if not isAscii(symbolCode): return ReturnCode.GOOD
self.model.InsertCommandSymbol(symbolCode) self.model.InsertCommandSymbol(symbolCode)
@ -53,24 +60,20 @@ class CommandStrategy(Strategy):
self.model.Scroll(self.adapter.lines, self.adapter.cols) self.model.Scroll(self.adapter.lines, self.adapter.cols)
return ReturnCode.GOOD return ReturnCode.GOOD
class EditStrategy(BaseStrategy):
class EditStrategy(Strategy):
"""Режим редактирования""" """Режим редактирования"""
def __init__(self, model: VimModel, adapter: CursesAdapter): def __init__(self, model: VimModel, adapter: CursesAdapter):
super().__init__(model, adapter, mode="EDIT") super().__init__(model, adapter, mode="EDIT")
def HandleInput(self, symbolCode) -> int: def HandleInput(self, symbolCode) -> int:
"""Обработка ввода пользователя""" """Обработка ввода пользователя"""
result = self.handle_common_input(symbolCode)
if result != ReturnCode.CONTINUE: return result
match symbolCode: 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_ENTER: self.model.Enter()
case self.adapter.KEY_BACKSPACE_1: self.model.Backspace() case self.adapter.KEY_BACKSPACE_1 | self.adapter.KEY_BACKSPACE_2:
case self.adapter.KEY_BACKSPACE_2: self.model.Backspace() self.model.Backspace()
case self.adapter.KEY_CTRL_S: self.model.SaveFile()
case _: case _:
if not isAscii(symbolCode): return ReturnCode.GOOD if not isAscii(symbolCode): return ReturnCode.GOOD
self.model.InsertSymbol(symbolCode) self.model.InsertSymbol(symbolCode)
@ -78,19 +81,17 @@ class EditStrategy(Strategy):
self.model.Scroll(self.adapter.lines, self.adapter.cols) self.model.Scroll(self.adapter.lines, self.adapter.cols)
return ReturnCode.GOOD return ReturnCode.GOOD
class NormalStrategy(Strategy): class NormalStrategy(BaseStrategy):
"""Режим навигации""" """Режим навигации"""
def __init__(self, model: VimModel, adapter: CursesAdapter): def __init__(self, model: VimModel, adapter: CursesAdapter):
super().__init__(model, adapter, mode="NORMAL") super().__init__(model, adapter, mode="NORMAL")
def HandleInput(self, symbolCode) -> int: def HandleInput(self, symbolCode) -> int:
"""Обработка ввода пользователя""" """Обработка ввода пользователя"""
result = self.handle_common_input(symbolCode)
if result != ReturnCode.CONTINUE: return result
match symbolCode: 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 case self.adapter.KEY_TWO_DOTS: return ReturnCode.SET_COMMAND_MODE
self.model.Scroll(self.adapter.lines, self.adapter.cols) self.model.Scroll(self.adapter.lines, self.adapter.cols)

View File

@ -6,6 +6,7 @@ class ReturnCode(Enum):
SET_BASIC_MODE = -99 SET_BASIC_MODE = -99
SET_COMMAND_MODE = -98 SET_COMMAND_MODE = -98
SET_EDIT_MODE = -97 SET_EDIT_MODE = -97
CONTINUE = -96
class VimModel: class VimModel:
def __init__(self): def __init__(self):