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