summaryrefslogtreecommitdiff
path: root/src/gui
diff options
context:
space:
mode:
authorAleks Kissinger <aleks0@gmail.com>2018-04-17 11:03:24 +0300
committerAleks Kissinger <aleks0@gmail.com>2018-04-17 11:03:24 +0300
commit8ac7248513189d82fe5bdf90c0d7fc15f2e718ce (patch)
treea537036afd281726cad73b1622935d3084c68f15 /src/gui
parent34b60b77d3f9830ddb6a0107bd65aa3c79701305 (diff)
fixed bounding box bug
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/edgeitem.cpp5
-rw-r--r--src/gui/nodeitem.cpp46
-rw-r--r--src/gui/nodeitem.h7
-rw-r--r--src/gui/tikzscene.cpp30
-rw-r--r--src/gui/undocommands.cpp4
5 files changed, 62 insertions, 30 deletions
diff --git a/src/gui/edgeitem.cpp b/src/gui/edgeitem.cpp
index 08a5ad1..88a4e85 100644
--- a/src/gui/edgeitem.cpp
+++ b/src/gui/edgeitem.cpp
@@ -136,7 +136,9 @@ QPainterPath EdgeItem::path() const
void EdgeItem::setPath(const QPainterPath &path)
{
- _path = path;
+ prepareGeometryChange();
+
+ _path = path;
// get the shape of the edge, and expand a bit to make selection easier
QPainterPathStroker stroker;
@@ -147,6 +149,5 @@ void EdgeItem::setPath(const QPainterPath &path)
float r = GLOBAL_SCALEF * (_edge->cpDist() + 0.2);
_boundingRect = _path.boundingRect().adjusted(-r,-r,r,r);
- prepareGeometryChange();
update();
}
diff --git a/src/gui/nodeitem.cpp b/src/gui/nodeitem.cpp
index 06b46ff..b0b7ea6 100644
--- a/src/gui/nodeitem.cpp
+++ b/src/gui/nodeitem.cpp
@@ -18,6 +18,7 @@ NodeItem::NodeItem(Node *node)
//setFlag(QGraphicsItem::ItemIsMovable);
//setFlag(QGraphicsItem::ItemSendsGeometryChanges);
readPos();
+ updateBounds();
}
void NodeItem::readPos()
@@ -98,27 +99,42 @@ QPainterPath NodeItem::shape() const
return path;
}
+// TODO: nodeitem should sync boundingRect()-relevant stuff (label etc) explicitly,
+// to allow prepareGeometryChange()
QRectF NodeItem::boundingRect() const
{
- QRectF r = labelRect();
- return r.united(shape().boundingRect()).adjusted(-4,-4,4,4);
+ return _boundingRect;
}
-Node *NodeItem::node() const
+void NodeItem::updateBounds()
{
- return _node;
+ prepareGeometryChange();
+ QString label = _node->label();
+ if (label != "") {
+ QFontMetrics fm(Tikzit::LABEL_FONT);
+ QRectF labelRect = fm.boundingRect(label);
+ labelRect.moveCenter(QPointF(0, 0));
+ _boundingRect = labelRect.united(shape().boundingRect()).adjusted(-4, -4, 4, 4);
+ } else {
+ _boundingRect = shape().boundingRect().adjusted(-4, -4, 4, 4);
+ }
}
-QVariant NodeItem::itemChange(GraphicsItemChange change, const QVariant &value)
+Node *NodeItem::node() const
{
- if (change == ItemPositionChange) {
- QPointF newPos = value.toPointF();
- int gridSize = GLOBAL_SCALE / 8;
- QPointF gridPos(round(newPos.x()/gridSize)*gridSize, round(newPos.y()/gridSize)*gridSize);
- _node->setPoint(fromScreen(gridPos));
-
- return gridPos;
- } else {
- return QGraphicsItem::itemChange(change, value);
- }
+ return _node;
}
+
+//QVariant NodeItem::itemChange(GraphicsItemChange change, const QVariant &value)
+//{
+// if (change == ItemPositionChange) {
+// QPointF newPos = value.toPointF();
+// int gridSize = GLOBAL_SCALE / 8;
+// QPointF gridPos(round(newPos.x()/gridSize)*gridSize, round(newPos.y()/gridSize)*gridSize);
+// _node->setPoint(fromScreen(gridPos));
+//
+// return gridPos;
+// } else {
+// return QGraphicsItem::itemChange(change, value);
+// }
+//}
diff --git a/src/gui/nodeitem.h b/src/gui/nodeitem.h
index eb3fbb3..91b3f63 100644
--- a/src/gui/nodeitem.h
+++ b/src/gui/nodeitem.h
@@ -19,14 +19,15 @@ public:
void readPos();
void writePos();
void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *);
- QVariant itemChange(GraphicsItemChange change, const QVariant &value);
- QPainterPath shape() const;
- QRectF boundingRect() const;
+ QPainterPath shape() const override;
+ QRectF boundingRect() const override;
+ void updateBounds();
Node *node() const;
private:
Node *_node;
QRectF labelRect() const;
+ QRectF _boundingRect;
};
#endif // NODEITEM_H
diff --git a/src/gui/tikzscene.cpp b/src/gui/tikzscene.cpp
index 345d02c..40d56e7 100644
--- a/src/gui/tikzscene.cpp
+++ b/src/gui/tikzscene.cpp
@@ -57,15 +57,16 @@ Graph *TikzScene::graph()
void TikzScene::graphReplaced()
{
- foreach (NodeItem *ni, _nodeItems) {
+
+ foreach (NodeItem *ni, _nodeItems) {
removeItem(ni);
- delete ni;
+ //delete ni;
}
_nodeItems.clear();
foreach (EdgeItem *ei, _edgeItems) {
removeItem(ei);
- delete ei;
+ //delete ei;
}
_edgeItems.clear();
@@ -287,8 +288,12 @@ void TikzScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
foreach (Node *n, _oldNodePositions.keys()) {
NodeItem *ni = _nodeItems[n];
- ni->setPos(toScreen(_oldNodePositions[n]) + shift);
- ni->writePos();
+
+ // in (rare) cases, the graph can change while we are dragging
+ if (ni != 0) {
+ ni->setPos(toScreen(_oldNodePositions[n]) + shift);
+ ni->writePos();
+ }
}
refreshAdjacentEdges(_oldNodePositions.keys());
@@ -711,11 +716,16 @@ void TikzScene::reloadStyles()
void TikzScene::refreshAdjacentEdges(QList<Node*> nodes)
{
if (nodes.empty()) return;
- foreach (EdgeItem *ei, _edgeItems) {
- if (nodes.contains(ei->edge()->source()) || nodes.contains(ei->edge()->target())) {
- ei->edge()->updateControls();
- ei->readPos();
- }
+ foreach (Edge *e, _edgeItems.keys()) {
+ EdgeItem *ei = _edgeItems[e];
+
+ // the list "nodes" can be out of date, e.g. if the graph changes while dragging
+ if (ei != 0) {
+ if (nodes.contains(ei->edge()->source()) || nodes.contains(ei->edge()->target())) {
+ ei->edge()->updateControls();
+ ei->readPos();
+ }
+ }
}
}
diff --git a/src/gui/undocommands.cpp b/src/gui/undocommands.cpp
index daa2fee..baa8c0e 100644
--- a/src/gui/undocommands.cpp
+++ b/src/gui/undocommands.cpp
@@ -341,6 +341,8 @@ void ChangeLabelCommand::undo()
{
foreach (Node *n, _oldLabels.keys()) {
n->setLabel(_oldLabels[n]);
+ NodeItem *ni = _scene->nodeItems()[n];
+ if (ni != 0) ni->updateBounds();
}
GraphUpdateCommand::undo();
@@ -350,6 +352,8 @@ void ChangeLabelCommand::redo()
{
foreach (Node *n, _oldLabels.keys()) {
n->setLabel(_newLabel);
+ NodeItem *ni = _scene->nodeItems()[n];
+ if (ni != 0) ni->updateBounds();
}
GraphUpdateCommand::redo();