вынес общую часть match всех стратегий в родительский класс BaseStrategy
parent
620efdbaaf
commit
6012c2f690
|
@ -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)
|
||||||
|
|
|
@ -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):
|
||||||
|
|
Loading…
Reference in New Issue