summaryrefslogtreecommitdiff
path: root/tikzit/src/gui/nodeitem.cpp
diff options
context:
space:
mode:
authorAleks Kissinger <aleks0@gmail.com>2017-02-28 14:46:39 +0100
committerAleks Kissinger <aleks0@gmail.com>2017-02-28 14:46:39 +0100
commitcb322a3acee9debf40c48ad1e3fb4458b0f51b7f (patch)
tree2cd3dc1060885152f0c706e0cf52bff0d8181d1e /tikzit/src/gui/nodeitem.cpp
parente1756ba69dd626073e22fd0a4f4c5fda42c88829 (diff)
generic nodes
Diffstat (limited to 'tikzit/src/gui/nodeitem.cpp')
-rw-r--r--tikzit/src/gui/nodeitem.cpp82
1 files changed, 79 insertions, 3 deletions
diff --git a/tikzit/src/gui/nodeitem.cpp b/tikzit/src/gui/nodeitem.cpp
index e817d98..d91bfd6 100644
--- a/tikzit/src/gui/nodeitem.cpp
+++ b/tikzit/src/gui/nodeitem.cpp
@@ -1,17 +1,93 @@
+#include "tikzit.h"
#include "nodeitem.h"
#include <QPen>
#include <QBrush>
+#include <QDebug>
+#include <QFont>
+#include <QFontMetrics>
+#include <QPainterPathStroker>
NodeItem::NodeItem(Node *node)
{
_node = node;
- setPen(QPen(Qt::black));
- setBrush(QBrush(Qt::white));
+ setFlag(QGraphicsItem::ItemIsSelectable);
+ setFlag(QGraphicsItem::ItemIsMovable);
syncPos();
}
void NodeItem::syncPos()
{
- setRect(80*_node->point().x() - 8, -80*_node->point().y() - 8, 16, 16);
+ setPos(toScreen(_node->point()));
+}
+
+
+void NodeItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
+{
+ if (_node->style().isNone()) {
+ QColor c(180,180,200);
+ painter->setPen(QPen(c));
+ painter->setBrush(QBrush(c));
+ painter->drawEllipse(QPointF(0,0), 1,1);
+
+ QPen pen(QColor(180,180,220));
+ QVector<qreal> p;
+ p << 2.0 << 2.0;
+ pen.setDashPattern(p);
+ painter->setPen(pen);
+ painter->setBrush(Qt::NoBrush);
+ painter->drawPath(shape());
+ } else {
+ QPen pen(_node->style().strokeColor);
+ pen.setWidth(_node->style().strokeThickness);
+ painter->setPen(pen);
+ painter->setBrush(QBrush(_node->style().fillColor));
+ painter->drawPath(shape());
+ }
+
+ if (_node->label() != "") {
+ QString label = _node->label();
+ QFont f("Monaco", 9);
+ QFontMetrics fm(f);
+ int w = fm.width(label) + 4;
+ int h = fm.height() + 2;
+
+ QRectF rect = fm.boundingRect(label);
+ rect.adjust(-2,-2,2,2);
+ rect.moveCenter(QPointF(0,0));
+ QPen pen(QColor(200,0,0,120));
+ QVector<qreal> d;
+ d << 2.0 << 2.0;
+ pen.setDashPattern(d);
+ painter->setPen(pen);
+ painter->setBrush(QBrush(QColor(255,255,100,120)));
+ painter->drawRect(rect);
+
+ painter->setPen(QPen(Qt::black));
+ painter->setFont(f);
+ painter->drawText(rect, Qt::AlignCenter, _node->label());
+ }
+
+ if (isSelected()) {
+ QPainterPath sh = shape();
+ QPainterPathStroker stroker;
+ stroker.setWidth(4);
+ QPainterPath outline = (stroker.createStroke(sh) + sh).simplified();
+ painter->setPen(Qt::NoPen);
+ painter->setBrush(QBrush(QColor(150,200,255,100)));
+ painter->drawPath(outline);
+ }
+
+}
+
+QPainterPath NodeItem::shape() const
+{
+ QPainterPath path;
+ path.addEllipse(QPointF(0,0), GLOBAL_SCALEF * 0.1, GLOBAL_SCALEF * 0.1);
+ return path;
+}
+
+QRectF NodeItem::boundingRect() const
+{
+ return shape().boundingRect().adjusted(-4,-4,4,4);
}