Includes cleanup
[novacoin.git] / src / qt / optionsmodel.cpp
1 #include "optionsmodel.h"
2 #include "bitcoinunits.h"
3 #include <QSettings>
4
5 #include "init.h"
6 #include "walletdb.h"
7 #include "guiutil.h"
8 #include "wallet.h"
9
10 OptionsModel::OptionsModel(QObject *parent) :
11     QAbstractListModel(parent)
12 {
13     Init();
14 }
15
16 bool static ApplyProxySettings()
17 {
18     QSettings settings;
19     CService addrProxy(settings.value("addrProxy", "127.0.0.1:9050").toString().toStdString());
20     int nSocksVersion(settings.value("nSocksVersion", 5).toInt());
21     if (!settings.value("fUseProxy", false).toBool()) {
22         addrProxy = CService();
23         nSocksVersion = 0;
24         return false;
25     }
26     if (nSocksVersion && !addrProxy.IsValid())
27         return false;
28
29     if (!IsLimited(NET_IPV4))
30         SetProxy(NET_IPV4, addrProxy, nSocksVersion);
31     if (nSocksVersion > 4) {
32 #ifdef USE_IPV6
33         if (!IsLimited(NET_IPV6))
34             SetProxy(NET_IPV6, addrProxy, nSocksVersion);
35 #endif
36     }
37
38     SetNameProxy(addrProxy, nSocksVersion);
39
40     return true;
41 }
42
43 bool static ApplyTorSettings()
44 {
45     QSettings settings;
46     CService addrTor(settings.value("addrTor", "127.0.0.1:9050").toString().toStdString());
47     if (!settings.value("fUseTor", false).toBool()) {
48         addrTor = CService();
49         return false;
50     }
51     if (!addrTor.IsValid())
52         return false;
53
54     SetProxy(NET_TOR, addrTor, 5);
55     SetReachable(NET_TOR);
56
57     return true;
58 }
59
60 void OptionsModel::Init()
61 {
62     QSettings settings;
63
64     // These are Qt-only settings:
65     nDisplayUnit = settings.value("nDisplayUnit", BitcoinUnits::BTC).toInt();
66     bDisplayAddresses = settings.value("bDisplayAddresses", false).toBool();
67     if (!settings.contains("strThirdPartyTxUrls")) {
68         if(fTestNet)
69             settings.setValue("strThirdPartyTxUrls", "");
70         else
71             settings.setValue("strThirdPartyTxUrls", "https://bitinfocharts.com/novacoin/tx/%s|https://explorer.novaco.in/tx/%s|https://novacoin.ru/explorer/tx/%s|https://prohashing.com/explorer/novacoin/%s");
72     }
73     strThirdPartyTxUrls = settings.value("strThirdPartyTxUrls", "https://bitinfocharts.com/novacoin/tx/%s|https://explorer.novaco.in/tx/%s|https://novacoin.ru/explorer/tx/%s|https://prohashing.com/explorer/novacoin/%s").toString();
74     fMinimizeToTray = settings.value("fMinimizeToTray", false).toBool();
75     fMinimizeOnClose = settings.value("fMinimizeOnClose", false).toBool();
76     fCoinControlFeatures = settings.value("fCoinControlFeatures", false).toBool();
77     nTransactionFee = settings.value("nTransactionFee").toLongLong();
78     language = settings.value("language", "").toString();
79
80     // These are shared with core Bitcoin; we want
81     // command-line options to override the GUI settings:
82     if ( !(settings.value("fTorOnly").toBool() && settings.contains("addrTor")) ) {
83         if (settings.contains("addrProxy") && settings.value("fUseProxy").toBool())
84             SoftSetArg("-proxy", settings.value("addrProxy").toString().toStdString());
85         if (settings.contains("nSocksVersion") && settings.value("fUseProxy").toBool())
86             SoftSetArg("-socks", settings.value("nSocksVersion").toString().toStdString());
87     }
88
89     if (settings.contains("addrTor") && settings.value("fUseTor").toBool()) {
90         SoftSetArg("-tor", settings.value("addrTor").toString().toStdString());
91         if (settings.value("fTorOnly").toBool())
92             SoftSetArg("-onlynet", "tor");
93
94         if (settings.value("TorName").toString().length() == 22) {
95             std::string strTorName = settings.value("TorName").toString().toStdString();
96
97             CService addrTorName(strTorName, GetListenPort());
98             if (addrTorName.IsValid())
99                 SoftSetArg("-torname", strTorName);
100         }
101     }
102
103     if (!fTestNet && settings.contains("externalSeeder") && settings.value("externalSeeder").toString() != "") {
104         SoftSetArg("-peercollector", settings.value("externalSeeder").toString().toStdString());
105     }
106
107     if (settings.contains("detachDB"))
108         SoftSetBoolArg("-detachdb", settings.value("detachDB").toBool());
109     if (!language.isEmpty())
110         SoftSetArg("-lang", language.toStdString());
111 }
112
113 int OptionsModel::rowCount(const QModelIndex & parent) const
114 {
115     return OptionIDRowCount;
116 }
117
118 QVariant OptionsModel::data(const QModelIndex & index, int role) const
119 {
120     if(role == Qt::EditRole)
121     {
122         QSettings settings;
123         switch(index.row())
124         {
125         case StartAtStartup:
126             return QVariant(GUIUtil::GetStartOnSystemStartup());
127         case MinimizeToTray:
128             return QVariant(fMinimizeToTray);
129         case MinimizeOnClose:
130             return QVariant(fMinimizeOnClose);
131         case ProxyUse:
132             return settings.value("fUseProxy", false);
133         case ProxyIP: {
134             proxyType proxy;
135             if (GetProxy(NET_IPV4, proxy))
136                 return QVariant(QString::fromStdString(proxy.first.ToStringIP()));
137             else
138                 return QVariant(QString::fromStdString("127.0.0.1"));
139         }
140         case ProxyPort: {
141             proxyType proxy;
142             if (GetProxy(NET_IPV4, proxy))
143                 return QVariant(proxy.first.GetPort());
144             else
145                 return QVariant(nSocksDefault);
146         }
147         case ProxySocksVersion:
148             return settings.value("nSocksVersion", 5);
149         case TorUse:
150             return settings.value("fUseTor", false);
151         case TorIP: {
152             proxyType proxy;
153             if (GetProxy(NET_TOR, proxy))
154                 return QVariant(QString::fromStdString(proxy.first.ToStringIP()));
155             else
156                 return QVariant(QString::fromStdString("127.0.0.1"));
157         }
158         case TorPort: {
159             proxyType proxy;
160             if (GetProxy(NET_TOR, proxy))
161                 return QVariant(proxy.first.GetPort());
162             else
163                 return QVariant(nSocksDefault);
164         }
165         case TorOnly:
166             return settings.value("fTorOnly", false);
167         case TorName:
168             return settings.value("TorName", "");
169         case ExternalSeeder:
170             return settings.value("externalSeeder", "");
171         case Fee:
172             return QVariant(static_cast<qlonglong>(nTransactionFee));
173         case DisplayUnit:
174             return QVariant(nDisplayUnit);
175         case DisplayAddresses:
176             return QVariant(bDisplayAddresses);
177         case ThirdPartyTxUrls:
178             return QVariant(strThirdPartyTxUrls);
179         case DetachDatabases:
180             return QVariant(bitdb.GetDetach());
181         case Language:
182             return settings.value("language", "");
183         case CoinControlFeatures:
184             return QVariant(fCoinControlFeatures);
185         default:
186             return QVariant();
187         }
188     }
189     return QVariant();
190 }
191
192 bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, int role)
193 {
194     bool successful = true; /* set to false on parse error */
195     if(role == Qt::EditRole)
196     {
197         QSettings settings;
198         switch(index.row())
199         {
200         case StartAtStartup:
201             successful = GUIUtil::SetStartOnSystemStartup(value.toBool());
202             break;
203         case MinimizeToTray:
204             fMinimizeToTray = value.toBool();
205             settings.setValue("fMinimizeToTray", fMinimizeToTray);
206             break;
207         case MinimizeOnClose:
208             fMinimizeOnClose = value.toBool();
209             settings.setValue("fMinimizeOnClose", fMinimizeOnClose);
210             break;
211         case ProxyUse:
212             settings.setValue("fUseProxy", value.toBool());
213             ApplyProxySettings();
214             break;
215         case ProxyIP: {
216             proxyType proxy;
217             proxy.first = CService("127.0.0.1", nSocksDefault);
218             GetProxy(NET_IPV4, proxy);
219
220             CNetAddr addr(value.toString().toStdString());
221             proxy.first.SetIP(addr);
222             settings.setValue("addrProxy", proxy.first.ToStringIPPort().c_str());
223             successful = ApplyProxySettings();
224         }
225         break;
226         case ProxyPort: {
227             proxyType proxy;
228             proxy.first = CService("127.0.0.1", nSocksDefault);
229             GetProxy(NET_IPV4, proxy);
230
231             proxy.first.SetPort(value.toInt());
232             settings.setValue("addrProxy", proxy.first.ToStringIPPort().c_str());
233             successful = ApplyProxySettings();
234         }
235         break;
236         case ProxySocksVersion: {
237             proxyType proxy;
238             proxy.second = 5;
239             GetProxy(NET_IPV4, proxy);
240
241             proxy.second = value.toInt();
242             settings.setValue("nSocksVersion", proxy.second);
243             successful = ApplyProxySettings();
244         }
245         break;
246         case TorUse: {
247             settings.setValue("fUseTor", value.toBool());
248             ApplyTorSettings();
249         }
250         break;
251         case TorIP: {
252             proxyType proxy;
253             proxy.first = CService("127.0.0.1", nSocksDefault);
254             GetProxy(NET_TOR, proxy);
255
256             CNetAddr addr(value.toString().toStdString());
257             proxy.first.SetIP(addr);
258             settings.setValue("addrTor", proxy.first.ToStringIPPort().c_str());
259             successful = ApplyTorSettings();
260         }
261         break;
262         case TorPort: {
263             proxyType proxy;
264             proxy.first = CService("127.0.0.1", nSocksDefault);
265             GetProxy(NET_TOR, proxy);
266
267             proxy.first.SetPort((uint16_t)value.toUInt());
268             settings.setValue("addrTor", proxy.first.ToStringIPPort().c_str());
269             successful = ApplyTorSettings();
270         }
271         break;
272         case TorOnly: {
273             settings.setValue("fTorOnly", value.toBool());
274             ApplyTorSettings();
275         }
276         case TorName: {
277             settings.setValue("TorName", value.toString());
278         }
279         break;
280         case ExternalSeeder:
281             settings.setValue("externalSeeder", value.toString());
282         break;
283         case Fee:
284             nTransactionFee = value.toLongLong();
285             settings.setValue("nTransactionFee", static_cast<qlonglong>(nTransactionFee));
286             emit transactionFeeChanged(nTransactionFee);
287             break;
288         case DisplayUnit:
289             nDisplayUnit = value.toInt();
290             settings.setValue("nDisplayUnit", nDisplayUnit);
291             emit displayUnitChanged(nDisplayUnit);
292             break;
293         case DisplayAddresses:
294             bDisplayAddresses = value.toBool();
295             settings.setValue("bDisplayAddresses", bDisplayAddresses);
296             break;
297         case DetachDatabases: {
298             bool fDetachDB = value.toBool();
299             bitdb.SetDetach(fDetachDB);
300             settings.setValue("detachDB", fDetachDB);
301             }
302             break;
303         case ThirdPartyTxUrls:
304             if (strThirdPartyTxUrls != value.toString()) {
305                 strThirdPartyTxUrls = value.toString();
306                 settings.setValue("strThirdPartyTxUrls", strThirdPartyTxUrls);
307             }
308             break;
309         case Language:
310             settings.setValue("language", value);
311             break;
312         case CoinControlFeatures: {
313             fCoinControlFeatures = value.toBool();
314             settings.setValue("fCoinControlFeatures", fCoinControlFeatures);
315             emit coinControlFeaturesChanged(fCoinControlFeatures);
316             }
317             break;
318         default:
319             break;
320         }
321     }
322     emit dataChanged(index, index);
323
324     return successful;
325 }
326
327 qint64 OptionsModel::getTransactionFee()
328 {
329     return nTransactionFee;
330 }
331
332 bool OptionsModel::getCoinControlFeatures()
333 {
334     return fCoinControlFeatures;
335 }
336
337 bool OptionsModel::getMinimizeToTray()
338 {
339     return fMinimizeToTray;
340 }
341
342 bool OptionsModel::getMinimizeOnClose()
343 {
344     return fMinimizeOnClose;
345 }
346
347 int OptionsModel::getDisplayUnit()
348 {
349     return nDisplayUnit;
350 }
351
352 bool OptionsModel::getDisplayAddresses()
353 {
354     return bDisplayAddresses;
355 }