summaryrefslogtreecommitdiffstats
path: root/src/corelib/itemmodels
diff options
context:
space:
mode:
authorChristian Ehrlicher <ch.ehrlicher@gmx.de>2019-09-13 22:33:50 +0200
committerChristian Ehrlicher <ch.ehrlicher@gmx.de>2020-03-27 06:56:23 +0100
commitddcf0df7d70b6bf7766c1fac2e6831c2077513e9 (patch)
tree049f987f76e799699eacb2e24e19a08cfaa41d28 /src/corelib/itemmodels
parent9968a211f92c2b4d5bd1fe004f16ec1c5f968dcd (diff)
Speed up QSortFilterProxyModel filtering
Speed up the QSortFilterProxyModel filtering by only updating the source_to_proxy entries which are really changed - When proxy intervals are added or removed, it is not needed to update the proxy_to_source indexes which were not touched. Change-Id: I35459ff1b04f4610ec74f4b01d58a71832a9ae22 Reviewed-by: David Faure <david.faure@kdab.com>
Diffstat (limited to 'src/corelib/itemmodels')
-rw-r--r--src/corelib/itemmodels/qsortfilterproxymodel.cpp19
1 files changed, 11 insertions, 8 deletions
diff --git a/src/corelib/itemmodels/qsortfilterproxymodel.cpp b/src/corelib/itemmodels/qsortfilterproxymodel.cpp
index a620e25f13..6ed4c942d8 100644
--- a/src/corelib/itemmodels/qsortfilterproxymodel.cpp
+++ b/src/corelib/itemmodels/qsortfilterproxymodel.cpp
@@ -403,8 +403,8 @@ public:
QVector<int> &source_to_proxy, QVector<int> &proxy_to_source,
int proxy_start, int proxy_end, const QModelIndex &proxy_parent,
Qt::Orientation orient, bool emit_signal = true);
- void build_source_to_proxy_mapping(
- const QVector<int> &proxy_to_source, QVector<int> &source_to_proxy) const;
+ static inline void build_source_to_proxy_mapping(
+ const QVector<int> &proxy_to_source, QVector<int> &source_to_proxy, int start = 0);
void source_items_inserted(const QModelIndex &source_parent,
int start, int end, Qt::Orientation orient);
void source_items_about_to_be_removed(const QModelIndex &source_parent,
@@ -798,9 +798,11 @@ void QSortFilterProxyModelPrivate::remove_proxy_interval(
}
// Remove items from proxy-to-source mapping
+ for (int i = proxy_start; i <= proxy_end; ++i)
+ source_to_proxy[proxy_to_source.at(i)] = -1;
proxy_to_source.remove(proxy_start, proxy_end - proxy_start + 1);
- build_source_to_proxy_mapping(proxy_to_source, source_to_proxy);
+ build_source_to_proxy_mapping(proxy_to_source, source_to_proxy, proxy_start);
if (emit_signal) {
if (orient == Qt::Vertical)
@@ -926,7 +928,7 @@ void QSortFilterProxyModelPrivate::insert_source_items(
for (int i = 0; i < source_items.size(); ++i)
proxy_to_source.insert(proxy_start + i, source_items.at(i));
- build_source_to_proxy_mapping(proxy_to_source, source_to_proxy);
+ build_source_to_proxy_mapping(proxy_to_source, source_to_proxy, proxy_start);
if (emit_signal) {
if (orient == Qt::Vertical)
@@ -1208,11 +1210,12 @@ void QSortFilterProxyModelPrivate::proxy_item_range(
\internal
*/
void QSortFilterProxyModelPrivate::build_source_to_proxy_mapping(
- const QVector<int> &proxy_to_source, QVector<int> &source_to_proxy) const
+ const QVector<int> &proxy_to_source, QVector<int> &source_to_proxy, int start)
{
- source_to_proxy.fill(-1);
- int proxy_count = proxy_to_source.size();
- for (int i = 0; i < proxy_count; ++i)
+ if (start == 0)
+ source_to_proxy.fill(-1);
+ const int proxy_count = proxy_to_source.size();
+ for (int i = start; i < proxy_count; ++i)
source_to_proxy[proxy_to_source.at(i)] = i;
}