[commands] only re-create out edges when undoing RemoveNode

"in" edges are automatically recreated since serialized as a connection expression in Node's dict representation and resolved by addNode
This commit is contained in:
Yann Lanthony 2017-10-17 16:32:42 +02:00
parent daebef92f1
commit fd0c209837
2 changed files with 17 additions and 13 deletions

View file

@ -589,20 +589,25 @@ class Graph(BaseObject):
return [edge for edge in self.edges if edge.src == attribute]
def removeNode(self, nodeName):
"""
Remove the node identified by 'nodeName' from the graph
and return in and out edges removed by this operation in two dicts {dstAttr.fullName(), srcAttr.fullName()}
"""
node = self.node(nodeName)
self._nodes.pop(nodeName)
edges = {}
inEdges = {}
outEdges = {}
for attr in node._attributes:
for edge in self.outEdges(attr):
self.edges.remove(edge)
edges[edge.dst.fullName()] = edge.src.fullName()
outEdges[edge.dst.fullName()] = edge.src.fullName()
if attr in self.edges.keys():
edge = self.edges.pop(attr)
edges[edge.dst.fullName()] = edge.src.fullName()
inEdges[edge.dst.fullName()] = edge.src.fullName()
self.updateInternals()
return edges
return inEdges, outEdges
@Slot(str, result=Node)
def addNewNode(self, nodeType, **kwargs):

View file

@ -90,24 +90,23 @@ class AddNodeCommand(GraphCommand):
class RemoveNodeCommand(GraphCommand):
def __init__(self, graph, node, parent=None):
super(RemoveNodeCommand, self).__init__(graph, parent)
self.nodeDesc = node.toDict()
self.nodeDict = node.toDict()
self.nodeName = node.getName()
self.setText("Remove Node {}".format(self.nodeName))
self.edges = {}
self.outEdges = {}
def redoImpl(self):
self.edges = self.graph.removeNode(self.nodeName)
# only keep outEdges since inEdges are serialized in nodeDict
inEdges, self.outEdges = self.graph.removeNode(self.nodeName)
return True
def undoImpl(self):
node = self.graph.addNode(Node(nodeDesc=self.nodeDesc["nodeType"],
parent=self.graph, **self.nodeDesc["attributes"]
node = self.graph.addNode(Node(nodeDesc=self.nodeDict["nodeType"],
parent=self.graph, **self.nodeDict["attributes"]
), self.nodeName)
assert (node.getName() == self.nodeName)
# recreate edges deleted on node removal
# edges having this node as destination could be retrieved from node description
# but we're missing edges starting from this node
for key, value in self.edges.items():
# recreate out edges deleted on node removal
for key, value in self.outEdges.items():
dstNode, dstAttr = key.split(".")
srcNode, srcAttr = value.split(".")
self.graph.addEdge(self.graph.node(srcNode).attribute(srcAttr),