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