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; };