diff --git a/mvc/controllers.py b/mvc/controllers.py index 83b161c..021e4e5 100644 --- a/mvc/controllers.py +++ b/mvc/controllers.py @@ -79,7 +79,10 @@ class EditStrategy(BaseStrategy): self.model.Backspace() case _: if not isAscii(symbolCode): return ReturnCode.GOOD - self.model.InsertSymbol(symbolCode) + if not self.model.inputAfterCursor: + self.model.InsertSymbol(symbolCode) + else: + self.model.InsertSymbolAfterCursor(symbolCode) self.model.Scroll() return ReturnCode.GOOD diff --git a/mvc/models.py b/mvc/models.py index 6c8a769..96f2f13 100644 --- a/mvc/models.py +++ b/mvc/models.py @@ -24,10 +24,14 @@ class VimModel: self.scrollX = 0 # горизонтальная прокрутка self.file_path = "" # путь к файлу self.mode = "" + self.inputAfterCursor = False self.keyLog = [] # лог нажатий клавиш (кортежи вида (код символа, юникс время нажатия)) self.commandBuffer = [] # буффер для команды self.exchangeBuffer = [] # буффер обмена + def InputAfterCursor(self) -> None: + self.inputAfterCursor = not self.inputAfterCursor + def UpdateKeyLog(self, symbolCode: int) -> None: if len(self.keyLog) > 5000: self.keyLog.clear() self.keyLog.append((symbolCode, tools.UnixSec())) @@ -73,6 +77,10 @@ class VimModel: if self.currentCol <= len(self.displayBuffer[self.currentLine]): # проверяем, не превышает ли индекс колонки длину строки self.displayBuffer[self.currentLine].insert(self.currentCol, chr(symbolCode)) self.currentCol += 1 + + def InsertSymbolAfterCursor(self, symbolCode: int) -> None: + if self.currentCol <= len(self.displayBuffer[self.currentLine]): # проверяем, не превышает ли индекс колонки длину строки + self.displayBuffer[self.currentLine].insert(self.currentCol, chr(symbolCode)) def ToLineStart(self) -> None: self.currentCol = 0 @@ -179,6 +187,9 @@ class VimModel: self.currentCol = 0 self.displayBuffer[self.currentLine] = [] return ReturnCode.SET_EDIT_MODE + case "o": + self.InputAfterCursor() + return ReturnCode.SET_EDIT_MODE case "h": self.LoadFile("config/usage.txt") return ReturnCode.SET_BASIC_MODE @@ -340,14 +351,17 @@ class VimModel: print(f"Error writing file: {str(e)}") def Reset(self) -> None: - self.displayBuffer = [] - self.dump = [] - self.currentLine = 0 - self.currentCol = 0 - self.scrollY = 0 - self.scrollX = 0 - self.file_path = "" - self.mode = "" + self.showLineNumbers = True self.lastSearch = () - self.commandBuffer = [] - self.exchangeBuffer = [] \ No newline at end of file + self.displayBuffer = [] # буфер для хранения всех строк + self.dump = [] + self.currentLine = 0 # текущий индекс строки + self.currentCol = 0 # текущий индекс колонки + self.scrollY = 0 # вертикальная прокрутка + self.scrollX = 0 # горизонтальная прокрутка + self.file_path = "" # путь к файлу + self.mode = "" + self.inputAfterCursor = False + self.keyLog = [] # лог нажатий клавиш (кортежи вида (код символа, юникс время нажатия)) + self.commandBuffer = [] # буффер для команды + self.exchangeBuffer = [] # буффер обмена \ No newline at end of file diff --git a/mvc/views.py b/mvc/views.py index 4851ed2..d7cc3b9 100644 --- a/mvc/views.py +++ b/mvc/views.py @@ -34,8 +34,9 @@ class CursesAdapter: self.lines = curses.LINES curses.curs_set(1) # Make cursor visible curses.start_color() - curses.init_pair(1, curses.COLOR_MAGENTA, curses.COLOR_BLACK) # Фиолетовый текст на черном фоне - self.colorPair = curses.color_pair(1) + 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""" @@ -52,6 +53,9 @@ class CursesAdapter: """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) @@ -86,7 +90,7 @@ class VimView: if show_line_numbers: line_number = f"{i + scrollY + 1:6} " # 6 символов на номер строки # Выводим номер строки фиолетовым цветом - self.curses_adapter.screen.addstr(i, 0, line_number, self.curses_adapter.colorPair) + self.curses_adapter.SetColorString(i, 0, line_number, self.curses_adapter.colorPairs[0]) # Выводим текст с учетом прокрутки и ширины нумерации visible_text_start = scrollX # Начало видимой части текста @@ -113,6 +117,8 @@ class VimView: """Print edit mode information panel""" if len(modeBarData) > self.curses_adapter.cols - 1: scrollX = len(modeBarData) - self.curses_adapter.cols - self.curses_adapter.SetString(self.curses_adapter.lines - 1, 0, modeBarData[scrollX + 1:]) + self.curses_adapter.SetColorString(self.curses_adapter.lines - 1, 0, + modeBarData[scrollX + 1:], self.curses_adapter.colorPairs[1]) else: - self.curses_adapter.SetString(self.curses_adapter.lines - 1, 0, modeBarData) + self.curses_adapter.SetColorString(self.curses_adapter.lines - 1, 0, + modeBarData, self.curses_adapter.colorPairs[1])