From fcc0fc080370c0c8e97a0c07043b83240d973cab Mon Sep 17 00:00:00 2001 From: Aleks Kissinger Date: Fri, 22 Dec 2017 16:19:28 +0000 Subject: graphs no longer allocate edges and nodes (but they do still own them) --- tikzit/src/data/graph.cpp | 15 +++++++++------ tikzit/src/data/graph.h | 4 ++-- tikzit/src/data/tikzparser.parser.cpp | 32 ++++++++++++++++++-------------- tikzit/src/data/tikzparser.y | 8 ++++++-- tikzit/src/gui/tikzscene.cpp | 15 +++++++++------ 5 files changed, 44 insertions(+), 30 deletions(-) (limited to 'tikzit/src') diff --git a/tikzit/src/data/graph.cpp b/tikzit/src/data/graph.cpp index de3eb08..4329928 100644 --- a/tikzit/src/data/graph.cpp +++ b/tikzit/src/data/graph.cpp @@ -20,17 +20,19 @@ void Graph::removeNode(Node *n) { outEdges.remove(n); } -Edge *Graph::addEdge(Node *s, Node *t) +Edge *Graph::addEdge(Edge *e) { - Edge *e = new Edge(s, t, this); + e->setParent(this); _edges << e; - outEdges.insert(s, e); - inEdges.insert(t, e); + outEdges.insert(e->source(), e); + inEdges.insert(e->target(), e); return e; } void Graph::removeEdge(Edge *e) { + // the edge itself is not deleted, as it may still be referenced in an undo command. It will + // be deleted when graph is, via QObject memory management. _edges.removeAll(e); outEdges.remove(e->source(), e); inEdges.remove(e->target(), e); @@ -151,8 +153,9 @@ void Graph::setBbox(const QRectF &bbox) _bbox = bbox; } -Node *Graph::addNode() { - Node *n = new Node(this); +// add a node. The graph claims ownership. +Node *Graph::addNode(Node *n) { + n->setParent(this); _nodes << n; return n; } diff --git a/tikzit/src/data/graph.h b/tikzit/src/data/graph.h index 3f4e8d3..963def8 100644 --- a/tikzit/src/data/graph.h +++ b/tikzit/src/data/graph.h @@ -21,9 +21,9 @@ class Graph : public QObject public: explicit Graph(QObject *parent = 0); ~Graph(); - Node *addNode(); + Node *addNode(Node *n); void removeNode(Node *n); - Edge *addEdge(Node *s, Node*t); + Edge *addEdge(Edge *e); void removeEdge(Edge *e); GraphElementData *data() const; diff --git a/tikzit/src/data/tikzparser.parser.cpp b/tikzit/src/data/tikzparser.parser.cpp index 3dadb45..7d77d0c 100644 --- a/tikzit/src/data/tikzparser.parser.cpp +++ b/tikzit/src/data/tikzparser.parser.cpp @@ -531,8 +531,8 @@ static const yytype_uint8 yyrline[] = { 0, 124, 124, 130, 130, 131, 131, 131, 131, 133, 133, 136, 138, 140, 141, 148, 154, 156, 163, 169, - 169, 171, 172, 190, 190, 191, 198, 199, 201, 202, - 210, 246, 246, 247, 247, 248, 250 + 169, 171, 172, 192, 192, 193, 200, 201, 203, 204, + 212, 250, 250, 251, 251, 252, 254 }; #endif @@ -1600,7 +1600,8 @@ yyreduce: case 22: #line 173 "../tikzit/src/data/tikzparser.y" { - Node *node = assembler->graph()->addNode(); + Node *node = new Node(); + if ((yyvsp[(2) - (7)].data)) { node->setData((yyvsp[(2) - (7)].data)); } @@ -1613,22 +1614,23 @@ yyreduce: node->setPoint(*(yyvsp[(5) - (7)].pt)); delete (yyvsp[(5) - (7)].pt); + assembler->graph()->addNode(node); assembler->addNodeToMap(node); ;} break; case 23: -#line 190 "../tikzit/src/data/tikzparser.y" +#line 192 "../tikzit/src/data/tikzparser.y" { (yyval.str) = 0; ;} break; case 24: -#line 190 "../tikzit/src/data/tikzparser.y" +#line 192 "../tikzit/src/data/tikzparser.y" { (yyval.str) = (yyvsp[(2) - (2)].str); ;} break; case 25: -#line 192 "../tikzit/src/data/tikzparser.y" +#line 194 "../tikzit/src/data/tikzparser.y" { (yyval.noderef).node = assembler->nodeWithName(QString((yyvsp[(2) - (4)].str))); free((yyvsp[(2) - (4)].str)); @@ -1637,22 +1639,22 @@ yyreduce: break; case 26: -#line 198 "../tikzit/src/data/tikzparser.y" +#line 200 "../tikzit/src/data/tikzparser.y" { (yyval.noderef) = (yyvsp[(1) - (1)].noderef); ;} break; case 27: -#line 199 "../tikzit/src/data/tikzparser.y" +#line 201 "../tikzit/src/data/tikzparser.y" { (yyval.noderef).node = 0; (yyval.noderef).anchor = 0; ;} break; case 28: -#line 201 "../tikzit/src/data/tikzparser.y" +#line 203 "../tikzit/src/data/tikzparser.y" { (yyval.node) = 0; ;} break; case 29: -#line 203 "../tikzit/src/data/tikzparser.y" +#line 205 "../tikzit/src/data/tikzparser.y" { (yyval.node) = new Node(); if ((yyvsp[(2) - (3)].data)) @@ -1663,7 +1665,7 @@ yyreduce: break; case 30: -#line 211 "../tikzit/src/data/tikzparser.y" +#line 213 "../tikzit/src/data/tikzparser.y" { Node *s; Node *t; @@ -1676,7 +1678,7 @@ yyreduce: t = s; } - Edge *edge = assembler->graph()->addEdge(s, t); + Edge *edge = new Edge(s, t); if ((yyvsp[(2) - (7)].data)) { edge->setData((yyvsp[(2) - (7)].data)); edge->setAttributesFromData(); @@ -1697,11 +1699,13 @@ yyreduce: } else { edge->setTargetAnchor(edge->sourceAnchor()); } + + assembler->graph()->addEdge(edge); ;} break; case 36: -#line 251 "../tikzit/src/data/tikzparser.y" +#line 255 "../tikzit/src/data/tikzparser.y" { assembler->graph()->setBbox(QRectF(*(yyvsp[(3) - (6)].pt), *(yyvsp[(5) - (6)].pt))); delete (yyvsp[(3) - (6)].pt); @@ -1711,7 +1715,7 @@ yyreduce: /* Line 1267 of yacc.c. */ -#line 1715 "../tikzit/src/data/tikzparser.parser.cpp" +#line 1719 "../tikzit/src/data/tikzparser.parser.cpp" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); diff --git a/tikzit/src/data/tikzparser.y b/tikzit/src/data/tikzparser.y index eaf09eb..420b8a0 100644 --- a/tikzit/src/data/tikzparser.y +++ b/tikzit/src/data/tikzparser.y @@ -171,7 +171,8 @@ val: PROPSTRING { $$ = $1; } | DELIMITEDSTRING { $$ = $1; }; nodename: "(" REFSTRING ")" { $$ = $2; }; node: "\\node" optproperties nodename "at" COORD DELIMITEDSTRING ";" { - Node *node = assembler->graph()->addNode(); + Node *node = new Node(); + if ($2) { node->setData($2); } @@ -184,6 +185,7 @@ node: "\\node" optproperties nodename "at" COORD DELIMITEDSTRING ";" node->setPoint(*$5); delete $5; + assembler->graph()->addNode(node); assembler->addNodeToMap(node); }; @@ -220,7 +222,7 @@ edge: "\\draw" optproperties noderef "to" optedgenode optnoderef ";" t = s; } - Edge *edge = assembler->graph()->addEdge(s, t); + Edge *edge = new Edge(s, t); if ($2) { edge->setData($2); edge->setAttributesFromData(); @@ -241,6 +243,8 @@ edge: "\\draw" optproperties noderef "to" optedgenode optnoderef ";" } else { edge->setTargetAnchor(edge->sourceAnchor()); } + + assembler->graph()->addEdge(edge); }; ignoreprop: val | val "=" val; diff --git a/tikzit/src/gui/tikzscene.cpp b/tikzit/src/gui/tikzscene.cpp index 619d916..a900192 100644 --- a/tikzit/src/gui/tikzscene.cpp +++ b/tikzit/src/gui/tikzscene.cpp @@ -52,8 +52,11 @@ void TikzScene::graphReplaced() void TikzScene::mousePressEvent(QGraphicsSceneMouseEvent *event) { // current mouse position, in scene coordinates - QPointF mousePos(event->buttonDownScenePos(Qt::LeftButton).x(), - event->buttonDownScenePos(Qt::LeftButton).y()); + QPointF mousePos = event->scenePos(); + + // disable rubber band drag, which will clear the selection. Only re-enable it + // for the SELECT tool, and when no control point has been clicked. + views()[0]->setDragMode(QGraphicsView::NoDrag); // radius of a control point for bezier edges, in scene coordinates qreal cpR = GLOBAL_SCALEF * (0.05); @@ -87,9 +90,6 @@ void TikzScene::mousePressEvent(QGraphicsSceneMouseEvent *event) } if (_modifyEdgeItem != 0) { - // disable rubber band drag, which will clear the selection - views()[0]->setDragMode(QGraphicsView::NoDrag); - // store for undo purposes Edge *e = _modifyEdgeItem->edge(); _oldBend = e->bend(); @@ -123,7 +123,6 @@ void TikzScene::mousePressEvent(QGraphicsSceneMouseEvent *event) void TikzScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { // current mouse position, in scene coordinates - QPointF mousePos = event->scenePos(); switch (tikzit->toolPalette()->currentTool()) { @@ -225,6 +224,9 @@ void TikzScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event) void TikzScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { + // current mouse position, in scene coordinates + QPointF mousePos = event->scenePos(); + switch (tikzit->toolPalette()->currentTool()) { case ToolPalette::SELECT: if (_modifyEdgeItem != 0) { @@ -265,6 +267,7 @@ void TikzScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) break; case ToolPalette::VERTEX: + // TODO break; case ToolPalette::EDGE: break; -- cgit v1.2.3