выделил adapter в отедльный файл
parent
5096c75fc6
commit
ee2337591c
|
@ -0,0 +1,91 @@
|
|||
from abc import ABC, abstractmethod
|
||||
import curses
|
||||
|
||||
class IController(ABC):
|
||||
@abstractmethod
|
||||
def GetChar(self) -> int:
|
||||
pass
|
||||
|
||||
class IView(ABC):
|
||||
@abstractmethod
|
||||
def Refresh(self) -> None:
|
||||
pass
|
||||
@abstractmethod
|
||||
def Cleanup(self) -> None:
|
||||
pass
|
||||
@abstractmethod
|
||||
def SetCursor(self, x: int, y: int) -> None:
|
||||
pass
|
||||
@abstractmethod
|
||||
def SetChar(self, x: int, y: int, code: int) -> None:
|
||||
pass
|
||||
@abstractmethod
|
||||
def SetColorString(self, x: int, y: int, data: str, attr: int) -> None:
|
||||
pass
|
||||
@abstractmethod
|
||||
def SetString(self, x: int, y: int, data: str) -> None:
|
||||
pass
|
||||
|
||||
class CursesAdapter(IView, IController):
|
||||
def __init__(self) -> None:
|
||||
self.KEY_BACKSPACE_2 = 8
|
||||
self.KEY_ENTER = 10
|
||||
self.KEY_CTRL_S = 19
|
||||
self.KEY_ESCAPE = 27
|
||||
self.KEY_DOLLAR = 36
|
||||
self.KEY_NULL = 48
|
||||
self.KEY_TWO_DOTS = 59
|
||||
self.KEY_G = 71
|
||||
self.KEY_XOR = 94
|
||||
self.KEY_b = 98
|
||||
self.KEY_d = 100
|
||||
self.KEY_g = 103
|
||||
self.KEY_p = 112
|
||||
self.KEY_w = 119
|
||||
self.KEY_x = 120
|
||||
self.KEY_y = 121
|
||||
self.KEY_BACKSPACE_1 = 127
|
||||
self.KEY_LEFT = curses.KEY_LEFT
|
||||
self.KEY_RIGHT = curses.KEY_RIGHT
|
||||
self.KEY_UP = curses.KEY_UP
|
||||
self.KEY_DOWN = curses.KEY_DOWN
|
||||
self.KEY_PG_UP = 451
|
||||
self.KEY_PG_DOWN = 457
|
||||
|
||||
|
||||
self.screen = curses.initscr()
|
||||
self.screen.keypad(True)
|
||||
self.cols = curses.COLS
|
||||
self.lines = curses.LINES
|
||||
curses.noecho()
|
||||
curses.curs_set(1) # Make cursor visible
|
||||
curses.start_color()
|
||||
curses.init_pair(1, curses.COLOR_BLUE, curses.COLOR_BLACK) # Фиолетовый текст на черном фоне
|
||||
curses.init_pair(2, curses.COLOR_WHITE, curses.COLOR_BLUE) # Фиолетовый текст на черном фоне
|
||||
self.colorPairs = [curses.color_pair(1), curses.color_pair(2)]
|
||||
|
||||
def Refresh(self) -> None:
|
||||
"""Apply changes"""
|
||||
self.screen.refresh()
|
||||
|
||||
def Cleanup(self) -> None:
|
||||
curses.endwin()
|
||||
|
||||
def SetCursor(self, x: int, y: int) -> None:
|
||||
"""set cursor position (x, y)"""
|
||||
self.screen.move(x, y)
|
||||
|
||||
def SetChar(self, x: int, y: int, code: int) -> None:
|
||||
"""set char position (x, y)"""
|
||||
self.screen.addch(x, y, code)
|
||||
|
||||
def SetColorString(self, x: int, y: int, data: str, attr: int) -> None:
|
||||
self.screen.addstr(x, y, data, attr)
|
||||
|
||||
def SetString(self, x: int, y: int, data: str) -> None:
|
||||
"""set string begin position (x, y)"""
|
||||
self.screen.addstr(x, y, data)
|
||||
|
||||
def GetChar(self) -> int:
|
||||
"""Wait users input"""
|
||||
return self.screen.getch()
|
3
main.py
3
main.py
|
@ -1,6 +1,7 @@
|
|||
import sys
|
||||
from mvc.models import VimModel
|
||||
from mvc.views import VimView, CursesAdapter
|
||||
from mvc.views import VimView
|
||||
from adapter import CursesAdapter
|
||||
from mvc.controllers import Controller, ReturnCode
|
||||
from mvc.controllers import EditStrategy, CommandStrategy, NormalStrategy
|
||||
import tools
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
from abc import ABC, abstractmethod
|
||||
import tools
|
||||
from enum import Enum
|
||||
from typing import List
|
||||
|
@ -12,6 +13,17 @@ class ReturnCode(Enum):
|
|||
SET_EDIT_MODE = -97
|
||||
CONTINUE = -96
|
||||
|
||||
class Observable(ABC):
|
||||
@abstractmethod
|
||||
def attach(self, observer):
|
||||
pass
|
||||
@abstractmethod
|
||||
def detach(self, observer):
|
||||
pass
|
||||
@abstractmethod
|
||||
def notify(self):
|
||||
pass
|
||||
|
||||
class VimModel:
|
||||
observers: List
|
||||
displayLinesCount: int
|
||||
|
|
79
mvc/views.py
79
mvc/views.py
|
@ -1,76 +1,11 @@
|
|||
from abc import ABC, abstractmethod
|
||||
import curses
|
||||
from adapter import CursesAdapter
|
||||
import mvc.models
|
||||
from mystring import MyString as MyString
|
||||
|
||||
|
||||
class CursesAdapter:
|
||||
def __init__(self) -> None:
|
||||
self.KEY_BACKSPACE_2 = 8
|
||||
self.KEY_ENTER = 10
|
||||
self.KEY_CTRL_S = 19
|
||||
self.KEY_ESCAPE = 27
|
||||
self.KEY_DOLLAR = 36
|
||||
self.KEY_NULL = 48
|
||||
self.KEY_TWO_DOTS = 59
|
||||
self.KEY_G = 71
|
||||
self.KEY_XOR = 94
|
||||
self.KEY_b = 98
|
||||
self.KEY_d = 100
|
||||
self.KEY_g = 103
|
||||
self.KEY_p = 112
|
||||
self.KEY_w = 119
|
||||
self.KEY_x = 120
|
||||
self.KEY_y = 121
|
||||
self.KEY_BACKSPACE_1 = 127
|
||||
self.KEY_LEFT = curses.KEY_LEFT
|
||||
self.KEY_RIGHT = curses.KEY_RIGHT
|
||||
self.KEY_UP = curses.KEY_UP
|
||||
self.KEY_DOWN = curses.KEY_DOWN
|
||||
self.KEY_PG_UP = 451
|
||||
self.KEY_PG_DOWN = 457
|
||||
|
||||
|
||||
self.screen = curses.initscr()
|
||||
self.screen.keypad(True)
|
||||
self.cols = curses.COLS
|
||||
self.lines = curses.LINES
|
||||
curses.noecho()
|
||||
curses.curs_set(1) # Make cursor visible
|
||||
curses.start_color()
|
||||
curses.init_pair(1, curses.COLOR_BLUE, curses.COLOR_BLACK) # Фиолетовый текст на черном фоне
|
||||
curses.init_pair(2, curses.COLOR_WHITE, curses.COLOR_BLUE) # Фиолетовый текст на черном фоне
|
||||
self.colorPairs = [curses.color_pair(1), curses.color_pair(2)]
|
||||
|
||||
def Refresh(self) -> None:
|
||||
"""Apply changes"""
|
||||
self.screen.refresh()
|
||||
|
||||
def Cleanup(self) -> None:
|
||||
curses.endwin()
|
||||
|
||||
def SetCursor(self, x: int, y: int):
|
||||
"""set cursor position (x, y)"""
|
||||
self.screen.move(x, y)
|
||||
|
||||
def SetChar(self, x: int, y: int, code: int):
|
||||
"""set char position (x, y)"""
|
||||
self.screen.addch(x, y, code)
|
||||
|
||||
def SetColorString(self, x: int, y: int, data: str, attr: int):
|
||||
self.screen.addstr(x, y, data, attr)
|
||||
|
||||
def SetString(self, x: int, y: int, data: str):
|
||||
"""set string begin position (x, y)"""
|
||||
self.screen.addstr(x, y, data)
|
||||
|
||||
def GetChar(self) -> int:
|
||||
"""Wait users input"""
|
||||
return self.screen.getch()
|
||||
|
||||
class Observer:
|
||||
class Observer(ABC):
|
||||
@abstractmethod
|
||||
def Update(self):
|
||||
def Update(self) -> None:
|
||||
pass
|
||||
|
||||
class VimView(Observer):
|
||||
|
@ -78,11 +13,11 @@ class VimView(Observer):
|
|||
self.curses_adapter = adapter
|
||||
self.model = None
|
||||
|
||||
def SetModel(self, model: mvc.models.VimModel):
|
||||
def SetModel(self, model: mvc.models.VimModel) -> None:
|
||||
self.model = model
|
||||
model.attach(self)
|
||||
|
||||
def Update(self):
|
||||
def Update(self) -> None:
|
||||
self.Render(
|
||||
self.model.displayBuffer,
|
||||
self.model.currentLine,
|
||||
|
@ -98,7 +33,7 @@ class VimView(Observer):
|
|||
currentLine: int, currentCol: int,
|
||||
scrollX: int, scrollY: int,
|
||||
modeBarData: str,
|
||||
show_line_numbers: bool = False):
|
||||
show_line_numbers: bool = False) -> None:
|
||||
"""Отрисовка текущего состояния"""
|
||||
|
||||
self.curses_adapter.screen.clear()
|
||||
|
@ -137,7 +72,7 @@ class VimView(Observer):
|
|||
|
||||
self.curses_adapter.Refresh()
|
||||
|
||||
def SetModeBar(self, modeBarData: str):
|
||||
def SetModeBar(self, modeBarData: str) -> None:
|
||||
"""Print edit mode information panel"""
|
||||
if len(modeBarData) > self.curses_adapter.cols - 1:
|
||||
scrollX = len(modeBarData) - self.curses_adapter.cols
|
||||
|
|
Loading…
Reference in New Issue