summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleks Kissinger <aleks0@gmail.com>2017-12-22 16:19:28 +0000
committerAleks Kissinger <aleks0@gmail.com>2017-12-22 16:19:28 +0000
commitfcc0fc080370c0c8e97a0c07043b83240d973cab (patch)
tree21493478f225955a75c9f7aa207db3a86a9db2cd
parentd8db367f6a4e49776834c82b092700dbda56cecc (diff)
graphs no longer allocate edges and nodes (but they do still own them)
-rw-r--r--tikzit/src/data/graph.cpp15
-rw-r--r--tikzit/src/data/graph.h4
-rw-r--r--tikzit/src/data/tikzparser.parser.cpp32
-rw-r--r--tikzit/src/data/tikzparser.y8
-rw-r--r--tikzit/src/gui/tikzscene.cpp15
5 files changed, 44 insertions, 30 deletions
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;