]> Git Repo - VerusCoin.git/blob - src/qt/optionsmodel.cpp
Merge pull request #5050
[VerusCoin.git] / src / qt / optionsmodel.cpp
1 // Copyright (c) 2011-2014 The Bitcoin developers
2 // Distributed under the MIT/X11 software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5 #if defined(HAVE_CONFIG_H)
6 #include "config/bitcoin-config.h"
7 #endif
8
9 #include "optionsmodel.h"
10
11 #include "bitcoinunits.h"
12 #include "guiutil.h"
13
14 #include "init.h"
15 #include "main.h"
16 #include "net.h"
17 #include "txdb.h" // for -dbcache defaults
18
19 #ifdef ENABLE_WALLET
20 #include "wallet.h"
21 #include "walletdb.h"
22 #endif
23
24 #include <QNetworkProxy>
25 #include <QSettings>
26 #include <QStringList>
27
28 OptionsModel::OptionsModel(QObject *parent) :
29     QAbstractListModel(parent)
30 {
31     Init();
32 }
33
34 void OptionsModel::addOverriddenOption(const std::string &option)
35 {
36     strOverriddenByCommandLine += QString::fromStdString(option) + "=" + QString::fromStdString(mapArgs[option]) + " ";
37 }
38
39 // Writes all missing QSettings with their default values
40 void OptionsModel::Init()
41 {
42     QSettings settings;
43
44     // Ensure restart flag is unset on client startup
45     setRestartRequired(false);
46
47     // These are Qt-only settings:
48
49     // Window
50     if (!settings.contains("fMinimizeToTray"))
51         settings.setValue("fMinimizeToTray", false);
52     fMinimizeToTray = settings.value("fMinimizeToTray").toBool();
53
54     if (!settings.contains("fMinimizeOnClose"))
55         settings.setValue("fMinimizeOnClose", false);
56     fMinimizeOnClose = settings.value("fMinimizeOnClose").toBool();
57
58     // Display
59     if (!settings.contains("nDisplayUnit"))
60         settings.setValue("nDisplayUnit", BitcoinUnits::BTC);
61     nDisplayUnit = settings.value("nDisplayUnit").toInt();
62
63     if (!settings.contains("strThirdPartyTxUrls"))
64         settings.setValue("strThirdPartyTxUrls", "");
65     strThirdPartyTxUrls = settings.value("strThirdPartyTxUrls", "").toString();
66
67     if (!settings.contains("fCoinControlFeatures"))
68         settings.setValue("fCoinControlFeatures", false);
69     fCoinControlFeatures = settings.value("fCoinControlFeatures", false).toBool();
70
71     // These are shared with the core or have a command-line parameter
72     // and we want command-line parameters to overwrite the GUI settings.
73     //
74     // If setting doesn't exist create it with defaults.
75     //
76     // If SoftSetArg() or SoftSetBoolArg() return false we were overridden
77     // by command-line and show this in the UI.
78
79     // Main
80     if (!settings.contains("nDatabaseCache"))
81         settings.setValue("nDatabaseCache", (qint64)nDefaultDbCache);
82     if (!SoftSetArg("-dbcache", settings.value("nDatabaseCache").toString().toStdString()))
83         addOverriddenOption("-dbcache");
84
85     if (!settings.contains("nThreadsScriptVerif"))
86         settings.setValue("nThreadsScriptVerif", DEFAULT_SCRIPTCHECK_THREADS);
87     if (!SoftSetArg("-par", settings.value("nThreadsScriptVerif").toString().toStdString()))
88         addOverriddenOption("-par");
89
90     // Wallet
91 #ifdef ENABLE_WALLET
92     if (!settings.contains("nTransactionFee"))
93         settings.setValue("nTransactionFee", (qint64)DEFAULT_TRANSACTION_FEE);
94     payTxFee = CFeeRate(settings.value("nTransactionFee").toLongLong()); // if -paytxfee is set, this will be overridden later in init.cpp
95     if (mapArgs.count("-paytxfee"))
96         addOverriddenOption("-paytxfee");
97
98     if (!settings.contains("bSpendZeroConfChange"))
99         settings.setValue("bSpendZeroConfChange", true);
100     if (!SoftSetBoolArg("-spendzeroconfchange", settings.value("bSpendZeroConfChange").toBool()))
101         addOverriddenOption("-spendzeroconfchange");
102 #endif
103
104     // Network
105     if (!settings.contains("fUseUPnP"))
106         settings.setValue("fUseUPnP", DEFAULT_UPNP);
107     if (!SoftSetBoolArg("-upnp", settings.value("fUseUPnP").toBool()))
108         addOverriddenOption("-upnp");
109
110     if (!settings.contains("fListen"))
111         settings.setValue("fListen", DEFAULT_LISTEN);
112     if (!SoftSetBoolArg("-listen", settings.value("fListen").toBool()))
113         addOverriddenOption("-listen");
114
115     if (!settings.contains("fUseProxy"))
116         settings.setValue("fUseProxy", false);
117     if (!settings.contains("addrProxy"))
118         settings.setValue("addrProxy", "127.0.0.1:9050");
119     // Only try to set -proxy, if user has enabled fUseProxy
120     if (settings.value("fUseProxy").toBool() && !SoftSetArg("-proxy", settings.value("addrProxy").toString().toStdString()))
121         addOverriddenOption("-proxy");
122     else if(!settings.value("fUseProxy").toBool() && !GetArg("-proxy", "").empty())
123         addOverriddenOption("-proxy");
124
125     // Display
126     if (!settings.contains("language"))
127         settings.setValue("language", "");
128     if (!SoftSetArg("-lang", settings.value("language").toString().toStdString()))
129         addOverriddenOption("-lang");
130
131     language = settings.value("language").toString();
132 }
133
134 void OptionsModel::Reset()
135 {
136     QSettings settings;
137
138     // Remove all entries from our QSettings object
139     settings.clear();
140
141     // default setting for OptionsModel::StartAtStartup - disabled
142     if (GUIUtil::GetStartOnSystemStartup())
143         GUIUtil::SetStartOnSystemStartup(false);
144 }
145
146 int OptionsModel::rowCount(const QModelIndex & parent) const
147 {
148     return OptionIDRowCount;
149 }
150
151 // read QSettings values and return them
152 QVariant OptionsModel::data(const QModelIndex & index, int role) const
153 {
154     if(role == Qt::EditRole)
155     {
156         QSettings settings;
157         switch(index.row())
158         {
159         case StartAtStartup:
160             return GUIUtil::GetStartOnSystemStartup();
161         case MinimizeToTray:
162             return fMinimizeToTray;
163         case MapPortUPnP:
164 #ifdef USE_UPNP
165             return settings.value("fUseUPnP");
166 #else
167             return false;
168 #endif
169         case MinimizeOnClose:
170             return fMinimizeOnClose;
171
172         // default proxy
173         case ProxyUse:
174             return settings.value("fUseProxy", false);
175         case ProxyIP: {
176             // contains IP at index 0 and port at index 1
177             QStringList strlIpPort = settings.value("addrProxy").toString().split(":", QString::SkipEmptyParts);
178             return strlIpPort.at(0);
179         }
180         case ProxyPort: {
181             // contains IP at index 0 and port at index 1
182             QStringList strlIpPort = settings.value("addrProxy").toString().split(":", QString::SkipEmptyParts);
183             return strlIpPort.at(1);
184         }
185
186 #ifdef ENABLE_WALLET
187         case Fee: {
188             // Attention: Init() is called before payTxFee is set in AppInit2()!
189             // To ensure we can change the fee on-the-fly update our QSetting when
190             // opening OptionsDialog, which queries Fee via the mapper.
191             if (!(payTxFee == CFeeRate(settings.value("nTransactionFee").toLongLong(), 1000)))
192                 settings.setValue("nTransactionFee", (qint64)payTxFee.GetFeePerK());
193             // Todo: Consider to revert back to use just payTxFee here, if we don't want
194             // -paytxfee to update our QSettings!
195             return settings.value("nTransactionFee");
196         }
197         case SpendZeroConfChange:
198             return settings.value("bSpendZeroConfChange");
199 #endif
200         case DisplayUnit:
201             return nDisplayUnit;
202         case ThirdPartyTxUrls:
203             return strThirdPartyTxUrls;
204         case Language:
205             return settings.value("language");
206         case CoinControlFeatures:
207             return fCoinControlFeatures;
208         case DatabaseCache:
209             return settings.value("nDatabaseCache");
210         case ThreadsScriptVerif:
211             return settings.value("nThreadsScriptVerif");
212         case Listen:
213             return settings.value("fListen");
214         default:
215             return QVariant();
216         }
217     }
218     return QVariant();
219 }
220
221 // write QSettings values
222 bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, int role)
223 {
224     bool successful = true; /* set to false on parse error */
225     if(role == Qt::EditRole)
226     {
227         QSettings settings;
228         switch(index.row())
229         {
230         case StartAtStartup:
231             successful = GUIUtil::SetStartOnSystemStartup(value.toBool());
232             break;
233         case MinimizeToTray:
234             fMinimizeToTray = value.toBool();
235             settings.setValue("fMinimizeToTray", fMinimizeToTray);
236             break;
237         case MapPortUPnP: // core option - can be changed on-the-fly
238             settings.setValue("fUseUPnP", value.toBool());
239             MapPort(value.toBool());
240             break;
241         case MinimizeOnClose:
242             fMinimizeOnClose = value.toBool();
243             settings.setValue("fMinimizeOnClose", fMinimizeOnClose);
244             break;
245
246         // default proxy
247         case ProxyUse:
248             if (settings.value("fUseProxy") != value) {
249                 settings.setValue("fUseProxy", value.toBool());
250                 setRestartRequired(true);
251             }
252             break;
253         case ProxyIP: {
254             // contains current IP at index 0 and current port at index 1
255             QStringList strlIpPort = settings.value("addrProxy").toString().split(":", QString::SkipEmptyParts);
256             // if that key doesn't exist or has a changed IP
257             if (!settings.contains("addrProxy") || strlIpPort.at(0) != value.toString()) {
258                 // construct new value from new IP and current port
259                 QString strNewValue = value.toString() + ":" + strlIpPort.at(1);
260                 settings.setValue("addrProxy", strNewValue);
261                 setRestartRequired(true);
262             }
263         }
264         break;
265         case ProxyPort: {
266             // contains current IP at index 0 and current port at index 1
267             QStringList strlIpPort = settings.value("addrProxy").toString().split(":", QString::SkipEmptyParts);
268             // if that key doesn't exist or has a changed port
269             if (!settings.contains("addrProxy") || strlIpPort.at(1) != value.toString()) {
270                 // construct new value from current IP and new port
271                 QString strNewValue = strlIpPort.at(0) + ":" + value.toString();
272                 settings.setValue("addrProxy", strNewValue);
273                 setRestartRequired(true);
274             }
275         }
276         break;
277 #ifdef ENABLE_WALLET
278         case Fee: { // core option - can be changed on-the-fly
279             // Todo: Add is valid check  and warn via message, if not
280             CAmount nTransactionFee(value.toLongLong());
281             payTxFee = CFeeRate(nTransactionFee, 1000);
282             settings.setValue("nTransactionFee", qint64(nTransactionFee));
283             emit transactionFeeChanged(nTransactionFee);
284             break;
285         }
286         case SpendZeroConfChange:
287             if (settings.value("bSpendZeroConfChange") != value) {
288                 settings.setValue("bSpendZeroConfChange", value);
289                 setRestartRequired(true);
290             }
291             break;
292 #endif
293         case DisplayUnit:
294             setDisplayUnit(value);
295             break;
296         case ThirdPartyTxUrls:
297             if (strThirdPartyTxUrls != value.toString()) {
298                 strThirdPartyTxUrls = value.toString();
299                 settings.setValue("strThirdPartyTxUrls", strThirdPartyTxUrls);
300                 setRestartRequired(true);
301             }
302             break;
303         case Language:
304             if (settings.value("language") != value) {
305                 settings.setValue("language", value);
306                 setRestartRequired(true);
307             }
308             break;
309         case CoinControlFeatures:
310             fCoinControlFeatures = value.toBool();
311             settings.setValue("fCoinControlFeatures", fCoinControlFeatures);
312             emit coinControlFeaturesChanged(fCoinControlFeatures);
313             break;
314         case DatabaseCache:
315             if (settings.value("nDatabaseCache") != value) {
316                 settings.setValue("nDatabaseCache", value);
317                 setRestartRequired(true);
318             }
319             break;
320         case ThreadsScriptVerif:
321             if (settings.value("nThreadsScriptVerif") != value) {
322                 settings.setValue("nThreadsScriptVerif", value);
323                 setRestartRequired(true);
324             }
325             break;
326         case Listen:
327             if (settings.value("fListen") != value) {
328                 settings.setValue("fListen", value);
329                 setRestartRequired(true);
330             }
331             break;
332         default:
333             break;
334         }
335     }
336
337     emit dataChanged(index, index);
338
339     return successful;
340 }
341
342 /** Updates current unit in memory, settings and emits displayUnitChanged(newUnit) signal */
343 void OptionsModel::setDisplayUnit(const QVariant &value)
344 {
345     if (!value.isNull())
346     {
347         QSettings settings;
348         nDisplayUnit = value.toInt();
349         settings.setValue("nDisplayUnit", nDisplayUnit);
350         emit displayUnitChanged(nDisplayUnit);
351     }
352 }
353
354 bool OptionsModel::getProxySettings(QNetworkProxy& proxy) const
355 {
356     // Directly query current base proxy, because
357     // GUI settings can be overridden with -proxy.
358     proxyType curProxy;
359     if (GetProxy(NET_IPV4, curProxy)) {
360         proxy.setType(QNetworkProxy::Socks5Proxy);
361         proxy.setHostName(QString::fromStdString(curProxy.ToStringIP()));
362         proxy.setPort(curProxy.GetPort());
363
364         return true;
365     }
366     else
367         proxy.setType(QNetworkProxy::NoProxy);
368
369     return false;
370 }
371
372 void OptionsModel::setRestartRequired(bool fRequired)
373 {
374     QSettings settings;
375     return settings.setValue("fRestartRequired", fRequired);
376 }
377
378 bool OptionsModel::isRestartRequired()
379 {
380     QSettings settings;
381     return settings.value("fRestartRequired", false).toBool();
382 }
This page took 0.046338 seconds and 4 git commands to generate.