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 ABSTRACT3DCONTROLLER_P_H
41#define ABSTRACT3DCONTROLLER_P_H
42
43#include "datavisualizationglobal_p.h"
44#include "qabstract3daxis.h"
45#include "drawer_p.h"
46#include "qabstract3dinputhandler.h"
47#include "qabstract3dgraph.h"
48#include "q3dscene_p.h"
49#include "qcustom3ditem.h"
50#include <QtGui/QLinearGradient>
51#include <QtCore/QElapsedTimer>
52#include <QtCore/QLocale>
53#include <QtCore/QMutex>
54
55QT_FORWARD_DECLARE_CLASS(QOpenGLFramebufferObject)
56
57QT_BEGIN_NAMESPACE_DATAVISUALIZATION
58
59class Abstract3DRenderer;
60class QAbstract3DSeries;
61class ThemeManager;
62
63struct Abstract3DChangeBitField {
64 bool themeChanged : 1;
65 bool shadowQualityChanged : 1;
66 bool selectionModeChanged : 1;
67 bool optimizationHintChanged : 1;
68 bool axisXTypeChanged : 1;
69 bool axisYTypeChanged : 1;
70 bool axisZTypeChanged : 1;
71 bool axisXTitleChanged : 1;
72 bool axisYTitleChanged : 1;
73 bool axisZTitleChanged : 1;
74 bool axisXLabelsChanged : 1;
75 bool axisYLabelsChanged : 1;
76 bool axisZLabelsChanged : 1;
77 bool axisXRangeChanged : 1;
78 bool axisYRangeChanged : 1;
79 bool axisZRangeChanged : 1;
80 bool axisXSegmentCountChanged : 1;
81 bool axisYSegmentCountChanged : 1;
82 bool axisZSegmentCountChanged : 1;
83 bool axisXSubSegmentCountChanged : 1;
84 bool axisYSubSegmentCountChanged : 1;
85 bool axisZSubSegmentCountChanged : 1;
86 bool axisXLabelFormatChanged : 1;
87 bool axisYLabelFormatChanged : 1;
88 bool axisZLabelFormatChanged : 1;
89 bool axisXReversedChanged : 1;
90 bool axisYReversedChanged : 1;
91 bool axisZReversedChanged : 1;
92 bool axisXFormatterChanged : 1;
93 bool axisYFormatterChanged : 1;
94 bool axisZFormatterChanged : 1;
95 bool projectionChanged : 1;
96 bool axisXLabelAutoRotationChanged : 1;
97 bool axisYLabelAutoRotationChanged : 1;
98 bool axisZLabelAutoRotationChanged : 1;
99 bool aspectRatioChanged : 1;
100 bool horizontalAspectRatioChanged : 1;
101 bool axisXTitleVisibilityChanged : 1;
102 bool axisYTitleVisibilityChanged : 1;
103 bool axisZTitleVisibilityChanged : 1;
104 bool axisXTitleFixedChanged : 1;
105 bool axisYTitleFixedChanged : 1;
106 bool axisZTitleFixedChanged : 1;
107 bool polarChanged : 1;
108 bool radialLabelOffsetChanged : 1;
109 bool reflectionChanged : 1;
110 bool reflectivityChanged : 1;
111 bool marginChanged : 1;
112
113 Abstract3DChangeBitField() :
114 themeChanged(true),
115 shadowQualityChanged(true),
116 selectionModeChanged(true),
117 optimizationHintChanged(true),
118 axisXTypeChanged(true),
119 axisYTypeChanged(true),
120 axisZTypeChanged(true),
121 axisXTitleChanged(true),
122 axisYTitleChanged(true),
123 axisZTitleChanged(true),
124 axisXLabelsChanged(true),
125 axisYLabelsChanged(true),
126 axisZLabelsChanged(true),
127 axisXRangeChanged(true),
128 axisYRangeChanged(true),
129 axisZRangeChanged(true),
130 axisXSegmentCountChanged(true),
131 axisYSegmentCountChanged(true),
132 axisZSegmentCountChanged(true),
133 axisXSubSegmentCountChanged(true),
134 axisYSubSegmentCountChanged(true),
135 axisZSubSegmentCountChanged(true),
136 axisXLabelFormatChanged(true),
137 axisYLabelFormatChanged(true),
138 axisZLabelFormatChanged(true),
139 axisXReversedChanged(true),
140 axisYReversedChanged(true),
141 axisZReversedChanged(true),
142 axisXFormatterChanged(true),
143 axisYFormatterChanged(true),
144 axisZFormatterChanged(true),
145 projectionChanged(true),
146 axisXLabelAutoRotationChanged(true),
147 axisYLabelAutoRotationChanged(true),
148 axisZLabelAutoRotationChanged(true),
149 aspectRatioChanged(true),
150 horizontalAspectRatioChanged(true),
151 axisXTitleVisibilityChanged(true),
152 axisYTitleVisibilityChanged(true),
153 axisZTitleVisibilityChanged(true),
154 axisXTitleFixedChanged(true),
155 axisYTitleFixedChanged(true),
156 axisZTitleFixedChanged(true),
157 polarChanged(true),
158 radialLabelOffsetChanged(true),
159 reflectionChanged(true),
160 reflectivityChanged(true),
161 marginChanged(true)
162 {
163 }
164};
165
166class QT_DATAVISUALIZATION_EXPORT Abstract3DController : public QObject
167{
168 Q_OBJECT
169
170public:
171 enum SelectionType {
172 SelectionNone = 0,
173 SelectionItem,
174 SelectionRow,
175 SelectionColumn
176 };
177
178private:
179 Abstract3DChangeBitField m_changeTracker;
180 ThemeManager *m_themeManager;
181 QAbstract3DGraph::SelectionFlags m_selectionMode;
182 QAbstract3DGraph::ShadowQuality m_shadowQuality;
183 bool m_useOrthoProjection;
184 qreal m_aspectRatio;
185 qreal m_horizontalAspectRatio;
186 QAbstract3DGraph::OptimizationHints m_optimizationHints;
187 bool m_reflectionEnabled;
188 qreal m_reflectivity;
189 QLocale m_locale;
190 QVector3D m_queriedGraphPosition;
191
192protected:
193 Q3DScene *m_scene;
194 QList<QAbstract3DInputHandler *> m_inputHandlers; // List of all added input handlers
195 QAbstract3DInputHandler *m_activeInputHandler;
196 // Active axes
197 QAbstract3DAxis *m_axisX;
198 QAbstract3DAxis *m_axisY;
199 QAbstract3DAxis *m_axisZ;
200
201 QList<QAbstract3DAxis *> m_axes; // List of all added axes
202 Abstract3DRenderer *m_renderer;
203 bool m_isDataDirty;
204 bool m_isCustomDataDirty;
205 bool m_isCustomItemDirty;
206 bool m_isSeriesVisualsDirty;
207 bool m_renderPending;
208 bool m_isPolar;
209 float m_radialLabelOffset;
210
211 QList<QAbstract3DSeries *> m_seriesList;
212
213 bool m_measureFps;
214 QElapsedTimer m_frameTimer;
215 int m_numFrames;
216 qreal m_currentFps;
217
218 QVector<QAbstract3DSeries *> m_changedSeriesList;
219
220 QList<QCustom3DItem *> m_customItems;
221
222 QAbstract3DGraph::ElementType m_clickedType;
223 int m_selectedLabelIndex;
224 int m_selectedCustomItemIndex;
225 qreal m_margin;
226
227 QMutex m_renderMutex;
228
229 explicit Abstract3DController(QRect initialViewport, Q3DScene *scene, QObject *parent = 0);
230
231public:
232 virtual ~Abstract3DController();
233
234 inline bool isInitialized() { return (m_renderer != 0); }
235 virtual void synchDataToRenderer();
236 virtual void render(const GLuint defaultFboHandle = 0);
237 virtual void initializeOpenGL() = 0;
238 void setRenderer(Abstract3DRenderer *renderer);
239
240 virtual void addSeries(QAbstract3DSeries *series);
241 virtual void insertSeries(int index, QAbstract3DSeries *series);
242 virtual void removeSeries(QAbstract3DSeries *series);
243 QList<QAbstract3DSeries *> seriesList();
244
245 virtual void setAxisX(QAbstract3DAxis *axis);
246 virtual QAbstract3DAxis *axisX() const;
247 virtual void setAxisY(QAbstract3DAxis *axis);
248 virtual QAbstract3DAxis *axisY() const;
249 virtual void setAxisZ(QAbstract3DAxis *axis);
250 virtual QAbstract3DAxis *axisZ() const;
251 virtual void addAxis(QAbstract3DAxis *axis);
252 virtual void releaseAxis(QAbstract3DAxis *axis);
253 virtual QList<QAbstract3DAxis *> axes() const; // Omits default axes
254
255 virtual void addInputHandler(QAbstract3DInputHandler *inputHandler);
256 virtual void releaseInputHandler(QAbstract3DInputHandler *inputHandler);
257 virtual void setActiveInputHandler(QAbstract3DInputHandler *inputHandler);
258 virtual QAbstract3DInputHandler *activeInputHandler();
259 virtual QList<QAbstract3DInputHandler *> inputHandlers() const;
260
261 virtual void addTheme(Q3DTheme *theme);
262 virtual void releaseTheme(Q3DTheme *theme);
263 virtual void setActiveTheme(Q3DTheme *theme, bool force = true);
264 virtual Q3DTheme *activeTheme() const;
265 virtual QList<Q3DTheme *> themes() const;
266
267 virtual void setSelectionMode(QAbstract3DGraph::SelectionFlags mode);
268 virtual QAbstract3DGraph::SelectionFlags selectionMode() const;
269
270 virtual void setShadowQuality(QAbstract3DGraph::ShadowQuality quality);
271 virtual void doSetShadowQuality(QAbstract3DGraph::ShadowQuality quality);
272 virtual QAbstract3DGraph::ShadowQuality shadowQuality() const;
273 virtual bool shadowsSupported() const;
274
275 void setOptimizationHints(QAbstract3DGraph::OptimizationHints hints);
276 QAbstract3DGraph::OptimizationHints optimizationHints() const;
277
278 bool isSlicingActive() const;
279 void setSlicingActive(bool isSlicing);
280
281 Q3DScene *scene();
282
283 void markDataDirty();
284 void markSeriesVisualsDirty();
285
286 void requestRender(QOpenGLFramebufferObject *fbo);
287
288 int addCustomItem(QCustom3DItem *item);
289 void deleteCustomItems();
290 void deleteCustomItem(QCustom3DItem *item);
291 void deleteCustomItem(const QVector3D &position);
292 void releaseCustomItem(QCustom3DItem *item);
293 QList<QCustom3DItem *> customItems() const;
294
295 int selectedLabelIndex() const;
296 QAbstract3DAxis *selectedAxis() const;
297 int selectedCustomItemIndex() const;
298 QCustom3DItem *selectedCustomItem() const;
299
300 void setOrthoProjection(bool enable);
301 bool isOrthoProjection() const;
302
303 void setMeasureFps(bool enable);
304 inline bool measureFps() const { return m_measureFps; }
305 inline qreal currentFps() const { return m_currentFps; }
306
307 QAbstract3DGraph::ElementType selectedElement() const;
308
309 void setAspectRatio(qreal ratio);
310 qreal aspectRatio();
311 void setHorizontalAspectRatio(qreal ratio);
312 qreal horizontalAspectRatio() const;
313
314 void setReflection(bool enable);
315 bool reflection() const;
316 void setReflectivity(qreal reflectivity);
317 qreal reflectivity() const;
318
319 void setPolar(bool enable);
320 bool isPolar() const;
321 void setRadialLabelOffset(float offset);
322 float radialLabelOffset() const;
323
324 void setLocale(const QLocale &locale);
325 QLocale locale() const;
326
327 QVector3D queriedGraphPosition() const;
328
329 void setMargin(qreal margin);
330 qreal margin() const;
331
332 void emitNeedRender();
333
334 virtual void clearSelection() = 0;
335
336 virtual void mouseDoubleClickEvent(QMouseEvent *event);
337 virtual void touchEvent(QTouchEvent *event);
338 virtual void mousePressEvent(QMouseEvent *event, const QPoint &mousePos);
339 virtual void mouseReleaseEvent(QMouseEvent *event, const QPoint &mousePos);
340 virtual void mouseMoveEvent(QMouseEvent *event, const QPoint &mousePos);
341#if QT_CONFIG(wheelevent)
342 virtual void wheelEvent(QWheelEvent *event);
343#endif
344
345 virtual void handleAxisTitleChangedBySender(QObject *sender);
346 virtual void handleAxisLabelsChangedBySender(QObject *sender);
347 virtual void handleAxisRangeChangedBySender(QObject *sender);
348 virtual void handleAxisSegmentCountChangedBySender(QObject *sender);
349 virtual void handleAxisSubSegmentCountChangedBySender(QObject *sender);
350 virtual void handleAxisAutoAdjustRangeChangedInOrientation(
351 QAbstract3DAxis::AxisOrientation orientation, bool autoAdjust) = 0;
352 virtual void handleAxisLabelFormatChangedBySender(QObject *sender);
353 virtual void handleAxisReversedChangedBySender(QObject *sender);
354 virtual void handleAxisFormatterDirtyBySender(QObject *sender);
355 virtual void handleAxisLabelAutoRotationChangedBySender(QObject *sender);
356 virtual void handleAxisTitleVisibilityChangedBySender(QObject *sender);
357 virtual void handleAxisTitleFixedChangedBySender(QObject *sender);
358 virtual void handleSeriesVisibilityChangedBySender(QObject *sender);
359 virtual void handlePendingClick();
360 virtual void handlePendingGraphPositionQuery();
361 virtual void adjustAxisRanges() = 0;
362
363 void markSeriesItemLabelsDirty();
364 bool isOpenGLES() const;
365
366public Q_SLOTS:
367 void destroyRenderer();
368
369 void handleAxisTitleChanged(const QString &title);
370 void handleAxisLabelsChanged();
371 void handleAxisRangeChanged(float min, float max);
372 void handleAxisSegmentCountChanged(int count);
373 void handleAxisSubSegmentCountChanged(int count);
374 void handleAxisAutoAdjustRangeChanged(bool autoAdjust);
375 void handleAxisLabelFormatChanged(const QString &format);
376 void handleAxisReversedChanged(bool enable);
377 void handleAxisFormatterDirty();
378 void handleAxisLabelAutoRotationChanged(float angle);
379 void handleAxisTitleVisibilityChanged(bool visible);
380 void handleAxisTitleFixedChanged(bool fixed);
381 void handleInputViewChanged(QAbstract3DInputHandler::InputView view);
382 void handleInputPositionChanged(const QPoint &position);
383 void handleSeriesVisibilityChanged(bool visible);
384
385 void handleThemeColorStyleChanged(Q3DTheme::ColorStyle style);
386 void handleThemeBaseColorsChanged(const QList<QColor> &color);
387 void handleThemeBaseGradientsChanged(const QList<QLinearGradient> &gradient);
388 void handleThemeSingleHighlightColorChanged(const QColor &color);
389 void handleThemeSingleHighlightGradientChanged(const QLinearGradient &gradient);
390 void handleThemeMultiHighlightColorChanged(const QColor &color);
391 void handleThemeMultiHighlightGradientChanged(const QLinearGradient &gradient);
392 void handleThemeTypeChanged(Q3DTheme::Theme theme);
393
394 // Renderer callback handlers
395 void handleRequestShadowQuality(QAbstract3DGraph::ShadowQuality quality);
396
397 void updateCustomItem();
398
399Q_SIGNALS:
400 void shadowQualityChanged(QAbstract3DGraph::ShadowQuality quality);
401 void activeInputHandlerChanged(QAbstract3DInputHandler *inputHandler);
402 void activeThemeChanged(Q3DTheme *activeTheme);
403 void selectionModeChanged(QAbstract3DGraph::SelectionFlags mode);
404 void needRender();
405 void axisXChanged(QAbstract3DAxis *axis);
406 void axisYChanged(QAbstract3DAxis *axis);
407 void axisZChanged(QAbstract3DAxis *axis);
408 void elementSelected(QAbstract3DGraph::ElementType type);
409 void measureFpsChanged(bool enabled);
410 void currentFpsChanged(qreal fps);
411 void orthoProjectionChanged(bool enabled);
412 void aspectRatioChanged(qreal ratio);
413 void horizontalAspectRatioChanged(qreal ratio);
414 void optimizationHintsChanged(QAbstract3DGraph::OptimizationHints hints);
415 void polarChanged(bool enabled);
416 void radialLabelOffsetChanged(float offset);
417 void reflectionChanged(bool enabled);
418 void reflectivityChanged(qreal reflectivity);
419 void localeChanged(const QLocale &locale);
420 void queriedGraphPositionChanged(const QVector3D &data);
421 void marginChanged(qreal margin);
422
423protected:
424 virtual QAbstract3DAxis *createDefaultAxis(QAbstract3DAxis::AxisOrientation orientation);
425 QValue3DAxis *createDefaultValueAxis();
426 QCategory3DAxis *createDefaultCategoryAxis();
427 virtual void startRecordingRemovesAndInserts();
428
429private:
430 void setAxisHelper(QAbstract3DAxis::AxisOrientation orientation, QAbstract3DAxis *axis,
431 QAbstract3DAxis **axisPtr);
432
433 friend class AbstractDeclarative;
434 friend class Bars3DController;
435 friend class QAbstract3DGraphPrivate;
436};
437
438QT_END_NAMESPACE_DATAVISUALIZATION
439
440#endif
441

source code of qtdatavis3d/src/datavisualization/engine/abstract3dcontroller_p.h