diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2014-01-13 10:22:43 +0200 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2014-01-13 12:31:40 +0200 |
commit | 02f950176d3a0488875d451d3da0fc8b2312bec0 (patch) | |
tree | 96a8078687db743986f150918f47a231ecf55134 | |
parent | d85201ec4aa738232e4ef085b78114c744cbcaa1 (diff) |
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 <mika.salmela@digia.com>
-rw-r--r-- | src/datavisualization/engine/bars3dcontroller.cpp | 52 | ||||
-rw-r--r-- | src/datavisualization/engine/scatter3dcontroller.cpp | 50 | ||||
-rw-r--r-- | src/datavisualization/engine/scatter3dcontroller_p.h | 1 | ||||
-rw-r--r-- | src/datavisualization/engine/surface3dcontroller.cpp | 50 | ||||
-rw-r--r-- | tests/scattertest/main.cpp | 6 | ||||
-rw-r--r-- | tests/scattertest/scatterchart.cpp | 6 | ||||
-rw-r--r-- | tests/scattertest/scatterchart.h | 1 |
7 files changed, 121 insertions, 45 deletions
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<QBarDataProxy *>(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<QBarDataProxy *>(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<QBarDataProxy *>(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<QBarDataProxy *>(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<QBarDataProxy *>(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<QBarDataProxy *>(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<QScatter3DSeries *>(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<QScatter3DSeries *> Scatter3DController::scatterSeriesList() void Scatter3DController::handleArrayReset() { - adjustValueAxisRange(); - m_isDataDirty = true; + QScatter3DSeries *series = static_cast<QScatterDataProxy *>(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<QScatterDataProxy *>(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<QScatterDataProxy *>(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<QScatterDataProxy *>(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<QScatterDataProxy *>(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<QSurface3DSeries *> Surface3DController::surfaceSeriesList() @@ -266,8 +270,11 @@ void Surface3DController::setSelectedPoint(const QPoint &position, QSurface3DSer void Surface3DController::handleArrayReset() { - adjustValueAxisRange(); - m_isDataDirty = true; + QSurface3DSeries *series = static_cast<QSurfaceDataProxy *>(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<QSurface3DSeries *>(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<QSurfaceDataProxy *>(QObject::sender()); - if (static_cast<QSurface3DSeries *>(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<QSurfaceDataProxy *>(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<QSurfaceDataProxy *>(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<QSurfaceDataProxy *>(sender())->series(); + if (series->isVisible()) { + adjustValueAxisRange(); + m_isDataDirty = true; + } // Clear selection unless still valid setSelectedPoint(m_selectedPoint, m_selectedSeries); diff --git a/tests/scattertest/main.cpp b/tests/scattertest/main.cpp index 26f30beb..d4a6c108 100644 --- a/tests/scattertest/main.cpp +++ b/tests/scattertest/main.cpp @@ -106,6 +106,9 @@ int main(int argc, char **argv) QPushButton *removeSeriesButton = new QPushButton(widget); removeSeriesButton->setText(QStringLiteral("Remove Series")); + QPushButton *toggleSeriesVisibilityButton = new QPushButton(widget); + toggleSeriesVisibilityButton->setText(QStringLiteral("Toggle visibility")); + QPushButton *startTimerButton = new QPushButton(widget); startTimerButton->setText(QStringLiteral("Start/stop timer")); @@ -172,6 +175,7 @@ int main(int argc, char **argv) vLayout->addWidget(setSelectedItemButton, 0, Qt::AlignTop); vLayout->addWidget(addSeriesButton, 0, Qt::AlignTop); vLayout->addWidget(removeSeriesButton, 0, Qt::AlignTop); + vLayout->addWidget(toggleSeriesVisibilityButton, 0, Qt::AlignTop); vLayout->addWidget(startTimerButton, 0, Qt::AlignTop); vLayout->addWidget(gradientBtoYPB, 0, Qt::AlignTop); vLayout->addWidget(backgroundCheckBox); @@ -224,6 +228,8 @@ int main(int argc, char **argv) &ScatterDataModifier::addSeries); QObject::connect(removeSeriesButton, &QPushButton::clicked, modifier, &ScatterDataModifier::removeSeries); + QObject::connect(toggleSeriesVisibilityButton, &QPushButton::clicked, modifier, + &ScatterDataModifier::toggleSeriesVisibility); QObject::connect(startTimerButton, &QPushButton::clicked, modifier, &ScatterDataModifier::startStopTimer); QObject::connect(gradientBtoYPB, &QPushButton::clicked, modifier, diff --git a/tests/scattertest/scatterchart.cpp b/tests/scattertest/scatterchart.cpp index 6b7fd910..58f5b355 100644 --- a/tests/scattertest/scatterchart.cpp +++ b/tests/scattertest/scatterchart.cpp @@ -470,6 +470,12 @@ void ScatterDataModifier::removeSeries() } } +void ScatterDataModifier::toggleSeriesVisibility() +{ + if (m_targetSeries) + m_targetSeries->setVisible(!m_targetSeries->isVisible()); +} + void ScatterDataModifier::handleAxisXChanged(QValue3DAxis *axis) { qDebug() << __FUNCTION__ << axis << axis->orientation() << (axis == m_chart->axisX()); diff --git a/tests/scattertest/scatterchart.h b/tests/scattertest/scatterchart.h index 903c6fc0..7906eac0 100644 --- a/tests/scattertest/scatterchart.h +++ b/tests/scattertest/scatterchart.h @@ -67,6 +67,7 @@ public slots: void setGradient(); void addSeries(); void removeSeries(); + void toggleSeriesVisibility(); void handleAxisXChanged(QValue3DAxis *axis); void handleAxisYChanged(QValue3DAxis *axis); |