d9463524f5870b8a46497fcae0e25fb8c7debac1
[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     if (!IsLimited(NET_IPV4))
28         SetProxy(NET_IPV4, addrProxy, nSocksVersion);
29     if (nSocksVersion > 4) {
30 #ifdef USE_IPV6
31         if (!IsLimited(NET_IPV6))
32             SetProxy(NET_IPV6, addrProxy, nSocksVersion);
33 #endif
34         SetNameProxy(addrProxy, nSocksVersion);
35     }
36     return true;
37 }
38
39 void OptionsModel::Init()
40 {
41     QSettings settings;
42
43     // These are Qt-only settings:
44     nDisplayUnit = settings.value("nDisplayUnit", BitcoinUnits::BTC).toInt();
45     bDisplayAddresses = settings.value("bDisplayAddresses", false).toBool();
46     if (!settings.contains("strThirdPartyTxUrls")) {
47         if(fTestNet)
48             settings.setValue("strThirdPartyTxUrls", "");
49         else
50             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");
51     }
52     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();
53     fMinimizeToTray = settings.value("fMinimizeToTray", false).toBool();
54     fMinimizeOnClose = settings.value("fMinimizeOnClose", false).toBool();
55     fCoinControlFeatures = settings.value("fCoinControlFeatures", false).toBool();
56     nTransactionFee = settings.value("nTransactionFee").toLongLong();
57     language = settings.value("language", "").toString();
58
59     // These are shared with core Bitcoin; we want
60     // command-line options to override the GUI settings:
61     if (settings.contains("fUseUPnP"))
62         SoftSetBoolArg("-upnp", settings.value("fUseUPnP").toBool());
63     if (settings.contains("addrProxy") && settings.value("fUseProxy").toBool())
64         SoftSetArg("-proxy", settings.value("addrProxy").toString().toStdString());
65     if (settings.contains("nSocksVersion") && settings.value("fUseProxy").toBool())
66         SoftSetArg("-socks", settings.value("nSocksVersion").toString().toStdString());
67     if (settings.contains("detachDB"))
68         SoftSetBoolArg("-detachdb", settings.value("detachDB").toBool());
69     if (!language.isEmpty())
70         SoftSetArg("-lang", language.toStdString());
71 }
72
73 bool OptionsModel::Upgrade()
74 {
75     QSettings settings;
76
77     if (settings.contains("bImportFinished"))
78         return false; // Already upgraded
79
80     settings.setValue("bImportFinished", true);
81
82     // Move settings from old wallet.dat (if any):
83     CWalletDB walletdb(strWalletFileName);
84
85     QList<QString> intOptions;
86     intOptions << "nDisplayUnit" << "nTransactionFee";
87     foreach(QString key, intOptions)
88     {
89         int value = 0;
90         if (walletdb.ReadSetting(key.toStdString(), value))
91         {
92             settings.setValue(key, value);
93             walletdb.EraseSetting(key.toStdString());
94         }
95     }
96     QList<QString> boolOptions;
97     boolOptions << "bDisplayAddresses" << "fMinimizeToTray" << "fMinimizeOnClose" << "fUseProxy" << "fUseUPnP";
98     foreach(QString key, boolOptions)
99     {
100         bool value = false;
101         if (walletdb.ReadSetting(key.toStdString(), value))
102         {
103             settings.setValue(key, value);
104             walletdb.EraseSetting(key.toStdString());
105         }
106     }
107     try
108     {
109         CAddress addrProxyAddress;
110         if (walletdb.ReadSetting("addrProxy", addrProxyAddress))
111         {
112             settings.setValue("addrProxy", addrProxyAddress.ToStringIPPort().c_str());
113             walletdb.EraseSetting("addrProxy");
114         }
115     }
116     catch (std::ios_base::failure &e)
117     {
118         // 0.6.0rc1 saved this as a CService, which causes failure when parsing as a CAddress
119         CService addrProxy;
120         if (walletdb.ReadSetting("addrProxy", addrProxy))
121         {
122             settings.setValue("addrProxy", addrProxy.ToStringIPPort().c_str());
123             walletdb.EraseSetting("addrProxy");
124         }
125     }
126     ApplyProxySettings();
127     Init();
128
129     return true;
130 }
131
132
133 int OptionsModel::rowCount(const QModelIndex & parent) const
134 {
135     return OptionIDRowCount;
136 }
137
138 QVariant OptionsModel::data(const QModelIndex & index, int role) const
139 {
140     if(role == Qt::EditRole)
141     {
142         QSettings settings;
143         switch(index.row())
144         {
145         case StartAtStartup:
146             return QVariant(GUIUtil::GetStartOnSystemStartup());
147         case MinimizeToTray:
148             return QVariant(fMinimizeToTray);
149         case MapPortUPnP:
150             return settings.value("fUseUPnP", GetBoolArg("-upnp", true));
151         case MinimizeOnClose:
152             return QVariant(fMinimizeOnClose);
153         case ProxyUse:
154             return settings.value("fUseProxy", false);
155         case ProxyIP: {
156             proxyType proxy;
157             if (GetProxy(NET_IPV4, proxy))
158                 return QVariant(QString::fromStdString(proxy.first.ToStringIP()));
159             else
160                 return QVariant(QString::fromStdString("127.0.0.1"));
161         }
162         case ProxyPort: {
163             proxyType proxy;
164             if (GetProxy(NET_IPV4, proxy))
165                 return QVariant(proxy.first.GetPort());
166             else
167                 return QVariant(9050);
168         }
169         case ProxySocksVersion:
170             return settings.value("nSocksVersion", 5);
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 MapPortUPnP:
208             fUseUPnP = value.toBool();
209             settings.setValue("fUseUPnP", fUseUPnP);
210             MapPort();
211             break;
212         case MinimizeOnClose:
213             fMinimizeOnClose = value.toBool();
214             settings.setValue("fMinimizeOnClose", fMinimizeOnClose);
215             break;
216         case ProxyUse:
217             settings.setValue("fUseProxy", value.toBool());
218             ApplyProxySettings();
219             break;
220         case ProxyIP: {
221             proxyType proxy;
222             proxy.first = CService("127.0.0.1", 9050);
223             GetProxy(NET_IPV4, proxy);
224
225             CNetAddr addr(value.toString().toStdString());
226             proxy.first.SetIP(addr);
227             settings.setValue("addrProxy", proxy.first.ToStringIPPort().c_str());
228             successful = ApplyProxySettings();
229         }
230         break;
231         case ProxyPort: {
232             proxyType proxy;
233             proxy.first = CService("127.0.0.1", 9050);
234             GetProxy(NET_IPV4, proxy);
235
236             proxy.first.SetPort(value.toInt());
237             settings.setValue("addrProxy", proxy.first.ToStringIPPort().c_str());
238             successful = ApplyProxySettings();
239         }
240         break;
241         case ProxySocksVersion: {
242             proxyType proxy;
243             proxy.second = 5;
244             GetProxy(NET_IPV4, proxy);
245
246             proxy.second = value.toInt();
247             settings.setValue("nSocksVersion", proxy.second);
248             successful = ApplyProxySettings();
249         }
250         break;
251         case Fee:
252             nTransactionFee = value.toLongLong();
253             settings.setValue("nTransactionFee", static_cast<qlonglong>(nTransactionFee));
254             emit transactionFeeChanged(nTransactionFee);
255             break;
256         case DisplayUnit:
257             nDisplayUnit = value.toInt();
258             settings.setValue("nDisplayUnit", nDisplayUnit);
259             emit displayUnitChanged(nDisplayUnit);
260             break;
261         case DisplayAddresses:
262             bDisplayAddresses = value.toBool();
263             settings.setValue("bDisplayAddresses", bDisplayAddresses);
264             break;
265         case DetachDatabases: {
266             bool fDetachDB = value.toBool();
267             bitdb.SetDetach(fDetachDB);
268             settings.setValue("detachDB", fDetachDB);
269             }
270             break;
271         case ThirdPartyTxUrls:
272             if (strThirdPartyTxUrls != value.toString()) {
273                 strThirdPartyTxUrls = value.toString();
274                 settings.setValue("strThirdPartyTxUrls", strThirdPartyTxUrls);
275             }
276             break;
277         case Language:
278             settings.setValue("language", value);
279             break;
280         case CoinControlFeatures: {
281             fCoinControlFeatures = value.toBool();
282             settings.setValue("fCoinControlFeatures", fCoinControlFeatures);
283             emit coinControlFeaturesChanged(fCoinControlFeatures);
284             }
285             break;
286         default:
287             break;
288         }
289     }
290     emit dataChanged(index, index);
291
292     return successful;
293 }
294
295 qint64 OptionsModel::getTransactionFee()
296 {
297     return nTransactionFee;
298 }
299
300 bool OptionsModel::getCoinControlFeatures()
301 {
302     return fCoinControlFeatures;
303 }
304
305 bool OptionsModel::getMinimizeToTray()
306 {
307     return fMinimizeToTray;
308 }
309
310 bool OptionsModel::getMinimizeOnClose()
311 {
312     return fMinimizeOnClose;
313 }
314
315 int OptionsModel::getDisplayUnit()
316 {
317     return nDisplayUnit;
318 }
319
320 bool OptionsModel::getDisplayAddresses()
321 {
322     return bDisplayAddresses;
323 }