summaryrefslogtreecommitdiff
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
parent34b60b77d3f9830ddb6a0107bd65aa3c79701305 (diff)
fixed bounding box bug
-rw-r--r--images/tikzdoc.icobin0 -> 310308 bytes
-rw-r--r--images/tikzit.icobin0 -> 322831 bytes
-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
-rw-r--r--src/main.cpp5
-rw-r--r--src/tikzit.cpp34
-rw-r--r--src/tikzit.h1
-rw-r--r--tikzit.pro3
11 files changed, 90 insertions, 45 deletions
diff --git a/images/tikzdoc.ico b/images/tikzdoc.ico
new file mode 100644
index 0000000..ccb1666
--- /dev/null
+++ b/images/tikzdoc.ico
Binary files differ
diff --git a/images/tikzit.ico b/images/tikzit.ico
new file mode 100644
index 0000000..e49d469
--- /dev/null
+++ b/images/tikzit.ico
Binary files 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<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();
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