47 lines
1.9 KiB
Python
47 lines
1.9 KiB
Python
|
import curses
|
||
|
|
||
|
from mvc.views import CursesAdapter
|
||
|
from mvc.models import VimModel
|
||
|
|
||
|
class EditController:
|
||
|
def __init__(self, model: VimModel, view: CursesAdapter):
|
||
|
self.model = model
|
||
|
self.view = view
|
||
|
|
||
|
def HandleInput(self, symbolCode):
|
||
|
"""Обработка ввода пользователя"""
|
||
|
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):
|
||
|
"""Отрисовка текущего состояния"""
|
||
|
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()
|