diff --git a/NodeGraphQt/base/commands.py b/NodeGraphQt/base/commands.py index 7d924e00..aadb7b95 100644 --- a/NodeGraphQt/base/commands.py +++ b/NodeGraphQt/base/commands.py @@ -61,7 +61,7 @@ def update_prop_bin(self, name, value): prop_wgt = properties_wgt.get_widget(name) # check if previous value is identical to current value, # prevent signals from causing a infinite loop. - if prop_wgt.get_value() != value: + if prop_wgt and prop_wgt.get_value() != value: prop_wgt.set_value(value) def undo(self): @@ -161,6 +161,8 @@ def undo(self): [port.connect_to(p) for p in connected_ports] def redo(self): + self.graph.properties_bin().remove_node(self.node) + for port, connected_ports in self.inputs: [port.disconnect_from(p) for p in connected_ports] for port, connected_ports in self.outputs: diff --git a/NodeGraphQt/base/graph.py b/NodeGraphQt/base/graph.py index f87febbf..eafce3e6 100644 --- a/NodeGraphQt/base/graph.py +++ b/NodeGraphQt/base/graph.py @@ -424,12 +424,13 @@ def create_node(self, node_type, name=None, selected=True, color=None, pos=None) return node raise Exception('\n\n>> Cannot find node:\t"{}"\n'.format(node_type)) - def add_node(self, node): + def add_node(self, node, pos=None): """ Add a node into the node graph. Args: node (NodeGraphQt.Node): node object. + pos (list[float]): node x,y position. (optional) """ assert isinstance(node, NodeObject), 'node must be a Node instance.' @@ -449,7 +450,7 @@ def add_node(self, node): node.model._graph_model = self.model node.model.name = node.NODE_NAME node.update() - self._undo_stack.push(NodeAddedCmd(self, node)) + self._undo_stack.push(NodeAddedCmd(self, node, pos)) def delete_node(self, node): """ @@ -651,27 +652,17 @@ def _deserialize(self, data, relative_pos=False, pos=None): NodeCls = self._node_factory.create_node_instance(identifier) if NodeCls: node = NodeCls() - node._graph = self - - name = self.get_unique_name(n_data.get('name', node.NODE_NAME)) - n_data['name'] = name - + node.NODE_NAME = n_data.get('name', node.NODE_NAME) # set properties. - for prop, val in node.model.properties.items(): + for prop in node.model.properties.keys(): if prop in n_data.keys(): - setattr(node.model, prop, n_data[prop]) - + node.model.set_property(prop, n_data[prop]) # set custom properties. for prop, val in n_data.get('custom', {}).items(): - if prop in node.model.custom_properties.keys(): - node.model.custom_properties[prop] = val - - node.update() + node.model.set_property(prop, val) - self._undo_stack.push( - NodeAddedCmd(self, node, n_data.get('pos')) - ) nodes[n_id] = node + self.add_node(node, n_data.get('pos')) # build the connections. for connection in data.get('connections', []): @@ -693,9 +684,10 @@ def _deserialize(self, data, relative_pos=False, pos=None): node_objs = list(nodes.values()) if relative_pos: self._viewer.move_nodes([n.view for n in node_objs]) - [setattr(n.model, 'pos', n.view.pos) for n in node_objs] + [setattr(n.model, 'pos', n.view.xy_pos) for n in node_objs] elif pos: self._viewer.move_nodes([n.view for n in node_objs], pos=pos) + [setattr(n.model, 'pos', n.view.xy_pos) for n in node_objs] return node_objs @@ -770,14 +762,14 @@ def paste_nodes(self): Pastes nodes copied from the clipboard. """ clipboard = QtWidgets.QApplication.clipboard() - cb_string = clipboard.text() - if not cb_string: + cb_text = clipboard.text() + if not cb_text: return self._undo_stack.beginMacro('pasted nodes') - serial_data = json.loads(cb_string) + serial_data = json.loads(cb_text) self.clear_selection() - nodes = self._deserialize(serial_data, True) + nodes = self._deserialize(serial_data, relative_pos=True) [n.set_selected(True) for n in nodes] self._undo_stack.endMacro() diff --git a/NodeGraphQt/base/node.py b/NodeGraphQt/base/node.py index 9b7fc9ba..7ae4a96b 100644 --- a/NodeGraphQt/base/node.py +++ b/NodeGraphQt/base/node.py @@ -22,7 +22,7 @@ def __get__(self, instance, owner): class NodeObject(object): """ - base skeleton class for all node objects. + base class for all node objects. Args: node (AbstractNodeItem): graphic item used for drawing. diff --git a/NodeGraphQt/widgets/node_abstract.py b/NodeGraphQt/widgets/node_abstract.py index a2f485b9..686cb052 100644 --- a/NodeGraphQt/widgets/node_abstract.py +++ b/NodeGraphQt/widgets/node_abstract.py @@ -6,7 +6,7 @@ class AbstractNodeItem(QtWidgets.QGraphicsItem): """ - The abstract base class of a node. + The abstract base class of a node item. """ def __init__(self, name='node', parent=None): diff --git a/NodeGraphQt/widgets/node_backdrop.py b/NodeGraphQt/widgets/node_backdrop.py index b997981a..cba7999a 100644 --- a/NodeGraphQt/widgets/node_backdrop.py +++ b/NodeGraphQt/widgets/node_backdrop.py @@ -11,7 +11,7 @@ class BackdropSizer(QtWidgets.QGraphicsItem): """ - Sizer item for resizing a backdrop node. + Sizer item for resizing a backdrop item. Args: parent (BackdropNodeItem): the parent node item.