начал переписывать с использованием с++ класса MyString

rewrite-MyString-class
serr 2025-02-11 10:37:35 +03:00
parent 7242026608
commit 3e9adc3c11
3 changed files with 50 additions and 26 deletions

View File

@ -4,6 +4,7 @@ from mvc.views import VimView, 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
from mystring import MyString as MyString
def main(): def main():
adapter = CursesAdapter() adapter = CursesAdapter()
@ -14,8 +15,10 @@ def main():
controller = Controller(strategy) controller = Controller(strategy)
# load file from sys argv # load file from sys argv
if len(sys.argv) > 1: model.LoadFile(sys.argv[1]) if len(sys.argv) > 1: model.LoadFile(MyString(sys.argv[1]))
else: model.LoadFile("File not found but i create it"+str(tools.UnixSec())+".txt") else: model.LoadFile(MyString("File not found but i create it").data()+\
MyString(str(tools.UnixSec())).data()+\
MyString(".txt").data())
view.SetModel(model) # view subscribe model view.SetModel(model) # view subscribe model

View File

@ -2,6 +2,7 @@ import tools
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from mvc.views import CursesAdapter from mvc.views import CursesAdapter
from mvc.models import VimModel, ReturnCode from mvc.models import VimModel, ReturnCode
from mystring import MyString as MyString
def CommonInput(HandleInputFunc): def CommonInput(HandleInputFunc):
"""common actions for all strategies decorator""" """common actions for all strategies decorator"""
@ -51,7 +52,7 @@ class Controller:
class CommandStrategy(BaseStrategy): class CommandStrategy(BaseStrategy):
"""command input mode""" """command input mode"""
def __init__(self, model: VimModel, adapter: CursesAdapter): def __init__(self, model: VimModel, adapter: CursesAdapter):
super().__init__(model, adapter, mode="COMMAND") super().__init__(model, adapter, mode=MyString("COMMAND"))
@CommonInput @CommonInput
def HandleInput(self, symbolCode) -> int: def HandleInput(self, symbolCode) -> int:
@ -70,7 +71,7 @@ class CommandStrategy(BaseStrategy):
class EditStrategy(BaseStrategy): class EditStrategy(BaseStrategy):
"""edit mode""" """edit mode"""
def __init__(self, model: VimModel, adapter: CursesAdapter): def __init__(self, model: VimModel, adapter: CursesAdapter):
super().__init__(model, adapter, mode="EDIT") super().__init__(model, adapter, mode=MyString("EDIT"))
@CommonInput @CommonInput
def HandleInput(self, symbolCode) -> int: def HandleInput(self, symbolCode) -> int:
@ -90,7 +91,7 @@ class EditStrategy(BaseStrategy):
class NormalStrategy(BaseStrategy): class NormalStrategy(BaseStrategy):
"""navigation mode""" """navigation mode"""
def __init__(self, model: VimModel, adapter: CursesAdapter): def __init__(self, model: VimModel, adapter: CursesAdapter):
super().__init__(model, adapter, mode="NORMAL") super().__init__(model, adapter, mode=MyString("NORMAL"))
@CommonInput @CommonInput
def HandleInput(self, symbolCode) -> int: def HandleInput(self, symbolCode) -> int:

View File

