From 02f950176d3a0488875d451d3da0fc8b2312bec0 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 13 Jan 2014 10:22:43 +0200 Subject: Fix axis range autoadjustment relating to series visibility No need to recalc ranges when a change targets non-visible series. Change-Id: Ifd80b876ba279917a5bded8240721d00d66a6f05 Reviewed-by: Mika Salmela --- src/datavisualization/engine/bars3dcontroller.cpp | 52 ++++++++++++++++------ .../engine/scatter3dcontroller.cpp | 50 ++++++++++++++------- .../engine/scatter3dcontroller_p.h | 1 + .../engine/surface3dcontroller.cpp | 50 ++++++++++++++------- 4 files changed, 108 insertions(+), 45 deletions(-) (limited to 'src') diff --git a/src/datavisualization/engine/bars3dcontroller.cpp b/src/datavisualization/engine/bars3dcontroller.cpp index c765a37a..8bf0cb8c 100644 --- a/src/datavisualization/engine/bars3dcontroller.cpp +++ b/src/datavisualization/engine/bars3dcontroller.cpp @@ -98,8 +98,11 @@ void Bars3DController::synchDataToRenderer() void Bars3DController::handleArrayReset() { - adjustAxisRanges(); - m_isDataDirty = true; + QBar3DSeries *series = static_cast(sender())->series(); + if (series->isVisible()) { + adjustAxisRanges(); + m_isDataDirty = true; + } // Clear selection unless still valid setSelectedBar(m_selectedBar, m_selectedBarSeries); emitNeedRender(); @@ -109,8 +112,11 @@ void Bars3DController::handleRowsAdded(int startIndex, int count) { Q_UNUSED(startIndex) Q_UNUSED(count) - adjustAxisRanges(); - m_isDataDirty = true; + QBar3DSeries *series = static_cast(sender())->series(); + if (series->isVisible()) { + adjustAxisRanges(); + m_isDataDirty = true; + } emitNeedRender(); } @@ -118,8 +124,11 @@ void Bars3DController::handleRowsChanged(int startIndex, int count) { Q_UNUSED(startIndex) Q_UNUSED(count) - adjustAxisRanges(); - m_isDataDirty = true; + QBar3DSeries *series = static_cast(sender())->series(); + if (series->isVisible()) { + adjustAxisRanges(); + m_isDataDirty = true; + } emitNeedRender(); } @@ -127,8 +136,11 @@ void Bars3DController::handleRowsRemoved(int startIndex, int count) { Q_UNUSED(startIndex) Q_UNUSED(count) - adjustAxisRanges(); - m_isDataDirty = true; + QBar3DSeries *series = static_cast(sender())->series(); + if (series->isVisible()) { + adjustAxisRanges(); + m_isDataDirty = true; + } // Clear selection unless still valid setSelectedBar(m_selectedBar, m_selectedBarSeries); @@ -140,8 +152,11 @@ void Bars3DController::handleRowsInserted(int startIndex, int count) { Q_UNUSED(startIndex) Q_UNUSED(count) - adjustAxisRanges(); - m_isDataDirty = true; + QBar3DSeries *series = static_cast(sender())->series(); + if (series->isVisible()) { + adjustAxisRanges(); + m_isDataDirty = true; + } emitNeedRender(); } @@ -149,8 +164,11 @@ void Bars3DController::handleItemChanged(int rowIndex, int columnIndex) { Q_UNUSED(rowIndex) Q_UNUSED(columnIndex) - adjustAxisRanges(); - m_isDataDirty = true; + QBar3DSeries *series = static_cast(sender())->series(); + if (series->isVisible()) { + adjustAxisRanges(); + m_isDataDirty = true; + } emitNeedRender(); } @@ -203,6 +221,8 @@ void Bars3DController::handleSeriesVisibilityChangedBySender(QObject *sender) { Abstract3DController::handleSeriesVisibilityChangedBySender(sender); + adjustAxisRanges(); + // Visibility changes may require disabling/enabling slicing, // so just reset selection to ensure everything is still valid. setSelectedBar(m_selectedBar, m_selectedBarSeries); @@ -234,9 +254,10 @@ void Bars3DController::addSeries(QAbstract3DSeries *series) Abstract3DController::addSeries(series); - if (firstAdded) { + if (series->isVisible()) adjustAxisRanges(); + if (firstAdded) { handleDataRowLabelsChanged(); handleDataColumnLabelsChanged(); } @@ -250,14 +271,17 @@ void Bars3DController::removeSeries(QAbstract3DSeries *series) { bool firstRemoved = (m_seriesList.size() && m_seriesList.at(0) == series); + bool wasVisible = (series && series->d_ptr->m_controller == this && series->isVisible()); + Abstract3DController::removeSeries(series); if (m_selectedBarSeries == series) setSelectedBar(invalidSelectionPosition(), 0); - if (firstRemoved) { + if (wasVisible) adjustAxisRanges(); + if (firstRemoved) { handleDataRowLabelsChanged(); handleDataColumnLabelsChanged(); } diff --git a/src/datavisualization/engine/scatter3dcontroller.cpp b/src/datavisualization/engine/scatter3dcontroller.cpp index 58706705..0c991839 100644 --- a/src/datavisualization/engine/scatter3dcontroller.cpp +++ b/src/datavisualization/engine/scatter3dcontroller.cpp @@ -80,11 +80,9 @@ void Scatter3DController::addSeries(QAbstract3DSeries *series) { Q_ASSERT(series && series->type() == QAbstract3DSeries::SeriesTypeScatter); - bool firstAdded = !m_seriesList.size(); - Abstract3DController::addSeries(series); - if (firstAdded) + if (series->isVisible()) adjustValueAxisRange(); QScatter3DSeries *scatterSeries = static_cast(series); @@ -94,14 +92,14 @@ void Scatter3DController::addSeries(QAbstract3DSeries *series) void Scatter3DController::removeSeries(QAbstract3DSeries *series) { - bool firstRemoved = (m_seriesList.size() && m_seriesList.at(0) == series); + bool wasVisible = (series && series->d_ptr->m_controller == this && series->isVisible()); Abstract3DController::removeSeries(series); if (m_selectedItemSeries == series) setSelectedItem(invalidSelectionIndex(), 0); - if (firstRemoved) + if (wasVisible) adjustValueAxisRange(); } @@ -120,8 +118,11 @@ QList Scatter3DController::scatterSeriesList() void Scatter3DController::handleArrayReset() { - adjustValueAxisRange(); - m_isDataDirty = true; + QScatter3DSeries *series = static_cast(sender())->series(); + if (series->isVisible()) { + adjustValueAxisRange(); + m_isDataDirty = true; + } setSelectedItem(m_selectedItem, m_selectedItemSeries); emitNeedRender(); } @@ -131,8 +132,11 @@ void Scatter3DController::handleItemsAdded(int startIndex, int count) Q_UNUSED(startIndex) Q_UNUSED(count) // TODO should dirty only affected values? - adjustValueAxisRange(); - m_isDataDirty = true; + QScatter3DSeries *series = static_cast(sender())->series(); + if (series->isVisible()) { + adjustValueAxisRange(); + m_isDataDirty = true; + } emitNeedRender(); } @@ -141,8 +145,11 @@ void Scatter3DController::handleItemsChanged(int startIndex, int count) Q_UNUSED(startIndex) Q_UNUSED(count) // TODO should dirty only affected values? - adjustValueAxisRange(); - m_isDataDirty = true; + QScatter3DSeries *series = static_cast(sender())->series(); + if (series->isVisible()) { + adjustValueAxisRange(); + m_isDataDirty = true; + } emitNeedRender(); } @@ -151,8 +158,11 @@ void Scatter3DController::handleItemsRemoved(int startIndex, int count) Q_UNUSED(startIndex) Q_UNUSED(count) // TODO should dirty only affected values? - adjustValueAxisRange(); - m_isDataDirty = true; + QScatter3DSeries *series = static_cast(sender())->series(); + if (series->isVisible()) { + adjustValueAxisRange(); + m_isDataDirty = true; + } // Clear selection unless it is still valid setSelectedItem(m_selectedItem, m_selectedItemSeries); @@ -165,8 +175,11 @@ void Scatter3DController::handleItemsInserted(int startIndex, int count) Q_UNUSED(startIndex) Q_UNUSED(count) // TODO should dirty only affected values? - adjustValueAxisRange(); - m_isDataDirty = true; + QScatter3DSeries *series = static_cast(sender())->series(); + if (series->isVisible()) { + adjustValueAxisRange(); + m_isDataDirty = true; + } emitNeedRender(); } @@ -194,6 +207,13 @@ void Scatter3DController::handleAxisRangeChangedBySender(QObject *sender) setSelectedItem(m_selectedItem, m_selectedItemSeries); } +void Scatter3DController::handleSeriesVisibilityChangedBySender(QObject *sender) +{ + Abstract3DController::handleSeriesVisibilityChangedBySender(sender); + + adjustValueAxisRange(); +} + void Scatter3DController::setSelectionMode(QDataVis::SelectionFlags mode) { // We only support single item selection mode and no selection mode diff --git a/src/datavisualization/engine/scatter3dcontroller_p.h b/src/datavisualization/engine/scatter3dcontroller_p.h index d484454d..2d0c9a9a 100644 --- a/src/datavisualization/engine/scatter3dcontroller_p.h +++ b/src/datavisualization/engine/scatter3dcontroller_p.h @@ -82,6 +82,7 @@ public: virtual void handleAxisAutoAdjustRangeChangedInOrientation(QAbstract3DAxis::AxisOrientation orientation, bool autoAdjust); virtual void handleAxisRangeChangedBySender(QObject *sender); + virtual void handleSeriesVisibilityChangedBySender(QObject *sender); public slots: void handleArrayReset(); diff --git a/src/datavisualization/engine/surface3dcontroller.cpp b/src/datavisualization/engine/surface3dcontroller.cpp index 7c7b7a90..cf844c0f 100644 --- a/src/datavisualization/engine/surface3dcontroller.cpp +++ b/src/datavisualization/engine/surface3dcontroller.cpp @@ -111,6 +111,8 @@ void Surface3DController::handleSeriesVisibilityChangedBySender(QObject *sender) { Abstract3DController::handleSeriesVisibilityChangedBySender(sender); + adjustValueAxisRange(); + // Visibility changes may require disabling/enabling slicing, // so just reset selection to ensure everything is still valid. setSelectedPoint(m_selectedPoint, m_selectedSeries); @@ -134,7 +136,8 @@ void Surface3DController::addSeries(QAbstract3DSeries *series) if (!m_seriesList.size()) { Abstract3DController::addSeries(series); - adjustValueAxisRange(); + if (series->isVisible()) + adjustValueAxisRange(); } else { qWarning("Surface graph only supports a single series."); } @@ -146,14 +149,15 @@ void Surface3DController::addSeries(QAbstract3DSeries *series) void Surface3DController::removeSeries(QAbstract3DSeries *series) { - if (series && series->d_ptr->m_controller == this) { - Abstract3DController::removeSeries(series); + bool wasVisible = (series && series->d_ptr->m_controller == this && series->isVisible()); + + Abstract3DController::removeSeries(series); - if (m_selectedSeries == series) - setSelectedPoint(invalidSelectionPosition(), 0); + if (m_selectedSeries == series) + setSelectedPoint(invalidSelectionPosition(), 0); + if (wasVisible) adjustValueAxisRange(); - } } QList Surface3DController::surfaceSeriesList() @@ -266,8 +270,11 @@ void Surface3DController::setSelectedPoint(const QPoint &position, QSurface3DSer void Surface3DController::handleArrayReset() { - adjustValueAxisRange(); - m_isDataDirty = true; + QSurface3DSeries *series = static_cast(sender())->series(); + if (series->isVisible()) { + adjustValueAxisRange(); + m_isDataDirty = true; + } // Clear selection unless still valid setSelectedPoint(m_selectedPoint, m_selectedSeries); emitNeedRender(); @@ -299,7 +306,8 @@ void Surface3DController::handleRowsChanged(int startIndex, int count) if (m_changedRows.size() == 0) m_changedRows.reserve(sender->rowCount()); - if (static_cast(m_seriesList.at(0)) == sender->series()) { + QSurface3DSeries *series = sender->series(); + if (series->isVisible()) { // Change is for the visible series, put the change to queue int oldChangeCount = m_changedRows.size(); for (int i = 0; i < count; i++) { @@ -328,7 +336,8 @@ void Surface3DController::handleRowsChanged(int startIndex, int count) void Surface3DController::handleItemChanged(int rowIndex, int columnIndex) { QSurfaceDataProxy *sender = static_cast(QObject::sender()); - if (static_cast(m_seriesList.at(0)) == sender->series()) { + QSurface3DSeries *series = sender->series(); + if (series->isVisible()) { // Change is for the visible series, put the change to queue bool newItem = true; QPoint candidate(columnIndex, rowIndex); @@ -354,8 +363,11 @@ void Surface3DController::handleRowsAdded(int startIndex, int count) { Q_UNUSED(startIndex) Q_UNUSED(count) - adjustValueAxisRange(); - m_isDataDirty = true; + QSurface3DSeries *series = static_cast(sender())->series(); + if (series->isVisible()) { + adjustValueAxisRange(); + m_isDataDirty = true; + } emitNeedRender(); } @@ -363,8 +375,11 @@ void Surface3DController::handleRowsInserted(int startIndex, int count) { Q_UNUSED(startIndex) Q_UNUSED(count) - adjustValueAxisRange(); - m_isDataDirty = true; + QSurface3DSeries *series = static_cast(sender())->series(); + if (series->isVisible()) { + adjustValueAxisRange(); + m_isDataDirty = true; + } emitNeedRender(); } @@ -372,8 +387,11 @@ void Surface3DController::handleRowsRemoved(int startIndex, int count) { Q_UNUSED(startIndex) Q_UNUSED(count) - adjustValueAxisRange(); - m_isDataDirty = true; + QSurface3DSeries *series = static_cast(sender())->series(); + if (series->isVisible()) { + adjustValueAxisRange(); + m_isDataDirty = true; + } // Clear selection unless still valid setSelectedPoint(m_selectedPoint, m_selectedSeries); -- cgit v1.2.3