PRCYCoin  2.0.0.7rc1
P2P Digital Currency
optionsmodel.cpp
Go to the documentation of this file.
1 // Copyright (c) 2011-2014 The Bitcoin developers
2 // Copyright (c) 2014-2015 The Dash developers
3 // Copyright (c) 2015-2018 The PIVX developers
4 // Copyright (c) 2018-2020 The DAPS Project developers
5 // Distributed under the MIT/X11 software license, see the accompanying
6 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
7 
8 #if defined(HAVE_CONFIG_H)
10 #endif
11 
12 #include "optionsmodel.h"
13 
14 #include "bitcoinunits.h"
15 #include "guiutil.h"
16 
17 #include "amount.h"
18 #include "init.h"
19 #include "main.h"
20 #include "net.h"
21 #include "netbase.h"
22 #include "txdb.h" // for -dbcache defaults
23 
24 #ifdef ENABLE_WALLET
25 #include "masternodeconfig.h"
26 #include "wallet/wallet.h"
27 #include "wallet/walletdb.h"
28 #endif
29 
30 #include <QDebug>
31 #include <QSettings>
32 #include <QStringList>
33 
34 OptionsModel::OptionsModel(QObject* parent) : QAbstractListModel(parent)
35 {
36  Init();
37 }
38 
39 void OptionsModel::addOverriddenOption(const std::string& option)
40 {
41  strOverriddenByCommandLine += QString::fromStdString(option) + "=" + QString::fromStdString(mapArgs[option]) + " ";
42 }
43 
44 // Writes all missing QSettings with their default values
46 {
47  resetSettings = false;
48  QSettings settings;
49 
50  // Ensure restart flag is unset on client startup
51  setRestartRequired(false);
52 
53  // These are Qt-only settings:
54 
55  // Window
56  if (!settings.contains("fMinimizeToTray"))
57  settings.setValue("fMinimizeToTray", false);
58  fMinimizeToTray = settings.value("fMinimizeToTray").toBool();
59 
60  if (!settings.contains("fMinimizeOnClose"))
61  settings.setValue("fMinimizeOnClose", false);
62  fMinimizeOnClose = settings.value("fMinimizeOnClose").toBool();
63 
64  // Display
65  if (!settings.contains("nDisplayUnit"))
66  settings.setValue("nDisplayUnit", BitcoinUnits::PRCY);
67  nDisplayUnit = settings.value("nDisplayUnit").toInt();
68 
69  if (!settings.contains("strThirdPartyTxUrls"))
70  settings.setValue("strThirdPartyTxUrls", "");
71  strThirdPartyTxUrls = settings.value("strThirdPartyTxUrls", "").toString();
72 
73  if (!settings.contains("fHideOrphans"))
74  settings.setValue("fHideOrphans", false);
75  fHideOrphans = settings.value("fHideOrphans").toBool();
76 
77  if (!settings.contains("fCoinControlFeatures"))
78  settings.setValue("fCoinControlFeatures", false);
79  fCoinControlFeatures = settings.value("fCoinControlFeatures", false).toBool();
80 
81  // These are shared with the core or have a command-line parameter
82  // and we want command-line parameters to overwrite the GUI settings.
83  //
84  // If setting doesn't exist create it with defaults.
85  //
86  // If SoftSetArg() or SoftSetBoolArg() return false we were overridden
87  // by command-line and show this in the UI.
88 
89  // Main
90  if (!settings.contains("nDatabaseCache"))
91  settings.setValue("nDatabaseCache", (qint64)nDefaultDbCache);
92  if (!SoftSetArg("-dbcache", settings.value("nDatabaseCache").toString().toStdString()))
93  addOverriddenOption("-dbcache");
94 
95  if (!settings.contains("nThreadsScriptVerif"))
96  settings.setValue("nThreadsScriptVerif", DEFAULT_SCRIPTCHECK_THREADS);
97  if (!SoftSetArg("-par", settings.value("nThreadsScriptVerif").toString().toStdString()))
98  addOverriddenOption("-par");
99 
100 // Wallet
101 #ifdef ENABLE_WALLET
102  if (!settings.contains("bSpendZeroConfChange"))
103  settings.setValue("bSpendZeroConfChange", false);
104  if (!SoftSetBoolArg("-spendzeroconfchange", settings.value("bSpendZeroConfChange").toBool()))
105  addOverriddenOption("-spendzeroconfchange");
106 #endif
107 
108  // Network
109  if (!settings.contains("fUseUPnP"))
110  settings.setValue("fUseUPnP", DEFAULT_UPNP);
111  if (!SoftSetBoolArg("-upnp", settings.value("fUseUPnP").toBool()))
112  addOverriddenOption("-upnp");
113 
114  if (!settings.contains("fListen"))
115  settings.setValue("fListen", DEFAULT_LISTEN);
116  if (!SoftSetBoolArg("-listen", settings.value("fListen").toBool()))
117  addOverriddenOption("-listen");
118 
119  if (!settings.contains("fUseProxy"))
120  settings.setValue("fUseProxy", false);
121  if (!settings.contains("addrProxy"))
122  settings.setValue("addrProxy", "127.0.0.1:9050");
123  // Only try to set -proxy, if user has enabled fUseProxy
124  if (settings.value("fUseProxy").toBool() && !SoftSetArg("-proxy", settings.value("addrProxy").toString().toStdString()))
125  addOverriddenOption("-proxy");
126  else if (!settings.value("fUseProxy").toBool() && !GetArg("-proxy", "").empty())
127  addOverriddenOption("-proxy");
128 
129  // Display
130  if (!settings.contains("digits"))
131  settings.setValue("digits", "2");
132  if (!settings.contains("theme"))
133  settings.setValue("theme", "webwallet");
134  if (!settings.contains("fCSSexternal"))
135  settings.setValue("fCSSexternal", false);
136  if (!settings.contains("language"))
137  settings.setValue("language", "");
138  if (!SoftSetArg("-lang", settings.value("language").toString().toStdString()))
139  addOverriddenOption("-lang");
140 
141  language = settings.value("language").toString();
142 
143  // 2FA Digits Setting
144  if (!settings.contains("2fadigits"))
145  settings.setValue("2fadigits", "6");
146 }
147 
149 {
150  QSettings settings;
151 
152  // Remove all entries from our QSettings object
153  settings.clear();
154  resetSettings = true; // Needed in prcycoin.cpp during shotdown to also remove the window positions
155 
156  // default setting for OptionsModel::StartAtStartup - disabled
159 }
160 
161 int OptionsModel::rowCount(const QModelIndex& parent) const
162 {
163  return OptionIDRowCount;
164 }
165 
166 // read QSettings values and return them
167 QVariant OptionsModel::data(const QModelIndex& index, int role) const
168 {
169  if (role == Qt::EditRole) {
170  QSettings settings;
171  switch (index.row()) {
172  case StartAtStartup:
174  case MinimizeToTray:
175  return fMinimizeToTray;
176  case MapPortUPnP:
177 #ifdef USE_UPNP
178  return settings.value("fUseUPnP");
179 #else
180  return false;
181 #endif
182  case MinimizeOnClose:
183  return fMinimizeOnClose;
184 
185  // default proxy
186  case ProxyUse:
187  return settings.value("fUseProxy", false);
188  case ProxyIP: {
189  // contains IP at index 0 and port at index 1
190  QStringList strlIpPort = settings.value("addrProxy").toString().split(":", QString::SkipEmptyParts);
191  return strlIpPort.at(0);
192  }
193  case ProxyPort: {
194  // contains IP at index 0 and port at index 1
195  QStringList strlIpPort = settings.value("addrProxy").toString().split(":", QString::SkipEmptyParts);
196  return strlIpPort.at(1);
197  }
198 
199 #ifdef ENABLE_WALLET
200  case SpendZeroConfChange:
201  return settings.value("bSpendZeroConfChange");
202 #endif
203  case DisplayUnit:
204  return nDisplayUnit;
205  case ThirdPartyTxUrls:
206  return strThirdPartyTxUrls;
207  case Digits:
208  return settings.value("digits");
209  case Theme:
210  return settings.value("theme");
211  case Language:
212  return settings.value("language");
213  case CoinControlFeatures:
214  return fCoinControlFeatures;
215  case DatabaseCache:
216  return settings.value("nDatabaseCache");
217  case ThreadsScriptVerif:
218  return settings.value("nThreadsScriptVerif");
219  case HideOrphans:
220  return settings.value("fHideOrphans");
221  case Listen:
222  return settings.value("fListen");
223  default:
224  return QVariant();
225  }
226  }
227  return QVariant();
228 }
229 
230 // write QSettings values
231 bool OptionsModel::setData(const QModelIndex& index, const QVariant& value, int role)
232 {
233  bool successful = true; /* set to false on parse error */
234  if (role == Qt::EditRole) {
235  QSettings settings;
236  switch (index.row()) {
237  case StartAtStartup:
238  successful = GUIUtil::SetStartOnSystemStartup(value.toBool());
239  break;
240  case MinimizeToTray:
241  fMinimizeToTray = value.toBool();
242  settings.setValue("fMinimizeToTray", fMinimizeToTray);
243  break;
244  case MapPortUPnP: // core option - can be changed on-the-fly
245  settings.setValue("fUseUPnP", value.toBool());
246  MapPort(value.toBool());
247  break;
248  case MinimizeOnClose:
249  fMinimizeOnClose = value.toBool();
250  settings.setValue("fMinimizeOnClose", fMinimizeOnClose);
251  break;
252 
253  // default proxy
254  case ProxyUse:
255  if (settings.value("fUseProxy") != value) {
256  settings.setValue("fUseProxy", value.toBool());
257  setRestartRequired(true);
258  }
259  break;
260  case ProxyIP: {
261  // contains current IP at index 0 and current port at index 1
262  QStringList strlIpPort = settings.value("addrProxy").toString().split(":", QString::SkipEmptyParts);
263  // if that key doesn't exist or has a changed IP
264  if (!settings.contains("addrProxy") || strlIpPort.at(0) != value.toString()) {
265  // construct new value from new IP and current port
266  QString strNewValue = value.toString() + ":" + strlIpPort.at(1);
267  settings.setValue("addrProxy", strNewValue);
268  setRestartRequired(true);
269  }
270  } break;
271  case ProxyPort: {
272  // contains current IP at index 0 and current port at index 1
273  QStringList strlIpPort = settings.value("addrProxy").toString().split(":", QString::SkipEmptyParts);
274  // if that key doesn't exist or has a changed port
275  if (!settings.contains("addrProxy") || strlIpPort.at(1) != value.toString()) {
276  // construct new value from current IP and new port
277  QString strNewValue = strlIpPort.at(0) + ":" + value.toString();
278  settings.setValue("addrProxy", strNewValue);
279  setRestartRequired(true);
280  }
281  } break;
282 #ifdef ENABLE_WALLET
283  case SpendZeroConfChange:
284  if (settings.value("bSpendZeroConfChange") != value) {
285  settings.setValue("bSpendZeroConfChange", value);
286  setRestartRequired(true);
287  }
288  break;
289 #endif
290  case DisplayUnit:
291  setDisplayUnit(value);
292  break;
293  case ThirdPartyTxUrls:
294  if (strThirdPartyTxUrls != value.toString()) {
295  strThirdPartyTxUrls = value.toString();
296  settings.setValue("strThirdPartyTxUrls", strThirdPartyTxUrls);
297  setRestartRequired(true);
298  }
299  break;
300  case Digits:
301  if (settings.value("digits") != value) {
302  settings.setValue("digits", value);
303  setRestartRequired(true);
304  }
305  break;
306  case Theme:
307  if (settings.value("theme") != value) {
308  settings.setValue("theme", value);
309  setRestartRequired(true);
310  }
311  break;
312  case Language:
313  if (settings.value("language") != value) {
314  settings.setValue("language", value);
315  setRestartRequired(true);
316  }
317  break;
318  case HideOrphans:
319  fHideOrphans = value.toBool();
320  settings.setValue("fHideOrphans", fHideOrphans);
322  break;
323  case CoinControlFeatures:
324  fCoinControlFeatures = value.toBool();
325  settings.setValue("fCoinControlFeatures", fCoinControlFeatures);
327  break;
328  case DatabaseCache:
329  if (settings.value("nDatabaseCache") != value) {
330  settings.setValue("nDatabaseCache", value);
331  setRestartRequired(true);
332  }
333  break;
334  case ThreadsScriptVerif:
335  if (settings.value("nThreadsScriptVerif") != value) {
336  settings.setValue("nThreadsScriptVerif", value);
337  setRestartRequired(true);
338  }
339  break;
340  case Listen:
341  if (settings.value("fListen") != value) {
342  settings.setValue("fListen", value);
343  setRestartRequired(true);
344  }
345  break;
346  default:
347  break;
348  }
349  }
350 
351  Q_EMIT dataChanged(index, index);
352 
353  return successful;
354 }
355 
357 void OptionsModel::setDisplayUnit(const QVariant& value)
358 {
359  if (!value.isNull()) {
360  QSettings settings;
361  nDisplayUnit = value.toInt();
362  settings.setValue("nDisplayUnit", nDisplayUnit);
364  }
365 }
366 
368 {
369  QSettings settings;
370  return settings.setValue("fRestartRequired", fRequired);
371 }
372 
374 {
375  QSettings settings;
376  return settings.value("fRestartRequired", false).toBool();
377 }
OptionsModel::hideOrphansChanged
void hideOrphansChanged(bool)
OptionsModel::fHideOrphans
bool fHideOrphans
Definition: optionsmodel.h:78
OptionsModel::Digits
@ Digits
Definition: optionsmodel.h:35
OptionsModel::MinimizeOnClose
@ MinimizeOnClose
Definition: optionsmodel.h:29
OptionsModel::isRestartRequired
bool isRestartRequired()
Definition: optionsmodel.cpp:373
SoftSetBoolArg
bool SoftSetBoolArg(const std::string &strArg, bool fValue)
Set a boolean argument if it doesn't already have a value.
Definition: util.cpp:270
OptionsModel::ThreadsScriptVerif
@ ThreadsScriptVerif
Definition: optionsmodel.h:39
GUIUtil::SetStartOnSystemStartup
bool SetStartOnSystemStartup(bool fAutoStart)
Definition: guiutil.cpp:687
OptionsModel::DisplayUnit
@ DisplayUnit
Definition: optionsmodel.h:33
OptionsModel::Listen
@ Listen
Definition: optionsmodel.h:44
mapArgs
std::map< std::string, std::string > mapArgs
Definition: util.cpp:111
OptionsModel::fMinimizeOnClose
bool fMinimizeOnClose
Definition: optionsmodel.h:73
wallet.h
OptionsModel::displayUnitChanged
void displayUnitChanged(int unit)
OptionsModel::ProxyPort
@ ProxyPort
Definition: optionsmodel.h:32
OptionsModel::DatabaseCache
@ DatabaseCache
Definition: optionsmodel.h:40
OptionsModel::Init
void Init()
Definition: optionsmodel.cpp:45
OptionsModel::SpendZeroConfChange
@ SpendZeroConfChange
Definition: optionsmodel.h:41
OptionsModel::HideOrphans
@ HideOrphans
Definition: optionsmodel.h:42
SoftSetArg
bool SoftSetArg(const std::string &strArg, const std::string &strValue)
Set an argument if it doesn't already have a value.
Definition: util.cpp:262
OptionsModel::setDisplayUnit
void setDisplayUnit(const QVariant &value)
Updates current unit in memory, settings and emits displayUnitChanged(newUnit) signal.
Definition: optionsmodel.cpp:357
OptionsModel::nDisplayUnit
int nDisplayUnit
Definition: optionsmodel.h:75
OptionsModel::OptionIDRowCount
@ OptionIDRowCount
Definition: optionsmodel.h:45
OptionsModel::MinimizeToTray
@ MinimizeToTray
Definition: optionsmodel.h:27
OptionsModel::Reset
void Reset()
Definition: optionsmodel.cpp:148
OptionsModel::ProxyUse
@ ProxyUse
Definition: optionsmodel.h:30
OptionsModel::addOverriddenOption
void addOverriddenOption(const std::string &option)
Add option to list of GUI options overridden through command line/config file.
Definition: optionsmodel.cpp:39
OptionsModel::Theme
@ Theme
Definition: optionsmodel.h:36
prcycoin-config.h
BitcoinUnits::PRCY
@ PRCY
Definition: bitcoinunits.h:61
init.h
OptionsModel::strThirdPartyTxUrls
QString strThirdPartyTxUrls
Definition: optionsmodel.h:76
OptionsModel::StartAtStartup
@ StartAtStartup
Definition: optionsmodel.h:26
OptionsModel::strOverriddenByCommandLine
QString strOverriddenByCommandLine
Definition: optionsmodel.h:80
guiutil.h
OptionsModel::fMinimizeToTray
bool fMinimizeToTray
Definition: optionsmodel.h:72
OptionsModel::data
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const
Definition: optionsmodel.cpp:167
OptionsModel::resetSettings
bool resetSettings
Definition: optionsmodel.h:68
OptionsModel::language
QString language
Definition: optionsmodel.h:74
OptionsModel::CoinControlFeatures
@ CoinControlFeatures
Definition: optionsmodel.h:38
OptionsModel::fCoinControlFeatures
bool fCoinControlFeatures
Definition: optionsmodel.h:77
OptionsModel::ProxyIP
@ ProxyIP
Definition: optionsmodel.h:31
GUIUtil::GetStartOnSystemStartup
bool GetStartOnSystemStartup()
Definition: guiutil.cpp:683
OptionsModel::ThirdPartyTxUrls
@ ThirdPartyTxUrls
Definition: optionsmodel.h:34
OptionsModel::MapPortUPnP
@ MapPortUPnP
Definition: optionsmodel.h:28
OptionsModel::rowCount
int rowCount(const QModelIndex &parent=QModelIndex()) const
Definition: optionsmodel.cpp:161
main.h
OptionsModel::Language
@ Language
Definition: optionsmodel.h:37
OptionsModel::OptionsModel
OptionsModel(QObject *parent=0)
Definition: optionsmodel.cpp:34
bitcoinunits.h
OptionsModel::setData
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole)
Definition: optionsmodel.cpp:231
netbase.h
walletdb.h
optionsmodel.h
net.h
GetArg
std::string GetArg(const std::string &strArg, const std::string &strDefault)
Return string argument or default value.
Definition: util.cpp:241
amount.h
masternodeconfig.h
txdb.h
OptionsModel::coinControlFeaturesChanged
void coinControlFeaturesChanged(bool)
OptionsModel::setRestartRequired
void setRestartRequired(bool fRequired)
Definition: optionsmodel.cpp:367
MapPort
void MapPort(bool)
Definition: net.cpp:1360