diff options
author | Thierry Bastian <thierry.bastian@nokia.com> | 2010-04-12 07:18:10 (GMT) |
---|---|---|
committer | Thierry Bastian <thierry.bastian@nokia.com> | 2010-04-12 07:21:08 (GMT) |
commit | d45c0d3930e295e9798f9172fa0f151044f7036b (patch) | |
tree | 70dce24226897ef66075742bab77539799c5df9c | |
parent | 757b9bf63dedbc33205f482c80f6843b738aa389 (diff) | |
download | Qt-d45c0d3930e295e9798f9172fa0f151044f7036b.zip Qt-d45c0d3930e295e9798f9172fa0f151044f7036b.tar.gz Qt-d45c0d3930e295e9798f9172fa0f151044f7036b.tar.bz2 |
Make sure the selectionChanged signal is not called too much
It could happen that it was called with empty selectionrange
Now we check to see if the selection ranges are empty
Task-number: QTBUG-9507
Reviewed-by: gabi
-rw-r--r-- | src/gui/itemviews/qitemselectionmodel.cpp | 21 | ||||
-rw-r--r-- | src/gui/itemviews/qitemselectionmodel.h | 2 | ||||
-rw-r--r-- | src/gui/itemviews/qtableview.cpp | 4 |
3 files changed, 26 insertions, 1 deletions
diff --git a/src/gui/itemviews/qitemselectionmodel.cpp b/src/gui/itemviews/qitemselectionmodel.cpp index d6e68f6..f848321 100644 --- a/src/gui/itemviews/qitemselectionmodel.cpp +++ b/src/gui/itemviews/qitemselectionmodel.cpp @@ -292,6 +292,27 @@ static void indexesFromRange(const QItemSelectionRange &range, QModelIndexList & } /*! + Returns true if the selection range contains no selectable item + \since 4.7 +*/ + +bool QItemSelectionRange::isEmpty() const +{ + if (!isValid() || !model()) + return true; + + for (int column = left(); column <= right(); ++column) { + for (int row = top(); row <= bottom(); ++row) { + QModelIndex index = model()->index(row, column, parent()); + Qt::ItemFlags flags = model()->flags(index); + if ((flags & Qt::ItemIsSelectable) && (flags & Qt::ItemIsEnabled)) + return false; + } + } + return true; +} + +/*! Returns the list of model index items stored in the selection. */ diff --git a/src/gui/itemviews/qitemselectionmodel.h b/src/gui/itemviews/qitemselectionmodel.h index 9980d0f..436514f 100644 --- a/src/gui/itemviews/qitemselectionmodel.h +++ b/src/gui/itemviews/qitemselectionmodel.h @@ -108,6 +108,8 @@ public: && top() <= bottom() && left() <= right()); } + bool isEmpty() const; + QModelIndexList indexes() const; private: diff --git a/src/gui/itemviews/qtableview.cpp b/src/gui/itemviews/qtableview.cpp index 43445b4..f49f273 100644 --- a/src/gui/itemviews/qtableview.cpp +++ b/src/gui/itemviews/qtableview.cpp @@ -1847,7 +1847,9 @@ void QTableView::setSelection(const QRect &rect, QItemSelectionModel::SelectionF selection.append(QItemSelectionRange(topLeft, bottomRight)); } } else { // nothing moved - selection.append(QItemSelectionRange(tl, br)); + QItemSelectionRange range(tl, br); + if (!range.isEmpty()) + selection.append(range); } d->selectionModel->select(selection, command); |