1 #include "optionsmodel.h"
2 #include "bitcoinunits.h"
9 OptionsModel::OptionsModel(QObject *parent) :
10 QAbstractListModel(parent)
15 bool static ApplyProxySettings()
18 CService addrProxy(settings.value("addrProxy", "127.0.0.1:9050").toString().toStdString());
19 int nSocksVersion(settings.value("nSocksVersion", 5).toInt());
20 if (!settings.value("fUseProxy", false).toBool()) {
21 addrProxy = CService();
25 if (nSocksVersion && !addrProxy.IsValid())
28 if (!IsLimited(NET_IPV4))
29 SetProxy(NET_IPV4, addrProxy, nSocksVersion);
30 if (nSocksVersion > 4) {
32 if (!IsLimited(NET_IPV6))
33 SetProxy(NET_IPV6, addrProxy, nSocksVersion);
37 SetNameProxy(addrProxy, nSocksVersion);
42 bool static ApplyTorSettings()
45 CService addrTor(settings.value("addrTor", "127.0.0.1:9050").toString().toStdString());
46 if (!settings.value("fUseTor", false).toBool()) {
50 if (!addrTor.IsValid())
53 SetProxy(NET_TOR, addrTor, 5);
54 SetReachable(NET_TOR);
59 void OptionsModel::Init()
63 // These are Qt-only settings:
64 nDisplayUnit = settings.value("nDisplayUnit", BitcoinUnits::BTC).toInt();
65 bDisplayAddresses = settings.value("bDisplayAddresses", false).toBool();
66 if (!settings.contains("strThirdPartyTxUrls")) {
68 settings.setValue("strThirdPartyTxUrls", "");
70 settings.setValue("strThirdPartyTxUrls", "https://bitinfocharts.com/novacoin/tx/%s|https://coinplorer.com/NVC/Transactions/%s|https://explorer.novaco.in/tx/%s|https://bchain.info/NVC/tx/%s");
72 strThirdPartyTxUrls = settings.value("strThirdPartyTxUrls", "https://bitinfocharts.com/novacoin/tx/%s|https://coinplorer.com/NVC/Transactions/%s|https://explorer.novaco.in/tx/%s|https://bchain.info/NVC/tx/%s").toString();
73 fMinimizeToTray = settings.value("fMinimizeToTray", false).toBool();
74 fMinimizeOnClose = settings.value("fMinimizeOnClose", false).toBool();
75 fCoinControlFeatures = settings.value("fCoinControlFeatures", false).toBool();
76 nTransactionFee = settings.value("nTransactionFee").toLongLong();
77 language = settings.value("language", "").toString();
79 // These are shared with core Bitcoin; we want
80 // command-line options to override the GUI settings:
81 if (settings.contains("fUseUPnP"))
82 SoftSetBoolArg("-upnp", settings.value("fUseUPnP").toBool());
83 if ( !(settings.value("fTorOnly").toBool() && settings.contains("addrTor")) ) {
84 if (settings.contains("addrProxy") && settings.value("fUseProxy").toBool())
85 SoftSetArg("-proxy", settings.value("addrProxy").toString().toStdString());
86 if (settings.contains("nSocksVersion") && settings.value("fUseProxy").toBool())
87 SoftSetArg("-socks", settings.value("nSocksVersion").toString().toStdString());
90 if (settings.contains("addrTor") && settings.value("fUseTor").toBool()) {
91 SoftSetArg("-tor", settings.value("addrTor").toString().toStdString());
92 if (settings.value("fTorOnly").toBool())
93 SoftSetArg("-onlynet", "tor");
96 if (settings.contains("detachDB"))
97 SoftSetBoolArg("-detachdb", settings.value("detachDB").toBool());
98 if (!language.isEmpty())
99 SoftSetArg("-lang", language.toStdString());
102 bool OptionsModel::Upgrade()
106 if (settings.contains("bImportFinished"))
107 return false; // Already upgraded
109 settings.setValue("bImportFinished", true);
111 // Move settings from old wallet.dat (if any):
112 CWalletDB walletdb(strWalletFileName);
114 QList<QString> intOptions;
115 intOptions << "nDisplayUnit" << "nTransactionFee";
116 foreach(QString key, intOptions)
119 if (walletdb.ReadSetting(key.toStdString(), value))
121 settings.setValue(key, value);
122 walletdb.EraseSetting(key.toStdString());
125 QList<QString> boolOptions;
126 boolOptions << "bDisplayAddresses" << "fMinimizeToTray" << "fMinimizeOnClose" << "fUseProxy" << "fUseTor" << "fTorOnly" << "fUseUPnP";
127 foreach(QString key, boolOptions)
130 if (walletdb.ReadSetting(key.toStdString(), value))
132 settings.setValue(key, value);
133 walletdb.EraseSetting(key.toStdString());
138 CAddress addrProxyAddress, addrTorAddress;
139 if (walletdb.ReadSetting("addrProxy", addrProxyAddress))
141 settings.setValue("addrProxy", addrProxyAddress.ToStringIPPort().c_str());
142 walletdb.EraseSetting("addrProxy");
145 if (walletdb.ReadSetting("addrTor", addrTorAddress))
147 settings.setValue("addrTor", addrTorAddress.ToStringIPPort().c_str());
148 walletdb.EraseSetting("addrTor");
151 catch (std::ios_base::failure &e)
153 // 0.6.0rc1 saved this as a CService, which causes failure when parsing as a CAddress
154 CService addrProxy, addrTor;
155 if (walletdb.ReadSetting("addrProxy", addrProxy))
157 settings.setValue("addrProxy", addrProxy.ToStringIPPort().c_str());
158 walletdb.EraseSetting("addrProxy");
161 if (walletdb.ReadSetting("addrTor", addrTor))
163 settings.setValue("addrTor", addrTor.ToStringIPPort().c_str());
164 walletdb.EraseSetting("addrTor");
168 ApplyProxySettings();
176 int OptionsModel::rowCount(const QModelIndex & parent) const
178 return OptionIDRowCount;
181 QVariant OptionsModel::data(const QModelIndex & index, int role) const
183 if(role == Qt::EditRole)
189 return QVariant(GUIUtil::GetStartOnSystemStartup());
191 return QVariant(fMinimizeToTray);
193 return settings.value("fUseUPnP", GetBoolArg("-upnp", true));
194 case MinimizeOnClose:
195 return QVariant(fMinimizeOnClose);
197 return settings.value("fUseProxy", false);
200 if (GetProxy(NET_IPV4, proxy))
201 return QVariant(QString::fromStdString(proxy.first.ToStringIP()));
203 return QVariant(QString::fromStdString("127.0.0.1"));
207 if (GetProxy(NET_IPV4, proxy))
208 return QVariant(proxy.first.GetPort());
210 return QVariant(9050);
212 case ProxySocksVersion:
213 return settings.value("nSocksVersion", 5);
215 return settings.value("fUseTor", false);
218 if (GetProxy(NET_TOR, proxy))
219 return QVariant(QString::fromStdString(proxy.first.ToStringIP()));
221 return QVariant(QString::fromStdString("127.0.0.1"));
225 if (GetProxy(NET_TOR, proxy))
226 return QVariant(proxy.first.GetPort());
228 return QVariant(9050);
231 return settings.value("fTorOnly", false);
233 return QVariant(static_cast<qlonglong>(nTransactionFee));
235 return QVariant(nDisplayUnit);
236 case DisplayAddresses:
237 return QVariant(bDisplayAddresses);
238 case ThirdPartyTxUrls:
239 return QVariant(strThirdPartyTxUrls);
240 case DetachDatabases:
241 return QVariant(bitdb.GetDetach());
243 return settings.value("language", "");
244 case CoinControlFeatures:
245 return QVariant(fCoinControlFeatures);
253 bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, int role)
255 bool successful = true; /* set to false on parse error */
256 if(role == Qt::EditRole)
262 successful = GUIUtil::SetStartOnSystemStartup(value.toBool());
265 fMinimizeToTray = value.toBool();
266 settings.setValue("fMinimizeToTray", fMinimizeToTray);
269 fUseUPnP = value.toBool();
270 settings.setValue("fUseUPnP", fUseUPnP);
273 case MinimizeOnClose:
274 fMinimizeOnClose = value.toBool();
275 settings.setValue("fMinimizeOnClose", fMinimizeOnClose);
278 settings.setValue("fUseProxy", value.toBool());
279 ApplyProxySettings();
283 proxy.first = CService("127.0.0.1", 9050);
284 GetProxy(NET_IPV4, proxy);
286 CNetAddr addr(value.toString().toStdString());
287 proxy.first.SetIP(addr);
288 settings.setValue("addrProxy", proxy.first.ToStringIPPort().c_str());
289 successful = ApplyProxySettings();
294 proxy.first = CService("127.0.0.1", 9050);
295 GetProxy(NET_IPV4, proxy);
297 proxy.first.SetPort(value.toInt());
298 settings.setValue("addrProxy", proxy.first.ToStringIPPort().c_str());
299 successful = ApplyProxySettings();
302 case ProxySocksVersion: {
305 GetProxy(NET_IPV4, proxy);
307 proxy.second = value.toInt();
308 settings.setValue("nSocksVersion", proxy.second);
309 successful = ApplyProxySettings();
313 settings.setValue("fUseTor", value.toBool());
319 proxy.first = CService("127.0.0.1", 9050);
320 GetProxy(NET_IPV4, proxy);
322 CNetAddr addr(value.toString().toStdString());
323 proxy.first.SetIP(addr);
324 settings.setValue("addrTor", proxy.first.ToStringIPPort().c_str());
325 successful = ApplyTorSettings();
330 proxy.first = CService("127.0.0.1", 9050);
331 GetProxy(NET_IPV4, proxy);
333 proxy.first.SetPort(value.toInt());
334 settings.setValue("addrTor", proxy.first.ToStringIPPort().c_str());
335 successful = ApplyTorSettings();
339 settings.setValue("fTorOnly", value.toBool());
344 nTransactionFee = value.toLongLong();
345 settings.setValue("nTransactionFee", static_cast<qlonglong>(nTransactionFee));
346 emit transactionFeeChanged(nTransactionFee);
349 nDisplayUnit = value.toInt();
350 settings.setValue("nDisplayUnit", nDisplayUnit);
351 emit displayUnitChanged(nDisplayUnit);
353 case DisplayAddresses:
354 bDisplayAddresses = value.toBool();
355 settings.setValue("bDisplayAddresses", bDisplayAddresses);
357 case DetachDatabases: {
358 bool fDetachDB = value.toBool();
359 bitdb.SetDetach(fDetachDB);
360 settings.setValue("detachDB", fDetachDB);
363 case ThirdPartyTxUrls:
364 if (strThirdPartyTxUrls != value.toString()) {
365 strThirdPartyTxUrls = value.toString();
366 settings.setValue("strThirdPartyTxUrls", strThirdPartyTxUrls);
370 settings.setValue("language", value);
372 case CoinControlFeatures: {
373 fCoinControlFeatures = value.toBool();
374 settings.setValue("fCoinControlFeatures", fCoinControlFeatures);
375 emit coinControlFeaturesChanged(fCoinControlFeatures);
382 emit dataChanged(index, index);
387 qint64 OptionsModel::getTransactionFee()
389 return nTransactionFee;
392 bool OptionsModel::getCoinControlFeatures()
394 return fCoinControlFeatures;
397 bool OptionsModel::getMinimizeToTray()
399 return fMinimizeToTray;
402 bool OptionsModel::getMinimizeOnClose()
404 return fMinimizeOnClose;
407 int OptionsModel::getDisplayUnit()
412 bool OptionsModel::getDisplayAddresses()
414 return bDisplayAddresses;