From 8ac7248513189d82fe5bdf90c0d7fc15f2e718ce Mon Sep 17 00:00:00 2001 From: Aleks Kissinger Date: Tue, 17 Apr 2018 11:03:24 +0300 Subject: fixed bounding box bug --- images/tikzdoc.ico | Bin 0 -> 310308 bytes images/tikzit.ico | Bin 0 -> 322831 bytes src/gui/edgeitem.cpp | 5 +++-- src/gui/nodeitem.cpp | 46 +++++++++++++++++++++++++++++++--------------- src/gui/nodeitem.h | 7 ++++--- src/gui/tikzscene.cpp | 30 ++++++++++++++++++++---------- src/gui/undocommands.cpp | 4 ++++ src/main.cpp | 5 +++++ src/tikzit.cpp | 34 ++++++++++++++++++++-------------- src/tikzit.h | 1 + tikzit.pro | 3 ++- 11 files changed, 90 insertions(+), 45 deletions(-) create mode 100644 images/tikzdoc.ico create mode 100644 images/tikzit.ico diff --git a/images/tikzdoc.ico b/images/tikzdoc.ico new file mode 100644 index 0000000..ccb1666 Binary files /dev/null and b/images/tikzdoc.ico differ diff --git a/images/tikzit.ico b/images/tikzit.ico new file mode 100644 index 0000000..e49d469 Binary files /dev/null and b/images/tikzit.ico differ 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 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(); diff --git a/src/main.cpp b/src/main.cpp index b15840d..3532888 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -20,5 +20,10 @@ int main(int argc, char *argv[]) a.setQuitOnLastWindowClosed(false); tikzit = new Tikzit(); tikzit->init(&a); + + if (a.arguments().length() > 1) { + tikzit->open(a.arguments()[1]); + } + return a.exec(); } diff --git a/src/tikzit.cpp b/src/tikzit.cpp index a55473e..dca6d95 100644 --- a/src/tikzit.cpp +++ b/src/tikzit.cpp @@ -91,20 +91,26 @@ void Tikzit::open() settings.value("previous-file-path").toString(), tr("TiKZ Files (*.tikz)")); - if (!fileName.isEmpty()) { - if (_windows.size() == 1 && - _windows[0]->tikzDocument()->isClean() && - _windows[0]->tikzDocument()->shortName().isEmpty()) - { - _windows[0]->open(fileName); - _windows[0]->show(); - } else { - MainWindow *w = new MainWindow(); - w->show(); - w->open(fileName); - _windows << w; - } - } + open(fileName); +} + +void Tikzit::open(QString fileName) +{ + if (!fileName.isEmpty()) { + if (_windows.size() == 1 && + _windows[0]->tikzDocument()->isClean() && + _windows[0]->tikzDocument()->shortName().isEmpty()) + { + _windows[0]->open(fileName); + _windows[0]->show(); + } + else { + MainWindow *w = new MainWindow(); + w->show(); + w->open(fileName); + _windows << w; + } + } } void Tikzit::openTikzStyles() { diff --git a/src/tikzit.h b/src/tikzit.h index 6a191b5..5ae9490 100644 --- a/src/tikzit.h +++ b/src/tikzit.h @@ -91,6 +91,7 @@ public: void newDoc(); void open(); + void open(QString fileName); void quit(); void init(QApplication *app); diff --git a/tikzit.pro b/tikzit.pro index c30d173..f933af7 100644 --- a/tikzit.pro +++ b/tikzit.pro @@ -10,7 +10,8 @@ CONFIG += testcase TARGET = tikzit TEMPLATE = app -win32:RC_ICONS += images/logo.ico +win32:RC_ICONS += images/tikzit.ico +win32:RC_ICONS += images/tikzdoc.ico # The following define makes your compiler emit warnings if you use # any feature of Qt which as been marked as deprecated (the exact warnings -- cgit v1.2.3