выделил adapter в отедльный файл

MyString
serr 2025-02-11 16:13:36 +03:00
parent 5096c75fc6
commit ee2337591c
4 changed files with 112 additions and 73 deletions

91
adapter.py Normal file
View File

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

View File

@ -1,6 +1,7 @@
import sys import sys
from mvc.models import VimModel 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 Controller, ReturnCode
from mvc.controllers import EditStrategy, CommandStrategy, NormalStrategy from mvc.controllers import EditStrategy, CommandStrategy, NormalStrategy
import tools import tools

View File

@ -1,3 +1,4 @@
from abc import ABC, abstractmethod
import tools import tools
from enum import Enum from enum import Enum
from typing import List from typing import List
@ -12,6 +13,17 @@ class ReturnCode(Enum):
SET_EDIT_MODE = -97 SET_EDIT_MODE = -97
CONTINUE = -96 CONTINUE = -96
class Observable(ABC):
@abstractmethod
def attach(self, observer):
pass
@abstractmethod
def detach(self, observer):
pass
@abstractmethod
def notify(self):
pass
class VimModel: class VimModel:
observers: List observers: List
displayLinesCount: int displayLinesCount: int

View File

@ -1,76 +1,11 @@
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
import curses from adapter import CursesAdapter
import mvc.models import mvc.models
from mystring import MyString as MyString from mystring import MyString as MyString
class Observer(ABC):
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:
@abstractmethod @abstractmethod
def Update(self): def Update(self) -> None:
pass pass
class VimView(Observer): class VimView(Observer):
@ -78,11 +13,11 @@ class VimView(Observer):
self.curses_adapter = adapter self.curses_adapter = adapter
self.model = None self.model = None
def SetModel(self, model: mvc.models.VimModel): def SetModel(self, model: mvc.models.VimModel) -> None:
self.model = model self.model = model
model.attach(self) model.attach(self)
def Update(self): def Update(self) -> None:
self.Render( self.Render(
self.model.displayBuffer, self.model.displayBuffer,
self.model.currentLine, self.model.currentLine,
@ -98,7 +33,7 @@ class VimView(Observer):
currentLine: int, currentCol: int, currentLine: int, currentCol: int,
scrollX: int, scrollY: int, scrollX: int, scrollY: int,
modeBarData: str, modeBarData: str,
show_line_numbers: bool = False): show_line_numbers: bool = False) -> None:
"""Отрисовка текущего состояния""" """Отрисовка текущего состояния"""
self.curses_adapter.screen.clear() self.curses_adapter.screen.clear()
@ -137,7 +72,7 @@ class VimView(Observer):
self.curses_adapter.Refresh() self.curses_adapter.Refresh()
def SetModeBar(self, modeBarData: str): def SetModeBar(self, modeBarData: str) -> None:
"""Print edit mode information panel""" """Print edit mode information panel"""
if len(modeBarData) > self.curses_adapter.cols - 1: if len(modeBarData) > self.curses_adapter.cols - 1:
scrollX = len(modeBarData) - self.curses_adapter.cols scrollX = len(modeBarData) - self.curses_adapter.cols