From edb7755fa437febdb6e5eda79ae1f5017a07b9f9 Mon Sep 17 00:00:00 2001 From: Luke Memet Date: Fri, 14 Feb 2025 20:47:44 -0500 Subject: [PATCH] GUI: Fix shift-click selection on macOS Implement custom mouse press event handling for macOS to properly support shift-click range selection in the transfer list. This addresses the issue reported in QTBUG-115838. --- src/gui/transferlistwidget.cpp | 35 ++++++++++++++++++++++++++++++++++ src/gui/transferlistwidget.h | 8 +++++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/gui/transferlistwidget.cpp b/src/gui/transferlistwidget.cpp index 9435b05be..aabe23f18 100644 --- a/src/gui/transferlistwidget.cpp +++ b/src/gui/transferlistwidget.cpp @@ -1446,3 +1446,38 @@ void TransferListWidget::wheelEvent(QWheelEvent *event) QTreeView::wheelEvent(event); // event delegated to base class } + +#ifdef Q_OS_MACOS +void TransferListWidget::mousePressEvent(QMouseEvent *event) +{ + const QModelIndex clickedIndex = indexAt(event->pos()); + if (!clickedIndex.isValid()) + { + QTreeView::mousePressEvent(event); + return; + } + + const Qt::KeyboardModifiers modifiers = event->modifiers(); + const bool shiftPressed = modifiers.testFlag(Qt::ShiftModifier); + const bool cmdPressed = modifiers.testFlag(Qt::ControlModifier); // Command key on macOS + + if (shiftPressed && m_lastClickedIndex.isValid()) + { + // Handle shift-click range selection + const QItemSelection selection(m_lastClickedIndex, clickedIndex); + if (cmdPressed) + selectionModel()->select(selection, QItemSelectionModel::Select | QItemSelectionModel::Rows); + else + selectionModel()->select(selection, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); + selectionModel()->setCurrentIndex(clickedIndex, QItemSelectionModel::NoUpdate); + event->accept(); + return; + } + + // For non-shift clicks, update the last clicked index + if (!(modifiers & (Qt::AltModifier | Qt::MetaModifier))) // Ignore if Alt/Meta is pressed + m_lastClickedIndex = clickedIndex; + + QTreeView::mousePressEvent(event); +} +#endif diff --git a/src/gui/transferlistwidget.h b/src/gui/transferlistwidget.h index c5b24ba24..a1ec19029 100644 --- a/src/gui/transferlistwidget.h +++ b/src/gui/transferlistwidget.h @@ -118,11 +118,14 @@ private slots: void askNewCategoryForSelection(); void saveSettings(); -private: +protected: void dragEnterEvent(QDragEnterEvent *event) override; void dragMoveEvent(QDragMoveEvent *event) override; void dropEvent(QDropEvent *event) override; void wheelEvent(QWheelEvent *event) override; + void mousePressEvent(QMouseEvent *event) override; + +private: QModelIndex mapToSource(const QModelIndex &index) const; QModelIndexList mapToSource(const QModelIndexList &indexes) const; QModelIndex mapFromSource(const QModelIndex &index) const; @@ -139,4 +142,7 @@ private: TransferListModel *m_listModel = nullptr; TransferListSortModel *m_sortFilterModel = nullptr; +#ifdef Q_OS_MACOS + QPersistentModelIndex m_lastClickedIndex; // For handling shift-click selection on macOS +#endif };