VIM-like-text-editor/controllers.py

77 lines
2.9 KiB
Python
Raw Normal View History

import curses
from views import CursesAdapter
from models import VimModel
class EditController:
def __init__(self, model: VimModel, view: CursesAdapter):
self.model = model
self.view = view
def handle_input(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
return True
def render(self):
"""Отрисовка текущего состояния"""
self.view.screen.clear()
# Отображение видимой части текста
for i in range(self.view.lines - 1):
if i + self.model.scrollY < len(self.model.displayBuffer):
line = ''.join(self.model.displayBuffer[i + self.model.scrollY])
if self.model.scrollX < len(line):
self.view.SetString(i, 0, line[self.model.scrollX:self.model.scrollX + self.view.cols])
else:
self.view.SetString(i, 0, '')
else:
self.view.SetString(i, 0, '')
# Отображение панели режима
self.view.EditModeBar(self.model.currentLine, len(self.model.displayBuffer), self.model.file_path)
# Установка курсора
self.view.SetCursor(self.model.currentLine - self.model.scrollY, self.model.currentCol - self.model.scrollX)
self.view.Refresh()