KDStateMachineEditor API Documentation 2.1
Loading...
Searching...
No Matches
quickprimitiveitem.cpp
Go to the documentation of this file.
1/*
2 This file is part of the KDAB State Machine Editor Library.
3
4 SPDX-FileCopyrightText: 2014 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
5 Author: Kevin Funk <kevin.funk@kdab.com>
6
7 SPDX-License-Identifier: LGPL-2.1-only OR LicenseRef-KDAB-KDStateMachineEditor
8
9 Licensees holding valid commercial KDAB State Machine Editor Library
10 licenses may use this file in accordance with the KDAB State Machine Editor
11 Library License Agreement provided with the Software.
12
13 Contact info@kdab.com if any conditions of this licensing are not clear to you.
14*/
15
17
18#include <QSGFlatColorMaterial>
19#include <QSGNode>
20
21#include <QRectF>
22
23namespace {
24
25QuickGeometryItem::VertexDataType typeOfGeometry(const QSGGeometry *geometry)
26{
27 switch (geometry->sizeOfVertex()) {
28 default:
29 Q_ASSERT_X(false, "VertexDataType", "Unknown vertex data type from QSGGeometry");
30 case 2 * sizeof(float):
31 return QuickGeometryItem::Point2DType;
32 case 4 * sizeof(float):
33 return QuickGeometryItem::TexturedPoint2DType;
34 case 2 * sizeof(float) + 4 * sizeof(char):
36 }
37}
38
39template<typename T>
40QRectF boundingBox_QSGGeometryNode_vertexData(T *vertices, int count)
41{
42 if (count <= 0) {
43 return QRectF();
44 }
45
46 float minX = vertices[0].x;
47 float minY = vertices[0].y;
48 float maxX = vertices[0].x;
49 float maxY = vertices[0].y;
50 for (int i = 1; i < count; ++i) {
51 if (vertices[i].x < minX)
52 minX = vertices[i].x;
53 if (vertices[i].y < minY)
54 minY = vertices[i].y;
55 if (vertices[i].x > maxX)
56 maxX = vertices[i].x;
57 if (vertices[i].y > maxY)
58 maxY = vertices[i].y;
59 }
60 return QRectF(minX, minY, maxX, maxY);
61}
62
63}
64
65QRectF GeometryUtils::boundingRect(QSGGeometry *geometry)
66{
67 switch (typeOfGeometry(geometry)) {
69 return boundingBox_QSGGeometryNode_vertexData(geometry->vertexDataAsPoint2D(), geometry->vertexCount());
71 return boundingBox_QSGGeometryNode_vertexData(geometry->vertexDataAsColoredPoint2D(), geometry->vertexCount());
73 return boundingBox_QSGGeometryNode_vertexData(geometry->vertexDataAsTexturedPoint2D(), geometry->vertexCount());
74 default:
75 return QRect();
76 }
77}
78
80 : QObject(parent)
81 , m_vertexDataType(Point2DType)
82 , m_drawingMode(TriangleStrip)
83 , m_lineWidth(1.F)
84{
85}
86
88{
89 return m_vertexData;
90}
91
92void QuickGeometryItem::setVertexData(const QList<qreal> &vertexData)
93{
94 if (m_vertexData == vertexData) {
95 return;
96 }
97
98 m_vertexData = vertexData;
99 Q_EMIT vertexDataChanged(m_vertexData);
100 Q_EMIT changed();
101}
102
104{
105 return m_vertexDataType;
106}
107
109{
110 if (m_vertexDataType == type)
111 return;
112
113 m_vertexDataType = type;
114 Q_EMIT vertexDataTypeChanged(m_vertexDataType);
115 Q_EMIT changed();
116}
117
119{
120 return m_drawingMode;
121}
122
124{
125 if (m_drawingMode == drawingMode)
126 return;
127
128 m_drawingMode = drawingMode;
129 Q_EMIT drawingModeChanged(m_drawingMode);
130 Q_EMIT changed();
131}
132
134{
135 return m_lineWidth;
136}
137
139{
140 if (m_lineWidth == lineWidth) {
141 return;
142 }
143
144 m_lineWidth = lineWidth;
145 Q_EMIT lineWidthChanged(m_lineWidth);
146 Q_EMIT changed();
147}
148
150{
151 QSGGeometry *geometry = nullptr;
152 const QList<qreal> &data = m_vertexData;
153 switch (m_vertexDataType) {
154 case Point2DType: {
155 Q_ASSERT(data.size() % 2 == 0);
156 const int vertexCount = static_cast<int>(data.size() / 2);
157 geometry = new QSGGeometry(QSGGeometry::defaultAttributes_Point2D(), vertexCount);
158 QSGGeometry::Point2D *vertices = geometry->vertexDataAsPoint2D();
159 for (int i = 0; i < vertexCount; ++i) {
160 const auto x = static_cast<float>(data[i * 2]);
161 const auto y = static_cast<float>(data[(i * 2) + 1]);
162 vertices[i].set(x, y);
163 }
164 break;
165 }
167 // TODO
168 geometry = new QSGGeometry(QSGGeometry::defaultAttributes_ColoredPoint2D(), 0);
169 break;
171 // TODO
172 geometry = new QSGGeometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 0);
173 break;
174 }
175 geometry->setDrawingMode(m_drawingMode);
176 geometry->setLineWidth(m_lineWidth);
177 return geometry;
178}
179
181 : QQuickItem(parent)
182 , m_geometryItem(nullptr)
183 , m_geometryDirty(false)
184 , m_color(Qt::black)
185{
186 setFlag(ItemHasContents, true);
187}
188
190{
191 return m_geometryItem;
192}
193
195{
196 if (m_geometryItem == item)
197 return;
198
199 if (m_geometryItem) {
200 disconnect(m_geometryItem, &QuickGeometryItem::changed, this, &QuickPrimitiveItem::updateGeometry);
201 }
202 m_geometryItem = item;
203 if (m_geometryItem) {
204 connect(m_geometryItem, &QuickGeometryItem::changed, this, &QuickPrimitiveItem::updateGeometry);
205 }
206 Q_EMIT geometryItemChanged(m_geometryItem);
207 update();
208}
209
210void QuickPrimitiveItem::updateImplicitSize(QSGGeometry *geometry)
211{
212 const QRectF boundingRect = GeometryUtils::boundingRect(geometry);
213 setImplicitWidth(boundingRect.x() + boundingRect.width());
214 setImplicitHeight(boundingRect.y() + boundingRect.height());
215}
216
218{
219 return m_color;
220}
221
222void QuickPrimitiveItem::setColor(const QColor &color)
223{
224 if (m_color == color)
225 return;
226
227 m_color = color;
228 Q_EMIT colorChanged(m_color);
229 update();
230}
231
232void QuickPrimitiveItem::updateGeometry()
233{
234 m_geometryDirty = true;
235 update();
236}
237
238QSGNode *QuickPrimitiveItem::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data)
239{
240 Q_UNUSED(data);
241
242 if (!geometryItem())
243 return nullptr;
244
245 auto *node = static_cast<QSGGeometryNode *>(oldNode);
246 if (!node) {
247 node = new QSGGeometryNode;
248 node->setFlag(QSGNode::OwnsGeometry);
249 auto *material = new QSGFlatColorMaterial;
250 node->setMaterial(material);
251 node->setFlag(QSGNode::OwnsMaterial);
252 m_geometryDirty = true;
253 }
254
255 if (m_geometryDirty) {
256 QSGGeometry *geometry = geometryItem()->createGeometry();
257 updateImplicitSize(geometry);
258 node->setGeometry(geometry);
259
260 m_geometryDirty = false;
261 }
262
263
264 auto *material = static_cast<QSGFlatColorMaterial *>(node->material());
265 material->setColor(m_color);
266
267 return node;
268}
void setLineWidth(float lineWidth)
void lineWidthChanged(float lineWidth)
VertexDataType vertexDataType() const
void vertexDataChanged(const QList< qreal > &vertexData)
void setVertexData(const QList< qreal > &vertexData)
QSGGeometry * createGeometry() const
void setDrawingMode(DrawingMode drawingMode)
QList< qreal > vertexData() const
void vertexDataTypeChanged(QuickGeometryItem::VertexDataType type)
QuickGeometryItem(QObject *parent=nullptr)
void drawingModeChanged(QuickGeometryItem::DrawingMode drawingMode)
QuickGeometryItem::VertexDataType type
void setVertexDataType(VertexDataType type)
void changed()
Emitted in case any of this object properties changes.
QuickGeometryItem * geometryItem() const
void colorChanged(const QColor &color)
void geometryItemChanged(QuickGeometryItem *geometry)
QuickPrimitiveItem(QQuickItem *parent=nullptr)
QuickGeometryItem * geometry
void setColor(const QColor &color)
QSGNode * updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data) override
void setGeometryItem(QuickGeometryItem *item)
QRectF boundingRect(QSGGeometry *geometry)

© Klarälvdalens Datakonsult AB (KDAB)
"The Qt, C++ and OpenGL Experts"
https://www.kdab.com/
KDStateMachineEditor
Create Qt State Machine metacode using a graphical user interface
https://github.com/KDAB/KDStateMachineEditor
Generated on Tue Jul 15 2025 15:21:47 for KDStateMachineEditor API Documentation by doxygen 1.9.8