VIM-like-text-editor/adapter.py

91 lines
2.7 KiB
Python
Raw Normal View History

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()