void GraphView::addEdgeCommand(bool undirected) { if (edgeSource) { GraphNode* edgeDestination = dynamic_cast<GraphNode*>(selectedItem); if (edgeDestination && edgeSource != edgeDestination) { GraphEdge* existingEdge = NULL; bool drawAsArc(false); QListIterator<GraphEdge*> it(edgeSource->getDestinationEdges()); while (it.hasNext() && !existingEdge) { GraphEdge* edge = it.next(); if (edge->getSourceNode() == edgeDestination) existingEdge = edge; } if (existingEdge) { if (!existingEdge->isUndirected()) { if (weightedGraph && !undirectedGraph && currentAction == ADD_DIRECTED_EDGE) { existingEdge->setDrawAsArc(true); drawAsArc = true; existingEdge = NULL; } else undoStack->push(new ChangeEdgeDirectionCommand(existingEdge, false, true)); } } else { it = QListIterator<GraphEdge*>(edgeSource->getSourceEdges()); while (it.hasNext() && !existingEdge) { GraphEdge* edge = it.next(); if (edge->getDestinationNode() == edgeDestination) { existingEdge = edge; if (currentAction == ADD_UNDIRECTED_EDGE) undoStack->push(new ChangeEdgeDirectionCommand(existingEdge, false, true)); } } } if (existingEdge) { scene()->removeItem(currentEdge); delete currentEdge; } else { currentEdge->setDestinationNode(edgeDestination); currentEdge->setDrawAsArc(drawAsArc); undoStack->push(new AddEdgeCommand(currentEdge, this)); } currentEdge = NULL; edgeSource = NULL; } } else if (selectedItem) { edgeSource = dynamic_cast<GraphNode*>(selectedItem); currentEdge = new GraphEdge(edgeSource, edgeSource->getCenter(), undirected, !undirectedGraph, weightedGraph, false); // Setting the Z value makes sure the selection of nodes are made correct currentEdge->setZValue(-1); scene()->addItem(currentEdge); } updateStatus(); }