diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-12-20 10:56:59 +0200 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2014-01-07 08:10:13 +0200 |
commit | aa842c39480aa5b95f704c97b8b3acc821144883 (patch) | |
tree | 8a1e90e1fe1d6d85054286e655cb2e1722d758eb /src/datavisualization/engine | |
parent | 91a94a743b4cfd30ef77aa73837050d44620469b (diff) |
Fix theme ownership
Theme ownership now uses similar model as axis and inputhandler
ownership: Graph can own multiple themes, but only one is active
at the time.
Task-number: QTRD-2623
Change-Id: I7134384df6f8cc465cc28fbebb454b7d2e254f83
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
Diffstat (limited to 'src/datavisualization/engine')
-rw-r--r-- | src/datavisualization/engine/abstract3dcontroller.cpp | 41 | ||||
-rw-r--r-- | src/datavisualization/engine/abstract3dcontroller_p.h | 9 | ||||
-rw-r--r-- | src/datavisualization/engine/bars3dcontroller.cpp | 2 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dbars.cpp | 19 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dbars.h | 6 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dscatter.cpp | 19 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dscatter.h | 7 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dsurface.cpp | 19 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dsurface.h | 6 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dwindow.cpp | 60 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dwindow.h | 11 |
11 files changed, 109 insertions, 90 deletions
diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 9835dbe4..500ce9dc 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -52,7 +52,7 @@ Abstract3DController::Abstract3DController(QRect initialViewport, QObject *paren m_renderPending(false) { // Set initial theme - setTheme(new Q3DTheme(Q3DTheme::ThemeQt)); + setActiveTheme(new Q3DTheme(Q3DTheme::ThemeQt)); m_scene->d_ptr->setViewport(initialViewport); @@ -102,7 +102,7 @@ void Abstract3DController::addSeries(QAbstract3DSeries *series) this, &Abstract3DController::handleSeriesVisibilityChanged); if (series->isVisible()) handleSeriesVisibilityChangedBySender(series); - series->d_ptr->resetToTheme(*m_themeManager->theme(), oldSize, false); + series->d_ptr->resetToTheme(*m_themeManager->activeTheme(), oldSize, false); } } @@ -135,7 +135,7 @@ void Abstract3DController::synchDataToRenderer() m_renderer->updateScene(m_scene); - m_renderer->updateTheme(m_themeManager->theme()); + m_renderer->updateTheme(m_themeManager->activeTheme()); if (m_changeTracker.shadowQualityChanged) { m_renderer->updateShadowQuality(m_shadowQuality); @@ -595,22 +595,43 @@ void Abstract3DController::setZoomLevel(int zoomLevel) emitNeedRender(); } -void Abstract3DController::setTheme(Q3DTheme *theme) +void Abstract3DController::addTheme(Q3DTheme *theme) { - if (theme != m_themeManager->theme()) { - m_themeManager->setTheme(theme); + m_themeManager->addTheme(theme); +} + +void Abstract3DController::releaseTheme(Q3DTheme *theme) +{ + Q3DTheme *oldTheme = m_themeManager->activeTheme(); + + m_themeManager->releaseTheme(theme); + + if (oldTheme != m_themeManager->activeTheme()) + emit activeThemeChanged(m_themeManager->activeTheme()); +} +QList<Q3DTheme *> Abstract3DController::themes() const +{ + return m_themeManager->themes(); +} + +void Abstract3DController::setActiveTheme(Q3DTheme *theme) +{ + if (theme != m_themeManager->activeTheme()) { + m_themeManager->setActiveTheme(theme); m_changeTracker.themeChanged = true; + // Default theme can be created by theme manager, so ensure we have correct theme + Q3DTheme *newActiveTheme = m_themeManager->activeTheme(); // Reset all attached series to the new theme for (int i = 0; i < m_seriesList.size(); i++) - m_seriesList.at(i)->d_ptr->resetToTheme(*theme, i, true); + m_seriesList.at(i)->d_ptr->resetToTheme(*newActiveTheme, i, true); markSeriesVisualsDirty(); - emit themeChanged(theme); + emit activeThemeChanged(newActiveTheme); } } -Q3DTheme *Abstract3DController::theme() const +Q3DTheme *Abstract3DController::activeTheme() const { - return m_themeManager->theme(); + return m_themeManager->activeTheme(); } void Abstract3DController::setSelectionMode(QDataVis::SelectionFlags mode) diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index c56b8a72..a862a961 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -191,8 +191,11 @@ public: virtual int zoomLevel(); virtual void setZoomLevel(int zoomLevel); - virtual void setTheme(Q3DTheme *theme); - virtual Q3DTheme *theme() const; + virtual void addTheme(Q3DTheme *theme); + virtual void releaseTheme(Q3DTheme *theme); + virtual void setActiveTheme(Q3DTheme *theme); + virtual Q3DTheme *activeTheme() const; + virtual QList<Q3DTheme *> themes() const; virtual void setSelectionMode(QDataVis::SelectionFlags mode); virtual QDataVis::SelectionFlags selectionMode() const; @@ -253,7 +256,7 @@ public slots: signals: void shadowQualityChanged(QDataVis::ShadowQuality quality); void activeInputHandlerChanged(QAbstract3DInputHandler *inputHandler); - void themeChanged(Q3DTheme *theme); + void activeThemeChanged(Q3DTheme *activeTheme); void selectionModeChanged(QDataVis::SelectionFlags mode); void needRender(); diff --git a/src/datavisualization/engine/bars3dcontroller.cpp b/src/datavisualization/engine/bars3dcontroller.cpp index 5232a566..007fdffc 100644 --- a/src/datavisualization/engine/bars3dcontroller.cpp +++ b/src/datavisualization/engine/bars3dcontroller.cpp @@ -72,7 +72,7 @@ void Bars3DController::initializeOpenGL() void Bars3DController::synchDataToRenderer() { // Background change requires reloading the meshes in bar graphs, so dirty the series visuals - if (m_themeManager->theme()->d_ptr->m_dirtyBits.backgroundEnabledDirty) { + if (m_themeManager->activeTheme()->d_ptr->m_dirtyBits.backgroundEnabledDirty) { m_isSeriesVisualsDirty = true; foreach (QAbstract3DSeries *series, m_seriesList) series->d_ptr->m_changeTracker.meshChanged = true; diff --git a/src/datavisualization/engine/q3dbars.cpp b/src/datavisualization/engine/q3dbars.cpp index d4e97519..530235f2 100644 --- a/src/datavisualization/engine/q3dbars.cpp +++ b/src/datavisualization/engine/q3dbars.cpp @@ -108,8 +108,6 @@ Q3DBars::Q3DBars(QWindow *parent) &Q3DBars::selectionModeChanged); QObject::connect(dptr()->m_shared, &Abstract3DController::shadowQualityChanged, this, &Q3DBars::shadowQualityChanged); - QObject::connect(dptr()->m_shared, &Abstract3DController::themeChanged, this, - &Q3DBars::themeChanged); QObject::connect(dptr()->m_shared, &Abstract3DController::needRender, d_ptr.data(), &Q3DWindowPrivate::renderLater); QObject::connect(dptr()->m_shared, &Abstract3DController::shadowQualityChanged, dptr(), @@ -272,23 +270,6 @@ bool Q3DBars::isBarSpacingRelative() } /*! - * \property Q3DBars::theme - * - * A \a theme to be used for the graph. Ownership of the \a theme is transferred. Previous theme - * is deleted when a new one is set. Properties of the \a theme can be modified even after setting - * it, and the modifications take effect immediately. - */ -void Q3DBars::setTheme(Q3DTheme *theme) -{ - dptr()->m_shared->setTheme(theme); -} - -Q3DTheme *Q3DBars::theme() const -{ - return dptrc()->m_shared->theme(); -} - -/*! * \property Q3DBars::selectionMode * * Sets bar selection \a mode to a combination of \c QDataVis::SelectionFlags. It is preset to diff --git a/src/datavisualization/engine/q3dbars.h b/src/datavisualization/engine/q3dbars.h index add3b11b..fac9558f 100644 --- a/src/datavisualization/engine/q3dbars.h +++ b/src/datavisualization/engine/q3dbars.h @@ -21,7 +21,6 @@ #include <QtDataVisualization/qdatavisualizationenums.h> #include <QtDataVisualization/q3dwindow.h> -#include <QtDataVisualization/q3dtheme.h> #include <QFont> #include <QLinearGradient> @@ -42,7 +41,6 @@ class QT_DATAVISUALIZATION_EXPORT Q3DBars : public Q3DWindow Q_PROPERTY(float barThickness READ barThickness WRITE setBarThickness NOTIFY barThicknessChanged) Q_PROPERTY(QSizeF barSpacing READ barSpacing WRITE setBarSpacing NOTIFY barSpacingChanged) Q_PROPERTY(bool barSpacingRelative READ isBarSpacingRelative WRITE setBarSpacingRelative NOTIFY barSpacingRelativeChanged) - Q_PROPERTY(Q3DTheme* theme READ theme WRITE setTheme NOTIFY themeChanged) Q_PROPERTY(Q3DScene* scene READ scene) public: @@ -53,9 +51,6 @@ public: void removeSeries(QBar3DSeries *series); QList<QBar3DSeries *> seriesList(); - void setTheme(Q3DTheme *theme); - Q3DTheme *theme() const; - void setBarThickness(float thicknessRatio); float barThickness(); @@ -89,7 +84,6 @@ signals: void barThicknessChanged(float thicknessRatio); void barSpacingChanged(QSizeF spacing); void barSpacingRelativeChanged(bool relative); - void themeChanged(Q3DTheme *theme); protected: diff --git a/src/datavisualization/engine/q3dscatter.cpp b/src/datavisualization/engine/q3dscatter.cpp index 3c28b4a5..13b22df4 100644 --- a/src/datavisualization/engine/q3dscatter.cpp +++ b/src/datavisualization/engine/q3dscatter.cpp @@ -92,8 +92,6 @@ Q3DScatter::Q3DScatter(QWindow *parent) &Q3DScatter::selectionModeChanged); QObject::connect(dptr()->m_shared, &Abstract3DController::shadowQualityChanged, this, &Q3DScatter::shadowQualityChanged); - QObject::connect(dptr()->m_shared, &Abstract3DController::themeChanged, this, - &Q3DScatter::themeChanged); QObject::connect(dptr()->m_shared, &Abstract3DController::needRender, d_ptr.data(), &Q3DWindowPrivate::renderLater); QObject::connect(dptr()->m_shared, &Abstract3DController::shadowQualityChanged, dptr(), @@ -192,23 +190,6 @@ const Q3DScatterPrivate *Q3DScatter::dptrc() const } /*! - * \property Q3DScatter::theme - * - * A \a theme to be used for the graph. Ownership of the \a theme is transferred. Previous theme - * is deleted when a new one is set. Properties of the \a theme can be modified even after setting - * it, and the modifications take effect immediately. - */ -void Q3DScatter::setTheme(Q3DTheme *theme) -{ - dptr()->m_shared->setTheme(theme); -} - -Q3DTheme *Q3DScatter::theme() const -{ - return dptrc()->m_shared->theme(); -} - -/*! * \property Q3DScatter::selectionMode * * Sets item selection \a mode to a combination of \c QDataVis::SelectionFlags. It is preset to diff --git a/src/datavisualization/engine/q3dscatter.h b/src/datavisualization/engine/q3dscatter.h index e58146a1..f71b469e 100644 --- a/src/datavisualization/engine/q3dscatter.h +++ b/src/datavisualization/engine/q3dscatter.h @@ -22,7 +22,6 @@ #include <QtDataVisualization/qdatavisualizationenums.h> #include <QtDataVisualization/q3dwindow.h> #include <QtDataVisualization/q3dscene.h> -#include <QtDataVisualization/q3dtheme.h> #include <QFont> #include <QLinearGradient> @@ -33,14 +32,12 @@ class LabelItem; class Q3DValueAxis; class Q3DCategoryAxis; class QScatter3DSeries; -class Q3DTheme; class QT_DATAVISUALIZATION_EXPORT Q3DScatter : public Q3DWindow { Q_OBJECT Q_PROPERTY(QtDataVisualization::QDataVis::SelectionFlags selectionMode READ selectionMode WRITE setSelectionMode NOTIFY selectionModeChanged) Q_PROPERTY(QtDataVisualization::QDataVis::ShadowQuality shadowQuality READ shadowQuality WRITE setShadowQuality NOTIFY shadowQualityChanged) - Q_PROPERTY(Q3DTheme* theme READ theme WRITE setTheme NOTIFY themeChanged) Q_PROPERTY(Q3DScene* scene READ scene) public: @@ -51,9 +48,6 @@ public: void removeSeries(QScatter3DSeries *series); QList<QScatter3DSeries *> seriesList(); - void setTheme(Q3DTheme *theme); - Q3DTheme *theme() const; - void setSelectionMode(QDataVis::SelectionFlags mode); QDataVis::SelectionFlags selectionMode() const; @@ -75,7 +69,6 @@ public: signals: void selectionModeChanged(QDataVis::SelectionFlags mode); void shadowQualityChanged(QDataVis::ShadowQuality quality); - void themeChanged(Q3DTheme* theme); protected: void mouseDoubleClickEvent(QMouseEvent *event); diff --git a/src/datavisualization/engine/q3dsurface.cpp b/src/datavisualization/engine/q3dsurface.cpp index ce738685..feb2ef22 100644 --- a/src/datavisualization/engine/q3dsurface.cpp +++ b/src/datavisualization/engine/q3dsurface.cpp @@ -103,8 +103,6 @@ Q3DSurface::Q3DSurface(QWindow *parent) dptr()->m_shared->initializeOpenGL(); QObject::connect(dptr()->m_shared, &Abstract3DController::selectionModeChanged, this, &Q3DSurface::selectionModeChanged); - QObject::connect(dptr()->m_shared, &Abstract3DController::themeChanged, this, - &Q3DSurface::themeChanged); QObject::connect(dptr()->m_shared, &Abstract3DController::shadowQualityChanged, this, &Q3DSurface::shadowQualityChanged); QObject::connect(dptr()->m_shared, &Abstract3DController::needRender, d_ptr.data(), @@ -205,23 +203,6 @@ const Q3DSurfacePrivate *Q3DSurface::dptrc() const } /*! - * \property Q3DSurface::theme - * - * A \a theme to be used for the graph. Ownership of the \a theme is transferred. Previous theme - * is deleted when a new one is set. Properties of the \a theme can be modified even after setting - * it, and the modifications take effect immediately. - */ -void Q3DSurface::setTheme(Q3DTheme *theme) -{ - dptr()->m_shared->setTheme(theme); -} - -Q3DTheme *Q3DSurface::theme() const -{ - return dptrc()->m_shared->theme(); -} - -/*! * \property Q3DSurface::shadowQuality * * Sets shadow \a quality to one of \c QDataVis::ShadowQuality. It is preset to diff --git a/src/datavisualization/engine/q3dsurface.h b/src/datavisualization/engine/q3dsurface.h index bdbe65f5..b91854d5 100644 --- a/src/datavisualization/engine/q3dsurface.h +++ b/src/datavisualization/engine/q3dsurface.h @@ -29,13 +29,11 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE class Q3DSurfacePrivate; class Q3DValueAxis; class QSurface3DSeries; -class Q3DTheme; class QT_DATAVISUALIZATION_EXPORT Q3DSurface : public Q3DWindow { Q_OBJECT Q_PROPERTY(QtDataVisualization::QDataVis::SelectionFlags selectionMode READ selectionMode WRITE setSelectionMode NOTIFY selectionModeChanged) - Q_PROPERTY(Q3DTheme* theme READ theme WRITE setTheme NOTIFY themeChanged) Q_PROPERTY(QtDataVisualization::QDataVis::ShadowQuality shadowQuality READ shadowQuality WRITE setShadowQuality NOTIFY shadowQualityChanged) Q_PROPERTY(Q3DScene* scene READ scene) @@ -47,9 +45,6 @@ public: void removeSeries(QSurface3DSeries *series); QList<QSurface3DSeries *> seriesList(); - void setTheme(Q3DTheme *theme); - Q3DTheme *theme() const; - void setShadowQuality(QDataVis::ShadowQuality quality); QDataVis::ShadowQuality shadowQuality() const; @@ -71,7 +66,6 @@ public: signals: void selectionModeChanged(QDataVis::SelectionFlags mode); - void themeChanged(Q3DTheme *theme); void shadowQualityChanged(QDataVis::ShadowQuality quality); protected: diff --git a/src/datavisualization/engine/q3dwindow.cpp b/src/datavisualization/engine/q3dwindow.cpp index 5285b585..6bf7da5e 100644 --- a/src/datavisualization/engine/q3dwindow.cpp +++ b/src/datavisualization/engine/q3dwindow.cpp @@ -92,6 +92,10 @@ Q3DWindow::Q3DWindow(Q3DWindowPrivate *d, QWindow *parent) if (splitversionstr[0].toFloat() < 1.2) qFatal("GLSL version must be 1.20 or higher. Try installing latest display drivers."); #endif + + QObject::connect(d_ptr->m_visualController, &Abstract3DController::activeThemeChanged, this, + &Q3DWindow::activeThemeChanged); + d_ptr->renderLater(); } @@ -149,6 +153,62 @@ QAbstract3DInputHandler *Q3DWindow::activeInputHandler() } /*! + * Adds the given \a theme to the graph. The themes added via addTheme are not taken in to use + * directly. Only the ownership of the a\ theme is given to the graph. + * The \a theme must not be null or already added to another graph. + * + * \sa releaseTheme(), setActiveTheme() + */ +void Q3DWindow::addTheme(Q3DTheme *theme) +{ + d_ptr->m_visualController->addTheme(theme); +} + +/*! + * Releases the ownership of the \a theme back to the caller, if it was added to this graph. + * If the released \a theme is in use, a new default theme will be created and set active. + * + * If the default theme is released and added back later, it behaves as any other theme would. + * + * \sa addTheme(), setActiveTheme() + */ +void Q3DWindow::releaseTheme(Q3DTheme *theme) +{ + d_ptr->m_visualController->releaseTheme(theme); +} + +/*! + * \property Q3DWindow::activeTheme + * + * The active \a theme to be used for the graph. Implicitly calls addTheme() to transfer ownership + * of the \a theme to this graph. + * If the \a theme is null, a temporary default theme is created. This temporary theme is destroyed + * if any theme is explicitly set later. + * Properties of the \a theme can be modified even after setting it, and the modifications take + * effect immediately. + */ +void Q3DWindow::setActiveTheme(Q3DTheme *theme) +{ + d_ptr->m_visualController->setActiveTheme(theme); +} + + +Q3DTheme *Q3DWindow::activeTheme() const +{ + return d_ptr->m_visualController->activeTheme(); +} + +/*! + * \return list of all added themes. + * + * \sa addTheme() + */ +QList<Q3DTheme *> Q3DWindow::themes() const +{ + return d_ptr->m_visualController->themes(); +} + +/*! * \internal */ bool Q3DWindow::event(QEvent *event) diff --git a/src/datavisualization/engine/q3dwindow.h b/src/datavisualization/engine/q3dwindow.h index cdffc6b9..18542868 100644 --- a/src/datavisualization/engine/q3dwindow.h +++ b/src/datavisualization/engine/q3dwindow.h @@ -32,10 +32,12 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE class Q3DWindowPrivate; class Abstract3DController; class QAbstract3DInputHandler; +class Q3DTheme; class QT_DATAVISUALIZATION_EXPORT Q3DWindow : public QWindow, protected QOpenGLFunctions { Q_OBJECT + Q_PROPERTY(Q3DTheme* activeTheme READ activeTheme WRITE setActiveTheme NOTIFY activeThemeChanged) protected: explicit Q3DWindow(Q3DWindowPrivate *d, QWindow *parent = 0); @@ -47,11 +49,20 @@ public: void setActiveInputHandler(QAbstract3DInputHandler *inputHandler); QAbstract3DInputHandler *activeInputHandler(); + void addTheme(Q3DTheme *theme); + void releaseTheme(Q3DTheme *theme); + void setActiveTheme(Q3DTheme *theme); + Q3DTheme *activeTheme() const; + QList<Q3DTheme *> themes() const; + protected: bool event(QEvent *event); void resizeEvent(QResizeEvent *event); void exposeEvent(QExposeEvent *event); +signals: + void activeThemeChanged(Q3DTheme *theme); + private: QScopedPointer<Q3DWindowPrivate> d_ptr; |