@ -1,5 +1,7 @@
import tools import tools
from enum import Enum from enum import Enum
from typing import List
from mystring import MyString as MyString
class ReturnCode(Enum): class ReturnCode(Enum):
GOOD = -101 GOOD = -101
@ -10,24 +12,42 @@ class ReturnCode(Enum):
CONTINUE = -96 CONTINUE = -96
class VimModel: class VimModel:
observers: List
displayLinesCount: int
displayColsCount: int
showLineNumbers: bool
lastSearch: tuple[str, int] # tuple (search str, direction)
displayBuffer: List[List[str]]
dump: List[List[str]]
currentLine: int
currentCol: int
scrollY: int
scrollX: int
file_path: MyString # filepath
mode: MyString
inputAfterCursor: bool
keyLog: List[tuple[int, int]] # key log for check combinations (tuples (symbol code, tap unix time))
commandBuffer: List[str] # buffer for command
exchangeBuffer: List[str] # buffer for exchange
def __init__(self, displayLinesCount: int, displayColsCount: int): def __init__(self, displayLinesCount: int, displayColsCount: int):
self.observers = [] self.observers = []
self.displayLinesCount = displayLinesCount self.displayLinesCount = displayLinesCount
self.displayColsCount = displayColsCount self.displayColsCount = displayColsCount
self.showLineNumbers = True self.showLineNumbers = True
self.lastSearch = () self.lastSearch = ()
self.displayBuffer = [] # буфер для хранения всех строк self.displayBuffer = []
self.dump = [] self.dump = []
self.currentLine = 0 # текущий индекс строки self.currentLine = 0
self.currentCol = 0 # текущий индекс колонки self.currentCol = 0
self.scrollY = 0 # вертикальная прокрутка self.scrollY = 0
self.scrollX = 0 # горизонтальная прокрутка self.scrollX = 0
self.file_path = "" # путь к файлу self.file_path = MyString()
self.mode = "" self.mode = MyString()
self.inputAfterCursor = False self.inputAfterCursor = False
self.keyLog = [] # лог нажатий клавиш (кортежи вида (код символа, юникс время нажатия)) self.keyLog = []
self.commandBuffer = [] # буффер для команды self.commandBuffer = []
self.exchangeBuffer = [] # буффер обмена self.exchangeBuffer = []
def attach(self, observer): def attach(self, observer):
self.observers.append(observer) self.observers.append(observer)
@ -57,8 +77,8 @@ class VimModel:
return False return False
def ModeBar(self) -> str: def ModeBar(self) -> str:
modeBar = f"MODE: {self.mode} | FILE: {self.file_path} | LINE: {self.currentLine+1}/{len(self.displayBuffer)}" modeBar = f"MODE: {self.mode.data()} | FILE: {self.file_path.data()} | LINE: {self.currentLine+1}/{len(self.displayBuffer)}"
if self.mode == "COMMAND": if self.mode == MyString("COMMAND"):
modeBar += f" | COMMAND BUFFER: {''.join(self.commandBuffer)}" modeBar += f" | COMMAND BUFFER: {''.join(self.commandBuffer)}"
return modeBar return modeBar
@ -231,12 +251,12 @@ class VimModel:
# Открывает файл filename # Открывает файл filename
if len(cmd) > 2 and cmd[:2] == 'o ': if len(cmd) > 2 and cmd[:2] == 'o ':
filename = cmd[2:] filename = cmd[2:]
self.LoadFile(filename) self.LoadFile(MyString(filename))
return ReturnCode.SET_BASIC_MODE return ReturnCode.SET_BASIC_MODE
# Запись в файл filename # Запись в файл filename
elif len(cmd) > 2 and cmd[:2] == 'w ': elif len(cmd) > 2 and cmd[:2] == 'w ':
filename = cmd[2:] filename = cmd[2:]
self.WriteFile(filename) self.WriteFile(MyString(filename))
# Заменяет символ на указанный # Заменяет символ на указанный
elif len(cmd) == 3 and cmd[:2] == 'r ': elif len(cmd) == 3 and cmd[:2] == 'r ':
self.displayBuffer[self.currentLine][self.currentCol] = cmd[2] self.displayBuffer[self.currentLine][self.currentCol] = cmd[2]
@ -335,13 +355,13 @@ class VimModel:
"""Загрузка файла для редактирования""" """Загрузка файла для редактирования"""
self.Reset() self.Reset()
self.file_path = file_path self.file_path = file_path
self.mode = "NORMAL" self.mode = MyString("NORMAL")
try: try:
with open(file_path, "r") as file: with open(file_path.data(), "r") as file:
self.displayBuffer = [list(line.rstrip('\n')) for line in file.readlines()] self.displayBuffer = [list(line.rstrip('\n')) for line in file.readlines()]
self.Dump() self.Dump()
except FileNotFoundError: except FileNotFoundError:
print(f"File '{file_path}' not found. Starting with empty buffer.") print(f"File '{file_path.data()}' not found. Starting with empty buffer.")
self.displayBuffer = [] self.displayBuffer = []
self.displayBuffer.append([]) self.displayBuffer.append([])
@ -352,11 +372,11 @@ class VimModel:
def WriteFile(self, file_path) -> None: def WriteFile(self, file_path) -> None:
"""Запись в файл по указанному пути""" """Запись в файл по указанному пути"""
try: try:
with open(file_path, "w") as file: with open(file_path.data(), "w") as file:
for line in self.displayBuffer: for line in self.displayBuffer:
file.write(''.join(line) + '\n') file.write(''.join(line) + '\n')
self.Dump() self.Dump()
print(f"In file '{file_path}' written successfully.") print(f"In file '{file_path.data()}' written successfully.")
except Exception as e: except Exception as e:
print(f"Error writing file: {str(e)}") print(f"Error writing file: {str(e)}")
@ -369,8 +389,8 @@ class VimModel:
self.currentCol = 0 # текущий индекс колонки self.currentCol = 0 # текущий индекс колонки
self.scrollY = 0 # вертикальная прокрутка self.scrollY = 0 # вертикальная прокрутка
self.scrollX = 0 # горизонтальная прокрутка self.scrollX = 0 # горизонтальная прокрутка
self.file_path = "" # путь к файлу self.file_path = MyString() # путь к файлу
self.mode = "" self.mode = MyString()
self.inputAfterCursor = False self.inputAfterCursor = False
self.keyLog = [] # лог нажатий клавиш (кортежи вида (код символа, юникс время нажатия)) self.keyLog = [] # лог нажатий клавиш (кортежи вида (код символа, юникс время нажатия))
self.commandBuffer = [] # буффер для команды self.commandBuffer = [] # буффер для команды