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 55 QT_FORWARD_DECLARE_CLASS(QOpenGLFramebufferObject) 56 57 QT_BEGIN_NAMESPACE_DATAVISUALIZATION 58 59 class Abstract3DRenderer; 60 class QAbstract3DSeries; 61 class ThemeManager; 62 63 struct 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 Abstract3DChangeBitFieldAbstract3DChangeBitField113 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 166 class QT_DATAVISUALIZATION_EXPORT Abstract3DController : public QObject 167 { 168 Q_OBJECT 169 170 public: 171 enum SelectionType { 172 SelectionNone = 0, 173 SelectionItem, 174 SelectionRow, 175 SelectionColumn 176 }; 177 178 private: 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 192 protected: 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 231 public: 232 virtual ~Abstract3DController(); 233 isInitialized()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); measureFps()304 inline bool measureFps() const { return m_measureFps; } currentFps()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 366 public 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 399 Q_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 423 protected: 424 virtual QAbstract3DAxis *createDefaultAxis(QAbstract3DAxis::AxisOrientation orientation); 425 QValue3DAxis *createDefaultValueAxis(); 426 QCategory3DAxis *createDefaultCategoryAxis(); 427 virtual void startRecordingRemovesAndInserts(); 428 429 private: 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 438 QT_END_NAMESPACE_DATAVISUALIZATION 439 440 #endif 441