From 9c774b7621fdc99c03fad1b424b09b82057dc748 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 16 Jul 2014 15:20:17 +0200 Subject: QItemSelectionModel: Sort persistent model indexes taking parent into account. When sorting a tree model with large sub-trees and and a large selection, the existing sort function would mix indexes of different parents, causing a fragmented selection, which slows down painting. Task-number: QTBUG-33954 Change-Id: Ia585fc1e5de9a1a3f6124a58c9c7c40fcbdbfb6a Reviewed-by: Olivier Goffart --- src/corelib/itemmodels/qitemselectionmodel.cpp | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/corelib/itemmodels/qitemselectionmodel.cpp b/src/corelib/itemmodels/qitemselectionmodel.cpp index 883aa5b982..0a75d5998a 100644 --- a/src/corelib/itemmodels/qitemselectionmodel.cpp +++ b/src/corelib/itemmodels/qitemselectionmodel.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtGui module of the Qt Toolkit. @@ -976,6 +976,22 @@ static QItemSelection mergeIndexes(const QVector &indexes return rowSpans; } +/*! + \internal + + Sort predicate function for QItemSelectionModelPrivate::_q_layoutChanged(), + sorting by parent first in addition to operator<(). This is to prevent + fragmentation of the selection by grouping indexes with the same row, column + of different parents next to each other, which may happen when a selection + spans sub-trees. +*/ +static bool qt_PersistentModelIndexLessThan(const QPersistentModelIndex &i1, const QPersistentModelIndex &i2) +{ + const QModelIndex parent1 = i1.parent(); + const QModelIndex parent2 = i2.parent(); + return parent1 == parent2 ? i1 < i2 : parent1 < parent2; +} + /*! \internal @@ -1011,8 +1027,10 @@ void QItemSelectionModelPrivate::_q_layoutChanged(const QList