diff --git a/src/base/bittorrent/session.cpp b/src/base/bittorrent/session.cpp index ea91af2ca..3d8d8040a 100644 --- a/src/base/bittorrent/session.cpp +++ b/src/base/bittorrent/session.cpp @@ -1863,20 +1863,26 @@ TorrentHandle *Session::findTorrent(const InfoHash &hash) const bool Session::hasActiveTorrents() const { - foreach (TorrentHandle *const torrent, m_torrents) - if (TorrentFilter::ActiveTorrent.match(torrent)) - return true; - - return false; + return std::any_of(m_torrents.begin(), m_torrents.end(), [](TorrentHandle *torrent) + { + return TorrentFilter::ActiveTorrent.match(torrent); + }); } bool Session::hasUnfinishedTorrents() const { - foreach (TorrentHandle *const torrent, m_torrents) - if (!torrent->isSeed() && !torrent->isPaused()) - return true; + return std::any_of(m_torrents.begin(), m_torrents.end(), [](const TorrentHandle *torrent) + { + return (!torrent->isSeed() && !torrent->isPaused()); + }); +} - return false; +bool Session::hasRunningSeed() const +{ + return std::any_of(m_torrents.begin(), m_torrents.end(), [](const TorrentHandle *torrent) + { + return (torrent->isSeed() && !torrent->isPaused()); + }); } void Session::banIP(const QString &ip) diff --git a/src/base/bittorrent/session.h b/src/base/bittorrent/session.h index 1d41eec03..03859ae5b 100644 --- a/src/base/bittorrent/session.h +++ b/src/base/bittorrent/session.h @@ -454,6 +454,7 @@ namespace BitTorrent TorrentStatusReport torrentStatusReport() const; bool hasActiveTorrents() const; bool hasUnfinishedTorrents() const; + bool hasRunningSeed() const; const SessionStatus &status() const; const CacheStatus &cacheStatus() const; quint64 getAlltimeDL() const; diff --git a/src/base/preferences.cpp b/src/base/preferences.cpp index 6bb30e585..61c6a3d32 100644 --- a/src/base/preferences.cpp +++ b/src/base/preferences.cpp @@ -255,14 +255,24 @@ void Preferences::setSplashScreenDisabled(bool b) } // Preventing from system suspend while active torrents are presented. -bool Preferences::preventFromSuspend() const +bool Preferences::preventFromSuspendWhenDownloading() const { - return value("Preferences/General/PreventFromSuspend", false).toBool(); + return value("Preferences/General/PreventFromSuspendWhenDownloading", false).toBool(); } -void Preferences::setPreventFromSuspend(bool b) +void Preferences::setPreventFromSuspendWhenDownloading(bool b) { - setValue("Preferences/General/PreventFromSuspend", b); + setValue("Preferences/General/PreventFromSuspendWhenDownloading", b); +} + +bool Preferences::preventFromSuspendWhenSeeding() const +{ + return value("Preferences/General/PreventFromSuspendWhenSeeding", false).toBool(); +} + +void Preferences::setPreventFromSuspendWhenSeeding(bool b) +{ + setValue("Preferences/General/PreventFromSuspendWhenSeeding", b); } #ifdef Q_OS_WIN @@ -1582,6 +1592,8 @@ void Preferences::setSpeedWidgetGraphEnable(int id, const bool enable) void Preferences::upgrade() { + SettingsStorage *settingsStorage = SettingsStorage::instance(); + QStringList labels = value("TransferListFilters/customLabels").toStringList(); if (!labels.isEmpty()) { QVariantMap categories = value("BitTorrent/Session/Categories").toMap(); @@ -1590,10 +1602,17 @@ void Preferences::upgrade() categories[label] = ""; } setValue("BitTorrent/Session/Categories", categories); - SettingsStorage::instance()->removeValue("TransferListFilters/customLabels"); + settingsStorage->removeValue("TransferListFilters/customLabels"); } - SettingsStorage::instance()->removeValue("Preferences/Downloads/AppendLabel"); + settingsStorage->removeValue("Preferences/Downloads/AppendLabel"); + + // Inhibit sleep based on running downloads/available seeds rather than network activity. + if (value("Preferences/General/PreventFromSuspend", false).toBool()) { + setPreventFromSuspendWhenDownloading(true); + setPreventFromSuspendWhenSeeding(true); + } + settingsStorage->removeValue("Preferences/General/PreventFromSuspend"); } void Preferences::apply() diff --git a/src/base/preferences.h b/src/base/preferences.h index b1e8a8d7e..969c38553 100644 --- a/src/base/preferences.h +++ b/src/base/preferences.h @@ -123,8 +123,10 @@ public: void setStartMinimized(bool b); bool isSplashScreenDisabled() const; void setSplashScreenDisabled(bool b); - bool preventFromSuspend() const; - void setPreventFromSuspend(bool b); + bool preventFromSuspendWhenDownloading() const; + void setPreventFromSuspendWhenDownloading(bool b); + bool preventFromSuspendWhenSeeding() const; + void setPreventFromSuspendWhenSeeding(bool b); #ifdef Q_OS_WIN bool WinStartup() const; void setWinStartup(bool b); diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp index ffdfbfee4..faedc77b9 100644 --- a/src/gui/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -344,7 +344,7 @@ MainWindow::MainWindow(QWidget *parent) m_pwr = new PowerManagement(this); m_preventTimer = new QTimer(this); - connect(m_preventTimer, &QTimer::timeout, this, &MainWindow::checkForActiveTorrents); + connect(m_preventTimer, &QTimer::timeout, this, &MainWindow::updatePowerManagementState); // Configure BT session according to options loadPreferences(false); @@ -1478,7 +1478,7 @@ void MainWindow::loadPreferences(bool configureSession) showStatusBar(pref->isStatusbarDisplayed()); - if (pref->preventFromSuspend() && !m_preventTimer->isActive()) { + if ((pref->preventFromSuspendWhenDownloading() || pref->preventFromSuspendWhenSeeding()) && !m_preventTimer->isActive()) { m_preventTimer->start(PREVENT_SUSPEND_INTERVAL); } else { @@ -2004,9 +2004,11 @@ void MainWindow::on_actionAutoShutdown_toggled(bool enabled) Preferences::instance()->setShutdownWhenDownloadsComplete(enabled); } -void MainWindow::checkForActiveTorrents() +void MainWindow::updatePowerManagementState() { - m_pwr->setActivityState(BitTorrent::Session::instance()->hasActiveTorrents()); + const bool inhibitSuspend = (Preferences::instance()->preventFromSuspendWhenDownloading() && BitTorrent::Session::instance()->hasUnfinishedTorrents()) + || (Preferences::instance()->preventFromSuspendWhenSeeding() && BitTorrent::Session::instance()->hasRunningSeed()); + m_pwr->setActivityState(inhibitSuspend); } #ifndef Q_OS_MAC diff --git a/src/gui/mainwindow.h b/src/gui/mainwindow.h index 88ed2acd5..87428eefc 100644 --- a/src/gui/mainwindow.h +++ b/src/gui/mainwindow.h @@ -174,8 +174,8 @@ private slots: void on_actionDownloadFromURL_triggered(); void on_actionExit_triggered(); void on_actionLock_triggered(); - // Check for active torrents and set preventing from suspend state - void checkForActiveTorrents(); + // Check for unpaused downloading or seeding torrents and prevent system suspend/sleep according to preferences + void updatePowerManagementState(); #if defined(Q_OS_WIN) || defined(Q_OS_MAC) void checkProgramUpdate(); #endif diff --git a/src/gui/optionsdialog.cpp b/src/gui/optionsdialog.cpp index e64c97ab0..44209f49a 100644 --- a/src/gui/optionsdialog.cpp +++ b/src/gui/optionsdialog.cpp @@ -225,10 +225,12 @@ OptionsDialog::OptionsDialog(QWidget *parent) connect(m_ui->checkShowSplash, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); connect(m_ui->checkProgramExitConfirm, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); connect(m_ui->checkProgramAutoExitConfirm, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkPreventFromSuspend, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); + connect(m_ui->checkPreventFromSuspendWhenDownloading, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); + connect(m_ui->checkPreventFromSuspendWhenSeeding, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); connect(m_ui->comboTrayIcon, qComboBoxCurrentIndexChanged, this, &ThisType::enableApplyButton); #if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC)) && !defined(QT_DBUS_LIB) - m_ui->checkPreventFromSuspend->setDisabled(true); + m_ui->checkPreventFromSuspendWhenDownloading->setDisabled(true); + m_ui->checkPreventFromSuspendWhenSeeding->setDisabled(true); #endif #if defined(Q_OS_WIN) || defined(Q_OS_MAC) connect(m_ui->checkAssociateTorrents, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); @@ -556,7 +558,8 @@ void OptionsDialog::saveOptions() pref->setSplashScreenDisabled(isSplashScreenDisabled()); pref->setConfirmOnExit(m_ui->checkProgramExitConfirm->isChecked()); pref->setDontConfirmAutoExit(!m_ui->checkProgramAutoExitConfirm->isChecked()); - pref->setPreventFromSuspend(preventFromSuspend()); + pref->setPreventFromSuspendWhenDownloading(m_ui->checkPreventFromSuspendWhenDownloading->isChecked()); + pref->setPreventFromSuspendWhenSeeding(m_ui->checkPreventFromSuspendWhenSeeding->isChecked()); #ifdef Q_OS_WIN pref->setWinStartup(WinStartup()); // Windows: file association settings @@ -793,7 +796,8 @@ void OptionsDialog::loadOptions() } #endif - m_ui->checkPreventFromSuspend->setChecked(pref->preventFromSuspend()); + m_ui->checkPreventFromSuspendWhenDownloading->setChecked(pref->preventFromSuspendWhenDownloading()); + m_ui->checkPreventFromSuspendWhenSeeding->setChecked(pref->preventFromSuspendWhenSeeding()); #ifdef Q_OS_WIN m_ui->checkStartup->setChecked(pref->WinStartup()); @@ -1407,11 +1411,6 @@ bool OptionsDialog::WinStartup() const } #endif -bool OptionsDialog::preventFromSuspend() const -{ - return m_ui->checkPreventFromSuspend->isChecked(); -} - bool OptionsDialog::preAllocateAllFiles() const { return m_ui->checkPreallocateAll->isChecked(); diff --git a/src/gui/optionsdialog.h b/src/gui/optionsdialog.h index 36d34513b..bac2945d7 100644 --- a/src/gui/optionsdialog.h +++ b/src/gui/optionsdialog.h @@ -122,7 +122,6 @@ private: #endif bool startMinimized() const; bool isSplashScreenDisabled() const; - bool preventFromSuspend() const; #ifdef Q_OS_WIN bool WinStartup() const; #endif diff --git a/src/gui/optionsdialog.ui b/src/gui/optionsdialog.ui index fa7a0688d..dcfc08e94 100644 --- a/src/gui/optionsdialog.ui +++ b/src/gui/optionsdialog.ui @@ -479,9 +479,16 @@ - + - Inhibit system sleep when torrents are active + Inhibit system sleep when torrents are downloading + + + + + + + Inhibit system sleep when torrents are seeding @@ -3369,7 +3376,8 @@ Use ';' to split multiple entries. Can use wildcard '*'. comboTrayIcon checkAssociateTorrents checkAssociateMagnetLinks - checkPreventFromSuspend + checkPreventFromSuspendWhenDownloading + checkPreventFromSuspendWhenSeeding checkAdditionDialog checkAdditionDialogFront checkPreallocateAll