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