метод scroll в модели, match case в handle input

master
serr 2025-02-04 14:14:46 +03:00
parent 72dda17eed
commit 40b223a5ec
3 changed files with 36 additions and 57 deletions

View File

@ -8,53 +8,23 @@ class EditController:
self.model = model
self.view = view
def handle_input(self, symbolCode):
def HandleInput(self, symbolCode):
"""Обработка ввода пользователя"""
# escape
if symbolCode == 27:
return False
elif symbolCode == curses.KEY_LEFT:
self.model.MoveLeft()
elif symbolCode == curses.KEY_RIGHT:
self.model.MoveRight()
elif symbolCode == curses.KEY_UP:
self.model.MoveUp()
elif symbolCode == curses.KEY_DOWN:
self.model.MoveDown()
elif symbolCode in (127, 8):
self.model.Backspace()
elif symbolCode == 10:
self.model.Enter()
elif symbolCode == 19:
self.model.SaveFile()
else:
if self.model.currentCol <= len(self.model.displayBuffer[self.model.currentLine]): # проверяем, не превышает ли индекс колонки длину строки
self.model.displayBuffer[self.model.currentLine].insert(self.model.currentCol, chr(symbolCode))
self.model.currentCol += 1
# Прокрутка экрана
if self.model.currentLine < self.model.scrollY:
self.model.scrollY = self.model.currentLine
elif self.model.currentLine >= self.model.scrollY + self.view.lines - 1:
self.model.scrollY = self.model.currentLine - self.view.lines + 2
if self.model.currentCol < self.model.scrollX:
self.model.scrollX = self.model.currentCol
elif self.model.currentCol >= self.model.scrollX + self.view.cols:
self.model.scrollX = self.model.currentCol - self.view.cols + 1
match symbolCode:
case 27: return False # escape
case curses.KEY_LEFT: self.model.MoveLeft()
case curses.KEY_RIGHT: self.model.MoveRight()
case curses.KEY_UP: self.model.MoveUp()
case curses.KEY_DOWN: self.model.MoveDown()
case 127 | 8: self.model.Backspace()
case 10: self.model.Enter()
case 19: self.model.SaveFile()
case _: self.model.InsertSymbol(symbolCode)
self.model.Scroll(self.view.lines, self.view.cols)
return True
def render(self):
def Render(self):
"""Отрисовка текущего состояния"""
self.view.screen.clear()

View File

@ -9,12 +9,12 @@ def main():
# Загрузка файла для редактирования
file_path = "example.txt" # Укажите путь к файлу
model.load_file(file_path)
model.LoadFile(file_path)
while True:
controller.render()
controller.Render()
symbolCode = view.GetChar()
if not controller.handle_input(symbolCode):
if not controller.HandleInput(symbolCode):
break
view.Cleanup()

View File

@ -7,6 +7,22 @@ class VimModel:
self.scrollX = 0 # горизонтальная прокрутка
self.file_path = "" # путь к файлу
def Scroll(self, displayLines: int, displayCols: int) -> None:
if self.currentLine < self.scrollY:
self.scrollY = self.currentLine
elif self.currentLine >= self.scrollY + displayLines - 1:
self.scrollY = self.currentLine - displayLines + 2
if self.currentCol < self.scrollX:
self.scrollX = self.currentCol
elif self.currentCol >= self.scrollX + displayCols:
self.scrollX = self.currentCol - displayCols + 1
def InsertSymbol(self, symbolCode: int) -> None:
if self.currentCol <= len(self.displayBuffer[self.currentLine]): # проверяем, не превышает ли индекс колонки длину строки
self.displayBuffer[self.currentLine].insert(self.currentCol, chr(symbolCode))
self.currentCol += 1
def Enter(self) -> None:
# Разделяем текущую строку на две части
new_line = self.displayBuffer[self.currentLine][self.currentCol:]
@ -51,14 +67,7 @@ class VimModel:
self.currentLine += 1
self.currentCol = min(self.currentCol, len(self.displayBuffer[self.currentLine]))
def SaveFile(self) -> None:
result = self.save_file()
if result is True:
print(f"File {self.file_path} saved successfully.")
else:
print(f"Error saving file: {result}")
def load_file(self, file_path) -> None:
def LoadFile(self, file_path) -> None:
"""Загрузка файла для редактирования"""
self.file_path = file_path
try:
@ -68,12 +77,12 @@ class VimModel:
print(f"File {file_path} not found. Starting with empty buffer.")
self.displayBuffer = []
def save_file(self) -> None:
def SaveFile(self) -> None:
"""Сохранение файла"""
try:
with open(self.file_path, "w") as file:
for line in self.displayBuffer:
file.write(''.join(line) + '\n')
return True
print(f"File {self.file_path} saved successfully.")
except Exception as e:
return str(e)
print(f"Error saving file: {str(e)}")