54 lines
1.9 KiB
Python
54 lines
1.9 KiB
Python
from __future__ import annotations
|
|
|
|
from PySide6.QtGui import QUndoCommand
|
|
|
|
from bedit_core.models import Component, EquationImplementation
|
|
|
|
|
|
class ChangeEquationTextCommand(QUndoCommand):
|
|
COMMAND_ID = 1001
|
|
|
|
def __init__(self, document: object, component: Component, section: str, text: list[str], edit_id: int) -> None:
|
|
super().__init__(self._command_text(section))
|
|
implementation = component.implementation
|
|
if not isinstance(implementation, EquationImplementation):
|
|
raise TypeError("equation text can only be changed on an equation component")
|
|
|
|
self.document = document
|
|
self.component = component
|
|
self.section = section
|
|
self.old_text = list(getattr(implementation, section))
|
|
self.new_text = list(text)
|
|
self.edit_id = edit_id
|
|
|
|
def id(self) -> int:
|
|
return self.COMMAND_ID
|
|
|
|
def mergeWith(self, other: QUndoCommand) -> bool:
|
|
if not isinstance(other, ChangeEquationTextCommand):
|
|
return False
|
|
if other.component is not self.component or other.section != self.section or other.edit_id != self.edit_id:
|
|
return False
|
|
self.new_text = list(other.new_text)
|
|
return True
|
|
|
|
def redo(self) -> None:
|
|
self._set_text(self.new_text)
|
|
|
|
def undo(self) -> None:
|
|
self._set_text(self.old_text)
|
|
|
|
def _set_text(self, text: list[str]) -> None:
|
|
implementation = self.component.implementation
|
|
assert isinstance(implementation, EquationImplementation)
|
|
setattr(implementation, self.section, list(text))
|
|
self.document.equation_text_changed.emit(self.component, self.section)
|
|
|
|
@staticmethod
|
|
def _command_text(section: str) -> str:
|
|
return {
|
|
"declarations": "Edit declarations",
|
|
"initial_equations": "Edit initial equations",
|
|
"equations": "Edit equations",
|
|
}[section]
|