разделил vimview и cursesadapter на 2 класса
parent
435987dcc6
commit
e5ff723cb1
11
main.py
11
main.py
|
@ -1,11 +1,11 @@
|
||||||
from mvc.models import VimModel
|
from mvc.models import VimModel
|
||||||
from mvc.views import CursesAdapter
|
from mvc.views import VimView
|
||||||
from mvc.controllers import EditController
|
from mvc.controllers import EditController
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
model = VimModel()
|
model = VimModel()
|
||||||
view = CursesAdapter()
|
view = VimView()
|
||||||
controller = EditController(model, view)
|
controller = EditController(model, view.curses_adapter)
|
||||||
|
|
||||||
# Загрузка файла для редактирования
|
# Загрузка файла для редактирования
|
||||||
file_path = "example.txt" # Укажите путь к файлу
|
file_path = "example.txt" # Укажите путь к файлу
|
||||||
|
@ -16,10 +16,11 @@ def main():
|
||||||
model.currentLine, model.currentCol,
|
model.currentLine, model.currentCol,
|
||||||
model.scrollX, model.scrollY,
|
model.scrollX, model.scrollY,
|
||||||
model.file_path)
|
model.file_path)
|
||||||
symbolCode = view.GetChar()
|
|
||||||
|
symbolCode = view.curses_adapter.GetChar()
|
||||||
if not controller.HandleInput(symbolCode): break
|
if not controller.HandleInput(symbolCode): break
|
||||||
|
|
||||||
view.Cleanup()
|
view.curses_adapter.Cleanup()
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
82
mvc/views.py
82
mvc/views.py
|
@ -1,5 +1,47 @@
|
||||||
import curses
|
import curses
|
||||||
|
|
||||||
|
class VimView:
|
||||||
|
def __init__(self) -> None:
|
||||||
|
self.curses_adapter = CursesAdapter()
|
||||||
|
|
||||||
|
def Render(self,
|
||||||
|
displayBuffer: list[list[str]],
|
||||||
|
currentLine: int, currentCol: int,
|
||||||
|
scrollX: int, scrollY: int,
|
||||||
|
file_path: str):
|
||||||
|
"""Отрисовка текущего состояния"""
|
||||||
|
|
||||||
|
self.curses_adapter.screen.clear()
|
||||||
|
|
||||||
|
# display visible part of text
|
||||||
|
for i in range(self.curses_adapter.lines - 1):
|
||||||
|
if i + scrollY < len(displayBuffer):
|
||||||
|
line = ''.join(displayBuffer[i + scrollY])
|
||||||
|
if scrollX < len(line):
|
||||||
|
self.curses_adapter.SetString(i, 0, line[scrollX:scrollX + self.curses_adapter.cols])
|
||||||
|
else:
|
||||||
|
self.curses_adapter.SetString(i, 0, '')
|
||||||
|
else:
|
||||||
|
self.curses_adapter.SetString(i, 0, '')
|
||||||
|
|
||||||
|
# update mode bar
|
||||||
|
self.EditModeBar(currentLine, len(displayBuffer), file_path)
|
||||||
|
# update cursor
|
||||||
|
self.curses_adapter.SetCursor(currentLine - scrollY, currentCol - scrollX)
|
||||||
|
self.curses_adapter.Refresh()
|
||||||
|
|
||||||
|
def EditModeBar(self, currentLine, totalLines, fileName):
|
||||||
|
"""Print edit mode information panel"""
|
||||||
|
self.curses_adapter.screen.addstr(self.curses_adapter.lines - 1, 0, ' ' * (self.curses_adapter.cols - 1)) # Очистка строки
|
||||||
|
self.curses_adapter.screen.addstr(self.curses_adapter.lines - 1, 0, "FILE: ")
|
||||||
|
self.curses_adapter.screen.addstr(fileName, curses.color_pair(1)) # Имя файла
|
||||||
|
self.curses_adapter.screen.addstr(" | MODE:")
|
||||||
|
self.curses_adapter.screen.addstr(" EDIT", curses.color_pair(1))
|
||||||
|
self.curses_adapter.screen.addstr(" | LINE: ")
|
||||||
|
self.curses_adapter.screen.addstr(str(currentLine + 1), curses.color_pair(1))
|
||||||
|
self.curses_adapter.screen.addstr("/")
|
||||||
|
self.curses_adapter.screen.addstr(str(totalLines), curses.color_pair(1)) # Общее количество строк
|
||||||
|
|
||||||
class CursesAdapter:
|
class CursesAdapter:
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
self.KEY_LEFT = curses.KEY_LEFT
|
self.KEY_LEFT = curses.KEY_LEFT
|
||||||
|
@ -44,42 +86,4 @@ class CursesAdapter:
|
||||||
|
|
||||||
def GetChar(self) -> int:
|
def GetChar(self) -> int:
|
||||||
"""Wait users input"""
|
"""Wait users input"""
|
||||||
return self.screen.getch()
|
return self.screen.getch()
|
||||||
|
|
||||||
def Render(self,
|
|
||||||
displayBuffer: list[list[str]],
|
|
||||||
currentLine: int, currentCol: int,
|
|
||||||
scrollX: int, scrollY: int,
|
|
||||||
file_path: str):
|
|
||||||
"""Отрисовка текущего состояния"""
|
|
||||||
|
|
||||||
self.screen.clear()
|
|
||||||
|
|
||||||
# display visible part of text
|
|
||||||
for i in range(self.lines - 1):
|
|
||||||
if i + scrollY < len(displayBuffer):
|
|
||||||
line = ''.join(displayBuffer[i + scrollY])
|
|
||||||
if scrollX < len(line):
|
|
||||||
self.SetString(i, 0, line[scrollX:scrollX + self.cols])
|
|
||||||
else:
|
|
||||||
self.SetString(i, 0, '')
|
|
||||||
else:
|
|
||||||
self.SetString(i, 0, '')
|
|
||||||
|
|
||||||
# update mode bar
|
|
||||||
self.EditModeBar(currentLine, len(displayBuffer), file_path)
|
|
||||||
# update cursor
|
|
||||||
self.SetCursor(currentLine - scrollY, currentCol - scrollX)
|
|
||||||
self.Refresh()
|
|
||||||
|
|
||||||
def EditModeBar(self, currentLine, totalLines, fileName):
|
|
||||||
"""Print edit mode information panel"""
|
|
||||||
self.screen.addstr(self.lines - 1, 0, ' ' * (self.cols - 1)) # Очистка строки
|
|
||||||
self.screen.addstr(self.lines - 1, 0, "FILE: ")
|
|
||||||
self.screen.addstr(fileName, curses.color_pair(1)) # Имя файла
|
|
||||||
self.screen.addstr(" | MODE:")
|
|
||||||
self.screen.addstr(" EDIT", curses.color_pair(1))
|
|
||||||
self.screen.addstr(" | LINE: ")
|
|
||||||
self.screen.addstr(str(currentLine + 1), curses.color_pair(1))
|
|
||||||
self.screen.addstr("/")
|
|
||||||
self.screen.addstr(str(totalLines), curses.color_pair(1)) # Общее количество строк
|
|
Loading…
Reference in New Issue