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(); }
void GraphView::executeContextMenu(const QPoint& menuPosition) { QMenu menu; GraphNode* node = dynamic_cast<GraphNode*>(selectedItem); GraphEdge* edge = dynamic_cast<GraphEdge*>(selectedItem); if (node) { QAction *changeLabelAction = menu.addAction("Change label"); QAction *deleteAction = menu.addAction("Delete vertex"); QAction *selectedAction = menu.exec(menuPosition); if (selectedAction == changeLabelAction) changeLabel(node); else if (selectedAction == deleteAction) removeItemCommand(node); } else if (edge){ QAction *changeWeightAction(NULL); if (weightedGraph) changeWeightAction = menu.addAction("Change weight"); QAction *changeDirectionSDAction(NULL); QAction *changeDirectionDSAction(NULL); QAction *changeUndirectedAction(NULL); if (!undirectedGraph) { QMenu *changeDirectionMenu = new QMenu("Change direction"); menu.addMenu(changeDirectionMenu); QString sourceLabel = edge->getSourceNode()->getLabel(); if (sourceLabel.isEmpty()) sourceLabel = "no_label"; QString destinationLabel = edge->getDestinationNode()->getLabel(); if (destinationLabel.isEmpty()) destinationLabel = "no_label"; changeDirectionSDAction = changeDirectionMenu->addAction(sourceLabel + " -> " + destinationLabel); changeDirectionDSAction = changeDirectionMenu->addAction(destinationLabel + " -> " + sourceLabel); changeUndirectedAction = changeDirectionMenu->addAction("Change to undirected"); if (edge->isUndirected()) changeUndirectedAction->setEnabled(false); else changeDirectionSDAction->setEnabled(false); } QAction *deleteAction = menu.addAction("Delete edge"); QAction *selectedAction = menu.exec(menuPosition); if (selectedAction) { if (selectedAction == deleteAction) removeItemCommand(edge); else if (selectedAction == changeWeightAction) changeWeight(edge); else if (selectedAction == changeDirectionSDAction) undoStack->push(new ChangeEdgeDirectionCommand(edge, false, false)); else if (selectedAction == changeDirectionDSAction) undoStack->push(new ChangeEdgeDirectionCommand(edge, true, false)); else if (selectedAction == changeUndirectedAction) undoStack->push(new ChangeEdgeDirectionCommand(edge, false, true)); } } }