summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2019-10-14 13:40:14 +0300
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2019-10-15 09:56:08 +0300
commit73f81ac479eb5ce48716c491abfe7a875a047edb (patch)
treeae21c679002eac13cede4bb1dde47a049bcdfca2
parenta692d9a826d864e91b668415aea266228c2ae323 (diff)
Fix removing rows from candlestick model mapper
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ää <tomi.korpipaa@qt.io>
-rw-r--r--src/charts/candlestickchart/qcandlestickmodelmapper.cpp33
-rw-r--r--tests/auto/qcandlestickmodelmapper/tst_qcandlestickmodelmapper.cpp11
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 <QtCore/QAbstractItemModel>
#include <private/qcandlestickmodelmapper_p.h>
+#include <algorithm>
+
QT_CHARTS_BEGIN_NAMESPACE
/*!
@@ -590,20 +592,33 @@ void QCandlestickModelMapperPrivate::candlestickSetsRemoved(const QList<QCandles
if (sets.isEmpty())
return;
- int firstIndex = m_sets.indexOf(sets.at(0));
- if (firstIndex == -1)
+ QVector<int> 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<QCandlestickSet *> 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);
}