commit 92d5fd3bffd1cee93532e4e3ee525af2328c9787 Author: Tomás Touceda chiiph@torproject.org Date: Fri Jan 20 19:03:45 2012 -0300
Adds a checkbox to VMessageLog::question to easily remember the answer
Also uses it for shutting down tor gracefully --- src/vidalia/MainWindow.cpp | 9 ++++- src/vidalia/VMessageBox.cpp | 55 ++++++++++++++++++++++++++----- src/vidalia/VMessageBox.h | 11 +++++- src/vidalia/config/VidaliaSettings.cpp | 13 +++++++ src/vidalia/config/VidaliaSettings.h | 8 +++++ 5 files changed, 83 insertions(+), 13 deletions(-)
diff --git a/src/vidalia/MainWindow.cpp b/src/vidalia/MainWindow.cpp index 183e78f..0ba6dda 100644 --- a/src/vidalia/MainWindow.cpp +++ b/src/vidalia/MainWindow.cpp @@ -717,12 +717,15 @@ MainWindow::stop() QString errmsg; TorStatus prevStatus; bool rc; + VidaliaSettings settings;
/* If we're running a server, give users the option of terminating * gracefully so clients have time to find new servers. */ if (server.isServerEnabled() && !_delayedShutdownStarted) { /* Ask the user if they want to shutdown nicely. */ - int response = VMessageBox::question(this, tr("Relaying is Enabled"), + int response = VMessageBox::Yes; + if(!settings.rememberShutdown()) { + response = VMessageBox::question(this, tr("Relaying is Enabled"), tr("You are currently running a relay. " "Terminating your relay will interrupt any " "open connections from clients.\n\n" @@ -730,7 +733,9 @@ MainWindow::stop() "give clients time to find a new relay?"), VMessageBox::Yes|VMessageBox::Default, VMessageBox::No, - VMessageBox::Cancel|VMessageBox::Escape); + VMessageBox::Cancel|VMessageBox::Escape, + "Remember this answer", &settings, SETTING_REMEMBER_SHUTDOWN); + } if (response == VMessageBox::Yes) _delayedShutdownStarted = true; else if (response == VMessageBox::Cancel) diff --git a/src/vidalia/VMessageBox.cpp b/src/vidalia/VMessageBox.cpp index 0dbf927..1600bc3 100644 --- a/src/vidalia/VMessageBox.cpp +++ b/src/vidalia/VMessageBox.cpp @@ -17,11 +17,19 @@
#include "html.h"
+#include <QGridLayout> +#include <QCheckBox> +#include <QDialogButtonBox> +#include <QPushButton>
/** Default constructor. */ VMessageBox::VMessageBox(QWidget *parent) : QMessageBox(parent) { + _chkRemember = new QCheckBox(""); + QGridLayout *gl = qobject_cast<QGridLayout *>(layout()); + gl->addWidget(_chkRemember, gl->rowCount() - 2, 1); + _chkRemember->setVisible(false); }
/** Returns the button (0, 1, or 2) that is OR-ed with QMessageBox::Default, @@ -113,15 +121,45 @@ VMessageBox::critical(QWidget *parent, QString caption, QString text, * QMessageBox::Escape, respectively. */ int VMessageBox::question(QWidget *parent, QString caption, QString text, - int button0, int button1, int button2) + int button0, int button1, int button2, + QString remember, VSettings *settings, QString key) { - int ret = QMessageBox::question(parent, caption, p(text), - VMessageBox::buttonText(button0), - VMessageBox::buttonText(button1), - VMessageBox::buttonText(button2), - VMessageBox::defaultButton(button0, button1, button2), - VMessageBox::escapeButton(button0, button1, button2)); - return VMessageBox::selected(ret, button0, button1, button2); + VMessageBox messageBox(parent); + + messageBox.setIcon(QMessageBox::Question); + messageBox.setWindowTitle(caption); + messageBox.setText(text); + messageBox.setStandardButtons(QMessageBox::NoButton); + + if(settings) { + messageBox._chkRemember->setVisible(true); + messageBox._chkRemember->setText(remember); + } + + QString myButton0Text = VMessageBox::buttonText(button0); + if (myButton0Text.isEmpty()) + myButton0Text = QDialogButtonBox::tr("OK"); + messageBox.addButton(myButton0Text, QMessageBox::ActionRole); + + if (!VMessageBox::buttonText(button1).isEmpty()) + messageBox.addButton(VMessageBox::buttonText(button1), QMessageBox::ActionRole); + + if (!VMessageBox::buttonText(button2).isEmpty()) + messageBox.addButton(VMessageBox::buttonText(button2), QMessageBox::ActionRole); + + const QList<QAbstractButton *> &buttonList = messageBox.buttons(); + messageBox.setDefaultButton(qobject_cast<QPushButton *>(buttonList + .value(VMessageBox::defaultButton(button0, + button1, + button2)))); + messageBox.setEscapeButton(buttonList.value(VMessageBox::escapeButton(button0, button1, button2))); + int ret = messageBox.exec(); + + if(!settings) + return ret; + settings->setValue(key, messageBox._chkRemember->checkState() == Qt::Checked); + + return ret; }
/** Displays an information message box with the given caption, message text, and @@ -157,4 +195,3 @@ VMessageBox::warning(QWidget *parent, QString caption, QString text, VMessageBox::escapeButton(button0, button1, button2)); return VMessageBox::selected(ret, button0, button1, button2); } - diff --git a/src/vidalia/VMessageBox.h b/src/vidalia/VMessageBox.h index fc96405..0dd3fe5 100644 --- a/src/vidalia/VMessageBox.h +++ b/src/vidalia/VMessageBox.h @@ -19,6 +19,9 @@ #include <QMessageBox> #include <QString>
+#include "VSettings.h" + +class QCheckBox;
class VMessageBox : public QMessageBox { @@ -72,8 +75,10 @@ public: * button, OR the Button enum value with QMessageBox::Default or * QMessageBox::Escape, respectively. */ static int question(QWidget *parent, QString caption, QString text, - int button0, int button1 = NoButton, - int button2 = NoButton); + int button0, int button1 = NoButton, + int button2 = NoButton, + QString remember = QString(), VSettings *settings = 0, + QString key = QString());
/** Converts a Button enum value to a translated string. */ static QString buttonText(int button); @@ -87,6 +92,8 @@ private: static int escapeButton(int button0, int button1, int button2); /** Returns the Button enum value from the given return value. */ static int selected(int ret, int button0, int button1, int button2); + + QCheckBox *_chkRemember; };
#endif diff --git a/src/vidalia/config/VidaliaSettings.cpp b/src/vidalia/config/VidaliaSettings.cpp index 022c427..48cd051 100644 --- a/src/vidalia/config/VidaliaSettings.cpp +++ b/src/vidalia/config/VidaliaSettings.cpp @@ -87,6 +87,7 @@ VidaliaSettings::VidaliaSettings()
setDefault(SETTING_PLUGIN_PATH, vApp->dataDirectory()); setDefault(SETTING_ICON_PREF, Both); + setDefault(SETTING_REMEMBER_SHUTDOWN, false); }
/** Gets the currently preferred language code for Vidalia. */ @@ -370,3 +371,15 @@ VidaliaSettings::fromString(QString iconPref)
return Both; } + +bool +VidaliaSettings::rememberShutdown() +{ + return value(SETTING_REMEMBER_SHUTDOWN).toBool(); +} + +void +VidaliaSettings::setRememberShutdown(bool val) +{ + setValue(SETTING_REMEMBER_SHUTDOWN, val); +} diff --git a/src/vidalia/config/VidaliaSettings.h b/src/vidalia/config/VidaliaSettings.h index bb6f1a0..3efbdb5 100644 --- a/src/vidalia/config/VidaliaSettings.h +++ b/src/vidalia/config/VidaliaSettings.h @@ -20,6 +20,8 @@
#include <QDateTime>
+/** Public setting keys */ +#define SETTING_REMEMBER_SHUTDOWN "RememberShutdown"
/** Handles saving and restoring Vidalia's settings, such as the * location of Tor, the control port, etc. @@ -144,6 +146,12 @@ public: void setIconPref(const IconPosition iconPref); QString toString(const IconPosition iconPref); IconPosition fromString(QString iconPref); + + /** Returns true if Vidalia should not ask if the user wants to shutdown + * tor gracefully */ + bool rememberShutdown(); + /** Sets RememberShutdown to val */ + void setRememberShutdown(bool val); };
#endif