diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-11-15 12:48:13 +0200 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-11-20 09:34:06 +0200 |
commit | 51d4a9fcba6089ba433ae126f554b50979220d07 (patch) | |
tree | 5ffdabb461efc3989224226b600a649d395ef80a /src/datavisualization/engine | |
parent | 96995bda0da7ecf99d2ac4a4e417545c3506bf02 (diff) |
Multi series selection part 1: bars
Task-number: QTRD-2556
Change-Id: I1f537f0b4c299028d4415f074d5eac6552bb3b9b
Reviewed-by: Pasi Keränen <pasi.keranen@digia.com>
Diffstat (limited to 'src/datavisualization/engine')
17 files changed, 334 insertions, 173 deletions
diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 625794a5..7f87ac7c 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -51,6 +51,7 @@ Abstract3DController::Abstract3DController(QRect boundRect, QObject *parent) : m_axisZ(0), m_renderer(0), m_isDataDirty(true), + m_isSeriesDirty(true), m_renderPending(false) { // Set initial theme @@ -96,6 +97,8 @@ void Abstract3DController::addSeries(QAbstract3DSeries *series) if (series && !m_seriesList.contains(series)) { m_seriesList.append(series); series->d_ptr->setController(this); + if (series->isVisible()) + handleSeriesVisibilityChangedBySender(series); } } @@ -104,6 +107,9 @@ void Abstract3DController::removeSeries(QAbstract3DSeries *series) if (series && series->d_ptr->m_controller == this) { m_seriesList.removeAll(series); series->d_ptr->setController(0); + m_isDataDirty = true; + m_isSeriesDirty = true; + emitNeedRender(); } } @@ -353,9 +359,15 @@ void Abstract3DController::synchDataToRenderer() } } - // TODO: Another (per-series?) flag about series visuals being dirty? + if (m_isSeriesDirty) { + m_renderer->updateSeries(m_seriesList); + m_isSeriesDirty = false; + } + if (m_isDataDirty) { - m_renderer->updateSeriesData(m_seriesList); + // Series list supplied above in updateSeries() is used to access the data, + // so no data needs to be passed in updateData() + m_renderer->updateData(); m_isDataDirty = false; } } @@ -1086,6 +1098,7 @@ void Abstract3DController::handleSeriesVisibilityChangedBySender(QObject *sender Q_UNUSED(sender) m_isDataDirty = true; + m_isSeriesDirty = true; emitNeedRender(); } diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index 6f7112b7..c86f9672 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -194,6 +194,7 @@ protected: QList<Q3DAbstractAxis *> m_axes; // List of all added axes Abstract3DRenderer *m_renderer; bool m_isDataDirty; + bool m_isSeriesDirty; bool m_renderPending; QList<QAbstract3DSeries *> m_seriesList; @@ -306,7 +307,7 @@ public: Q3DScene *scene(); - inline void setDataDirty() { m_isDataDirty = true; } + inline void setSeriesDirty() { m_isSeriesDirty = true; } void emitNeedRender(); virtual void mouseDoubleClickEvent(QMouseEvent *event); diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 1446d39a..0f1349d1 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -143,11 +143,6 @@ QString Abstract3DRenderer::generateValueLabel(const QString &format, qreal valu return Utils::formatLabel(valueFormatArray, valueParamType, value); } -QString Abstract3DRenderer::itemLabelFormat() const -{ - return m_cachedItemLabelFormat; -} - void Abstract3DRenderer::updateSelectionState(SelectionState state) { m_selectionState = state; @@ -394,11 +389,22 @@ void Abstract3DRenderer::updateMultiHighlightGradient(const QLinearGradient &gra fixGradient(&m_cachedMultiHighlightGradient, &m_multiHighlightGradientTexture); } -void Abstract3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &seriesList) +void Abstract3DRenderer::updateSeries(const QList<QAbstract3DSeries *> &seriesList) { - // TODO: To series visuals update - just use first series format for now - if (seriesList.size()) - m_cachedItemLabelFormat = seriesList.at(0)->itemLabelFormat(); + int visibleCount = 0; + foreach (QAbstract3DSeries *current, seriesList) { + if (current->isVisible()) + visibleCount++; + } + + if (visibleCount != m_visibleSeriesList.size()) + m_visibleSeriesList.resize(visibleCount); + + visibleCount = 0; + foreach (QAbstract3DSeries *current, seriesList) { + if (current->isVisible()) + m_visibleSeriesList[visibleCount++].populate(current); + } } AxisRenderCache &Abstract3DRenderer::axisCacheForOrientation(Q3DAbstractAxis::AxisOrientation orientation) diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index 24d42e37..1a95aaeb 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -37,6 +37,7 @@ #include "abstract3dcontroller_p.h" #include "axisrendercache_p.h" #include "qabstractdataproxy.h" +#include "seriesrendercache_p.h" //#define DISPLAY_RENDER_SPEED @@ -67,7 +68,6 @@ protected: QDataVis::ShadowQuality m_cachedShadowQuality; GLfloat m_autoScaleAdjustment; - QString m_cachedItemLabelFormat; QString m_cachedObjFile; QDataVis::SelectionFlags m_cachedSelectionMode; bool m_cachedIsGridEnabled; @@ -94,6 +94,7 @@ protected: bool m_selectionDirty; SelectionState m_selectionState; QPoint m_inputPosition; + QVector<SeriesRenderCache> m_visibleSeriesList; #ifdef DISPLAY_RENDER_SPEED bool m_isFirstFrame; @@ -106,7 +107,8 @@ protected: public: virtual ~Abstract3DRenderer(); - virtual void updateSeriesData(const QList<QAbstract3DSeries *> &seriesList); + virtual void updateData() = 0; + virtual void updateSeries(const QList<QAbstract3DSeries *> &seriesList); virtual void render(GLuint defaultFboHandle); @@ -121,7 +123,6 @@ public: virtual void updateBackgroundEnabled(bool enable); virtual void updateMeshFileName(const QString &objFileName); virtual void updateScene(Q3DScene *scene); - virtual QString itemLabelFormat() const; virtual void updateTextures() = 0; virtual void initSelectionBuffer() = 0; virtual void updateSelectionState(SelectionState state); diff --git a/src/datavisualization/engine/bars3dcontroller.cpp b/src/datavisualization/engine/bars3dcontroller.cpp index 019a96be..995633a8 100644 --- a/src/datavisualization/engine/bars3dcontroller.cpp +++ b/src/datavisualization/engine/bars3dcontroller.cpp @@ -33,6 +33,7 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE Bars3DController::Bars3DController(QRect boundRect) : Abstract3DController(boundRect), m_selectedBar(noSelectionPoint()), + m_selectedBarSeries(0), m_isBarSpecRelative(true), m_barThicknessRatio(1.0f), m_barSpacing(QSizeF(1.0, 1.0)), @@ -84,7 +85,7 @@ void Bars3DController::synchDataToRenderer() // Needs to be done after data is set, as it needs to know the visual array. if (m_changeTracker.selectedBarChanged) { - m_renderer->updateSelectedBar(m_selectedBar); + m_renderer->updateSelectedBar(m_selectedBar, m_selectedBarSeries); m_changeTracker.selectedBarChanged = false; } } @@ -94,7 +95,7 @@ void Bars3DController::handleArrayReset() adjustAxisRanges(); m_isDataDirty = true; // Clear selection unless still valid - setSelectedBar(m_selectedBar); + setSelectedBar(m_selectedBar, m_selectedBarSeries); emitNeedRender(); } @@ -124,7 +125,7 @@ void Bars3DController::handleRowsRemoved(int startIndex, int count) m_isDataDirty = true; // Clear selection unless still valid - setSelectedBar(m_selectedBar); + setSelectedBar(m_selectedBar, m_selectedBarSeries); emitNeedRender(); } @@ -176,9 +177,14 @@ void Bars3DController::handleDataColumnLabelsChanged() } } -void Bars3DController::handleBarClicked(const QPoint &position) +void Bars3DController::handleBarClicked(const QPoint &position, QBar3DSeries *series) { - setSelectedBar(position); + // Series may already have been removed, so check it before setting the selection. + if (m_seriesList.contains(series)) + setSelectedBar(position, series); + else + setSelectedBar(noSelectionPoint(), 0); + // TODO: pass clicked to parent. (QTRD-2517) // TODO: Also hover needed? (QTRD-2131) } @@ -191,6 +197,15 @@ void Bars3DController::handleAxisAutoAdjustRangeChangedInOrientation( adjustAxisRanges(); } +void Bars3DController::handleSeriesVisibilityChangedBySender(QObject *sender) +{ + Abstract3DController::handleSeriesVisibilityChangedBySender(sender); + + // Visibility changes may require disabling/enabling slicing, + // so just reset selection to ensure everything is still valid. + setSelectedBar(m_selectedBar, m_selectedBarSeries); +} + QPoint Bars3DController::noSelectionPoint() { static QPoint noSelectionPos(-1, -1); @@ -222,16 +237,20 @@ void Bars3DController::addSeries(QAbstract3DSeries *series) handleDataRowLabelsChanged(); handleDataColumnLabelsChanged(); - - // TODO: Temp until selection by series is properly implemented - setSelectedBar(noSelectionPoint()); } + + QBar3DSeries *barSeries = static_cast<QBar3DSeries *>(series); + if (barSeries->selectedBar() != noSelectionPoint()) + setSelectedBar(barSeries->selectedBar(), barSeries); } void Bars3DController::removeSeries(QAbstract3DSeries *series) { bool firstRemoved = (m_seriesList.size() && m_seriesList.at(0) == series); + if (m_selectedBarSeries == series) + setSelectedBar(noSelectionPoint(), 0); + Abstract3DController::removeSeries(series); if (firstRemoved) { @@ -239,9 +258,6 @@ void Bars3DController::removeSeries(QAbstract3DSeries *series) handleDataRowLabelsChanged(); handleDataColumnLabelsChanged(); - - // TODO: Temp until selection by series is properly implemented - setSelectedBar(noSelectionPoint()); } } @@ -271,7 +287,7 @@ void Bars3DController::handleAxisRangeChangedBySender(QObject *sender) Abstract3DController::handleAxisRangeChangedBySender(sender); // Update selected bar - may be moved offscreen - setSelectedBar(m_selectedBar); + setSelectedBar(m_selectedBar, m_selectedBarSeries); } void Bars3DController::setBarSpecs(GLfloat thicknessRatio, const QSizeF &spacing, bool relative) @@ -325,44 +341,37 @@ void Bars3DController::setSelectionMode(QDataVis::SelectionFlags mode) && (mode.testFlag(QDataVis::SelectionRow) == mode.testFlag(QDataVis::SelectionColumn))) { qWarning("Must specify one of either row or column selection mode in conjunction with slicing mode."); } else { - // When setting selection mode to a new slicing mode, activate slicing - if (mode != selectionMode()) { - bool isSlicing = mode.testFlag(QDataVis::SelectionSlice); - if (isSlicing && m_selectedBar != noSelectionPoint()) - scene()->setSlicingActive(true); - else - scene()->setSlicingActive(false); - } + QDataVis::SelectionFlags oldMode = selectionMode(); Abstract3DController::setSelectionMode(mode); + + if (mode != oldMode) { + // Refresh selection upon mode change to ensure slicing is correctly updated + // according to series the visibility. + setSelectedBar(m_selectedBar, m_selectedBarSeries); + + // Special case: Always deactivate slicing when changing away from slice + // automanagement, as this can't be handled in setSelectedBar. + if (!mode.testFlag(QDataVis::SelectionSlice) + && oldMode.testFlag(QDataVis::SelectionSlice)) { + scene()->setSlicingActive(false); + } + } } } -void Bars3DController::setSelectedBar(const QPoint &position) +void Bars3DController::setSelectedBar(const QPoint &position, QBar3DSeries *series) { // If the selection targets non-existent bar, clear selection instead. QPoint pos = position; - // TODO: Selection needs to be refactored to be handled by series - const QBarDataProxy *proxy = 0; - if (m_seriesList.size()) - proxy = static_cast<QBar3DSeries *>(m_seriesList.at(0))->dataProxy(); - else - return; - - if (pos != noSelectionPoint()) { - int maxRow = proxy->rowCount() - 1; - int maxCol = (pos.x() <= maxRow && pos.x() >= 0 && proxy->rowAt(pos.x())) - ? proxy->rowAt(pos.x())->size() - 1 : -1; - - if (pos.x() < 0 || pos.x() > maxRow || pos.y() < 0 || pos.y() > maxCol) - pos = noSelectionPoint(); - } + adjustSelectionPosition(pos, series); if (selectionMode().testFlag(QDataVis::SelectionSlice)) { - // If the selected bar is outside data window, or there is no selected bar, disable slicing + // If the selected bar is outside data window, or there is no visible selected bar, disable slicing if (pos.x() < m_axisX->min() || pos.x() > m_axisX->max() - || pos.y() < m_axisZ->min() || pos.y() > m_axisZ->max()) { + || pos.y() < m_axisZ->min() || pos.y() > m_axisZ->max() + || !series->isVisible()) { scene()->setSlicingActive(false); } else { scene()->setSlicingActive(true); @@ -370,19 +379,23 @@ void Bars3DController::setSelectedBar(const QPoint &position) emitNeedRender(); } - if (pos != m_selectedBar) { + if (pos != m_selectedBar || series != m_selectedBarSeries) { m_selectedBar = pos; + m_selectedBarSeries = series; m_changeTracker.selectedBarChanged = true; - emit selectedBarChanged(pos); + // Clear selection from other series and set the new selection to the affected series + foreach (QAbstract3DSeries *otherSeries, m_seriesList) { + QBar3DSeries *barSeries = static_cast<QBar3DSeries *>(otherSeries); + if (barSeries != m_selectedBarSeries) + barSeries->dptr()->setSelectedBar(noSelectionPoint()); + else + barSeries->dptr()->setSelectedBar(m_selectedBar); + } + emitNeedRender(); } } -QPoint Bars3DController::selectedBar() const -{ - return m_selectedBar; -} - void Bars3DController::adjustAxisRanges() { if (m_seriesList.size()) { @@ -428,6 +441,26 @@ void Bars3DController::adjustAxisRanges() } } +// Invalidate selection position if outside data for the series +void Bars3DController::adjustSelectionPosition(QPoint &pos, const QBar3DSeries *series) +{ + const QBarDataProxy *proxy = 0; + if (series) + proxy = series->dataProxy(); + + if (!proxy) + pos = noSelectionPoint(); + + if (pos != noSelectionPoint()) { + int maxRow = proxy->rowCount() - 1; + int maxCol = (pos.x() <= maxRow && pos.x() >= 0 && proxy->rowAt(pos.x())) + ? proxy->rowAt(pos.x())->size() - 1 : -1; + + if (pos.x() < 0 || pos.x() > maxRow || pos.y() < 0 || pos.y() > maxCol) + pos = noSelectionPoint(); + } +} + Q3DAbstractAxis *Bars3DController::createDefaultAxis(Q3DAbstractAxis::AxisOrientation orientation) { Q3DAbstractAxis *defaultAxis = 0; diff --git a/src/datavisualization/engine/bars3dcontroller_p.h b/src/datavisualization/engine/bars3dcontroller_p.h index f1eda225..4da6c730 100644 --- a/src/datavisualization/engine/bars3dcontroller_p.h +++ b/src/datavisualization/engine/bars3dcontroller_p.h @@ -61,6 +61,8 @@ private: // Interaction QPoint m_selectedBar; // Points to row & column in data window. + QBar3DSeries *m_selectedBarSeries; // Points to the series for which the bar is selected in + // single series selection cases. // Look'n'feel bool m_isBarSpecRelative; @@ -89,10 +91,10 @@ public: void setBarType(QDataVis::MeshStyle style, bool smooth = false); void setSelectionMode(QDataVis::SelectionFlags mode); - void setSelectedBar(const QPoint &position); - QPoint selectedBar() const; + void setSelectedBar(const QPoint &position, QBar3DSeries *series); virtual void handleAxisAutoAdjustRangeChangedInOrientation(Q3DAbstractAxis::AxisOrientation orientation, bool autoAdjust); + virtual void handleSeriesVisibilityChangedBySender(QObject *sender); static QPoint noSelectionPoint(); @@ -116,16 +118,14 @@ public slots: void handleDataColumnLabelsChanged(); // Renderer callback handlers - void handleBarClicked(const QPoint &position); - -signals: - void selectedBarChanged(QPoint position); + void handleBarClicked(const QPoint &position, QBar3DSeries *series); protected: virtual Q3DAbstractAxis *createDefaultAxis(Q3DAbstractAxis::AxisOrientation orientation); private: void adjustAxisRanges(); + void adjustSelectionPosition(QPoint &pos, const QBar3DSeries *series); Q_DISABLE_COPY(Bars3DController) diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 23932f23..7682f389 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -87,10 +87,11 @@ Bars3DRenderer::Bars3DRenderer(Bars3DController *controller) m_scaleFactor(0), m_maxSceneSize(40.0f), m_visualSelectedBarPos(Bars3DController::noSelectionPoint()), + m_visualSelectedBarSeriesIndex(-1), m_hasHeightAdjustmentChanged(true), m_selectedBarPos(Bars3DController::noSelectionPoint()), + m_selectedBarSeries(0), m_noZeroInRange(false), - m_seriesCount(0), m_seriesScale(0.0f), m_seriesStep(0.0f), m_seriesStart(0.0f) @@ -151,15 +152,9 @@ void Bars3DRenderer::initializeOpenGL() loadBackgroundMesh(); } -void Bars3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &seriesList) +void Bars3DRenderer::updateData() { - QList<QBar3DSeries *> visibleSeries; - foreach (QAbstract3DSeries *current, seriesList) { - if (current->isVisible()) - visibleSeries.append(static_cast<QBar3DSeries *>(current)); - } - - int seriesCount = visibleSeries.size(); + int seriesCount = m_visibleSeriesList.size(); int minRow = m_axisCacheX.min(); int maxRow = m_axisCacheX.max(); int minCol = m_axisCacheZ.min(); @@ -168,13 +163,13 @@ void Bars3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &seriesLi int newColumns = maxCol - minCol + 1; int updateSize = 0; int dataRowCount = 0; + int maxDataRowCount = 0; - if (m_seriesCount != seriesCount) { - m_seriesCount = seriesCount; - m_renderingArrays.resize(m_seriesCount); - m_seriesScale = 1.0f / float(m_seriesCount); - m_seriesStep = 1.0f / float(m_seriesCount); - m_seriesStart = -((float(m_seriesCount) - 1.0f) / 2.0f) * m_seriesStep; + if (m_renderingArrays.size() != seriesCount) { + m_renderingArrays.resize(seriesCount); + m_seriesScale = 1.0f / float(seriesCount); + m_seriesStep = 1.0f / float(seriesCount); + m_seriesStart = -((float(seriesCount) - 1.0f) / 2.0f) * m_seriesStep; } if (m_cachedRowCount != newRows || m_cachedColumnCount != newColumns) { @@ -194,7 +189,7 @@ void Bars3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &seriesLi calculateSceneScalingFactors(); } - for (int series = 0; series < m_seriesCount; series++) { + for (int series = 0; series < seriesCount; series++) { if (newRows != m_renderingArrays.at(series).size() || newColumns != m_renderingArrays.at(series).at(0).size()) { // Destroy old render items and reallocate new array @@ -204,8 +199,11 @@ void Bars3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &seriesLi } // Update cached data window - QBarDataProxy *dataProxy = visibleSeries.at(series)->dataProxy(); + QBarDataProxy *dataProxy = + static_cast<QBar3DSeries *>(m_visibleSeriesList.at(series).series())->dataProxy(); dataRowCount = dataProxy->rowCount(); + if (maxDataRowCount < dataRowCount) + maxDataRowCount = qMin(dataRowCount, newRows); int dataRowIndex = minRow; GLfloat heightValue = 0.0f; for (int i = 0; i < newRows; i++) { @@ -248,14 +246,12 @@ void Bars3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &seriesLi m_renderColumns = updateSize; if (m_renderingArrays.size()) - m_renderRows = qMin((dataRowCount - minRow), newRows); + m_renderRows = qMin((maxDataRowCount - minRow), newRows); else m_renderRows = 0; // Reset selected bar to update selection - updateSelectedBar(m_selectedBarPos); - - Abstract3DRenderer::updateSeriesData(seriesList); + updateSelectedBar(m_selectedBarPos, m_selectedBarSeries); } void Bars3DRenderer::updateScene(Q3DScene *scene) @@ -606,9 +602,16 @@ void Bars3DRenderer::drawSlicedScene(const LabelItem &xLabel, } int labelCount = m_sliceCache->labelItems().size(); + int seriesCount = 1; + if (m_cachedSelectionMode.testFlag(QDataVis::SelectionMultiSeries)) + seriesCount = m_visibleSeriesList.size(); + int adjustment = flipped ? (m_sliceSelection->size() - (labelCount * seriesCount)) : 0; + for (int labelNo = 0; labelNo < labelCount; labelNo++) { // Get labels from first series only - BarRenderItem *item = m_sliceSelection->at(labelNo * m_seriesCount); + // Adjustment is used in flipped cases to fix label positioning in cases when there are + // more actual data rows in the slice than labeled rows + BarRenderItem *item = m_sliceSelection->at(labelNo * seriesCount + adjustment); // TODO: Make user controllable (QTRD-2546) // Draw labels int labelIndex = flipped ? m_sliceCache->labelItems().size() - 1 - labelNo : labelNo; @@ -672,6 +675,8 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) GLfloat colPos = 0; GLfloat rowPos = 0; + int seriesCount = m_visibleSeriesList.size(); + const Q3DCamera *activeCamera = m_cachedScene->activeCamera(); // Specify viewport @@ -777,7 +782,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) for (int bar = startBar; bar != stopBar; bar += stepBar) { GLfloat shadowOffset = 0.0f; float seriesPos = m_seriesStart; - for (int series = 0; series < m_seriesCount; series++) { + for (int series = 0; series < seriesCount; series++) { const BarRenderItem &item = m_renderingArrays.at(series).at(row).at(bar); if (!item.value()) continue; @@ -880,10 +885,12 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) for (int row = startRow; row != stopRow; row += stepRow) { for (int bar = startBar; bar != stopBar; bar += stepBar) { float seriesPos = m_seriesStart; - for (int series = 0; series < m_seriesCount; series++) { + for (int series = 0; series < seriesCount; series++) { const BarRenderItem &item = m_renderingArrays.at(series).at(row).at(bar); - if (!item.value()) + if (!item.value()) { + seriesPos += m_seriesStep; continue; + } if (item.height() < 0) glCullFace(GL_FRONT); @@ -912,7 +919,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) //#else QVector3D barColor = QVector3D((GLdouble)row / 255.0, (GLdouble)bar / 255.0, - 0.0); + (GLdouble)series / 255.0); //#endif m_selectionShader->setUniformValue(m_selectionShader->MVP(), MVPMatrix); @@ -946,7 +953,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) // Read color under cursor QVector3D clickedColor = Utils::getSelection(m_inputPosition, m_cachedBoundingRect.height()); - emit barClicked(selectionColorToArrayPosition(clickedColor)); + emit barClicked(selectionColorToArrayPosition(clickedColor), selectionColorToSeries(clickedColor)); glBindFramebuffer(GL_FRAMEBUFFER, defaultFboHandle); @@ -990,7 +997,6 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) gradientTexture = m_objectGradientTexture; } - // TODO: Can't call back to controller here! (QTRD-2216) if (m_selectionDirty) { if (m_cachedIsSlicingActivated) { if (m_sliceSelection && m_sliceSelection->size()) { @@ -1017,12 +1023,13 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) bool barSelectionFound = false; BarRenderItem *selectedBar(0); + QVector3D modelScaler(m_scaleX * m_seriesScale, 0.0f, m_scaleZ); bool somethingSelected = (m_visualSelectedBarPos != Bars3DController::noSelectionPoint()); for (int row = startRow; row != stopRow; row += stepRow) { for (int bar = startBar; bar != stopBar; bar += stepBar) { float seriesPos = m_seriesStart; - for (int series = 0; series < m_seriesCount; series++) { + for (int series = 0; series < seriesCount; series++) { BarRenderItem &item = m_renderingArrays[series][row][bar]; if (item.height() < 0) @@ -1060,7 +1067,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) if (m_cachedSelectionMode > QDataVis::SelectionNone) { Bars3DController::SelectionType selectionType = Bars3DController::SelectionNone; if (somethingSelected) - selectionType = isSelected(row, bar); + selectionType = isSelected(row, bar, series); switch (selectionType) { case Bars3DController::SelectionItem: { @@ -1072,7 +1079,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) lightStrength = m_cachedTheme.m_highlightLightStrength; shadowLightStrength = adjustedHighlightStrength; // Insert position data into render item. We have no ownership, don't delete the previous one - if (!m_cachedIsSlicingActivated) { + if (!m_cachedIsSlicingActivated && m_visualSelectedBarSeriesIndex == series) { selectedBar = &item; selectedBar->setPosition(QPoint(row, bar)); item.setTranslation(modelMatrix.column(3).toVector3D()); @@ -1081,7 +1088,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) if (m_selectionDirty && m_cachedIsSlicingActivated) { QVector3D translation = modelMatrix.column(3).toVector3D(); if (m_cachedSelectionMode & QDataVis::SelectionColumn - && m_seriesCount > 1) { + && seriesCount > 1) { translation.setZ((m_columnDepth - ((row + 0.5f + seriesPos) * (m_cachedBarSpacing.height()))) / m_scaleFactor); @@ -1124,7 +1131,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) shadowLightStrength = adjustedHighlightStrength; if (m_cachedIsSlicingActivated) { QVector3D translation = modelMatrix.column(3).toVector3D(); - if (m_seriesCount > 1) { + if (seriesCount > 1) { translation.setZ((m_columnDepth - ((row + 0.5f + seriesPos) * (m_cachedBarSpacing.height()))) / m_scaleFactor); @@ -1712,7 +1719,9 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) static const QString valueLabelTag(QStringLiteral("@valueLabel")); // Custom format expects printf format specifier. There is no tag for it. - labelText = generateValueLabel(itemLabelFormat(), selectedBar->value()); + labelText = generateValueLabel( + m_visibleSeriesList[m_visualSelectedBarSeriesIndex].itemLabelFormat(), + selectedBar->value()); int selBarPosX = selectedBar->position().x(); int selBarPosY = selectedBar->position().y(); @@ -1829,13 +1838,15 @@ void Bars3DRenderer::updateBackgroundEnabled(bool enable) } } -void Bars3DRenderer::updateSelectedBar(const QPoint &position) +void Bars3DRenderer::updateSelectedBar(const QPoint &position, const QBar3DSeries *series) { m_selectedBarPos = position; + m_selectedBarSeries = series; m_selectionDirty = true; if (m_renderingArrays.isEmpty()) { m_visualSelectedBarPos = Bars3DController::noSelectionPoint(); + m_visualSelectedBarSeriesIndex = -1; return; } @@ -1844,6 +1855,14 @@ void Bars3DRenderer::updateSelectedBar(const QPoint &position) int maxX = m_renderingArrays.at(0).size() - 1; int maxZ = maxX >= 0 ? m_renderingArrays.at(0).at(0).size() - 1 : -1; + m_visualSelectedBarSeriesIndex = -1; + for (int i = 0; i < m_visibleSeriesList.size(); i++) { + if (m_visibleSeriesList.at(i).series() == series) { + m_visualSelectedBarSeriesIndex = i; + break; + } + } + if (m_selectedBarPos == Bars3DController::noSelectionPoint() || adjustedX < 0 || adjustedX > maxX || adjustedZ < 0 || adjustedZ > maxZ) { @@ -1983,20 +2002,25 @@ void Bars3DRenderer::calculateHeightAdjustment() } } -Bars3DController::SelectionType Bars3DRenderer::isSelected(GLint row, GLint bar) +Bars3DController::SelectionType Bars3DRenderer::isSelected(int row, int bar, int seriesIndex) { Bars3DController::SelectionType isSelectedType = Bars3DController::SelectionNone; - if (row == m_visualSelectedBarPos.x() && bar == m_visualSelectedBarPos.y() - && (m_cachedSelectionMode.testFlag(QDataVis::SelectionItem))) { - isSelectedType = Bars3DController::SelectionItem; - } else if (row == m_visualSelectedBarPos.x() - && (m_cachedSelectionMode.testFlag(QDataVis::SelectionRow))) { - isSelectedType = Bars3DController::SelectionRow; - } else if (bar == m_visualSelectedBarPos.y() - && (m_cachedSelectionMode.testFlag(QDataVis::SelectionColumn))) { - isSelectedType = Bars3DController::SelectionColumn; + if ((m_cachedSelectionMode.testFlag(QDataVis::SelectionMultiSeries) + && m_visualSelectedBarSeriesIndex >= 0) + || seriesIndex == m_visualSelectedBarSeriesIndex) { + if (row == m_visualSelectedBarPos.x() && bar == m_visualSelectedBarPos.y() + && (m_cachedSelectionMode.testFlag(QDataVis::SelectionItem))) { + isSelectedType = Bars3DController::SelectionItem; + } else if (row == m_visualSelectedBarPos.x() + && (m_cachedSelectionMode.testFlag(QDataVis::SelectionRow))) { + isSelectedType = Bars3DController::SelectionRow; + } else if (bar == m_visualSelectedBarPos.y() + && (m_cachedSelectionMode.testFlag(QDataVis::SelectionColumn))) { + isSelectedType = Bars3DController::SelectionColumn; + } } + return isSelectedType; } @@ -2012,6 +2036,14 @@ QPoint Bars3DRenderer::selectionColorToArrayPosition(const QVector3D &selectionC return position; } +QBar3DSeries *Bars3DRenderer::selectionColorToSeries(const QVector3D &selectionColor) +{ + if (selectionColor == selectionSkipColor) + return 0; + else + return static_cast<QBar3DSeries *>(m_visibleSeriesList.at(int(selectionColor.z())).series()); +} + void Bars3DRenderer::updateSlicingActive(bool isSlicing) { if (isSlicing == m_cachedIsSlicingActivated) diff --git a/src/datavisualization/engine/bars3drenderer_p.h b/src/datavisualization/engine/bars3drenderer_p.h index 5424c096..08db5e06 100644 --- a/src/datavisualization/engine/bars3drenderer_p.h +++ b/src/datavisualization/engine/bars3drenderer_p.h @@ -96,15 +96,16 @@ private: GLfloat m_scaleZ; GLfloat m_scaleFactor; GLfloat m_maxSceneSize; - QPoint m_visualSelectedBarPos; // The selection id color + QPoint m_visualSelectedBarPos; + int m_visualSelectedBarSeriesIndex; int m_renderRows; int m_renderColumns; bool m_hasHeightAdjustmentChanged; QPoint m_selectedBarPos; + const QBar3DSeries *m_selectedBarSeries; BarRenderItem m_dummyBarRenderItem; QVector<BarRenderItemArray> m_renderingArrays; bool m_noZeroInRange; - int m_seriesCount; float m_seriesScale; float m_seriesStep; float m_seriesStart; @@ -113,7 +114,7 @@ public: explicit Bars3DRenderer(Bars3DController *controller); ~Bars3DRenderer(); - void updateSeriesData(const QList<QAbstract3DSeries *> &seriesList); + void updateData(); void updateScene(Q3DScene *scene); void render(GLuint defaultFboHandle = 0); @@ -129,13 +130,13 @@ public slots: bool relative = true); void updateSlicingActive(bool isSlicing); void updateBackgroundEnabled(bool enable); - void updateSelectedBar(const QPoint &position); + void updateSelectedBar(const QPoint &position, const QBar3DSeries *series); // Overloaded from abstract renderer virtual void updateAxisRange(Q3DAbstractAxis::AxisOrientation orientation, qreal min, qreal max); signals: - void barClicked(QPoint position); + void barClicked(QPoint position, QBar3DSeries *series); private: virtual void initShaders(const QString &vertexShader, const QString &fragmentShader); @@ -160,8 +161,9 @@ private: #endif void calculateSceneScalingFactors(); void calculateHeightAdjustment(); - Abstract3DController::SelectionType isSelected(GLint row, GLint bar); + Abstract3DController::SelectionType isSelected(int row, int bar, int seriesIndex); QPoint selectionColorToArrayPosition(const QVector3D &selectionColor); + QBar3DSeries *selectionColorToSeries(const QVector3D &selectionColor); Q_DISABLE_COPY(Bars3DRenderer) diff --git a/src/datavisualization/engine/engine.pri b/src/datavisualization/engine/engine.pri index 4c905fe9..7bf58379 100644 --- a/src/datavisualization/engine/engine.pri +++ b/src/datavisualization/engine/engine.pri @@ -16,6 +16,7 @@ HEADERS += $$PWD/q3dwindow_p.h \ $$PWD/scatter3dcontroller_p.h \ $$PWD/scatter3drenderer_p.h \ $$PWD/axisrendercache_p.h \ + $$PWD/seriesrendercache_p.h \ $$PWD/abstract3drenderer_p.h \ $$PWD/selectionpointer_p.h \ $$PWD/q3dcamera.h \ @@ -42,6 +43,7 @@ SOURCES += $$PWD/q3dwindow.cpp \ $$PWD/scatter3dcontroller.cpp \ $$PWD/scatter3drenderer.cpp \ $$PWD/axisrendercache.cpp \ + $$PWD/seriesrendercache.cpp \ $$PWD/abstract3drenderer.cpp \ $$PWD/selectionpointer.cpp \ $$PWD/q3dcamera.cpp \ diff --git a/src/datavisualization/engine/q3dbars.cpp b/src/datavisualization/engine/q3dbars.cpp index 3baff904..60d827bd 100644 --- a/src/datavisualization/engine/q3dbars.cpp +++ b/src/datavisualization/engine/q3dbars.cpp @@ -119,8 +119,6 @@ Q3DBars::Q3DBars() &Q3DBars::gridVisibleChanged); QObject::connect(d_ptr->m_shared, &Abstract3DController::backgroundVisibleChanged, this, &Q3DBars::backgroundVisibleChanged); - QObject::connect(d_ptr->m_shared, &Bars3DController::selectedBarChanged, this, - &Q3DBars::selectedBarChanged); QObject::connect(d_ptr->m_shared, &Abstract3DController::colorStyleChanged, this, &Q3DBars::colorStyleChanged); QObject::connect(d_ptr->m_shared, &Abstract3DController::objectColorChanged, this, @@ -151,7 +149,8 @@ Q3DBars::~Q3DBars() * so the rows and columns of all series must match for the visualized data to be meaningful. * If the graph has multiple visible series, only the first one added will * generate the row or column labels on the axes in cases where the labels are not explicitly set - * to the axes. + * to the axes. If newly added series has specified a selected bar, it will be highlighted and + * any existing selection will be cleared. Only one added series can have an active selection. */ void Q3DBars::addSeries(QBar3DSeries *series) { @@ -450,24 +449,6 @@ bool Q3DBars::isBackgroundVisible() const } /*! - * \property Q3DBars::selectedBar - * - * Selects a bar in a \a position. The position is the (row, column) position in - * the data array of the series. - * Only one bar can be selected at a time. - * To clear selection, specify an illegal \a position, e.g. (-1, -1). - */ -void Q3DBars::setSelectedBar(const QPoint &position) -{ - d_ptr->m_shared->setSelectedBar(position); -} - -QPoint Q3DBars::selectedBar() const -{ - return d_ptr->m_shared->selectedBar(); -} - -/*! * \property Q3DBars::shadowQuality * * Sets shadow \a quality to one of \c QDataVis::ShadowQuality. It is preset to diff --git a/src/datavisualization/engine/q3dbars.h b/src/datavisualization/engine/q3dbars.h index cba54dce..86a02b5d 100644 --- a/src/datavisualization/engine/q3dbars.h +++ b/src/datavisualization/engine/q3dbars.h @@ -47,7 +47,6 @@ class QT_DATAVISUALIZATION_EXPORT Q3DBars : public Q3DWindow Q_PROPERTY(QtDataVisualization::QDataVis::Theme theme READ theme WRITE setTheme NOTIFY themeChanged) Q_PROPERTY(bool gridVisible READ isGridVisible WRITE setGridVisible NOTIFY gridVisibleChanged) Q_PROPERTY(bool backgroundVisible READ isBackgroundVisible WRITE setBackgroundVisible NOTIFY backgroundVisibleChanged) - Q_PROPERTY(QPoint selectedBar READ selectedBar WRITE setSelectedBar NOTIFY selectedBarChanged) Q_PROPERTY(Q3DScene* scene READ scene) Q_PROPERTY(QtDataVisualization::QDataVis::ColorStyle colorStyle READ colorStyle WRITE setColorStyle NOTIFY colorStyleChanged) Q_PROPERTY(QColor barColor READ barColor WRITE setBarColor NOTIFY barColorChanged) @@ -104,9 +103,6 @@ public: void setBackgroundVisible(bool visible); bool isBackgroundVisible() const; - void setSelectedBar(const QPoint &position); - QPoint selectedBar() const; - void setShadowQuality(QDataVis::ShadowQuality quality); QDataVis::ShadowQuality shadowQuality() const; @@ -148,7 +144,6 @@ signals: void themeChanged(QDataVis::Theme theme); void gridVisibleChanged(bool visible); void backgroundVisibleChanged(bool visible); - void selectedBarChanged(QPoint position); void colorStyleChanged(QDataVis::ColorStyle style); void barColorChanged(QColor color); void barGradientChanged(QLinearGradient gradient); diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 311373da..2abb4fe9 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -83,8 +83,7 @@ Scatter3DRenderer::Scatter3DRenderer(Scatter3DController *controller) m_areaSize(QSizeF(0.0, 0.0)), m_dotSizeScale(1.0f), m_hasHeightAdjustmentChanged(true), - m_drawingPoints(false), - m_seriesCount(0) + m_drawingPoints(false) { initializeOpenGLFunctions(); initializeOpenGL(); @@ -141,14 +140,9 @@ void Scatter3DRenderer::initializeOpenGL() loadBackgroundMesh(); } -void Scatter3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &seriesList) +void Scatter3DRenderer::updateData() { - QList<QScatter3DSeries *> visibleSeries; - foreach (QAbstract3DSeries *current, seriesList) { - if (current->isVisible()) - visibleSeries.append(static_cast<QScatter3DSeries *>(current)); - } - int seriesCount = visibleSeries.size(); + int seriesCount = m_visibleSeriesList.size(); calculateSceneScalingFactors(); float minX = float(m_axisCacheX.min()); float maxX = float(m_axisCacheX.max()); @@ -158,13 +152,12 @@ void Scatter3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &serie float maxZ = float(m_axisCacheZ.max()); int totalDataSize = 0; - if (m_seriesCount != seriesCount) { - m_seriesCount = seriesCount; - m_renderingArrays.resize(m_seriesCount); - } + if (m_renderingArrays.size() != seriesCount) + m_renderingArrays.resize(seriesCount); - for (int series = 0; series < m_seriesCount; series++) { - QScatterDataProxy *dataProxy = visibleSeries.at(series)->dataProxy(); + for (int series = 0; series < seriesCount; series++) { + QScatterDataProxy *dataProxy = + static_cast<QScatter3DSeries *>(m_visibleSeriesList.at(series).series())->dataProxy(); const QScatterDataArray &dataArray = *dataProxy->array(); int dataSize = dataArray.size(); totalDataSize += dataSize; @@ -188,8 +181,6 @@ void Scatter3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &serie } m_dotSizeScale = (GLfloat)qBound(0.01, (2.0 / qSqrt((qreal)totalDataSize)), 0.1); m_selectedItem = 0; - - Abstract3DRenderer::updateSeriesData(seriesList); } void Scatter3DRenderer::updateScene(Q3DScene *scene) @@ -242,6 +233,8 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) QMatrix4x4 projectionViewMatrix = projectionMatrix * viewMatrix; + int seriesCount = m_visibleSeriesList.size(); + // Calculate label flipping if (viewMatrix.row(0).x() > 0) m_zFlipped = false; @@ -337,7 +330,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) depthProjectionViewMatrix = depthProjectionMatrix * depthViewMatrix; // Draw dots to depth buffer - for (int series = 0; series < m_seriesCount; series++) { + for (int series = 0; series < seriesCount; series++) { for (int dot = 0; dot < m_renderingArrays.at(series).size(); dot++) { const ScatterRenderItem &item = m_renderingArrays.at(series).at(dot); if (!item.isVisible()) @@ -440,7 +433,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) int totalArraySize = 0; int dotNo = 0; - for (int series = 0; series < m_seriesCount; series++) { + for (int series = 0; series < seriesCount; series++) { arraySize = m_renderingArrays.at(series).size(); totalArraySize += arraySize; @@ -563,9 +556,10 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) // Draw dots bool dotSelectionFound = false; ScatterRenderItem *selectedItem(0); + int selectedSeriesIndex(0); int dotNo = 0; - for (int series = 0; series < m_seriesCount; series++) { + for (int series = 0; series < seriesCount; series++) { // TODO: Color per series. Let's just hack it while testing with 2 series QTRD-2557 QVector3D baseColor = Utils::vectorFromColor(m_cachedObjectColor) * (series + 0.25f); QVector3D dotColor = baseColor; @@ -610,6 +604,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) lightStrength = m_cachedTheme.m_highlightLightStrength; // Insert data to ScatterRenderItem. We have no ownership, don't delete the previous one selectedItem = &item; + selectedSeriesIndex = series; dotSelectionFound = true; } @@ -1364,7 +1359,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) static const QString yLabelTag(QStringLiteral("@yLabel")); static const QString zLabelTag(QStringLiteral("@zLabel")); - labelText = itemLabelFormat(); + labelText = m_visibleSeriesList[selectedSeriesIndex].itemLabelFormat(); labelText.replace(xTitleTag, m_axisCacheX.title()); labelText.replace(yTitleTag, m_axisCacheY.title()); diff --git a/src/datavisualization/engine/scatter3drenderer_p.h b/src/datavisualization/engine/scatter3drenderer_p.h index 6513e571..bba790a1 100644 --- a/src/datavisualization/engine/scatter3drenderer_p.h +++ b/src/datavisualization/engine/scatter3drenderer_p.h @@ -89,13 +89,12 @@ private: bool m_drawingPoints; ScatterRenderItem m_dummyRenderItem; QVector<ScatterRenderItemArray> m_renderingArrays; - int m_seriesCount; public: explicit Scatter3DRenderer(Scatter3DController *controller); ~Scatter3DRenderer(); - void updateSeriesData(const QList<QAbstract3DSeries *> &seriesList); + void updateData(); void updateScene(Q3DScene *scene); void render(GLuint defaultFboHandle); diff --git a/src/datavisualization/engine/seriesrendercache.cpp b/src/datavisualization/engine/seriesrendercache.cpp new file mode 100644 index 00000000..53bc97a1 --- /dev/null +++ b/src/datavisualization/engine/seriesrendercache.cpp @@ -0,0 +1,42 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#include "seriesrendercache_p.h" + +QT_DATAVISUALIZATION_BEGIN_NAMESPACE + +SeriesRenderCache::SeriesRenderCache() + : m_series(0) +{ +} + +SeriesRenderCache::~SeriesRenderCache() +{ +} + +void SeriesRenderCache::populate(QAbstract3DSeries *series) +{ + Q_ASSERT(series); + + m_series = series; + m_itemLabelFormat = series->itemLabelFormat(); + + // TODO: Add other visual element extractions +} + +QT_DATAVISUALIZATION_END_NAMESPACE diff --git a/src/datavisualization/engine/seriesrendercache_p.h b/src/datavisualization/engine/seriesrendercache_p.h new file mode 100644 index 00000000..34b1d97d --- /dev/null +++ b/src/datavisualization/engine/seriesrendercache_p.h @@ -0,0 +1,60 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the QtDataVisualization API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef SERIESRENDERCACHE_P_H +#define SERIESRENDERCACHE_P_H + +#include "datavisualizationglobal_p.h" +#include "qabstract3dseries_p.h" + +QT_DATAVISUALIZATION_BEGIN_NAMESPACE + +class SeriesRenderCache +{ +public: + SeriesRenderCache(); + virtual ~SeriesRenderCache(); + + void populate(QAbstract3DSeries *series); + + inline const QString &itemLabelFormat() const { return m_itemLabelFormat; } + + // NOTE: Series pointer can only be used to access the series when syncing with controller. + // It is not guaranteed to be valid while rendering and should only be used as an identifier. + inline QAbstract3DSeries *series() const { return m_series; } + + // TODO: Add other visual elements + +protected: + QString m_itemLabelFormat; + QAbstract3DSeries *m_series; +}; + +QT_DATAVISUALIZATION_END_NAMESPACE + +#endif diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index e8b0a0f4..85e189f8 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -197,12 +197,12 @@ void Surface3DRenderer::initializeOpenGL() loadBackgroundMesh(); } -void Surface3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &seriesList) +void Surface3DRenderer::updateData() { // Surface only supports single series for now, so we are only interested in the first series const QSurfaceDataArray *array = 0; - if (seriesList.size()) { - QSurface3DSeries *firstSeries = static_cast<QSurface3DSeries *>(seriesList.at(0)); + if (m_visibleSeriesList.size()) { + QSurface3DSeries *firstSeries = static_cast<QSurface3DSeries *>(m_visibleSeriesList.at(0).series()); m_cachedSurfaceVisible = firstSeries->isVisible(); // TODO: To series visuals update? if (m_cachedSurfaceGridOn || m_cachedSurfaceVisible) { QSurfaceDataProxy *dataProxy = firstSeries->dataProxy(); @@ -268,8 +268,6 @@ void Surface3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &serie m_sliceDataArray.clear(); m_selectionDirty = true; - - Abstract3DRenderer::updateSeriesData(seriesList); } void Surface3DRenderer::updateSliceDataModel(const QPoint &point) @@ -1871,7 +1869,8 @@ QPoint Surface3DRenderer::selectionIdToSurfacePoint(uint id) QString Surface3DRenderer::createSelectionLabel(qreal value, int column, int row) { - QString labelText = itemLabelFormat(); + // TODO: Get from correct series once multiple series supported + QString labelText = m_visibleSeriesList[0].itemLabelFormat(); static const QString xTitleTag(QStringLiteral("@xTitle")); static const QString yTitleTag(QStringLiteral("@yTitle")); static const QString zTitleTag(QStringLiteral("@zTitle")); diff --git a/src/datavisualization/engine/surface3drenderer_p.h b/src/datavisualization/engine/surface3drenderer_p.h index 45222564..5ac20e0e 100644 --- a/src/datavisualization/engine/surface3drenderer_p.h +++ b/src/datavisualization/engine/surface3drenderer_p.h @@ -132,7 +132,7 @@ public: explicit Surface3DRenderer(Surface3DController *controller); ~Surface3DRenderer(); - void updateSeriesData(const QList<QAbstract3DSeries *> &seriesList); + void updateData(); void updateScene(Q3DScene *scene); bool updateSmoothStatus(bool enable); void updateSurfaceGridStatus(bool enable); |