]>
Commit | Line | Data |
---|---|---|
f914f1a7 | 1 | // Copyright (c) 2011-2014 The Bitcoin Core developers |
78253fcb | 2 | // Distributed under the MIT software license, see the accompanying |
e592d43f WL |
3 | // file COPYING or http://www.opensource.org/licenses/mit-license.php. |
4 | ||
35b8af92 | 5 | #if defined(HAVE_CONFIG_H) |
f3967bcc | 6 | #include "config/bitcoin-config.h" |
35b8af92 CF |
7 | #endif |
8 | ||
92f20d53 | 9 | #include "optionsmodel.h" |
e8ef3da7 | 10 | |
32af5266 | 11 | #include "bitcoinunits.h" |
51ed9ec9 BD |
12 | #include "guiutil.h" |
13 | ||
eda37330 | 14 | #include "amount.h" |
f18a119a | 15 | #include "init.h" |
51ed9ec9 BD |
16 | #include "main.h" |
17 | #include "net.h" | |
82e96006 | 18 | #include "txdb.h" // for -dbcache defaults |
5e83bc40 | 19 | |
b7f4b6d3 | 20 | #ifdef ENABLE_WALLET |
50c72f23 JS |
21 | #include "wallet/wallet.h" |
22 | #include "wallet/walletdb.h" | |
b7f4b6d3 | 23 | #endif |
92f20d53 | 24 | |
1ba3560f | 25 | #include <QNetworkProxy> |
32af5266 | 26 | #include <QSettings> |
7e195e84 | 27 | #include <QStringList> |
32af5266 | 28 | |
3f8cb2c5 GA |
29 | OptionsModel::OptionsModel(QObject *parent) : |
30 | QAbstractListModel(parent) | |
92f20d53 | 31 | { |
3f8cb2c5 | 32 | Init(); |
92f20d53 WL |
33 | } |
34 | ||
b40bdd65 WL |
35 | void OptionsModel::addOverriddenOption(const std::string &option) |
36 | { | |
37 | strOverriddenByCommandLine += QString::fromStdString(option) + "=" + QString::fromStdString(mapArgs[option]) + " "; | |
38 | } | |
39 | ||
7e195e84 | 40 | // Writes all missing QSettings with their default values |
3f8cb2c5 GA |
41 | void OptionsModel::Init() |
42 | { | |
43 | QSettings settings; | |
44 | ||
7e195e84 PK |
45 | // Ensure restart flag is unset on client startup |
46 | setRestartRequired(false); | |
47 | ||
0e3947ef | 48 | // These are Qt-only settings: |
7e195e84 PK |
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 | ||
40c5b939 CL |
64 | if (!settings.contains("strThirdPartyTxUrls")) |
65 | settings.setValue("strThirdPartyTxUrls", ""); | |
66 | strThirdPartyTxUrls = settings.value("strThirdPartyTxUrls", "").toString(); | |
67 | ||
7e195e84 PK |
68 | if (!settings.contains("fCoinControlFeatures")) |
69 | settings.setValue("fCoinControlFeatures", false); | |
6a86c24d | 70 | fCoinControlFeatures = settings.value("fCoinControlFeatures", false).toBool(); |
3f8cb2c5 | 71 | |
7e195e84 PK |
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 | |
5409404d PK |
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 | |
b7f4b6d3 | 92 | #ifdef ENABLE_WALLET |
29d45073 WL |
93 | if (!settings.contains("bSpendZeroConfChange")) |
94 | settings.setValue("bSpendZeroConfChange", true); | |
95 | if (!SoftSetBoolArg("-spendzeroconfchange", settings.value("bSpendZeroConfChange").toBool())) | |
b40bdd65 | 96 | addOverriddenOption("-spendzeroconfchange"); |
b7f4b6d3 | 97 | #endif |
7e195e84 | 98 | |
7e195e84 PK |
99 | // Network |
100 | if (!settings.contains("fUseUPnP")) | |
d4e1c612 | 101 | settings.setValue("fUseUPnP", DEFAULT_UPNP); |
7e195e84 | 102 | if (!SoftSetBoolArg("-upnp", settings.value("fUseUPnP").toBool())) |
b40bdd65 | 103 | addOverriddenOption("-upnp"); |
7e195e84 | 104 | |
56b07d2d PK |
105 | if (!settings.contains("fListen")) |
106 | settings.setValue("fListen", DEFAULT_LISTEN); | |
107 | if (!SoftSetBoolArg("-listen", settings.value("fListen").toBool())) | |
108 | addOverriddenOption("-listen"); | |
109 | ||
7e195e84 PK |
110 | if (!settings.contains("fUseProxy")) |
111 | settings.setValue("fUseProxy", false); | |
112 | if (!settings.contains("addrProxy")) | |
113 | settings.setValue("addrProxy", "127.0.0.1:9050"); | |
114 | // Only try to set -proxy, if user has enabled fUseProxy | |
115 | if (settings.value("fUseProxy").toBool() && !SoftSetArg("-proxy", settings.value("addrProxy").toString().toStdString())) | |
b40bdd65 | 116 | addOverriddenOption("-proxy"); |
27c3e910 CF |
117 | else if(!settings.value("fUseProxy").toBool() && !GetArg("-proxy", "").empty()) |
118 | addOverriddenOption("-proxy"); | |
7e195e84 PK |
119 | |
120 | // Display | |
121 | if (!settings.contains("language")) | |
122 | settings.setValue("language", ""); | |
123 | if (!SoftSetArg("-lang", settings.value("language").toString().toStdString())) | |
b40bdd65 | 124 | addOverriddenOption("-lang"); |
7e195e84 PK |
125 | |
126 | language = settings.value("language").toString(); | |
3f8cb2c5 GA |
127 | } |
128 | ||
5fb445b4 PK |
129 | void OptionsModel::Reset() |
130 | { | |
131 | QSettings settings; | |
132 | ||
7e195e84 | 133 | // Remove all entries from our QSettings object |
5fb445b4 PK |
134 | settings.clear(); |
135 | ||
136 | // default setting for OptionsModel::StartAtStartup - disabled | |
137 | if (GUIUtil::GetStartOnSystemStartup()) | |
138 | GUIUtil::SetStartOnSystemStartup(false); | |
3f8cb2c5 GA |
139 | } |
140 | ||
92f20d53 WL |
141 | int OptionsModel::rowCount(const QModelIndex & parent) const |
142 | { | |
143 | return OptionIDRowCount; | |
144 | } | |
145 | ||
7e195e84 | 146 | // read QSettings values and return them |
92f20d53 WL |
147 | QVariant OptionsModel::data(const QModelIndex & index, int role) const |
148 | { | |
92f20d53 WL |
149 | if(role == Qt::EditRole) |
150 | { | |
3f8cb2c5 | 151 | QSettings settings; |
92f20d53 WL |
152 | switch(index.row()) |
153 | { | |
154 | case StartAtStartup: | |
7e195e84 | 155 | return GUIUtil::GetStartOnSystemStartup(); |
92f20d53 | 156 | case MinimizeToTray: |
7e195e84 | 157 | return fMinimizeToTray; |
92f20d53 | 158 | case MapPortUPnP: |
6a3aef39 | 159 | #ifdef USE_UPNP |
7e195e84 | 160 | return settings.value("fUseUPnP"); |
6a3aef39 | 161 | #else |
7e195e84 | 162 | return false; |
6a3aef39 | 163 | #endif |
92f20d53 | 164 | case MinimizeOnClose: |
7e195e84 PK |
165 | return fMinimizeOnClose; |
166 | ||
167 | // default proxy | |
168 | case ProxyUse: | |
169 | return settings.value("fUseProxy", false); | |
587f929c | 170 | case ProxyIP: { |
7e195e84 PK |
171 | // contains IP at index 0 and port at index 1 |
172 | QStringList strlIpPort = settings.value("addrProxy").toString().split(":", QString::SkipEmptyParts); | |
173 | return strlIpPort.at(0); | |
587f929c PW |
174 | } |
175 | case ProxyPort: { | |
7e195e84 PK |
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(1); | |
5e5c102f | 179 | } |
7e195e84 | 180 | |
b7f4b6d3 | 181 | #ifdef ENABLE_WALLET |
29d45073 WL |
182 | case SpendZeroConfChange: |
183 | return settings.value("bSpendZeroConfChange"); | |
b7f4b6d3 | 184 | #endif |
ee014e5b | 185 | case DisplayUnit: |
7e195e84 | 186 | return nDisplayUnit; |
40c5b939 CL |
187 | case ThirdPartyTxUrls: |
188 | return strThirdPartyTxUrls; | |
5ac114c7 | 189 | case Language: |
7e195e84 | 190 | return settings.value("language"); |
6a86c24d | 191 | case CoinControlFeatures: |
7e195e84 PK |
192 | return fCoinControlFeatures; |
193 | case DatabaseCache: | |
194 | return settings.value("nDatabaseCache"); | |
195 | case ThreadsScriptVerif: | |
196 | return settings.value("nThreadsScriptVerif"); | |
56b07d2d PK |
197 | case Listen: |
198 | return settings.value("fListen"); | |
92f20d53 WL |
199 | default: |
200 | return QVariant(); | |
201 | } | |
202 | } | |
203 | return QVariant(); | |
204 | } | |
81bbef26 | 205 | |
7e195e84 | 206 | // write QSettings values |
92f20d53 WL |
207 | bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, int role) |
208 | { | |
c3e0734d WL |
209 | bool successful = true; /* set to false on parse error */ |
210 | if(role == Qt::EditRole) | |
211 | { | |
3f8cb2c5 | 212 | QSettings settings; |
c3e0734d WL |
213 | switch(index.row()) |
214 | { | |
215 | case StartAtStartup: | |
67d4cbab | 216 | successful = GUIUtil::SetStartOnSystemStartup(value.toBool()); |
c3e0734d WL |
217 | break; |
218 | case MinimizeToTray: | |
219 | fMinimizeToTray = value.toBool(); | |
3f8cb2c5 | 220 | settings.setValue("fMinimizeToTray", fMinimizeToTray); |
c3e0734d | 221 | break; |
7e195e84 | 222 | case MapPortUPnP: // core option - can be changed on-the-fly |
21eb5ada GA |
223 | settings.setValue("fUseUPnP", value.toBool()); |
224 | MapPort(value.toBool()); | |
c3e0734d WL |
225 | break; |
226 | case MinimizeOnClose: | |
227 | fMinimizeOnClose = value.toBool(); | |
3f8cb2c5 | 228 | settings.setValue("fMinimizeOnClose", fMinimizeOnClose); |
c3e0734d | 229 | break; |
7e195e84 PK |
230 | |
231 | // default proxy | |
587f929c | 232 | case ProxyUse: |
7e195e84 PK |
233 | if (settings.value("fUseProxy") != value) { |
234 | settings.setValue("fUseProxy", value.toBool()); | |
235 | setRestartRequired(true); | |
236 | } | |
c3e0734d | 237 | break; |
81bbef26 | 238 | case ProxyIP: { |
7e195e84 PK |
239 | // contains current IP at index 0 and current port at index 1 |
240 | QStringList strlIpPort = settings.value("addrProxy").toString().split(":", QString::SkipEmptyParts); | |
241 | // if that key doesn't exist or has a changed IP | |
242 | if (!settings.contains("addrProxy") || strlIpPort.at(0) != value.toString()) { | |
243 | // construct new value from new IP and current port | |
244 | QString strNewValue = value.toString() + ":" + strlIpPort.at(1); | |
245 | settings.setValue("addrProxy", strNewValue); | |
246 | setRestartRequired(true); | |
247 | } | |
81bbef26 PK |
248 | } |
249 | break; | |
250 | case ProxyPort: { | |
7e195e84 PK |
251 | // contains current IP at index 0 and current port at index 1 |
252 | QStringList strlIpPort = settings.value("addrProxy").toString().split(":", QString::SkipEmptyParts); | |
253 | // if that key doesn't exist or has a changed port | |
254 | if (!settings.contains("addrProxy") || strlIpPort.at(1) != value.toString()) { | |
255 | // construct new value from current IP and new port | |
256 | QString strNewValue = strlIpPort.at(0) + ":" + value.toString(); | |
257 | settings.setValue("addrProxy", strNewValue); | |
258 | setRestartRequired(true); | |
259 | } | |
81bbef26 PK |
260 | } |
261 | break; | |
b7f4b6d3 | 262 | #ifdef ENABLE_WALLET |
29d45073 WL |
263 | case SpendZeroConfChange: |
264 | if (settings.value("bSpendZeroConfChange") != value) { | |
265 | settings.setValue("bSpendZeroConfChange", value); | |
266 | setRestartRequired(true); | |
267 | } | |
268 | break; | |
b7f4b6d3 | 269 | #endif |
144bfd9c | 270 | case DisplayUnit: |
8969828d | 271 | setDisplayUnit(value); |
559fc3c6 | 272 | break; |
40c5b939 CL |
273 | case ThirdPartyTxUrls: |
274 | if (strThirdPartyTxUrls != value.toString()) { | |
275 | strThirdPartyTxUrls = value.toString(); | |
276 | settings.setValue("strThirdPartyTxUrls", strThirdPartyTxUrls); | |
277 | setRestartRequired(true); | |
278 | } | |
279 | break; | |
144bfd9c | 280 | case Language: |
7e195e84 PK |
281 | if (settings.value("language") != value) { |
282 | settings.setValue("language", value); | |
283 | setRestartRequired(true); | |
284 | } | |
5ac114c7 | 285 | break; |
0689f46c | 286 | case CoinControlFeatures: |
6a86c24d CL |
287 | fCoinControlFeatures = value.toBool(); |
288 | settings.setValue("fCoinControlFeatures", fCoinControlFeatures); | |
e092f229 | 289 | Q_EMIT coinControlFeaturesChanged(fCoinControlFeatures); |
0689f46c | 290 | break; |
7e195e84 PK |
291 | case DatabaseCache: |
292 | if (settings.value("nDatabaseCache") != value) { | |
293 | settings.setValue("nDatabaseCache", value); | |
294 | setRestartRequired(true); | |
295 | } | |
296 | break; | |
297 | case ThreadsScriptVerif: | |
298 | if (settings.value("nThreadsScriptVerif") != value) { | |
299 | settings.setValue("nThreadsScriptVerif", value); | |
300 | setRestartRequired(true); | |
301 | } | |
302 | break; | |
56b07d2d PK |
303 | case Listen: |
304 | if (settings.value("fListen") != value) { | |
305 | settings.setValue("fListen", value); | |
306 | setRestartRequired(true); | |
307 | } | |
308 | break; | |
c3e0734d WL |
309 | default: |
310 | break; | |
311 | } | |
312 | } | |
8969828d | 313 | |
e092f229 | 314 | Q_EMIT dataChanged(index, index); |
c3e0734d WL |
315 | |
316 | return successful; | |
92f20d53 | 317 | } |
968d55aa | 318 | |
8969828d | 319 | /** Updates current unit in memory, settings and emits displayUnitChanged(newUnit) signal */ |
320 | void OptionsModel::setDisplayUnit(const QVariant &value) | |
321 | { | |
322 | if (!value.isNull()) | |
323 | { | |
324 | QSettings settings; | |
325 | nDisplayUnit = value.toInt(); | |
326 | settings.setValue("nDisplayUnit", nDisplayUnit); | |
e092f229 | 327 | Q_EMIT displayUnitChanged(nDisplayUnit); |
8969828d | 328 | } |
329 | } | |
330 | ||
1ba3560f | 331 | bool OptionsModel::getProxySettings(QNetworkProxy& proxy) const |
a41d5fe0 | 332 | { |
1ba3560f PK |
333 | // Directly query current base proxy, because |
334 | // GUI settings can be overridden with -proxy. | |
335 | proxyType curProxy; | |
336 | if (GetProxy(NET_IPV4, curProxy)) { | |
0127a9be | 337 | proxy.setType(QNetworkProxy::Socks5Proxy); |
67a79493 WL |
338 | proxy.setHostName(QString::fromStdString(curProxy.proxy.ToStringIP())); |
339 | proxy.setPort(curProxy.proxy.GetPort()); | |
1ba3560f | 340 | |
0127a9be | 341 | return true; |
1ba3560f PK |
342 | } |
343 | else | |
344 | proxy.setType(QNetworkProxy::NoProxy); | |
a41d5fe0 | 345 | |
0127a9be | 346 | return false; |
a41d5fe0 | 347 | } |
7e195e84 PK |
348 | |
349 | void OptionsModel::setRestartRequired(bool fRequired) | |
350 | { | |
351 | QSettings settings; | |
352 | return settings.setValue("fRestartRequired", fRequired); | |
353 | } | |
354 | ||
355 | bool OptionsModel::isRestartRequired() | |
356 | { | |
357 | QSettings settings; | |
358 | return settings.value("fRestartRequired", false).toBool(); | |
359 | } |