1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the Qt Data Visualization module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:GPL$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU
19** General Public License version 3 or (at your option) any later version
20** approved by the KDE Free Qt Foundation. The licenses are as published by
21** the Free Software Foundation and appearing in the file LICENSE.GPL3
22** included in the packaging of this file. Please review the following
23** information to ensure the GNU General Public License requirements will
24** be met: https://www.gnu.org/licenses/gpl-3.0.html.
25**
26** $QT_END_LICENSE$
27**
28****************************************************************************/
29
30//
31// W A R N I N G
32// -------------
33//
34// This file is not part of the QtDataVisualization API. It exists purely as an
35// implementation detail. This header file may change from version to
36// version without notice, or even be removed.
37//
38// We mean it.
39
40#ifndef ABSTRACTDECLARATIVE_P_H
41#define ABSTRACTDECLARATIVE_P_H
42
43#include "datavisualizationglobal_p.h"
44#include "abstract3dcontroller_p.h"
45#include "declarativescene_p.h"
46
47#include <QtQuick/QQuickItem>
48#include <QtCore/QPointer>
49#include <QtCore/QThread>
50#include <QtCore/QMutex>
51#include <QtCore/QSharedPointer>
52
53class GLStateStore;
54
55QT_BEGIN_NAMESPACE_DATAVISUALIZATION
56
57class AbstractDeclarative : public QQuickItem
58{
59 Q_OBJECT
60 Q_ENUMS(ShadowQuality)
61 Q_ENUMS(RenderingMode)
62 Q_ENUMS(ElementType)
63 Q_FLAGS(SelectionFlag SelectionFlags)
64 Q_FLAGS(OptimizationHint OptimizationHints)
65 Q_PROPERTY(SelectionFlags selectionMode READ selectionMode WRITE setSelectionMode NOTIFY selectionModeChanged)
66 Q_PROPERTY(ShadowQuality shadowQuality READ shadowQuality WRITE setShadowQuality NOTIFY shadowQualityChanged)
67 Q_PROPERTY(bool shadowsSupported READ shadowsSupported NOTIFY shadowsSupportedChanged)
68 Q_PROPERTY(int msaaSamples READ msaaSamples WRITE setMsaaSamples NOTIFY msaaSamplesChanged)
69 Q_PROPERTY(Declarative3DScene* scene READ scene NOTIFY sceneChanged)
70 Q_PROPERTY(QAbstract3DInputHandler* inputHandler READ inputHandler WRITE setInputHandler NOTIFY inputHandlerChanged)
71 Q_PROPERTY(Q3DTheme* theme READ theme WRITE setTheme NOTIFY themeChanged)
72 Q_PROPERTY(RenderingMode renderingMode READ renderingMode WRITE setRenderingMode NOTIFY renderingModeChanged)
73 Q_PROPERTY(bool measureFps READ measureFps WRITE setMeasureFps NOTIFY measureFpsChanged REVISION 1)
74 Q_PROPERTY(qreal currentFps READ currentFps NOTIFY currentFpsChanged REVISION 1)
75 Q_PROPERTY(QQmlListProperty<QCustom3DItem> customItemList READ customItemList REVISION 1)
76 Q_PROPERTY(bool orthoProjection READ isOrthoProjection WRITE setOrthoProjection NOTIFY orthoProjectionChanged REVISION 1)
77 Q_PROPERTY(ElementType selectedElement READ selectedElement NOTIFY selectedElementChanged REVISION 1)
78 Q_PROPERTY(qreal aspectRatio READ aspectRatio WRITE setAspectRatio NOTIFY aspectRatioChanged REVISION 1)
79 Q_PROPERTY(OptimizationHints optimizationHints READ optimizationHints WRITE setOptimizationHints NOTIFY optimizationHintsChanged REVISION 1)
80 Q_PROPERTY(bool polar READ isPolar WRITE setPolar NOTIFY polarChanged REVISION 2)
81 Q_PROPERTY(float radialLabelOffset READ radialLabelOffset WRITE setRadialLabelOffset NOTIFY radialLabelOffsetChanged REVISION 2)
82 Q_PROPERTY(qreal horizontalAspectRatio READ horizontalAspectRatio WRITE setHorizontalAspectRatio NOTIFY horizontalAspectRatioChanged REVISION 2)
83 Q_PROPERTY(bool reflection READ isReflection WRITE setReflection NOTIFY reflectionChanged REVISION 2)
84 Q_PROPERTY(qreal reflectivity READ reflectivity WRITE setReflectivity NOTIFY reflectivityChanged REVISION 2)
85 Q_PROPERTY(QLocale locale READ locale WRITE setLocale NOTIFY localeChanged REVISION 2)
86 Q_PROPERTY(QVector3D queriedGraphPosition READ queriedGraphPosition NOTIFY queriedGraphPositionChanged REVISION 2)
87 Q_PROPERTY(qreal margin READ margin WRITE setMargin NOTIFY marginChanged REVISION 2)
88
89public:
90 enum SelectionFlag {
91 SelectionNone = 0,
92 SelectionItem = 1,
93 SelectionRow = 2,
94 SelectionItemAndRow = SelectionItem | SelectionRow,
95 SelectionColumn = 4,
96 SelectionItemAndColumn = SelectionItem | SelectionColumn,
97 SelectionRowAndColumn = SelectionRow | SelectionColumn,
98 SelectionItemRowAndColumn = SelectionItem | SelectionRow | SelectionColumn,
99 SelectionSlice = 8,
100 SelectionMultiSeries = 16
101 };
102 Q_DECLARE_FLAGS(SelectionFlags, SelectionFlag)
103
104 enum ShadowQuality {
105 ShadowQualityNone = 0,
106 ShadowQualityLow,
107 ShadowQualityMedium,
108 ShadowQualityHigh,
109 ShadowQualitySoftLow,
110 ShadowQualitySoftMedium,
111 ShadowQualitySoftHigh
112 };
113
114 enum ElementType {
115 ElementNone = 0,
116 ElementSeries,
117 ElementAxisXLabel,
118 ElementAxisYLabel,
119 ElementAxisZLabel,
120 ElementCustomItem
121 };
122
123 enum RenderingMode {
124 RenderDirectToBackground = 0,
125 RenderDirectToBackground_NoClear,
126 RenderIndirect
127 };
128
129 enum OptimizationHint {
130 OptimizationDefault = 0,
131 OptimizationStatic = 1
132 };
133 Q_DECLARE_FLAGS(OptimizationHints, OptimizationHint)
134
135public:
136 explicit AbstractDeclarative(QQuickItem *parent = 0);
137 virtual ~AbstractDeclarative();
138
139 virtual void setRenderingMode(RenderingMode mode);
140 virtual AbstractDeclarative::RenderingMode renderingMode() const;
141
142 virtual void setSelectionMode(SelectionFlags mode);
143 virtual AbstractDeclarative::SelectionFlags selectionMode() const;
144
145 virtual void setShadowQuality(ShadowQuality quality);
146 virtual AbstractDeclarative::ShadowQuality shadowQuality() const;
147
148 virtual AbstractDeclarative::ElementType selectedElement() const;
149
150 virtual bool shadowsSupported() const;
151
152 virtual void setMsaaSamples(int samples);
153 virtual int msaaSamples() const;
154
155 virtual Declarative3DScene *scene() const;
156
157 virtual QAbstract3DInputHandler *inputHandler() const;
158 virtual void setInputHandler(QAbstract3DInputHandler *inputHandler);
159
160 virtual void setTheme(Q3DTheme *theme);
161 virtual Q3DTheme *theme() const;
162
163 Q_INVOKABLE virtual void clearSelection();
164
165 Q_REVISION(1) Q_INVOKABLE virtual int addCustomItem(QCustom3DItem *item);
166 Q_REVISION(1) Q_INVOKABLE virtual void removeCustomItems();
167 Q_REVISION(1) Q_INVOKABLE virtual void removeCustomItem(QCustom3DItem *item);
168 Q_REVISION(1) Q_INVOKABLE virtual void removeCustomItemAt(const QVector3D &position);
169 Q_REVISION(1) Q_INVOKABLE virtual void releaseCustomItem(QCustom3DItem *item);
170
171 Q_REVISION(1) Q_INVOKABLE virtual int selectedLabelIndex() const;
172 Q_REVISION(1) Q_INVOKABLE virtual QAbstract3DAxis *selectedAxis() const;
173
174 Q_REVISION(1) Q_INVOKABLE virtual int selectedCustomItemIndex() const;
175 Q_REVISION(1) Q_INVOKABLE virtual QCustom3DItem *selectedCustomItem() const;
176
177 QQmlListProperty<QCustom3DItem> customItemList();
178 static void appendCustomItemFunc(QQmlListProperty<QCustom3DItem> *list,
179 QCustom3DItem *item);
180 static int countCustomItemFunc(QQmlListProperty<QCustom3DItem> *list);
181 static QCustom3DItem *atCustomItemFunc(QQmlListProperty<QCustom3DItem> *list, int index);
182 static void clearCustomItemFunc(QQmlListProperty<QCustom3DItem> *list);
183
184 virtual void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry);
185
186 void setSharedController(Abstract3DController *controller);
187 // Used to synch up data model from controller to renderer while main thread is locked
188 void synchDataToRenderer();
189 void render();
190
191 void activateOpenGLContext(QQuickWindow *window);
192 void doneOpenGLContext(QQuickWindow *window);
193
194 void checkWindowList(QQuickWindow *window);
195
196 void setMeasureFps(bool enable);
197 bool measureFps() const;
198 qreal currentFps() const;
199
200 void setOrthoProjection(bool enable);
201 bool isOrthoProjection() const;
202
203 void setAspectRatio(qreal ratio);
204 qreal aspectRatio() const;
205
206 void setOptimizationHints(OptimizationHints hints);
207 OptimizationHints optimizationHints() const;
208
209 void setPolar(bool enable);
210 bool isPolar() const;
211
212 void setRadialLabelOffset(float offset);
213 float radialLabelOffset() const;
214
215 void setHorizontalAspectRatio(qreal ratio);
216 qreal horizontalAspectRatio() const;
217
218 void setReflection(bool enable);
219 bool isReflection() const;
220
221 void setReflectivity(qreal reflectivity);
222 qreal reflectivity() const;
223
224 void setLocale(const QLocale &locale);
225 QLocale locale() const;
226
227 QVector3D queriedGraphPosition() const;
228
229 void setMargin(qreal margin);
230 qreal margin() const;
231
232 QMutex *mutex() { return &m_mutex; }
233
234public Q_SLOTS:
235 virtual void handleAxisXChanged(QAbstract3DAxis *axis) = 0;
236 virtual void handleAxisYChanged(QAbstract3DAxis *axis) = 0;
237 virtual void handleAxisZChanged(QAbstract3DAxis *axis) = 0;
238 void windowDestroyed(QObject *obj);
239 void destroyContext();
240
241protected:
242 virtual void mouseDoubleClickEvent(QMouseEvent *event);
243 virtual void touchEvent(QTouchEvent *event);
244 virtual void mousePressEvent(QMouseEvent *event);
245 virtual void mouseReleaseEvent(QMouseEvent *event);
246 virtual void mouseMoveEvent(QMouseEvent *event);
247#if QT_CONFIG(wheelevent)
248 virtual void wheelEvent(QWheelEvent *event);
249#endif
250 virtual void handleWindowChanged(QQuickWindow *win);
251 virtual void itemChange(ItemChange change, const ItemChangeData &value);
252 virtual void updateWindowParameters();
253 virtual void handleSelectionModeChange(QAbstract3DGraph::SelectionFlags mode);
254 virtual void handleShadowQualityChange(QAbstract3DGraph::ShadowQuality quality);
255 virtual void handleSelectedElementChange(QAbstract3DGraph::ElementType type);
256 virtual void handleOptimizationHintChange(QAbstract3DGraph::OptimizationHints hints);
257 virtual QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *);
258
259Q_SIGNALS:
260 void selectionModeChanged(AbstractDeclarative::SelectionFlags mode);
261 void shadowQualityChanged(AbstractDeclarative::ShadowQuality quality);
262 void shadowsSupportedChanged(bool supported);
263 void msaaSamplesChanged(int samples);
264 void sceneChanged(Q3DScene *scene);
265 void inputHandlerChanged(QAbstract3DInputHandler *inputHandler);
266 void themeChanged(Q3DTheme *theme);
267 void renderingModeChanged(AbstractDeclarative::RenderingMode mode);
268 Q_REVISION(1) void measureFpsChanged(bool enabled);
269 Q_REVISION(1) void currentFpsChanged(qreal fps);
270 Q_REVISION(1) void selectedElementChanged(AbstractDeclarative::ElementType type);
271 Q_REVISION(1) void orthoProjectionChanged(bool enabled);
272 Q_REVISION(1) void aspectRatioChanged(qreal ratio);
273 Q_REVISION(1) void optimizationHintsChanged(AbstractDeclarative::OptimizationHints hints);
274 Q_REVISION(2) void polarChanged(bool enabled);
275 Q_REVISION(2) void radialLabelOffsetChanged(float offset);
276 Q_REVISION(2) void horizontalAspectRatioChanged(qreal ratio);
277 Q_REVISION(2) void reflectionChanged(bool enabled);
278 Q_REVISION(2) void reflectivityChanged(qreal reflectivity);
279 Q_REVISION(2) void localeChanged(const QLocale &locale);
280 Q_REVISION(2) void queriedGraphPositionChanged(const QVector3D &data);
281 Q_REVISION(2) void marginChanged(qreal margin);
282
283protected:
284 QSharedPointer<QMutex> m_nodeMutex;
285
286private:
287 QPointer<Abstract3DController> m_controller;
288 QRectF m_cachedGeometry;
289 QPointer<QQuickWindow> m_contextWindow;
290 AbstractDeclarative::RenderingMode m_renderMode;
291 int m_samples;
292 int m_windowSamples;
293 QSize m_initialisedSize;
294 union {
295 QObject *m_contextOrStateStore;
296 QOpenGLContext *m_context;
297 GLStateStore *m_stateStore;
298 };
299 QPointer<QOpenGLContext> m_qtContext;
300 QThread *m_mainThread;
301 QThread *m_contextThread;
302 bool m_runningInDesigner;
303 QMutex m_mutex;
304};
305Q_DECLARE_OPERATORS_FOR_FLAGS(AbstractDeclarative::SelectionFlags)
306Q_DECLARE_OPERATORS_FOR_FLAGS(AbstractDeclarative::OptimizationHints)
307
308QT_END_NAMESPACE_DATAVISUALIZATION
309
310#endif
311

source code of qtdatavis3d/src/datavisualizationqml2/abstractdeclarative_p.h