From 555de037490fe704bd15a3f4c037b9cfeba59aa8 Mon Sep 17 00:00:00 2001 From: Arjan Molenaar Date: Thu, 11 Feb 2021 21:46:40 +0100 Subject: [PATCH] Fix undo of attributes and enumerations By setting the default value on unlink. Fixes #643. --- gaphor/core/modeling/properties.py | 7 ++----- tests/test_undo.py | 11 ++++++++--- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/gaphor/core/modeling/properties.py b/gaphor/core/modeling/properties.py index 806c5fc41..a897e9dca 100644 --- a/gaphor/core/modeling/properties.py +++ b/gaphor/core/modeling/properties.py @@ -204,9 +204,7 @@ class attribute(umlproperty, Generic[T]): raise TypeError(error_msg) def unlink(self, obj): - old = self._get(obj) - log.debug("Unlink attribute %s.%s", obj, self.name) - self.handle(AttributeUpdated(obj, self, old, old)) + self._set(obj, self.default) def __str__(self): return f"" @@ -282,8 +280,7 @@ class enumeration(umlproperty): setattr(obj, self._name, value) def unlink(self, obj): - old = self._get(obj) - self.handle(AttributeUpdated(obj, self, old, old)) + self._set(obj, self.default) def _set(self, obj, value): if value not in self.values: diff --git a/tests/test_undo.py b/tests/test_undo.py index 1e1fa3a7a..3b1437cb4 100644 --- a/tests/test_undo.py +++ b/tests/test_undo.py @@ -92,19 +92,24 @@ def test_class_association_undo_redo(event_manager, element_factory, undo_manage undo_manager.redo_transaction() -def test_diagram_item_can_undo_(event_manager, element_factory, undo_manager, caplog): +def test_diagram_item_can_undo_and_redo( + event_manager, element_factory, undo_manager, caplog +): caplog.set_level(logging.INFO) with Transaction(event_manager): diagram = element_factory.create(Diagram) with Transaction(event_manager): cls = diagram.create(ClassItem, subject=element_factory.create(UML.Class)) + cls.subject.name = "name" cls.matrix.translate(10, 10) undo_manager.undo_transaction() undo_manager.redo_transaction() - - assert diagram.ownedPresentation[0].matrix.tuple() == (1, 0, 0, 1, 10, 10) + new_cls = diagram.ownedPresentation[0] + assert new_cls.matrix.tuple() == (1, 0, 0, 1, 10, 10) + assert new_cls.subject, element_factory.select() + assert new_cls.subject.name == "name" assert not caplog.records