GCC Code Coverage Report
Directory: QGVCore/ Exec Total Coverage
File: QGVCore/QGVNode.cpp Lines: 0 80 0.0 %
Date: 2024-03-31 10:30:44 Branches: 0 20 0.0 %

Line Branch Exec Source
1
/***************************************************************
2
QGVCore
3
Copyright (c) 2014, Bergont Nicolas, All rights reserved.
4
5
This library is free software; you can redistribute it and/or
6
modify it under the terms of the GNU Lesser General Public
7
License as published by the Free Software Foundation; either
8
version 3.0 of the License, or (at your option) any later version.
9
10
This library is distributed in the hope that it will be useful,
11
but WITHOUT ANY WARRANTY; without even the implied warranty of
12
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
Lesser General Public License for more details.
14
15
You should have received a copy of the GNU Lesser General Public
16
License along with this library.
17
***************************************************************/
18
#include <QGVCore.h>
19
#include <QGVGraphPrivate.h>
20
#include <QGVNode.h>
21
#include <QGVNodePrivate.h>
22
#include <QGVScene.h>
23
24
#include <QDebug>
25
#include <QPainter>
26
27
QGVNode::QGVNode(QGVNodePrivate *node, QGVScene *scene)
28
    : _scene(scene), _node(node) {
29
  setFlag(QGraphicsItem::ItemIsSelectable, true);
30
  setFlag(QGraphicsItem::ItemIsMovable, true);
31
  setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
32
}
33
34
QGVNode::~QGVNode() {
35
  _scene->removeItem(this);
36
  delete _node;
37
}
38
39
QString QGVNode::label() const { return getAttribute("label"); }
40
41
void QGVNode::setLabel(const QString &label) { setAttribute("label", label); }
42
43
QRectF QGVNode::boundingRect() const { return _path.boundingRect(); }
44
45
void QGVNode::paint(QPainter *painter, const QStyleOptionGraphicsItem *,
46
                    QWidget *) {
47
  painter->save();
48
49
  painter->setPen(_pen);
50
51
  if (isSelected()) {
52
    QBrush tbrush(_brush);
53
    tbrush.setColor(tbrush.color().darker(120));
54
    painter->setBrush(tbrush);
55
  } else
56
    painter->setBrush(_brush);
57
58
  painter->drawPath(_path);
59
60
  painter->setPen(QGVCore::toColor(getAttribute("labelfontcolor")));
61
62
  const QRectF rect = boundingRect().adjusted(2, 2, -2, -2);  // Margin
63
  if (_icon.isNull()) {
64
    painter->drawText(rect, Qt::AlignCenter, QGVNode::label());
65
  } else {
66
    painter->drawText(rect.adjusted(0, 0, 0, -rect.height() * 2 / 3),
67
                      Qt::AlignCenter, QGVNode::label());
68
69
    const QRectF img_rect = rect.adjusted(0, rect.height() / 3, 0, 0);
70
    QImage img = _icon.scaled(img_rect.size().toSize(), Qt::KeepAspectRatio,
71
                              Qt::SmoothTransformation);
72
    painter->drawImage(
73
        img_rect.topLeft() +
74
            QPointF((img_rect.width() - img.rect().width()) / 2, 0),
75
        img);
76
  }
77
  painter->restore();
78
}
79
80
void QGVNode::setAttribute(const QString &name, const QString &value) {
81
  char empty[] = "";
82
  agsafeset(_node->node(), name.toLocal8Bit().data(),
83
            value.toLocal8Bit().data(), empty);
84
}
85
86
QString QGVNode::getAttribute(const QString &name) const {
87
  char *value = agget(_node->node(), name.toLocal8Bit().data());
88
  if (value) return value;
89
  return QString();
90
}
91
92
QString QGVNode::posToAttributeString() const {
93
  qreal gheight = QGVCore::graphHeight(_scene->_graph->graph());
94
  qreal width = ND_width(_node->node()) * DotDefaultDPI;
95
  qreal height = ND_height(_node->node()) * DotDefaultDPI;
96
  return QGVCore::qtToGvPos(QGVCore::centerToOrigin(pos(), -width, -height),
97
                            gheight);
98
}
99
100
void QGVNode::setIcon(const QImage &icon) { _icon = icon; }
101
102
QVariant QGVNode::itemChange(GraphicsItemChange change, const QVariant &value) {
103
  if (change == ItemPositionChange && _scene) {
104
    // value is the new position.
105
    QString oldStr = getAttribute(QString::fromLocal8Bit("pos"));
106
    qreal gheight = QGVCore::graphHeight(_scene->_graph->graph());
107
    QPointF newPos = value.toPointF();
108
    qreal width = ND_width(_node->node()) * DotDefaultDPI;
109
    qreal height = ND_height(_node->node()) * DotDefaultDPI;
110
    QString newStr = QGVCore::qtToGvPos(
111
        QGVCore::centerToOrigin(newPos, -width, -height), gheight);
112
113
    if (!newStr.isEmpty()) {
114
      if (oldStr != newStr) {
115
        setAttribute("pos", newStr.toLocal8Bit().data());
116
      }
117
      return newPos;
118
    }
119
  } else if (change == ItemPositionHasChanged && _scene) {
120
    emit _scene->nodeChanged(this);
121
    return value;
122
  }
123
  return QGraphicsItem::itemChange(change, value);
124
}
125
126
void QGVNode::updateLayout() {
127
  prepareGeometryChange();
128
  qreal width = ND_width(_node->node()) * DotDefaultDPI;
129
  qreal height = ND_height(_node->node()) * DotDefaultDPI;
130
131
  // Node Position (center)
132
  qreal gheight = QGVCore::graphHeight(_scene->_graph->graph());
133
  setPos(QGVCore::centerToOrigin(
134
      QGVCore::toPoint(ND_coord(_node->node()), gheight), width, height));
135
136
  // Node on top
137
  setZValue(1);
138
139
  // Node path
140
  _path =
141
      QGVCore::toPath(ND_shape(_node->node())->name,
142
                      (polygon_t *)ND_shape_info(_node->node()), width, height);
143
  _pen.setWidth(1);
144
145
  _brush.setStyle(QGVCore::toBrushStyle(getAttribute("style")));
146
  _brush.setColor(QGVCore::toColor(getAttribute("fillcolor")));
147
  _pen.setStyle(QGVCore::toPenStyle(getAttribute("style")));
148
  _pen.setColor(QGVCore::toColor(getAttribute("color")));
149
150
  setToolTip(getAttribute("tooltip"));
151
}