summaryrefslogtreecommitdiffstats
path: root/src/widgets/itemviews
diff options
context:
space:
mode:
authorAlexander Volkov <a.volkov@rusbitech.ru>2019-02-07 13:58:12 +0300
committerAlexander Volkov <a.volkov@rusbitech.ru>2019-02-27 15:58:56 +0000
commitf657c7426329d3763bbf3373b986378c22020269 (patch)
tree8991718a43d5e4983b0f5f9aef6914ad61bce9e4 /src/widgets/itemviews
parentca991ee22d3509f8f54ee26d4c30d45319428c8f (diff)
QListView: Fix Shift+click selection for non-default itemAlignment
QListView::setSelection() algorithm is designed for items to occupy their cells completely, which is not the case when itemAlignment is used. The middle part of the selection rect goes beyond the column borders and extra items are selected. Use the introduced cellRectForIndex() instead of rectForIndex() to calculate the middle part correctly. Fixes: QTBUG-73684 Change-Id: I4a1e42a056d56e85a16d8ae0ffe18b78d1d6deb7 Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
Diffstat (limited to 'src/widgets/itemviews')
-rw-r--r--src/widgets/itemviews/qlistview.cpp4
-rw-r--r--src/widgets/itemviews/qlistview_p.h19
2 files changed, 20 insertions, 3 deletions
diff --git a/src/widgets/itemviews/qlistview.cpp b/src/widgets/itemviews/qlistview.cpp
index 6b5857f1ca..e07514f297 100644
--- a/src/widgets/itemviews/qlistview.cpp
+++ b/src/widgets/itemviews/qlistview.cpp
@@ -1315,8 +1315,8 @@ void QListView::setSelection(const QRect &rect, QItemSelectionModel::SelectionFl
if (tl.isValid() && br.isValid()
&& d->isIndexEnabled(tl)
&& d->isIndexEnabled(br)) {
- QRect first = rectForIndex(tl);
- QRect last = rectForIndex(br);
+ QRect first = d->cellRectForIndex(tl);
+ QRect last = d->cellRectForIndex(br);
QRect middle;
if (d->flow == LeftToRight) {
QRect &top = first;
diff --git a/src/widgets/itemviews/qlistview_p.h b/src/widgets/itemviews/qlistview_p.h
index 181386d4d0..c94357afe9 100644
--- a/src/widgets/itemviews/qlistview_p.h
+++ b/src/widgets/itemviews/qlistview_p.h
@@ -333,14 +333,31 @@ public:
inline QModelIndex listViewItemToIndex(const QListViewItem &item) const
{ return model->index(commonListView->itemIndex(item), column, root); }
+ inline bool hasRectForIndex(const QModelIndex &index) const
+ {
+ return isIndexValid(index) && index.parent() == root && index.column() == column && !isHidden(index.row());
+ }
+
QRect rectForIndex(const QModelIndex &index) const
{
- if (!isIndexValid(index) || index.parent() != root || index.column() != column || isHidden(index.row()))
+ if (!hasRectForIndex(index))
return QRect();
executePostedLayout();
return viewItemRect(indexToListViewItem(index));
}
+ QRect cellRectForIndex(const QModelIndex &index)
+ {
+ if (!hasRectForIndex(index))
+ return QRect();
+ executePostedLayout();
+ auto oldItemAlignment = itemAlignment;
+ itemAlignment = Qt::Alignment();
+ const QRect rect = rectForIndex(index);
+ itemAlignment = oldItemAlignment;
+ return rect;
+ }
+
void viewUpdateGeometries() { q_func()->updateGeometries(); }