@@ -142,6 +142,7 @@ def __init__(self, parent=None):
142142 self ._node_factory = NodeFactory ()
143143 self ._undo_stack = QtWidgets .QUndoStack (self )
144144 self ._current_node_space = None
145+ self ._editable = True
145146
146147 tab = QtWidgets .QShortcut (QtGui .QKeySequence (QtCore .Qt .Key_Tab ), self ._viewer )
147148 tab .activated .connect (self ._toggle_tab_search )
@@ -176,6 +177,8 @@ def _insert_node(self, pipe, node_id, prev_node_pos):
176177 node_id (str): selected node id to insert.
177178 prev_node_pos (dict): previous node position. {NodeItem: [prev_x, prev_y]}
178179 """
180+ if not self ._editable :
181+ return
179182 node = self .get_node_by_id (node_id )
180183
181184 # exclude the BackdropNode
@@ -203,6 +206,8 @@ def _toggle_tab_search(self):
203206 """
204207 toggle the tab search widget.
205208 """
209+ if not self ._editable :
210+ return
206211 if self ._viewer .underMouse ():
207212 self ._viewer .tab_search_set_nodes (self ._node_factory .names )
208213 self ._viewer .tab_search_toggle ()
@@ -217,6 +222,8 @@ def _on_property_bin_changed(self, node_id, prop_name, prop_value):
217222 prop_name (str): node property name.
218223 prop_value (object): python object.
219224 """
225+ if not self ._editable :
226+ return
220227 node = self .get_node_by_id (node_id )
221228
222229 # prevent signals from causing a infinite loop.
@@ -307,6 +314,8 @@ def _on_connection_changed(self, disconnected, connected):
307314 connected (list[list[widgets.port.PortItem]]):
308315 pair list of port view items.
309316 """
317+ if not self ._editable :
318+ return
310319 if not (disconnected or connected ):
311320 return
312321
@@ -336,7 +345,7 @@ def _on_connection_sliced(self, ports):
336345 ports (list[list[widgets.port.PortItem]]):
337346 pair list of port connections (in port, out port)
338347 """
339- if not ports :
348+ if not ports or not self . _editable :
340349 return
341350 ptypes = {IN_PORT : 'inputs' , OUT_PORT : 'outputs' }
342351 self ._undo_stack .beginMacro ('slice connections' )
@@ -747,6 +756,8 @@ def create_node(self, node_type, name=None, selected=True, color=None,
747756 Returns:
748757 NodeGraphQt.BaseNode: the created instance of the node.
749758 """
759+ if not self ._editable :
760+ return
750761 NodeCls = self ._node_factory .create_node_instance (node_type )
751762 if NodeCls :
752763 node = NodeCls ()
@@ -813,6 +824,8 @@ def add_node(self, node, pos=None, unique_name=True):
813824 pos (list[float]): node x,y position. (optional)
814825 unique_name (bool): make node name unique
815826 """
827+ if not self ._editable :
828+ return
816829 assert isinstance (node , NodeObject ), 'node must be a Node instance.'
817830
818831 wid_types = node .model .__dict__ .pop ('_TEMP_property_widget_types' )
@@ -850,6 +863,10 @@ def set_node_space(self, node):
850863 if node is not None :
851864 node .enter ()
852865 self ._node_space_bar .set_node (node )
866+ self ._editable = node .is_editable ()
867+ else :
868+ self ._editable = True
869+ self ._viewer .scene ().set_editable (self ._editable )
853870
854871 def get_node_space (self ):
855872 """
@@ -867,6 +884,8 @@ def delete_node(self, node):
867884 Args:
868885 node (NodeGraphQt.BaseNode): node object.
869886 """
887+ if not self ._editable :
888+ return
870889 assert isinstance (node , NodeObject ), \
871890 'node must be a instance of a NodeObject.'
872891 if node is self .root_node ():
@@ -887,6 +906,8 @@ def delete_nodes(self, nodes):
887906 Args:
888907 nodes (list[NodeGraphQt.BaseNode]): list of node instances.
889908 """
909+ if not self ._editable :
910+ return
890911 root_node = self .root_node ()
891912 self .nodes_deleted .emit ([n .id for n in nodes ])
892913 self ._undo_stack .beginMacro ('delete nodes' )
@@ -1082,9 +1103,7 @@ def _serialize(self, nodes):
10821103 node_dict = n .model .to_dict
10831104
10841105 if isinstance (n , SubGraph ):
1085- published = n .has_property ('published' )
1086- if published :
1087- published = n .get_property ('published' )
1106+ published = n .get_property ('published' )
10881107 if not published :
10891108 children = n .children ()
10901109 if children :
@@ -1132,6 +1151,8 @@ def _deserialize(self, data, relative_pos=False, pos=None, set_parent=True):
11321151 Returns:
11331152 list[NodeGraphQt.Nodes]: list of node instances.
11341153 """
1154+ if not self ._editable :
1155+ return
11351156 nodes = {}
11361157 # build the nodes.
11371158 for n_id , n_data in data .get ('nodes' , {}).items ():
@@ -1325,6 +1346,8 @@ def paste_nodes(self):
13251346 """
13261347 Pastes nodes copied from the clipboard.
13271348 """
1349+ if not self ._editable :
1350+ return
13281351 clipboard = QtWidgets .QApplication .clipboard ()
13291352 cb_text = clipboard .text ()
13301353 if not cb_text :
@@ -1346,7 +1369,7 @@ def duplicate_nodes(self, nodes):
13461369 Returns:
13471370 list[NodeGraphQt.BaseNode]: list of duplicated node instances.
13481371 """
1349- if not nodes :
1372+ if not nodes or not self . _editable :
13501373 return
13511374
13521375 self ._undo_stack .beginMacro ('duplicate nodes' )
@@ -1374,7 +1397,7 @@ def disable_nodes(self, nodes, mode=None):
13741397 nodes (list[NodeGraphQt.BaseNode]): list of node instances.
13751398 mode (bool): (optional) disable state of the nodes.
13761399 """
1377- if not nodes :
1400+ if not nodes or not self . _editable :
13781401 return
13791402 if mode is None :
13801403 mode = not nodes [0 ].disabled ()
0 commit comments