From 73f81ac479eb5ce48716c491abfe7a875a047edb Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 14 Oct 2019 13:40:14 +0300 Subject: Fix removing rows from candlestick model mapper MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There is no guarantee removed rows are in correct order or that they are sequential, so don't assume so. Fixes: QTBUG-79188 Change-Id: I6ee6851ce881872d01486c600d4204faeb162d87 Reviewed-by: Tomi Korpipää --- .../candlestickchart/qcandlestickmodelmapper.cpp | 33 ++++++++++++++++------ .../tst_qcandlestickmodelmapper.cpp | 11 +++++++- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/src/charts/candlestickchart/qcandlestickmodelmapper.cpp b/src/charts/candlestickchart/qcandlestickmodelmapper.cpp index 8f876cd3..95a53b52 100644 --- a/src/charts/candlestickchart/qcandlestickmodelmapper.cpp +++ b/src/charts/candlestickchart/qcandlestickmodelmapper.cpp @@ -33,6 +33,8 @@ #include #include +#include + QT_CHARTS_BEGIN_NAMESPACE /*! @@ -590,20 +592,33 @@ void QCandlestickModelMapperPrivate::candlestickSetsRemoved(const QList removedIndices; + for (auto &set : sets) { + int index = m_sets.indexOf(set); + if (index != -1) + removedIndices << index; + } + + if (removedIndices.isEmpty()) return; - m_lastSetSection -= sets.count(); + std::sort(removedIndices.begin(), removedIndices.end()); - for (int i = firstIndex + sets.count() - 1; i >= firstIndex; --i) - m_sets.removeAt(i); + for (int i = removedIndices.size() - 1; i >= 0; --i) { + m_sets.removeAt(removedIndices[i]); + --m_lastSetSection; + } blockModelSignals(); - if (q->orientation() == Qt::Vertical) - m_model->removeColumns(firstIndex + m_firstSetSection, sets.count()); - else - m_model->removeRows(firstIndex + m_firstSetSection, sets.count()); + + // There is no guarantee removed sets are continuous, so remove them one by one + for (int i = removedIndices.size() - 1; i >= 0; --i) { + if (q->orientation() == Qt::Vertical) + m_model->removeColumns(removedIndices[i] + m_firstSetSection, 1); + else + m_model->removeRows(removedIndices[i] + m_firstSetSection, 1); + } + blockModelSignals(false); initializeCandlestickFromModel(); } diff --git a/tests/auto/qcandlestickmodelmapper/tst_qcandlestickmodelmapper.cpp b/tests/auto/qcandlestickmodelmapper/tst_qcandlestickmodelmapper.cpp index cf3531ed..a9ac4837 100644 --- a/tests/auto/qcandlestickmodelmapper/tst_qcandlestickmodelmapper.cpp +++ b/tests/auto/qcandlestickmodelmapper/tst_qcandlestickmodelmapper.cpp @@ -425,14 +425,23 @@ void tst_qcandlestickmodelmapper::seriesUpdated() QList newCandlestickSets; newCandlestickSets << new QCandlestickSet(3.0, 5.0, 2.0, 4.0, 1234); newCandlestickSets << new QCandlestickSet(5.0, 7.0, 4.0, 6.0, 5678); + newCandlestickSets << new QCandlestickSet(3.0, 8.0, 4.0, 6.0, 6789); m_series->append(newCandlestickSets); QCOMPARE(m_model->columnCount(), m_modelColumnCount + newCandlestickSets.count()); // remove sets newCandlestickSets.clear(); newCandlestickSets << m_series->sets().at(m_series->count() - 1); - newCandlestickSets << m_series->sets().at(m_series->count() - 2); + newCandlestickSets << m_series->sets().at(m_series->count() - 5); + newCandlestickSets << m_series->sets().at(m_series->count() - 3); m_series->remove(newCandlestickSets); + + // Make sure correct rows have been removed from model + for (int i = 0, end = m_series->sets().size(); i < end; ++i) { + QCOMPARE(m_model->data(m_model->index(m_vMapper->timestampRow(), i)).toReal(), + m_series->sets().at(i)->timestamp()); + } + QCOMPARE(m_model->columnCount(), m_modelColumnCount); } -- cgit v1.2.3