diff options
author | Philip Kaufmann <phil.kaufmann@t-online.de> | 2013-12-03 09:10:10 +0100 |
---|---|---|
committer | Philip Kaufmann <phil.kaufmann@t-online.de> | 2014-01-06 16:19:04 +0100 |
commit | 7e195e8459ad741368db6bb574981fccb1707268 (patch) | |
tree | d14b125aac61867a028af5dab191926789848182 /src/qt/optionsmodel.cpp | |
parent | 65515c0d05678334a52f686eaaa2bac1ff285a5a (diff) |
[Qt] massive options/settings rework (no core changes)
- add new options for database cache and script verification threads
- add label which displays options that are overridden by command-line
parameters
- proxy settings are not applied on-the-fly anymore and require a client
restart (ApplyProxySettings() was removed and was not working very well
anyway)
- re-work options reset and require a client shutdown (as it is much
easier to do it this way without having to mess with what can be changed
on-the-fly and what needs a restart anyway)
- options reset now writes default values for every single option
- when changing an option which requires a client restart display a 10
second warning message in statusLabel (via a QTimer)
- when applying the changes via ok change that to a persistent message,
which is displayed even after closing optionsdialog and re-open it, when
no client restart was made
- remove dialog boxes used when changing language or proxy settings
- add setRestartRequired() and isRestartRequired() to OptionsModel and
use the set function when updating options to signal OptionsDialog
when a restart is needed
- resize optionsdialog a little and add some min sizes for certain GUI
elements
- remove apply button from optionsdialog
- save and restore optionsdialog window position
- update nTransactionFee in QSettings with a set -paytxfee value when
opening optionsdialog (I'm not sure about this yet, perhaps revert to
not updating QSettings and just display current -paytxfee value in
optionsdialog.)
Diffstat (limited to 'src/qt/optionsmodel.cpp')
-rw-r--r-- | src/qt/optionsmodel.cpp | 287 |
1 files changed, 179 insertions, 108 deletions
diff --git a/src/qt/optionsmodel.cpp b/src/qt/optionsmodel.cpp index b64b0dff8b..c7817a94a8 100644 --- a/src/qt/optionsmodel.cpp +++ b/src/qt/optionsmodel.cpp @@ -18,6 +18,7 @@ #include "walletdb.h" #include <QSettings> +#include <QStringList> OptionsModel::OptionsModel(QObject *parent) : QAbstractListModel(parent) @@ -25,79 +26,114 @@ OptionsModel::OptionsModel(QObject *parent) : Init(); } -bool static ApplyProxySettings() -{ - QSettings settings; - CService addrProxy(settings.value("addrProxy", "127.0.0.1:9050").toString().toStdString()); - int nSocksVersion(settings.value("nSocksVersion", 5).toInt()); - if (!settings.value("fUseProxy", false).toBool()) { - addrProxy = CService(); - nSocksVersion = 0; - return false; - } - if (nSocksVersion && !addrProxy.IsValid()) - return false; - if (!IsLimited(NET_IPV4)) - SetProxy(NET_IPV4, addrProxy, nSocksVersion); - if (nSocksVersion > 4) { -#ifdef USE_IPV6 - if (!IsLimited(NET_IPV6)) - SetProxy(NET_IPV6, addrProxy, nSocksVersion); -#endif - SetNameProxy(addrProxy, nSocksVersion); - } - return true; -} - +// Writes all missing QSettings with their default values void OptionsModel::Init() { QSettings settings; + // Ensure restart flag is unset on client startup + setRestartRequired(false); + // These are Qt-only settings: - nDisplayUnit = settings.value("nDisplayUnit", BitcoinUnits::BTC).toInt(); + + // Window + if (!settings.contains("fMinimizeToTray")) + settings.setValue("fMinimizeToTray", false); + fMinimizeToTray = settings.value("fMinimizeToTray").toBool(); + + if (!settings.contains("fMinimizeOnClose")) + settings.setValue("fMinimizeOnClose", false); + fMinimizeOnClose = settings.value("fMinimizeOnClose").toBool(); + + // Display + if (!settings.contains("nDisplayUnit")) + settings.setValue("nDisplayUnit", BitcoinUnits::BTC); + nDisplayUnit = settings.value("nDisplayUnit").toInt(); + + if (!settings.contains("bDisplayAddresses")) + settings.setValue("bDisplayAddresses", false); bDisplayAddresses = settings.value("bDisplayAddresses", false).toBool(); - fMinimizeToTray = settings.value("fMinimizeToTray", false).toBool(); - fMinimizeOnClose = settings.value("fMinimizeOnClose", false).toBool(); - nTransactionFee = settings.value("nTransactionFee").toLongLong(); - language = settings.value("language", "").toString(); + + if (!settings.contains("fCoinControlFeatures")) + settings.setValue("fCoinControlFeatures", false); fCoinControlFeatures = settings.value("fCoinControlFeatures", false).toBool(); - // These are shared with core Bitcoin; we want - // command-line options to override the GUI settings: - if (settings.contains("fUseUPnP")) - SoftSetBoolArg("-upnp", settings.value("fUseUPnP").toBool()); - if (settings.contains("addrProxy") && settings.value("fUseProxy").toBool()) - SoftSetArg("-proxy", settings.value("addrProxy").toString().toStdString()); - if (settings.contains("nSocksVersion") && settings.value("fUseProxy").toBool()) - SoftSetArg("-socks", settings.value("nSocksVersion").toString().toStdString()); - if (!language.isEmpty()) - SoftSetArg("-lang", language.toStdString()); + // These are shared with the core or have a command-line parameter + // and we want command-line parameters to overwrite the GUI settings. + // + // If setting doesn't exist create it with defaults. + // + // If SoftSetArg() or SoftSetBoolArg() return false we were overridden + // by command-line and show this in the UI. + + // Main + if (!settings.contains("nTransactionFee")) + settings.setValue("nTransactionFee", 0); + + if (!settings.contains("nDatabaseCache")) + settings.setValue("nDatabaseCache", 25); + if (!SoftSetArg("-dbcache", settings.value("nDatabaseCache").toString().toStdString())) + strOverriddenByCommandLine += "-dbcache "; + + if (!settings.contains("nThreadsScriptVerif")) + settings.setValue("nThreadsScriptVerif", 0); + if (!SoftSetArg("-par", settings.value("nThreadsScriptVerif").toString().toStdString())) + strOverriddenByCommandLine += "-par "; + + // Network + if (!settings.contains("fUseUPnP")) +#ifdef USE_UPNP + settings.setValue("fUseUPnP", true); +#else + settings.setValue("fUseUPnP", false); +#endif + if (!SoftSetBoolArg("-upnp", settings.value("fUseUPnP").toBool())) + strOverriddenByCommandLine += "-upnp "; + + if (!settings.contains("fUseProxy")) + settings.setValue("fUseProxy", false); + if (!settings.contains("addrProxy")) + settings.setValue("addrProxy", "127.0.0.1:9050"); + // Only try to set -proxy, if user has enabled fUseProxy + if (settings.value("fUseProxy").toBool() && !SoftSetArg("-proxy", settings.value("addrProxy").toString().toStdString())) + strOverriddenByCommandLine += "-proxy "; + if (!settings.contains("nSocksVersion")) + settings.setValue("nSocksVersion", 5); + // Only try to set -socks, if user has enabled fUseProxy + if (settings.value("fUseProxy").toBool() && !SoftSetArg("-socks", settings.value("nSocksVersion").toString().toStdString())) + strOverriddenByCommandLine += "-socks "; + + // Display + if (!settings.contains("language")) + settings.setValue("language", ""); + if (!SoftSetArg("-lang", settings.value("language").toString().toStdString())) + strOverriddenByCommandLine += "-lang"; + + language = settings.value("language").toString(); } void OptionsModel::Reset() { QSettings settings; - // Remove all entries in this QSettings object + // Remove all entries from our QSettings object settings.clear(); // default setting for OptionsModel::StartAtStartup - disabled if (GUIUtil::GetStartOnSystemStartup()) GUIUtil::SetStartOnSystemStartup(false); - // Re-Init to get default values - Init(); - // Ensure Upgrade() is not running again by setting the bImportFinished flag settings.setValue("bImportFinished", true); } -bool OptionsModel::Upgrade() +void OptionsModel::Upgrade() { QSettings settings; + // Already upgraded if (settings.contains("bImportFinished")) - return false; // Already upgraded + return; settings.setValue("bImportFinished", true); @@ -145,18 +181,16 @@ bool OptionsModel::Upgrade() walletdb.EraseSetting("addrProxy"); } } - ApplyProxySettings(); - Init(); - return true; + Init(); } - int OptionsModel::rowCount(const QModelIndex & parent) const { return OptionIDRowCount; } +// read QSettings values and return them QVariant OptionsModel::data(const QModelIndex & index, int role) const { if(role == Qt::EditRole) @@ -165,52 +199,55 @@ QVariant OptionsModel::data(const QModelIndex & index, int role) const switch(index.row()) { case StartAtStartup: - return QVariant(GUIUtil::GetStartOnSystemStartup()); + return GUIUtil::GetStartOnSystemStartup(); case MinimizeToTray: - return QVariant(fMinimizeToTray); + return fMinimizeToTray; case MapPortUPnP: #ifdef USE_UPNP - return settings.value("fUseUPnP", GetBoolArg("-upnp", true)); + return settings.value("fUseUPnP"); #else - return QVariant(false); + return false; #endif case MinimizeOnClose: - return QVariant(fMinimizeOnClose); - case ProxyUse: { - proxyType proxy; - return QVariant(GetProxy(NET_IPV4, proxy)); - } + return fMinimizeOnClose; + + // default proxy + case ProxyUse: + return settings.value("fUseProxy", false); case ProxyIP: { - proxyType proxy; - if (GetProxy(NET_IPV4, proxy)) - return QVariant(QString::fromStdString(proxy.first.ToStringIP())); - else - return QVariant(QString::fromStdString("127.0.0.1")); + // contains IP at index 0 and port at index 1 + QStringList strlIpPort = settings.value("addrProxy").toString().split(":", QString::SkipEmptyParts); + return strlIpPort.at(0); } case ProxyPort: { - proxyType proxy; - if (GetProxy(NET_IPV4, proxy)) - return QVariant(proxy.first.GetPort()); - else - return QVariant(9050); - } - case ProxySocksVersion: { - proxyType proxy; - if (GetProxy(NET_IPV4, proxy)) - return QVariant(proxy.second); - else - return QVariant(5); + // contains IP at index 0 and port at index 1 + QStringList strlIpPort = settings.value("addrProxy").toString().split(":", QString::SkipEmptyParts); + return strlIpPort.at(1); } + case ProxySocksVersion: + return settings.value("nSocksVersion", 5); + case Fee: - return QVariant((qint64) nTransactionFee); + // Attention: Init() is called before nTransactionFee is set in AppInit2()! + // To ensure we can change the fee on-the-fly update our QSetting when + // opening OptionsDialog, which queries Fee via the mapper. + if (nTransactionFee != settings.value("nTransactionFee").toLongLong()) + settings.setValue("nTransactionFee", (qint64)nTransactionFee); + // Todo: Consider to revert back to use just nTransactionFee here, if we don't want + // -paytxfee to update our QSettings! + return settings.value("nTransactionFee"); case DisplayUnit: - return QVariant(nDisplayUnit); + return nDisplayUnit; case DisplayAddresses: - return QVariant(bDisplayAddresses); + return bDisplayAddresses; case Language: - return settings.value("language", ""); + return settings.value("language"); case CoinControlFeatures: - return QVariant(fCoinControlFeatures); + return fCoinControlFeatures; + case DatabaseCache: + return settings.value("nDatabaseCache"); + case ThreadsScriptVerif: + return settings.value("nThreadsScriptVerif"); default: return QVariant(); } @@ -218,6 +255,7 @@ QVariant OptionsModel::data(const QModelIndex & index, int role) const return QVariant(); } +// write QSettings values bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, int role) { bool successful = true; /* set to false on parse error */ @@ -233,7 +271,7 @@ bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, in fMinimizeToTray = value.toBool(); settings.setValue("fMinimizeToTray", fMinimizeToTray); break; - case MapPortUPnP: + case MapPortUPnP: // core option - can be changed on-the-fly settings.setValue("fUseUPnP", value.toBool()); MapPort(value.toBool()); break; @@ -241,44 +279,50 @@ bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, in fMinimizeOnClose = value.toBool(); settings.setValue("fMinimizeOnClose", fMinimizeOnClose); break; + + // default proxy case ProxyUse: - settings.setValue("fUseProxy", value.toBool()); - successful = ApplyProxySettings(); + if (settings.value("fUseProxy") != value) { + settings.setValue("fUseProxy", value.toBool()); + setRestartRequired(true); + } break; case ProxyIP: { - proxyType proxy; - proxy.first = CService("127.0.0.1", 9050); - GetProxy(NET_IPV4, proxy); - - CNetAddr addr(value.toString().toStdString()); - proxy.first.SetIP(addr); - settings.setValue("addrProxy", proxy.first.ToStringIPPort().c_str()); - successful = ApplyProxySettings(); + // contains current IP at index 0 and current port at index 1 + QStringList strlIpPort = settings.value("addrProxy").toString().split(":", QString::SkipEmptyParts); + // if that key doesn't exist or has a changed IP + if (!settings.contains("addrProxy") || strlIpPort.at(0) != value.toString()) { + // construct new value from new IP and current port + QString strNewValue = value.toString() + ":" + strlIpPort.at(1); + settings.setValue("addrProxy", strNewValue); + setRestartRequired(true); + } } break; case ProxyPort: { - proxyType proxy; - proxy.first = CService("127.0.0.1", 9050); - GetProxy(NET_IPV4, proxy); - - proxy.first.SetPort(value.toInt()); - settings.setValue("addrProxy", proxy.first.ToStringIPPort().c_str()); - successful = ApplyProxySettings(); + // contains current IP at index 0 and current port at index 1 + QStringList strlIpPort = settings.value("addrProxy").toString().split(":", QString::SkipEmptyParts); + // if that key doesn't exist or has a changed port + if (!settings.contains("addrProxy") || strlIpPort.at(1) != value.toString()) { + // construct new value from current IP and new port + QString strNewValue = strlIpPort.at(0) + ":" + value.toString(); + settings.setValue("addrProxy", strNewValue); + setRestartRequired(true); + } } break; case ProxySocksVersion: { - proxyType proxy; - proxy.second = 5; - GetProxy(NET_IPV4, proxy); - - proxy.second = value.toInt(); - settings.setValue("nSocksVersion", proxy.second); - successful = ApplyProxySettings(); + if (settings.value("nSocksVersion") != value) { + settings.setValue("nSocksVersion", value.toInt()); + setRestartRequired(true); + } } break; - case Fee: + + case Fee: // core option - can be changed on-the-fly + // Todo: Add is valid check and warn via message, if not nTransactionFee = value.toLongLong(); - settings.setValue("nTransactionFee", (qint64) nTransactionFee); + settings.setValue("nTransactionFee", (qint64)nTransactionFee); emit transactionFeeChanged(nTransactionFee); break; case DisplayUnit: @@ -291,13 +335,28 @@ bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, in settings.setValue("bDisplayAddresses", bDisplayAddresses); break; case Language: - settings.setValue("language", value); + if (settings.value("language") != value) { + settings.setValue("language", value); + setRestartRequired(true); + } break; case CoinControlFeatures: fCoinControlFeatures = value.toBool(); settings.setValue("fCoinControlFeatures", fCoinControlFeatures); emit coinControlFeaturesChanged(fCoinControlFeatures); break; + case DatabaseCache: + if (settings.value("nDatabaseCache") != value) { + settings.setValue("nDatabaseCache", value); + setRestartRequired(true); + } + break; + case ThreadsScriptVerif: + if (settings.value("nThreadsScriptVerif") != value) { + settings.setValue("nThreadsScriptVerif", value); + setRestartRequired(true); + } + break; default: break; } @@ -317,3 +376,15 @@ bool OptionsModel::getProxySettings(QString& proxyIP, quint16 &proxyPort) const proxyPort = addrProxy.GetPort(); return true; } + +void OptionsModel::setRestartRequired(bool fRequired) +{ + QSettings settings; + return settings.setValue("fRestartRequired", fRequired); +} + +bool OptionsModel::isRestartRequired() +{ + QSettings settings; + return settings.value("fRestartRequired", false).toBool(); +} |