From bf6d1382414e8d77dda32691841687f8b464f892 Mon Sep 17 00:00:00 2001 From: Rebecca Breu Date: Tue, 28 Nov 2023 21:37:57 +0100 Subject: [PATCH] Remove empty text items when leaving editing mode --- CHANGELOG.rst | 3 ++- beeref/items.py | 5 ++++- tests/items/test_textitem.py | 20 ++++++++++++++++++-- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index beccd35..774ada6 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -14,6 +14,8 @@ Added large zoom factor are exempt to make sure that icons, pixel sprites etc can be viewed correctly. * A scene can now be exported to a single image (File -> Export Scene...) +* Editing of text items will now be undoable after leaving edit mode +* Empty text items will be deleted after leaving edit mode Changed @@ -21,7 +23,6 @@ Changed * "Save as" will now open pre-select the folder of the currently opened file * "Save" and "Save as" are now inactive when the scene is empty -* Editing of text items will now be undoable after leaving edit mode Fixed diff --git a/beeref/items.py b/beeref/items.py index fe021ae..754583a 100644 --- a/beeref/items.py +++ b/beeref/items.py @@ -556,6 +556,10 @@ class BeeTextItem(BeeItemMixin, QtWidgets.QGraphicsTextItem): self.scene().undo_stack.push( commands.ChangeText(self, self.toPlainText(), self.old_text)) self.scene().edit_item = None + if not self.toPlainText().strip(): + logger.debug(f'Removing empty text item') + self.scene().undo_stack.push( + commands.DeleteItems(self.scene(), [self])) def has_selection_handles(self): return super().has_selection_handles() and not self.edit_mode @@ -564,7 +568,6 @@ class BeeTextItem(BeeItemMixin, QtWidgets.QGraphicsTextItem): if (event.key() in (Qt.Key.Key_Enter, Qt.Key.Key_Return) and event.modifiers() == Qt.KeyboardModifier.NoModifier): self.exit_edit_mode() - self.scene().edit_item = None event.accept() return super().keyPressEvent(event) diff --git a/tests/items/test_textitem.py b/tests/items/test_textitem.py index 28a261e..ca527fc 100644 --- a/tests/items/test_textitem.py +++ b/tests/items/test_textitem.py @@ -215,6 +215,7 @@ def test_enter_edit_mode(view): def test_exit_edit_mode(setcursor_mock, cursor_mock, view): item = BeeTextItem('foo bar') item.edit_mode = True + item.old_text = 'old' view.scene.addItem(item) view.scene.edit_item = item item.exit_edit_mode() @@ -224,6 +225,23 @@ def test_exit_edit_mode(setcursor_mock, cursor_mock, view): assert flags == Qt.TextInteractionFlag.NoTextInteraction cursor_mock.assert_called_once_with(item.document()) setcursor_mock.assert_called_once_with(cursor_mock.return_value) + assert view.scene.edit_item is None + + +def test_exit_edit_mode_when_text_empty(view): + item = BeeTextItem(' \r\n\t') + item.edit_mode = True + item.old_text = 'old' + view.scene.addItem(item) + view.scene.edit_item = item + item.exit_edit_mode() + assert item.edit_mode is False + assert view.scene.edit_item is None + flags = item.textInteractionFlags() + assert flags == Qt.TextInteractionFlag.NoTextInteraction + assert item.scene() is None + assert view.scene.items() == [] + assert view.scene.edit_item is None @patch('PyQt6.QtWidgets.QGraphicsTextItem.keyPressEvent') @@ -283,7 +301,6 @@ def test_key_press_event_return(exit_mock, key_press_mock, view): item.keyPressEvent(event) key_press_mock.assert_not_called() exit_mock.assert_called_once_with() - assert view.scene.edit_item is None @patch('PyQt6.QtWidgets.QGraphicsTextItem.keyPressEvent') @@ -298,7 +315,6 @@ def test_key_press_event_enter(exit_mock, key_press_mock, view): item.keyPressEvent(event) key_press_mock.assert_not_called() exit_mock.assert_called_once_with() - assert view.scene.edit_item is None def test_item_to_clipboard(qapp):