выделил 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
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

View File

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

View File

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