общий код для всех стратегий вынес в декоратор
parent
7b2bc07fc2
commit
7242026608
2
main.py
2
main.py
|
@ -13,7 +13,7 @@ def main():
|
||||||
strategy = NormalStrategy(model, view.curses_adapter)
|
strategy = NormalStrategy(model, view.curses_adapter)
|
||||||
controller = Controller(strategy)
|
controller = Controller(strategy)
|
||||||
|
|
||||||
# Первинчая загрузка файла для редактирования
|
# load file from sys argv
|
||||||
if len(sys.argv) > 1: model.LoadFile(sys.argv[1])
|
if len(sys.argv) > 1: model.LoadFile(sys.argv[1])
|
||||||
else: model.LoadFile("File not found but i create it"+str(tools.UnixSec())+".txt")
|
else: model.LoadFile("File not found but i create it"+str(tools.UnixSec())+".txt")
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,19 @@ 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 CommonInput(HandleInputFunc):
|
||||||
return 32 <= symbolCode <= 126
|
"""common actions for all strategies decorator"""
|
||||||
|
def wrapper(self, symbolCode: int) -> int:
|
||||||
|
result = self.HandleCommonInput(symbolCode)
|
||||||
|
if result != ReturnCode.CONTINUE: # an action common to all strategies occurred
|
||||||
|
self.model.Scroll()
|
||||||
|
return result
|
||||||
|
|
||||||
|
return_code = HandleInputFunc(self, symbolCode)
|
||||||
|
|
||||||
|
self.model.Scroll()
|
||||||
|
return return_code
|
||||||
|
return wrapper
|
||||||
|
|
||||||
class BaseStrategy(ABC):
|
class BaseStrategy(ABC):
|
||||||
def __init__(self, model: VimModel, adapter: CursesAdapter, mode: str):
|
def __init__(self, model: VimModel, adapter: CursesAdapter, mode: str):
|
||||||
|
@ -12,8 +23,8 @@ class BaseStrategy(ABC):
|
||||||
self.adapter = adapter
|
self.adapter = adapter
|
||||||
self.mode = model.mode = mode
|
self.mode = model.mode = mode
|
||||||
|
|
||||||
def handle_common_input(self, symbolCode: int) -> int:
|
def HandleCommonInput(self, symbolCode: int) -> int:
|
||||||
"""Обработка общих для всех стратегий действий"""
|
"""common actions for all strategies"""
|
||||||
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()
|
||||||
|
@ -21,7 +32,7 @@ class BaseStrategy(ABC):
|
||||||
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 # Не обрабатываем, передаем дальше
|
return ReturnCode.CONTINUE
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def HandleInput(self, symbolCode: int) -> int:
|
def HandleInput(self, symbolCode: int) -> int:
|
||||||
|
@ -38,104 +49,75 @@ class Controller:
|
||||||
return self.strategy.HandleInput(symbolCode)
|
return self.strategy.HandleInput(symbolCode)
|
||||||
|
|
||||||
class CommandStrategy(BaseStrategy):
|
class CommandStrategy(BaseStrategy):
|
||||||
"""Режим ввода команд"""
|
"""command input mode"""
|
||||||
def __init__(self, model: VimModel, adapter: CursesAdapter):
|
def __init__(self, model: VimModel, adapter: CursesAdapter):
|
||||||
super().__init__(model, adapter, mode="COMMAND")
|
super().__init__(model, adapter, mode="COMMAND")
|
||||||
|
|
||||||
|
@CommonInput
|
||||||
def HandleInput(self, symbolCode) -> int:
|
def HandleInput(self, symbolCode) -> int:
|
||||||
"""Обработка ввода пользователя"""
|
"""user input processing"""
|
||||||
result = self.handle_common_input(symbolCode)
|
|
||||||
if result != ReturnCode.CONTINUE: return result
|
|
||||||
returnCode = ReturnCode.GOOD
|
returnCode = ReturnCode.GOOD
|
||||||
|
|
||||||
match symbolCode:
|
match symbolCode:
|
||||||
case self.adapter.KEY_ENTER:
|
case self.adapter.KEY_ENTER:
|
||||||
returnCode = self.model.EnterCommand()
|
returnCode = self.model.EnterCommand()
|
||||||
case self.adapter.KEY_BACKSPACE_1 | self.adapter.KEY_BACKSPACE_2:
|
case self.adapter.KEY_BACKSPACE_1 | self.adapter.KEY_BACKSPACE_2:
|
||||||
self.model.BackspaceCommand()
|
self.model.BackspaceCommand()
|
||||||
case _:
|
case _:
|
||||||
if not isAscii(symbolCode): return ReturnCode.GOOD
|
if not tools.isAscii(symbolCode): return ReturnCode.GOOD
|
||||||
self.model.InsertCommandSymbol(symbolCode)
|
self.model.InsertCommandSymbol(symbolCode)
|
||||||
|
|
||||||
self.model.Scroll()
|
|
||||||
return returnCode
|
return returnCode
|
||||||
|
|
||||||
class EditStrategy(BaseStrategy):
|
class EditStrategy(BaseStrategy):
|
||||||
"""Режим редактирования"""
|
"""edit mode"""
|
||||||
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")
|
||||||
|
|
||||||
|
@CommonInput
|
||||||
def HandleInput(self, symbolCode) -> int:
|
def HandleInput(self, symbolCode) -> int:
|
||||||
"""Обработка ввода пользователя"""
|
"""user input processing"""
|
||||||
result = self.handle_common_input(symbolCode)
|
|
||||||
if result != ReturnCode.CONTINUE: return result
|
|
||||||
|
|
||||||
match symbolCode:
|
match symbolCode:
|
||||||
case self.adapter.KEY_ENTER: self.model.Enter()
|
case self.adapter.KEY_ENTER: self.model.Enter()
|
||||||
case self.adapter.KEY_BACKSPACE_1 | self.adapter.KEY_BACKSPACE_2:
|
case self.adapter.KEY_BACKSPACE_1 | self.adapter.KEY_BACKSPACE_2:
|
||||||
self.model.Backspace()
|
self.model.Backspace()
|
||||||
case _:
|
case _:
|
||||||
if not isAscii(symbolCode): return ReturnCode.GOOD
|
if not tools.isAscii(symbolCode): return ReturnCode.GOOD
|
||||||
if not self.model.inputAfterCursor:
|
if not self.model.inputAfterCursor:
|
||||||
self.model.InsertSymbol(symbolCode)
|
self.model.InsertSymbol(symbolCode)
|
||||||
else:
|
else:
|
||||||
self.model.InsertSymbolAfterCursor(symbolCode)
|
self.model.InsertSymbolAfterCursor(symbolCode)
|
||||||
|
|
||||||
self.model.Scroll()
|
|
||||||
return ReturnCode.GOOD
|
return ReturnCode.GOOD
|
||||||
|
|
||||||
class NormalStrategy(BaseStrategy):
|
class NormalStrategy(BaseStrategy):
|
||||||
"""Режим навигации"""
|
"""navigation mode"""
|
||||||
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")
|
||||||
|
|
||||||
|
@CommonInput
|
||||||
def HandleInput(self, symbolCode) -> int:
|
def HandleInput(self, symbolCode) -> int:
|
||||||
"""Обработка ввода пользователя"""
|
"""user input processing"""
|
||||||
self.model.UpdateKeyLog(symbolCode)
|
self.model.UpdateKeyLog(symbolCode)
|
||||||
result = self.handle_common_input(symbolCode)
|
|
||||||
if result != ReturnCode.CONTINUE:
|
|
||||||
self.model.Scroll()
|
|
||||||
return result
|
|
||||||
|
|
||||||
match symbolCode:
|
match symbolCode:
|
||||||
case self.adapter.KEY_TWO_DOTS:
|
case self.adapter.KEY_TWO_DOTS: return ReturnCode.SET_COMMAND_MODE
|
||||||
return ReturnCode.SET_COMMAND_MODE
|
case self.adapter.KEY_NULL | self.adapter.KEY_XOR: self.model.ToLineStart()
|
||||||
case self.adapter.KEY_NULL | self.adapter.KEY_XOR:
|
case self.adapter.KEY_DOLLAR: self.model.ToLineEnd()
|
||||||
self.model.ToLineStart()
|
case self.adapter.KEY_p: self.model.Paste()
|
||||||
case self.adapter.KEY_DOLLAR:
|
|
||||||
self.model.ToLineEnd()
|
|
||||||
case self.adapter.KEY_p:
|
|
||||||
self.model.Paste()
|
|
||||||
case self.adapter.KEY_w:
|
case self.adapter.KEY_w:
|
||||||
if self.model.CombinationCheck("diw", 3):
|
if self.model.CombinationCheck("diw", 3): self.model.DeleteWord()
|
||||||
self.model.DeleteWord()
|
elif self.model.CombinationCheck("yw", 3): self.model.CopyWord()
|
||||||
elif self.model.CombinationCheck("yw", 3):
|
|
||||||
self.model.CopyWord()
|
|
||||||
else: self.model.ToWordEnd()
|
else: self.model.ToWordEnd()
|
||||||
case self.adapter.KEY_b:
|
case self.adapter.KEY_b: self.model.ToWordStart()
|
||||||
self.model.ToWordStart()
|
|
||||||
case self.adapter.KEY_d:
|
case self.adapter.KEY_d:
|
||||||
if self.model.CombinationCheck("dd", 3):
|
if self.model.CombinationCheck("dd", 3): self.model.CutLine()
|
||||||
self.model.CutLine()
|
|
||||||
case self.adapter.KEY_y:
|
case self.adapter.KEY_y:
|
||||||
if self.model.CombinationCheck("yy", 3):
|
if self.model.CombinationCheck("yy", 3): self.model.CopyLine()
|
||||||
self.model.CopyLine()
|
case self.adapter.KEY_x: self.model.DeleteNext()
|
||||||
case self.adapter.KEY_x:
|
case self.adapter.KEY_U: self.model.RecoverLine()
|
||||||
self.model.DeleteNext()
|
|
||||||
case self.adapter.KEY_U:
|
|
||||||
self.model.RecoverLine()
|
|
||||||
case self.adapter.KEY_G:
|
case self.adapter.KEY_G:
|
||||||
num, ind = tools.ExtracrtNumBeforeLastKey(''.join([chr(item[0]) for item in self.model.keyLog]))
|
num, ind = tools.ExtracrtNumBeforeLastKey(''.join([chr(item[0]) for item in self.model.keyLog]))
|
||||||
if num != None and ind != None:
|
if num != None and ind != None: self.model.MoveToLine(num)
|
||||||
self.model.MoveToLine(num)
|
else: self.model.ToFileEnd()
|
||||||
else:
|
|
||||||
self.model.ToFileEnd()
|
|
||||||
case self.adapter.KEY_g:
|
case self.adapter.KEY_g:
|
||||||
if self.model.CombinationCheck("gg", 3): self.model.ToFileStart()
|
if self.model.CombinationCheck("gg", 3): self.model.ToFileStart()
|
||||||
case self.adapter.KEY_PG_UP:
|
case self.adapter.KEY_PG_UP: self.model.PageUp()
|
||||||
self.model.PageUp()
|
case self.adapter.KEY_PG_DOWN: self.model.PageDown()
|
||||||
case self.adapter.KEY_PG_DOWN:
|
|
||||||
self.model.PageDown()
|
|
||||||
|
|
||||||
self.model.Scroll()
|
|
||||||
return ReturnCode.GOOD
|
return ReturnCode.GOOD
|
3
tools.py
3
tools.py
|
@ -23,5 +23,8 @@ def ExtracrtNumBeforeLastKey(s):
|
||||||
return int(number), i
|
return int(number), i
|
||||||
return None, None
|
return None, None
|
||||||
|
|
||||||
|
def isAscii(symbolCode: int) -> bool:
|
||||||
|
return 32 <= symbolCode <= 126
|
||||||
|
|
||||||
def UnixSec() -> int:
|
def UnixSec() -> int:
|
||||||
return int(time.time())
|
return int(time.time())
|
Loading…
Reference in New Issue