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