Fix signal handling during graph rebuild
- Add _rebuilding flag to ignore signals during rebuild - Prevents cascade of port_disconnected signals when clearing graph - Fixes KeyError in NodeGraphQt undo stack - Fixes false dependency warnings on view switch The port_disconnected and nodes_deleted signals were firing during clear_session(), causing recursive rebuilds and errors. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
d1f0c2f893
commit
683a8a6d8f
|
|
@ -135,6 +135,7 @@ class FlowGraphWidget(QWidget):
|
|||
self._input_node = None
|
||||
self._output_node = None
|
||||
self._step_nodes: List[CmdForgeBaseNode] = []
|
||||
self._rebuilding = False # Flag to ignore signals during rebuild
|
||||
|
||||
self._setup_ui()
|
||||
|
||||
|
|
@ -215,13 +216,21 @@ class FlowGraphWidget(QWidget):
|
|||
if not self._graph:
|
||||
return
|
||||
|
||||
# Clear existing nodes
|
||||
self._graph.clear_session()
|
||||
# Set flag to ignore signals during rebuild
|
||||
self._rebuilding = True
|
||||
|
||||
try:
|
||||
# Clear existing nodes
|
||||
self._graph.clear_session()
|
||||
except Exception:
|
||||
pass # Ignore errors during clear
|
||||
|
||||
self._input_node = None
|
||||
self._output_node = None
|
||||
self._step_nodes = []
|
||||
|
||||
if not self._tool:
|
||||
self._rebuilding = False
|
||||
return
|
||||
|
||||
# Create input node
|
||||
|
|
@ -294,6 +303,7 @@ class FlowGraphWidget(QWidget):
|
|||
node.set_selected(True)
|
||||
|
||||
# Use a timer to fit after the widget is fully rendered
|
||||
# Also clears the rebuilding flag after everything settles
|
||||
QTimer.singleShot(50, self._fit_and_clear_selection)
|
||||
|
||||
def _fit_and_clear_selection(self):
|
||||
|
|
@ -303,6 +313,9 @@ class FlowGraphWidget(QWidget):
|
|||
# Clear selection
|
||||
self._graph.clear_selection()
|
||||
|
||||
# Clear rebuilding flag - now safe to handle user interactions
|
||||
self._rebuilding = False
|
||||
|
||||
def select_all_nodes(self):
|
||||
"""Select all nodes in the graph."""
|
||||
if not self._graph:
|
||||
|
|
@ -419,6 +432,10 @@ class FlowGraphWidget(QWidget):
|
|||
|
||||
def _on_nodes_deleted(self, nodes):
|
||||
"""Handle node deletion from the graph."""
|
||||
# Ignore during rebuild
|
||||
if self._rebuilding:
|
||||
return
|
||||
|
||||
# Collect step indices of deleted step nodes (not Input/Output nodes)
|
||||
deleted_indices = []
|
||||
for node in nodes:
|
||||
|
|
@ -439,6 +456,10 @@ class FlowGraphWidget(QWidget):
|
|||
2. The chain reconnects (previous node → next node)
|
||||
3. Disconnected node attaches at the end before Output
|
||||
"""
|
||||
# Ignore during rebuild
|
||||
if self._rebuilding:
|
||||
return
|
||||
|
||||
if not self._tool or not self._tool.steps:
|
||||
return
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue