diff options
author | Aleks Kissinger <aleks0@gmail.com> | 2017-02-28 14:46:39 +0100 |
---|---|---|
committer | Aleks Kissinger <aleks0@gmail.com> | 2017-02-28 14:46:39 +0100 |
commit | cb322a3acee9debf40c48ad1e3fb4458b0f51b7f (patch) | |
tree | 2cd3dc1060885152f0c706e0cf52bff0d8181d1e /tikzit/src/gui/nodeitem.cpp | |
parent | e1756ba69dd626073e22fd0a4f4c5fda42c88829 (diff) |
generic nodes
Diffstat (limited to 'tikzit/src/gui/nodeitem.cpp')
-rw-r--r-- | tikzit/src/gui/nodeitem.cpp | 82 |
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); } |