From 42786b2afcc0a7797e25771131c584be33c985fa Mon Sep 17 00:00:00 2001
From: nn <86272232+loop-nop@users.noreply.github.com>
Date: Sun, 28 Sep 2025 17:58:46 +0000
Subject: [PATCH] Restore default drag behavior in Torrent Content widget
Multi-selection for default LMB action, as before 5.1 update.
Adds option to select grab as the default behavior, for users who don't have the Alt key available.
Holding the Alt key toggles between grab/multi-selection.
PR #23180.
Closes #22686.
---
src/base/preferences.cpp | 13 +++++++++++++
src/base/preferences.h | 2 ++
src/gui/optionsdialog.cpp | 6 ++++++
src/gui/optionsdialog.ui | 19 +++++++++++++++++++
src/gui/properties/propertieswidget.cpp | 8 +++++++-
src/gui/torrentcontentwidget.cpp | 24 +++++++++++++++++++++++-
src/gui/torrentcontentwidget.h | 7 +++++++
7 files changed, 77 insertions(+), 2 deletions(-)
diff --git a/src/base/preferences.cpp b/src/base/preferences.cpp
index 453a1a993..df6424ab4 100644
--- a/src/base/preferences.cpp
+++ b/src/base/preferences.cpp
@@ -372,6 +372,19 @@ void Preferences::setToolbarDisplayed(const bool displayed)
setValue(u"Preferences/General/ToolbarDisplayed"_s, displayed);
}
+bool Preferences::isTorrentContentDragEnabled() const
+{
+ return value(u"Preferences/General/TorrentContentDragEnabled"_s, false);
+}
+
+void Preferences::setTorrentContentDragEnabled(const bool enabled)
+{
+ if (enabled == isTorrentContentDragEnabled())
+ return;
+
+ setValue(u"Preferences/General/TorrentContentDragEnabled"_s, enabled);
+}
+
bool Preferences::isStatusbarDisplayed() const
{
return value(u"Preferences/General/StatusbarDisplayed"_s, true);
diff --git a/src/base/preferences.h b/src/base/preferences.h
index 64685b8e8..a927c0e70 100644
--- a/src/base/preferences.h
+++ b/src/base/preferences.h
@@ -129,6 +129,8 @@ public:
void setStatusbarExternalIPDisplayed(bool displayed);
bool isToolbarDisplayed() const;
void setToolbarDisplayed(bool displayed);
+ bool isTorrentContentDragEnabled() const;
+ void setTorrentContentDragEnabled(bool enabled);
bool isSplashScreenDisabled() const;
void setSplashScreenDisabled(bool b);
bool preventFromSuspendWhenDownloading() const;
diff --git a/src/gui/optionsdialog.cpp b/src/gui/optionsdialog.cpp
index ad2eb348b..56bf1a457 100644
--- a/src/gui/optionsdialog.cpp
+++ b/src/gui/optionsdialog.cpp
@@ -290,6 +290,8 @@ void OptionsDialog::loadBehaviorTabOptions()
m_ui->checkBoxHideZeroStatusFilters->setChecked(pref->getHideZeroStatusFilters());
+ m_ui->checkTorrentContentDrag->setChecked(pref->isTorrentContentDragEnabled());
+
#ifndef Q_OS_WIN
m_ui->checkStartup->setVisible(false);
#endif
@@ -402,6 +404,8 @@ void OptionsDialog::loadBehaviorTabOptions()
connect(m_ui->actionTorrentFnOnDblClBox, qComboBoxCurrentIndexChanged, this, &ThisType::enableApplyButton);
connect(m_ui->checkBoxHideZeroStatusFilters, &QAbstractButton::toggled, this, &ThisType::enableApplyButton);
+ connect(m_ui->checkTorrentContentDrag, &QAbstractButton::toggled, this, &ThisType::enableApplyButton);
+
#ifdef Q_OS_WIN
connect(m_ui->checkStartup, &QAbstractButton::toggled, this, &ThisType::enableApplyButton);
#endif
@@ -499,6 +503,8 @@ void OptionsDialog::saveBehaviorTabOptions() const
pref->setHideZeroStatusFilters(m_ui->checkBoxHideZeroStatusFilters->isChecked());
+ pref->setTorrentContentDragEnabled(m_ui->checkTorrentContentDrag->isChecked());
+
pref->setSplashScreenDisabled(isSplashScreenDisabled());
pref->setConfirmOnExit(m_ui->checkProgramExitConfirm->isChecked());
pref->setDontConfirmAutoExit(!m_ui->checkProgramAutoExitConfirm->isChecked());
diff --git a/src/gui/optionsdialog.ui b/src/gui/optionsdialog.ui
index a0afed167..912f22b1a 100644
--- a/src/gui/optionsdialog.ui
+++ b/src/gui/optionsdialog.ui
@@ -459,6 +459,25 @@
+ -
+
+
+ Torrent Content View
+
+
+
-
+
+
+ Replaces multi-selection (hold Alt key to invert)
+
+
+ Drag content from qBittorrent
+
+
+
+
+
+
-
diff --git a/src/gui/properties/propertieswidget.cpp b/src/gui/properties/propertieswidget.cpp
index d86f5a074..a885b1cff 100644
--- a/src/gui/properties/propertieswidget.cpp
+++ b/src/gui/properties/propertieswidget.cpp
@@ -86,6 +86,7 @@ PropertiesWidget::PropertiesWidget(QWidget *parent)
connect(m_contentFilterLine, &LineEdit::textChanged, this, &PropertiesWidget::setContentFilterPattern);
m_ui->contentFilterLayout->insertWidget(3, m_contentFilterLine);
+ m_ui->filesList->setContentDragAllowed(true);
m_ui->filesList->setDoubleClickAction(TorrentContentWidget::DoubleClickAction::Open);
m_ui->filesList->setOpenByEnterKey(true);
@@ -572,8 +573,13 @@ void PropertiesWidget::displayWebSeedListMenu()
void PropertiesWidget::configure()
{
+ const auto *preferences = Preferences::instance();
+
+ // Torrent Content Widget
+ m_ui->filesList->setContentDragEnabled(preferences->isTorrentContentDragEnabled());
+
// Speed widget
- if (Preferences::instance()->isSpeedWidgetEnabled())
+ if (preferences->isSpeedWidgetEnabled())
{
if (!qobject_cast(m_speedWidget))
{
diff --git a/src/gui/torrentcontentwidget.cpp b/src/gui/torrentcontentwidget.cpp
index 472537bf2..59b4d5a0a 100644
--- a/src/gui/torrentcontentwidget.cpp
+++ b/src/gui/torrentcontentwidget.cpp
@@ -71,8 +71,9 @@ namespace
TorrentContentWidget::TorrentContentWidget(QWidget *parent)
: QTreeView(parent)
{
- setDragEnabled(true);
setDragDropMode(QAbstractItemView::DragOnly);
+ setDragEnabled(false);
+ setSelectionMode(QAbstractItemView::MultiSelection);
setExpandsOnDoubleClick(false);
setSortingEnabled(true);
setUniformRowHeights(true);
@@ -224,6 +225,27 @@ void TorrentContentWidget::checkNone()
model()->setData(model()->index(i, TorrentContentModelItem::COL_NAME), Qt::Unchecked, Qt::CheckStateRole);
}
+void TorrentContentWidget::setContentDragAllowed(const bool allowed)
+{
+ m_contentDragAllowed = allowed;
+}
+
+void TorrentContentWidget::setContentDragEnabled(const bool enabled)
+{
+ m_contentDragEnabled = enabled;
+}
+
+void TorrentContentWidget::mousePressEvent(QMouseEvent *event)
+{
+ if (m_contentDragAllowed)
+ {
+ const bool hasAlt = event->modifiers().testFlag(Qt::AltModifier);
+ setDragEnabled(hasAlt ? !m_contentDragEnabled : m_contentDragEnabled);
+ }
+
+ QTreeView::mousePressEvent(event);
+}
+
void TorrentContentWidget::keyPressEvent(QKeyEvent *event)
{
if ((event->key() != Qt::Key_Space) && (event->key() != Qt::Key_Select))
diff --git a/src/gui/torrentcontentwidget.h b/src/gui/torrentcontentwidget.h
index 1e9f0835c..d7b6fe1ed 100644
--- a/src/gui/torrentcontentwidget.h
+++ b/src/gui/torrentcontentwidget.h
@@ -98,11 +98,15 @@ public:
void checkAll();
void checkNone();
+ void setContentDragAllowed(bool allowed);
+ void setContentDragEnabled(bool enabled);
+
signals:
void stateChanged();
private:
void setModel(QAbstractItemModel *model) override;
+ void mousePressEvent(QMouseEvent *event) override;
void keyPressEvent(QKeyEvent *event) override;
void wheelEvent(QWheelEvent *event) override;
QModelIndex currentNameCell() const;
@@ -126,4 +130,7 @@ private:
ColumnsVisibilityMode m_columnsVisibilityMode = ColumnsVisibilityMode::Editable;
QShortcut *m_openFileHotkeyEnter = nullptr;
QShortcut *m_openFileHotkeyReturn = nullptr;
+
+ bool m_contentDragAllowed = false;
+ bool m_contentDragEnabled = false;
};