начал переписывать с использованием с++ класса MyString
parent
7242026608
commit
3e9adc3c11
7
main.py
7
main.py
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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 = [] # буффер для команды
|
||||||
|
|
Loading…
Reference in New Issue