Skip to content

Commit b636594

Browse files
committed
Fix bug with undo redo and empty selections.
1 parent e90b86b commit b636594

2 files changed

Lines changed: 21 additions & 17 deletions

File tree

src/mapclient/view/workflow/workflowcommands.py

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -60,23 +60,27 @@ class CommandSelection(QtGui.QUndoCommand):
6060
don't end up in a recursive loop.
6161
"""
6262

63-
def __init__(self, scene, selection, previous):
63+
def __init__(self, scene, current, previous):
6464
super(CommandSelection, self).__init__()
65-
logger.debug("Selection Command created ...")
6665
self._scene = scene
67-
self._selection = selection
68-
self._previousSelection = previous
66+
self._current = list(current)
67+
self._previous = list(previous)
6968

7069
def redo(self):
71-
self._scene.blockSignals(True)
72-
for item in list(self._scene.items()):
73-
item.setSelected(item in self._selection)
74-
self._scene.blockSignals(False)
70+
self._apply_selection(self._current)
7571

7672
def undo(self):
73+
self._apply_selection(self._previous)
74+
75+
def _apply_selection(self, items_to_select):
7776
self._scene.blockSignals(True)
78-
for item in list(self._scene.items()):
79-
item.setSelected(item in self._previousSelection)
77+
78+
self._scene.clearSelection()
79+
for item in items_to_select:
80+
# Check if item still belongs to scene (handle deleted items)
81+
if item.scene() == self._scene:
82+
item.setSelected(True)
83+
8084
self._scene.blockSignals(False)
8185

8286

src/mapclient/view/workflow/workflowgraphicsview.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -129,11 +129,10 @@ def connectNodes(self, src_port, dest_port):
129129
self._errorIconTimer.start()
130130

131131
def selectionChanged(self):
132-
currentSelection = self.scene().selectedItems()
133-
previousSelection = self.scene().previouslySelectedItems()
134-
command = CommandSelection(self.scene(), currentSelection, previousSelection)
135-
self._undoStack.push(command)
136-
self.scene().setPreviouslySelectedItems(currentSelection)
132+
current_selection = self.scene().selectedItems()
133+
previous_selection = self.scene().previouslySelectedItems()
134+
self._undoStack.push(CommandSelection(self.scene(), current_selection, previous_selection))
135+
self.scene().setPreviouslySelectedItems(current_selection)
137136

138137
def nodeSelected(self, node, state):
139138
if state and node not in self._selectedNodes:
@@ -370,9 +369,10 @@ def mouseReleaseEvent(self, event):
370369
QtWidgets.QGraphicsView.mouseReleaseEvent(self, event)
371370
if self._selectionStartPos:
372371
diff = event.pos() - self._selectionStartPos
373-
if diff.x() != 0 and diff.y() != 0:
372+
selected_items = self.scene().selectedItems()
373+
if diff.x() != 0 and diff.y() != 0 and selected_items:
374374
self._undoStack.beginMacro('Move Step(s)')
375-
for item in self.scene().selectedItems():
375+
for item in selected_items:
376376
if item.type() == Node.Type:
377377
self._undoStack.push(CommandMove(item, item.pos() - diff, item.pos()))
378378
self._undoStack.endMacro()

0 commit comments

Comments
 (0)