1// Copyright (C) 2023 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
4//
5// W A R N I N G
6// -------------
7//
8// This file is not part of the QtGraphs API. It exists purely as an
9// implementation detail. This header file may change from version to
10// version without notice, or even be removed.
11//
12// We mean it.
13
14#ifndef QQUICKGRAPHSSURFACE_P_H
15#define QQUICKGRAPHSSURFACE_P_H
16
17#include "qquickgraphsitem_p.h"
18#include "qsurface3dseries.h"
19
20#include <private/qgraphsglobal_p.h>
21
22QT_BEGIN_NAMESPACE
23
24class QValue3DAxis;
25class QSurface3DSeries;
26class QQuickGraphsSurface;
27
28struct Surface3DChangeBitField
29{
30 bool selectedPointChanged : 1;
31 bool rowsChanged : 1;
32 bool itemChanged : 1;
33 bool flipHorizontalGridChanged : 1;
34 bool surfaceTextureChanged : 1;
35
36 Surface3DChangeBitField()
37 : selectedPointChanged(true)
38 , rowsChanged(false)
39 , itemChanged(false)
40 , flipHorizontalGridChanged(true)
41 , surfaceTextureChanged(true)
42 {}
43};
44
45class Q_GRAPHS_EXPORT QQuickGraphsSurface : public QQuickGraphsItem
46{
47 Q_OBJECT
48 Q_PROPERTY(QValue3DAxis *axisX READ axisX WRITE setAxisX NOTIFY axisXChanged)
49 Q_PROPERTY(QValue3DAxis *axisY READ axisY WRITE setAxisY NOTIFY axisYChanged)
50 Q_PROPERTY(QValue3DAxis *axisZ READ axisZ WRITE setAxisZ NOTIFY axisZChanged)
51 Q_PROPERTY(QSurface3DSeries *selectedSeries READ selectedSeries NOTIFY selectedSeriesChanged)
52 Q_PROPERTY(QQmlListProperty<QSurface3DSeries> seriesList READ seriesList CONSTANT)
53 Q_PROPERTY(bool flipHorizontalGrid READ flipHorizontalGrid WRITE setFlipHorizontalGrid NOTIFY
54 flipHorizontalGridChanged)
55 Q_CLASSINFO("DefaultProperty", "seriesList")
56
57 QML_NAMED_ELEMENT(Surface3D)
58
59public:
60 explicit QQuickGraphsSurface(QQuickItem *parent = 0);
61 ~QQuickGraphsSurface() override;
62
63 struct ChangeItem
64 {
65 QSurface3DSeries *series;
66 QPoint point;
67 };
68 struct ChangeRow
69 {
70 QSurface3DSeries *series;
71 qsizetype row;
72 };
73 enum DataDimension {
74 BothAscending = 0,
75 XDescending = 1,
76 ZDescending = 2,
77 BothDescending = XDescending | ZDescending,
78 };
79 Q_DECLARE_FLAGS(DataDimensions, DataDimension)
80
81 void setAxisX(QValue3DAxis *axis);
82 QValue3DAxis *axisX() const;
83 void setAxisY(QValue3DAxis *axis);
84 QValue3DAxis *axisY() const;
85 void setAxisZ(QValue3DAxis *axis);
86 QValue3DAxis *axisZ() const;
87
88 QQmlListProperty<QSurface3DSeries> seriesList();
89 static void appendSeriesFunc(QQmlListProperty<QSurface3DSeries> *list, QSurface3DSeries *series);
90 static qsizetype countSeriesFunc(QQmlListProperty<QSurface3DSeries> *list);
91 static QSurface3DSeries *atSeriesFunc(QQmlListProperty<QSurface3DSeries> *list, qsizetype index);
92 static void clearSeriesFunc(QQmlListProperty<QSurface3DSeries> *list);
93 Q_INVOKABLE void addSeries(QSurface3DSeries *series);
94 Q_INVOKABLE void removeSeries(QSurface3DSeries *series);
95 Q_INVOKABLE void clearSelection() override;
96
97 void setFlipHorizontalGrid(bool flip);
98 bool flipHorizontalGrid() const;
99 bool isFlatShadingSupported();
100 QList<QSurface3DSeries *> surfaceSeriesList();
101 void updateSurfaceTexture(QSurface3DSeries *series);
102
103 static QPoint invalidSelectionPosition();
104 void setSelectedPoint(QPoint position, QSurface3DSeries *series, bool enterSlice);
105
106 QSurface3DSeries *selectedSeries() const { return m_selectedSeries; }
107 void setSelectionMode(QtGraphs3D::SelectionFlags mode) override;
108
109 void setDataDimensions(DataDimensions dimension) { m_dataDimensions = dimension; }
110 DataDimensions dataDimensions() { return m_dataDimensions; }
111
112 bool hasChangedSeriesList() const { return !m_changedSeriesList.isEmpty(); }
113 bool isSeriesVisibilityDirty() const { return m_isSeriesVisibilityDirty; }
114 void setSeriesVisibilityDirty(bool dirty) { m_isSeriesVisibilityDirty = dirty; }
115 bool isDataDirty() const { return m_isDataDirty; }
116 void setDataDirty(bool dirty) { m_isDataDirty = dirty; }
117 bool isSeriesVisualsDirty() const { return m_isSeriesVisualsDirty; }
118 void setSeriesVisualsDirty(bool dirty) { m_isSeriesVisualsDirty = dirty; }
119 bool isIndexDirty() const { return m_isIndexDirty; }
120 void setIndexDirty(bool dirty) { m_isIndexDirty = dirty; }
121
122 QList<QAbstract3DSeries *> changedSeriesList() { return m_changedSeriesList; }
123
124 bool isSelectedPointChanged() const { return m_changeTracker.selectedPointChanged; }
125 void setSelectedPointChanged(bool changed) { m_changeTracker.selectedPointChanged = changed; }
126
127 bool isFlipHorizontalGridChanged() const { return m_changeTracker.flipHorizontalGridChanged; }
128 void setFlipHorizontalGridChanged(bool changed)
129 {
130 m_changeTracker.flipHorizontalGridChanged = changed;
131 }
132
133 bool isSurfaceTextureChanged() const { return m_changeTracker.surfaceTextureChanged; }
134 void setSurfaceTextureChanged(bool changed) { m_changeTracker.surfaceTextureChanged = changed; }
135 bool isChangedTexturesEmpty() const { return m_changedTextures.empty(); }
136 bool hasSeriesToChangeTexture(QSurface3DSeries *series) const
137 {
138 return m_changedTextures.contains(t: series);
139 }
140
141 void handleAxisAutoAdjustRangeChangedInOrientation(QAbstract3DAxis::AxisOrientation orientation,
142 bool autoAdjust) override;
143 void handleAxisRangeChangedBySender(QObject *sender) override;
144 void handleSeriesVisibilityChangedBySender(QObject *sender) override;
145 void adjustAxisRanges() override;
146
147protected:
148 void componentComplete() override;
149 void synchData() override;
150 void updateGraph() override;
151 void calculateSceneScalingFactors() override;
152 void toggleSliceGraph() override;
153 void updateSingleHighlightColor() override;
154 void updateLightStrength() override;
155 void handleThemeTypeChange() override;
156 bool doPicking(QPointF position) override;
157
158 void createSliceView() override;
159 void updateSliceItemLabel(const QString &label, QVector3D position) override;
160 void updateSelectionMode(QtGraphs3D::SelectionFlags mode) override;
161
162public Q_SLOTS:
163 void handleAxisXChanged(QAbstract3DAxis *axis) override;
164 void handleAxisYChanged(QAbstract3DAxis *axis) override;
165 void handleAxisZChanged(QAbstract3DAxis *axis) override;
166
167 void handleShadingChanged();
168 void handleWireframeColorChanged();
169 void handleFlipHorizontalGridChanged(bool flip);
170
171 void handleArrayReset();
172 void handleRowsAdded(qsizetype startIndex, qsizetype count);
173 void handleRowsChanged(qsizetype startIndex, qsizetype count);
174 void handleRowsRemoved(qsizetype startIndex, qsizetype count);
175 void handleRowsInserted(qsizetype startIndex, qsizetype count);
176 void handleItemChanged(qsizetype rowIndex, qsizetype columnIndex);
177
178 void handleFlatShadingSupportedChange(bool supported);
179
180Q_SIGNALS:
181 void axisXChanged(QValue3DAxis *axis);
182 void axisYChanged(QValue3DAxis *axis);
183 void axisZChanged(QValue3DAxis *axis);
184 void selectedSeriesChanged(QSurface3DSeries *series);
185 void flipHorizontalGridChanged(bool flip);
186
187private:
188 struct SurfaceVertex
189 {
190 QVector3D position;
191 QVector2D uv;
192 QPoint coord;
193 };
194
195 struct SurfaceModel
196 {
197 QQuick3DModel *model;
198 QQuick3DModel *gridModel;
199 QQuick3DModel *sliceModel;
200 QQuick3DModel *sliceGridModel;
201 QQuick3DModel *proxyModel;
202 QVector<SurfaceVertex> vertices;
203 QVector<quint32> indices;
204 QVector<quint32> gridIndices;
205 QSurface3DSeries *series;
206 QQuick3DTexture *texture;
207 QQuick3DTexture *heightTexture;
208 QQuick3DCustomMaterial *customMaterial;
209 qsizetype columnCount;
210 qsizetype rowCount;
211 SurfaceVertex selectedVertex;
212 bool picked = false;
213 QVector3D boundsMin;
214 QVector3D boundsMax;
215 QRect sampleSpace;
216 bool ascendingX;
217 bool ascendingZ;
218 };
219
220 QVector3D getNormalizedVertex(const QSurfaceDataItem &data, bool polar, bool flipXZ);
221 QRect calculateSampleSpace(SurfaceModel *model);
222 QPointF mapCoordsToWorldSpace(SurfaceModel *model, QPointF coords);
223 QPoint mapCoordsToSampleSpace(SurfaceModel *model, QPointF coords);
224 void createIndices(SurfaceModel *model, qsizetype columnCount, qsizetype rowCount);
225 void createGridlineIndices(SurfaceModel *model, qsizetype x, qsizetype y, qsizetype endX, qsizetype endY);
226 void handleChangedSeries();
227 void updateModel(SurfaceModel *model);
228 void createProxyModel(SurfaceModel *parentModel);
229 void updateProxyModel(SurfaceModel *model);
230 void updateMaterial(SurfaceModel *model);
231 void updateSelectedPoint();
232 void addModel(QSurface3DSeries *series);
233 void addSliceModel(SurfaceModel *model);
234
235 void handleMeshTypeChanged(QAbstract3DSeries::Mesh mesh);
236 void handlePointerChanged(const QString &filename);
237 void changePointerMeshTypeForSeries(QAbstract3DSeries::Mesh mesh, QSurface3DSeries *series);
238 void changePointerForSeries(const QString &filename, QSurface3DSeries *series);
239 void changeSlicePointerMeshTypeForSeries(QAbstract3DSeries::Mesh mesh, QSurface3DSeries *series);
240 void changeSlicePointerForSeries(const QString &filename, QSurface3DSeries *series);
241 QString getMeshFileName(QAbstract3DSeries::Mesh mesh, QSurface3DSeries *series) const;
242
243 QVector<SurfaceModel *> m_model;
244 QMap<QSurface3DSeries *, QQuick3DModel *> m_selectionPointers = {};
245 QMap<QSurface3DSeries *, QQuick3DModel *> m_sliceSelectionPointers = {};
246
247 bool m_isIndexDirty = true;
248 bool m_selectionDirty = false;
249
250 bool m_pickThisFrame = false;
251 bool m_proxyDirty = false;
252 QPointF m_lastPick;
253
254 Surface3DChangeBitField m_changeTracker;
255 QPoint m_selectedPoint;
256 QSurface3DSeries *m_selectedSeries
257 = nullptr; // Points to the series for which the point is selected in
258 // single series selection cases.
259 bool m_flatShadingSupported = true;
260 QList<ChangeItem> m_changedItems;
261 QList<ChangeRow> m_changedRows;
262 bool m_flipHorizontalGrid = false;
263 QList<QSurface3DSeries *> m_changedTextures;
264 bool m_isSeriesVisibilityDirty = false;
265
266 QQuick3DModel *m_topGrid = nullptr;
267 QQuick3DNode *m_topGridScale = nullptr;
268 QQuick3DNode *m_topGridRotation = nullptr;
269
270 DataDimensions m_dataDimensions;
271
272 friend class Q3DSurfaceWidgetItem;
273};
274
275QT_END_NAMESPACE
276
277#endif // QQUICKGRAPHSSURFACE_P_H
278

Provided by KDAB

Privacy Policy
Learn Advanced QML with KDAB
Find out more

source code of qtgraphs/src/graphs3d/qml/qquickgraphssurface_p.h