displayLines, displayCols из модели, убрал лишнюю функцию

master
serr 2025-02-04 20:28:41 +03:00
parent 7326aa1834
commit 8e711e95ae
4 changed files with 18 additions and 32 deletions

View File

@ -1,15 +1,13 @@
from mvc.models import VimModel
from mvc.views import VimView, CursesAdapter
from mvc.views import VimView
from mvc.controllers import Controller, ReturnCode
from mvc.controllers import EditStrategy, CommandStrategy, NormalStrategy
def main():
adapter = CursesAdapter()
model = VimModel(adapter.lines, adapter.cols)
view = VimView(adapter)
model, view = VimModel(), VimView()
# start mode - navigation mode
strategy = NormalStrategy(model, adapter)
strategy = NormalStrategy(model, view.curses_adapter)
controller = Controller(strategy)
# Загрузка файла для редактирования

View File

@ -50,7 +50,10 @@ class CommandStrategy(BaseStrategy):
if result != ReturnCode.CONTINUE: return result
match symbolCode:
case self.adapter.KEY_ENTER: return self.model.EnterCommand()
case self.adapter.KEY_ENTER:
code = self.model.EnterCommand()
self.model.Scroll(self.adapter.lines, self.adapter.cols)
return code
case self.adapter.KEY_BACKSPACE_1 | self.adapter.KEY_BACKSPACE_2:
self.model.BackspaceCommand()
case _:

View File

@ -9,9 +9,7 @@ class ReturnCode(Enum):
CONTINUE = -96
class VimModel:
def __init__(self, displayLines: int, displayCols: int):
self.displayLines = displayLines
self.displayCols = displayCols
def __init__(self):
self.displayBuffer = [] # буфер для хранения всех строк
self.currentLine = 0 # текущий индекс строки
self.currentCol = 0 # текущий индекс колонки
@ -46,56 +44,43 @@ class VimModel:
self.displayBuffer[self.currentLine].insert(self.currentCol, chr(symbolCode))
self.currentCol += 1
def MoveToPositionWithScroll(self, position: int) -> None:
"""
Перемещает курсор в указанную позицию в текущей строке
и корректирует прокрутку, если это необходимо.
"""
line_length = len(self.displayBuffer[self.currentLine])
self.currentCol = max(0, min(position, line_length))
# Корректируем прокрутку, если курсор выходит за пределы видимой области
if self.currentCol < self.scrollX:
self.scrollX = self.currentCol # Прокрутка влево
elif self.currentCol >= self.scrollX + self.displayCols:
self.scrollX = self.currentCol - self.displayCols + 1 # Прокрутка вправо
def EnterCommand(self):
"""Обработка введенной команды"""
cmd = ''.join(self.commandBuffer)
self.commandBuffer.clear()
match cmd:
case "$":
self.MoveToPositionWithScroll(len(self.displayBuffer[self.currentLine])) # Перемещение в конец строки
self.currentCol = len(self.displayBuffer[self.currentLine]) # Перемещение в конец строки
return ReturnCode.GOOD
case "^" | "0":
self.MoveToPositionWithScroll(0) # Перемещение в начало строки
self.currentCol = 0 # Перемещение в начало строки
return ReturnCode.GOOD
case "q":
return ReturnCode.EXIT_CODE
case "i":
return ReturnCode.SET_EDIT_MODE
case "S":
self.MoveToPositionWithScroll(0)
self.currentCol = 0
self.displayBuffer[self.currentLine] = []
return ReturnCode.SET_EDIT_MODE
case "RIGHT":
self.MoveToPositionWithScroll(self.currentCol + 1)
self.currentCol += 1
return ReturnCode.GOOD
case "LEFT":
self.MoveToPositionWithScroll(self.currentCol - 1)
if self.currentCol > 0:
self.currentCol -= 1
return ReturnCode.GOOD
case "UP":
if self.currentLine > 0:
self.currentLine -= 1
if self.currentCol > len(self.displayBuffer[self.currentLine]):
self.MoveToPositionWithScroll(len(self.displayBuffer[self.currentLine]))
self.currentCol = len(self.displayBuffer[self.currentLine])
return ReturnCode.GOOD
case "DOWN":
if self.currentLine < len(self.displayBuffer) - 1:
self.currentLine += 1
if self.currentCol > len(self.displayBuffer[self.currentLine]):
self.MoveToPositionWithScroll(len(self.displayBuffer[self.currentLine]))
self.currentCol = len(self.displayBuffer[self.currentLine])
return ReturnCode.GOOD
def Enter(self) -> None:

View File

@ -49,8 +49,8 @@ class CursesAdapter:
class VimView:
def __init__(self, adapter: CursesAdapter) -> None:
self.curses_adapter = adapter
def __init__(self) -> None:
self.curses_adapter = CursesAdapter()
def Render(self,