add third party links to transaction context menu
[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         settings.setValue("strThirdPartyTxUrls", "");
48     strThirdPartyTxUrls = settings.value("strThirdPartyTxUrls", "https://bitinfocharts.com/novacoin/tx/%s|https://coinplorer.com/NVC/Transactions/%s|https://explorer.novaco.in/tx/%s").toString();
49     fMinimizeToTray = settings.value("fMinimizeToTray", false).toBool();
50     fMinimizeOnClose = settings.value("fMinimizeOnClose", false).toBool();
51     fCoinControlFeatures = settings.value("fCoinControlFeatures", false).toBool();
52     nTransactionFee = settings.value("nTransactionFee").toLongLong();
53     language = settings.value("language", "").toString();
54
55     // These are shared with core Bitcoin; we want
56     // command-line options to override the GUI settings:
57     if (settings.contains("fUseUPnP"))
58         SoftSetBoolArg("-upnp", settings.value("fUseUPnP").toBool());
59     if (settings.contains("addrProxy") && settings.value("fUseProxy").toBool())
60         SoftSetArg("-proxy", settings.value("addrProxy").toString().toStdString());
61     if (settings.contains("nSocksVersion") && settings.value("fUseProxy").toBool())
62         SoftSetArg("-socks", settings.value("nSocksVersion").toString().toStdString());
63     if (settings.contains("detachDB"))
64         SoftSetBoolArg("-detachdb", settings.value("detachDB").toBool());
65     if (!language.isEmpty())
66         SoftSetArg("-lang", language.toStdString());
67 }
68
69 bool OptionsModel::Upgrade()
70 {
71     QSettings settings;
72
73     if (settings.contains("bImportFinished"))
74         return false; // Already upgraded
75
76     settings.setValue("bImportFinished", true);
77
78     // Move settings from old wallet.dat (if any):
79     CWalletDB walletdb(strWalletFileName);
80
81     QList<QString> intOptions;
82     intOptions << "nDisplayUnit" << "nTransactionFee";
83     foreach(QString key, intOptions)
84     {
85         int value = 0;
86         if (walletdb.ReadSetting(key.toStdString(), value))
87         {
88             settings.setValue(key, value);
89             walletdb.EraseSetting(key.toStdString());
90         }
91     }
92     QList<QString> boolOptions;
93     boolOptions << "bDisplayAddresses" << "fMinimizeToTray" << "fMinimizeOnClose" << "fUseProxy" << "fUseUPnP";
94     foreach(QString key, boolOptions)
95     {
96         bool value = false;
97         if (walletdb.ReadSetting(key.toStdString(), value))
98         {
99             settings.setValue(key, value);
100             walletdb.EraseSetting(key.toStdString());
101         }
102     }
103     try
104     {
105         CAddress addrProxyAddress;
106         if (walletdb.ReadSetting("addrProxy", addrProxyAddress))
107         {
108             settings.setValue("addrProxy", addrProxyAddress.ToStringIPPort().c_str());
109             walletdb.EraseSetting("addrProxy");
110         }
111     }
112     catch (std::ios_base::failure &e)
113     {
114         // 0.6.0rc1 saved this as a CService, which causes failure when parsing as a CAddress
115         CService addrProxy;
116         if (walletdb.ReadSetting("addrProxy", addrProxy))
117         {
118             settings.setValue("addrProxy", addrProxy.ToStringIPPort().c_str());
119             walletdb.EraseSetting("addrProxy");
120         }
121     }
122     ApplyProxySettings();
123     Init();
124
125     return true;
126 }
127
128
129 int OptionsModel::rowCount(const QModelIndex & parent) const
130 {
131     return OptionIDRowCount;
132 }
133
134 QVariant OptionsModel::data(const QModelIndex & index, int role) const
135 {
136     if(role == Qt::EditRole)
137     {
138         QSettings settings;
139         switch(index.row())
140         {
141         case StartAtStartup:
142             return QVariant(GUIUtil::GetStartOnSystemStartup());
143         case MinimizeToTray:
144             return QVariant(fMinimizeToTray);
145         case MapPortUPnP:
146             return settings.value("fUseUPnP", GetBoolArg("-upnp", true));
147         case MinimizeOnClose:
148             return QVariant(fMinimizeOnClose);
149         case ProxyUse:
150             return settings.value("fUseProxy", false);
151         case ProxyIP: {
152             proxyType proxy;
153             if (GetProxy(NET_IPV4, proxy))
154                 return QVariant(QString::fromStdString(proxy.first.ToStringIP()));
155             else
156                 return QVariant(QString::fromStdString("127.0.0.1"));
157         }
158         case ProxyPort: {
159             proxyType proxy;
160             if (GetProxy(NET_IPV4, proxy))
161                 return QVariant(proxy.first.GetPort());
162             else
163                 return QVariant(9050);
164         }
165         case ProxySocksVersion:
166             return settings.value("nSocksVersion", 5);
167         case Fee:
168             return QVariant(nTransactionFee);
169         case DisplayUnit:
170             return QVariant(nDisplayUnit);
171         case DisplayAddresses:
172             return QVariant(bDisplayAddresses);
173             case ThirdPartyTxUrls:
174             return QVariant(strThirdPartyTxUrls);
175         case DetachDatabases:
176             return QVariant(bitdb.GetDetach());
177         case Language:
178             return settings.value("language", "");
179         case CoinControlFeatures:
180             return QVariant(fCoinControlFeatures);
181         default:
182             return QVariant();
183         }
184     }
185     return QVariant();
186 }
187
188 bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, int role)
189 {
190     bool successful = true; /* set to false on parse error */
191     if(role == Qt::EditRole)
192     {
193         QSettings settings;
194         switch(index.row())
195         {
196         case StartAtStartup:
197             successful = GUIUtil::SetStartOnSystemStartup(value.toBool());
198             break;
199         case MinimizeToTray:
200             fMinimizeToTray = value.toBool();
201             settings.setValue("fMinimizeToTray", fMinimizeToTray);
202             break;
203         case MapPortUPnP:
204             fUseUPnP = value.toBool();
205             settings.setValue("fUseUPnP", fUseUPnP);
206             MapPort();
207             break;
208         case MinimizeOnClose:
209             fMinimizeOnClose = value.toBool();
210             settings.setValue("fMinimizeOnClose", fMinimizeOnClose);
211             break;
212         case ProxyUse:
213             settings.setValue("fUseProxy", value.toBool());
214             ApplyProxySettings();
215             break;
216         case ProxyIP: {
217             proxyType proxy;
218             proxy.first = CService("127.0.0.1", 9050);
219             GetProxy(NET_IPV4, proxy);
220
221             CNetAddr addr(value.toString().toStdString());
222             proxy.first.SetIP(addr);
223             settings.setValue("addrProxy", proxy.first.ToStringIPPort().c_str());
224             successful = ApplyProxySettings();
225         }
226         break;
227         case ProxyPort: {
228             proxyType proxy;
229             proxy.first = CService("127.0.0.1", 9050);
230             GetProxy(NET_IPV4, proxy);
231
232             proxy.first.SetPort(value.toInt());
233             settings.setValue("addrProxy", proxy.first.ToStringIPPort().c_str());
234             successful = ApplyProxySettings();
235         }
236         break;
237         case ProxySocksVersion: {
238             proxyType proxy;
239             proxy.second = 5;
240             GetProxy(NET_IPV4, proxy);
241
242             proxy.second = value.toInt();
243             settings.setValue("nSocksVersion", proxy.second);
244             successful = ApplyProxySettings();
245         }
246         break;
247         case Fee:
248             nTransactionFee = value.toLongLong();
249             settings.setValue("nTransactionFee", nTransactionFee);
250             emit transactionFeeChanged(nTransactionFee);
251             break;
252         case DisplayUnit:
253             nDisplayUnit = value.toInt();
254             settings.setValue("nDisplayUnit", nDisplayUnit);
255             emit displayUnitChanged(nDisplayUnit);
256             break;
257         case DisplayAddresses:
258             bDisplayAddresses = value.toBool();
259             settings.setValue("bDisplayAddresses", bDisplayAddresses);
260             break;
261         case DetachDatabases: {
262             bool fDetachDB = value.toBool();
263             bitdb.SetDetach(fDetachDB);
264             settings.setValue("detachDB", fDetachDB);
265             }
266             break;
267         case ThirdPartyTxUrls:
268             if (strThirdPartyTxUrls != value.toString()) {
269                 strThirdPartyTxUrls = value.toString();
270                 settings.setValue("strThirdPartyTxUrls", strThirdPartyTxUrls);
271             }
272             break;
273         case Language:
274             settings.setValue("language", value);
275             break;
276         case CoinControlFeatures: {
277             fCoinControlFeatures = value.toBool();
278             settings.setValue("fCoinControlFeatures", fCoinControlFeatures);
279             emit coinControlFeaturesChanged(fCoinControlFeatures);
280             }
281             break;
282         default:
283             break;
284         }
285     }
286     emit dataChanged(index, index);
287
288     return successful;
289 }
290
291 qint64 OptionsModel::getTransactionFee()
292 {
293     return nTransactionFee;
294 }
295
296 bool OptionsModel::getCoinControlFeatures()
297 {
298     return fCoinControlFeatures;
299 }
300
301 bool OptionsModel::getMinimizeToTray()
302 {
303     return fMinimizeToTray;
304 }
305
306 bool OptionsModel::getMinimizeOnClose()
307 {
308     return fMinimizeOnClose;
309 }
310
311 int OptionsModel::getDisplayUnit()
312 {
313     return nDisplayUnit;
314 }
315
316 bool OptionsModel::getDisplayAddresses()
317 {
318     return bDisplayAddresses;
319 }