diff --git a/src/app/application.cpp b/src/app/application.cpp index c78d1c32a..a414ae7cb 100644 --- a/src/app/application.cpp +++ b/src/app/application.cpp @@ -287,12 +287,12 @@ void Application::allTorrentsFinished() Preferences *const pref = Preferences::instance(); bool will_shutdown = (pref->shutdownWhenDownloadsComplete() - || pref->shutdownqBTWhenDownloadsComplete() || pref->suspendWhenDownloadsComplete() || pref->hibernateWhenDownloadsComplete()); + bool will_exit_only = pref->shutdownqBTWhenDownloadsComplete(); // Auto-Shutdown - if (will_shutdown) { + if (will_exit_only || will_shutdown) { bool suspend = pref->suspendWhenDownloadsComplete(); bool hibernate = pref->hibernateWhenDownloadsComplete(); bool shutdown = pref->shutdownWhenDownloadsComplete(); @@ -306,7 +306,21 @@ void Application::allTorrentsFinished() else if (shutdown) action = ShutdownAction::Shutdown; - if (!ShutdownConfirmDlg::askForConfirmation(action)) return; + if (will_exit_only) { + if (!pref->dontConfirmAutoExit()) { + bool exitConfirmed = false; + bool neverAskForExitConfirmationAgain = false; + ShutdownConfirmDlg::askForConfirmation(action, &exitConfirmed, &neverAskForExitConfirmationAgain); + if (neverAskForExitConfirmationAgain && exitConfirmed/*discard the request to never show again if dialog not accepted*/) + pref->setDontConfirmAutoExit(true); + if (!exitConfirmed) return; + } + } + else { //exit and shutdown + bool shutdownConfirmed = false; + ShutdownConfirmDlg::askForConfirmation(action, &shutdownConfirmed); + if (!shutdownConfirmed) return; + } // Actually shut down if (suspend || hibernate || shutdown) { diff --git a/src/base/preferences.cpp b/src/base/preferences.cpp index f38a0e499..8f3e8df9e 100644 --- a/src/base/preferences.cpp +++ b/src/base/preferences.cpp @@ -1164,6 +1164,16 @@ void Preferences::setShutdownqBTWhenDownloadsComplete(bool shutdown) setValue("Preferences/Downloads/AutoShutDownqBTOnCompletion", shutdown); } +bool Preferences::dontConfirmAutoExit() const +{ + return value("Preferences/Downloads/DontConfirmAutoExit", false).toBool(); +} + +void Preferences::setDontConfirmAutoExit(bool dontConfirmAutoExit) +{ + setValue("Preferences/Downloads/DontConfirmAutoExit", dontConfirmAutoExit); +} + uint Preferences::diskCacheSize() const { uint size = value("Preferences/Downloads/DiskWriteCacheSize", 0).toUInt(); diff --git a/src/base/preferences.h b/src/base/preferences.h index a554ecc9f..f9eaec5ff 100644 --- a/src/base/preferences.h +++ b/src/base/preferences.h @@ -331,6 +331,8 @@ public: void setHibernateWhenDownloadsComplete(bool hibernate); bool shutdownqBTWhenDownloadsComplete() const; void setShutdownqBTWhenDownloadsComplete(bool shutdown); + bool dontConfirmAutoExit() const; + void setDontConfirmAutoExit(bool dontConfirmAutoExit); uint diskCacheSize() const; void setDiskCacheSize(uint size); uint diskCacheTTL() const; diff --git a/src/gui/options.ui b/src/gui/options.ui index ac06db522..060f8fc8f 100644 --- a/src/gui/options.ui +++ b/src/gui/options.ui @@ -369,6 +369,16 @@ + + + + Confirmation on auto-exit when downloads finish + + + true + + + diff --git a/src/gui/options_imp.cpp b/src/gui/options_imp.cpp index f15e1db81..fce9e91db 100644 --- a/src/gui/options_imp.cpp +++ b/src/gui/options_imp.cpp @@ -159,6 +159,7 @@ options_imp::options_imp(QWidget *parent) #endif connect(checkShowSplash, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); connect(checkProgramExitConfirm, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(checkProgramAutoExitConfirm, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); connect(checkPreventFromSuspend, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); connect(comboTrayIcon, SIGNAL(currentIndexChanged(int)), this, SLOT(enableApplyButton())); #if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC)) && !defined(QT_DBUS_LIB) @@ -433,6 +434,7 @@ void options_imp::saveOptions() pref->setStartMinimized(startMinimized()); pref->setSplashScreenDisabled(isSlashScreenDisabled()); pref->setConfirmOnExit(checkProgramExitConfirm->isChecked()); + pref->setDontConfirmAutoExit(!checkProgramAutoExitConfirm->isChecked()); pref->setPreventFromSuspend(preventFromSuspend()); #ifdef Q_OS_WIN pref->setWinStartup(WinStartup()); @@ -628,6 +630,7 @@ void options_imp::loadOptions() checkShowSplash->setChecked(!pref->isSplashScreenDisabled()); checkStartMinimized->setChecked(pref->startMinimized()); checkProgramExitConfirm->setChecked(pref->confirmOnExit()); + checkProgramAutoExitConfirm->setChecked(!pref->dontConfirmAutoExit()); checkShowSystray->setChecked(pref->systrayIntegration()); if (checkShowSystray->isChecked()) { diff --git a/src/gui/shutdownconfirm.cpp b/src/gui/shutdownconfirm.cpp index 8fc204320..d1579f7c8 100644 --- a/src/gui/shutdownconfirm.cpp +++ b/src/gui/shutdownconfirm.cpp @@ -33,50 +33,81 @@ #include "base/types.h" #include "shutdownconfirm.h" +#include +#include +#include +#include +#include +#include +#include #include ShutdownConfirmDlg::ShutdownConfirmDlg(const ShutdownAction &action) - : m_exitNow(0) + : m_neverShowAgain(false) , m_timeout(15) , m_action(action) { - // Title and button + QVBoxLayout *myLayout = new QVBoxLayout(); + //Warning Icon and Text + QHBoxLayout *messageRow = new QHBoxLayout(); + QLabel *warningLabel = new QLabel(); + QIcon warningIcon(style()->standardIcon(QStyle::SP_MessageBoxWarning, 0, this)); + warningLabel->setPixmap(warningIcon.pixmap(warningIcon.actualSize(QSize(32, 32)))); + messageRow->addWidget(warningLabel); + m_text = new QLabel(); + messageRow->addWidget(m_text); + myLayout->addLayout(messageRow); + updateText(); + QDialogButtonBox *buttons = new QDialogButtonBox(Qt::Horizontal); + // Never show again checkbox, Title, and button if (m_action == ShutdownAction::None) { + //Never show again checkbox (shown only when exitting without shutdown) + QCheckBox *neverShowAgainCheckbox = new QCheckBox(tr("Never show again")); + myLayout->addWidget(neverShowAgainCheckbox, 0, Qt::AlignHCenter); + //Title and button + connect(neverShowAgainCheckbox, SIGNAL(clicked(bool)), this, SLOT(handleNeverShowAgainCheckboxToggled(bool))); setWindowTitle(tr("Exit confirmation")); - m_exitNow = addButton(tr("Exit now"), QMessageBox::AcceptRole); + buttons->addButton(new QPushButton(tr("Exit Now")), QDialogButtonBox::AcceptRole); } else { setWindowTitle(tr("Shutdown confirmation")); - m_exitNow = addButton(tr("Shutdown now"), QMessageBox::AcceptRole); + buttons->addButton(new QPushButton(tr("Shutdown Now")), QDialogButtonBox::AcceptRole); } // Cancel Button - addButton(QMessageBox::Cancel); - // Text - updateText(); - // Icon - setIcon(QMessageBox::Warning); + QPushButton *cancelButton = buttons->addButton(QDialogButtonBox::Cancel); + cancelButton->setDefault(true); + myLayout->addWidget(buttons, 0, Qt::AlignHCenter); + connect(buttons, SIGNAL(accepted()), this, SLOT(accept())); + connect(buttons, SIGNAL(rejected()), this, SLOT(reject())); // Always on top setWindowFlags(windowFlags()|Qt::WindowStaysOnTopHint); // Set 'Cancel' as default button. - setDefaultButton(QMessageBox::Cancel); m_timer.setInterval(1000); // 1sec connect(&m_timer, SIGNAL(timeout()), this, SLOT(updateSeconds())); - show(); // Move to center move(Utils::Misc::screenCenter(this)); + setLayout(myLayout); + cancelButton->setFocus(); +} + +bool ShutdownConfirmDlg::neverShowAgain() const +{ + return m_neverShowAgain; } void ShutdownConfirmDlg::showEvent(QShowEvent *event) { - QMessageBox::showEvent(event); + QDialog::showEvent(event); m_timer.start(); } -bool ShutdownConfirmDlg::askForConfirmation(const ShutdownAction &action) +void ShutdownConfirmDlg::askForConfirmation(const ShutdownAction &action, bool *shutdownConfirmed, bool *neverShowAgain) { ShutdownConfirmDlg dlg(action); dlg.exec(); - return dlg.shutdown(); + *shutdownConfirmed = dlg.shutdown(); + if (neverShowAgain) + *neverShowAgain = dlg.neverShowAgain(); } void ShutdownConfirmDlg::updateSeconds() @@ -89,15 +120,14 @@ void ShutdownConfirmDlg::updateSeconds() } } +void ShutdownConfirmDlg::handleNeverShowAgainCheckboxToggled(bool checked) +{ + m_neverShowAgain = checked; +} + bool ShutdownConfirmDlg::shutdown() const { - // This is necessary because result() in the case of QMessageBox - // returns a type of StandardButton, but since we use a custom button - // it will return 0 instead, even though we set the 'accept' role on it. - if (result() != QDialog::Accepted) - return (clickedButton() == m_exitNow); - else - return true; + return (result() == QDialog::Accepted); } void ShutdownConfirmDlg::updateText() @@ -119,15 +149,5 @@ void ShutdownConfirmDlg::updateText() break; } - setText(text); -} - -QAbstractButton *ShutdownConfirmDlg::getExit_now() const -{ - return m_exitNow; -} - -void ShutdownConfirmDlg::setExit_now(QAbstractButton *value) -{ - m_exitNow = value; + m_text->setText(text); } diff --git a/src/gui/shutdownconfirm.h b/src/gui/shutdownconfirm.h index b28792945..a365fd27e 100644 --- a/src/gui/shutdownconfirm.h +++ b/src/gui/shutdownconfirm.h @@ -31,35 +31,37 @@ #ifndef SHUTDOWNCONFIRM_H #define SHUTDOWNCONFIRM_H -#include +#include #include #include "base/utils/misc.h" -class ShutdownConfirmDlg : public QMessageBox +class QLabel; + +class ShutdownConfirmDlg : public QDialog { Q_OBJECT public: ShutdownConfirmDlg(const ShutdownAction &action); + bool neverShowAgain() const; bool shutdown() const; - static bool askForConfirmation(const ShutdownAction &action); - - QAbstractButton *getExit_now() const; - void setExit_now(QAbstractButton *value); + static void askForConfirmation(const ShutdownAction &action, bool *shutdownConfirmed, bool *neverShowAgain = 0); protected: void showEvent(QShowEvent *event); private slots: void updateSeconds(); + void handleNeverShowAgainCheckboxToggled(bool checked); private: // Methods void updateText(); // Vars - QAbstractButton *m_exitNow; + QLabel *m_text; + bool m_neverShowAgain; QTimer m_timer; int m_timeout; ShutdownAction m_action;