from PySide6.QtCore import QObject from bedit_gui.documents import Document from bedit_gui.services.application_logging import get_logger from bedit_gui.views.main_window import MainWindow logger = get_logger(__name__) class UndoController(QObject): def __init__(self, document: Document, window: MainWindow) -> None: super().__init__(window) self.document = document self.window = window undo_action = window.ui.actionUndo redo_action = window.ui.actionRedo undo_stack = document.undo_stack undo_action.triggered.connect(self.undo) redo_action.triggered.connect(self.redo) undo_stack.canUndoChanged.connect(undo_action.setEnabled) undo_stack.canRedoChanged.connect(redo_action.setEnabled) undo_stack.undoTextChanged.connect(self._update_undo_text) undo_stack.redoTextChanged.connect(self._update_redo_text) undo_action.setEnabled(undo_stack.canUndo()) redo_action.setEnabled(undo_stack.canRedo()) def undo(self) -> None: command = self.document.undo_stack.undoText() self.document.undo_stack.undo() logger.info("Undo: %s", command) def redo(self) -> None: command = self.document.undo_stack.redoText() self.document.undo_stack.redo() logger.info("Redo: %s", command) def _update_undo_text(self, command: str) -> None: text = f"Undo {command}" if command else "Undo" self.window.ui.actionUndo.setText(text) def _update_redo_text(self, command: str) -> None: text = f"Redo {command}" if command else "Redo" self.window.ui.actionRedo.setText(text)