diff options
author | Aleks Kissinger <aleks0@gmail.com> | 2018-04-17 11:03:24 +0300 |
---|---|---|
committer | Aleks Kissinger <aleks0@gmail.com> | 2018-04-17 11:03:24 +0300 |
commit | 8ac7248513189d82fe5bdf90c0d7fc15f2e718ce (patch) | |
tree | a537036afd281726cad73b1622935d3084c68f15 /src/gui | |
parent | 34b60b77d3f9830ddb6a0107bd65aa3c79701305 (diff) |
fixed bounding box bug
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/edgeitem.cpp | 5 | ||||
-rw-r--r-- | src/gui/nodeitem.cpp | 46 | ||||
-rw-r--r-- | src/gui/nodeitem.h | 7 | ||||
-rw-r--r-- | src/gui/tikzscene.cpp | 30 | ||||
-rw-r--r-- | src/gui/undocommands.cpp | 4 |
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(); |