PIVX Core  5.6.99
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-2021 The PIVX Core developers
4 // Distributed under the MIT/X11 software license, see the accompanying
5 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
6 
7 #if defined(HAVE_CONFIG_H)
8 #include "config/pivx-config.h"
9 #endif
10 
11 #include "optionsmodel.h"
12 
13 #include "bitcoinunits.h"
14 #include "guiutil.h"
15 
16 #include "mapport.h"
17 #include "net.h"
18 #include "netbase.h"
19 #include "txdb.h" // for -dbcache defaults
20 #include "util/system.h"
21 
22 #ifdef ENABLE_WALLET
23 #include "masternodeconfig.h"
24 #include "wallet/wallet.h"
25 #include "wallet/walletdb.h"
26 #endif
27 
28 #include <QDebug>
29 #include <QStringList>
30 
31 OptionsModel::OptionsModel(QObject* parent) : QAbstractListModel(parent)
32 {
33  Init();
34 }
35 
36 void OptionsModel::addOverriddenOption(const std::string& option)
37 {
38  strOverriddenByCommandLine += QString::fromStdString(option) + "=" + QString::fromStdString(gArgs.GetArg(option, "")) + " ";
39 }
40 
41 // Writes all missing QSettings with their default values
43 {
44  resetSettings = false;
45  QSettings settings;
46 
47  // Ensure restart flag is unset on client startup
48  setRestartRequired(false);
49 
50  // These are Qt-only settings:
51 
52  // Window
54 
55  // Display
56  if (!settings.contains("fHideZeroBalances"))
57  settings.setValue("fHideZeroBalances", true);
58  fHideZeroBalances = settings.value("fHideZeroBalances").toBool();
59 
60  if (!settings.contains("fHideOrphans"))
61  settings.setValue("fHideOrphans", true);
62  fHideOrphans = settings.value("fHideOrphans").toBool();
63 
64  if (!settings.contains("fCoinControlFeatures"))
65  settings.setValue("fCoinControlFeatures", false);
66  fCoinControlFeatures = settings.value("fCoinControlFeatures", false).toBool();
67 
68  if (!settings.contains("fShowColdStakingScreen"))
69  settings.setValue("fShowColdStakingScreen", false);
70  showColdStakingScreen = settings.value("fShowColdStakingScreen", false).toBool();
71 
72  if (!settings.contains("fShowMasternodesTab"))
73  settings.setValue("fShowMasternodesTab", masternodeConfig.getCount());
74 
75  // Main
77 
78  // Wallet
79 #ifdef ENABLE_WALLET
81 #endif
82 
83  // Network
85  // Display
87 
88  language = settings.value("language").toString();
89 }
90 
92 {
93  Q_EMIT dataChanged(index(0), index(rowCount(QModelIndex()) - 1));
94 }
95 
96 void OptionsModel::setMainDefaultOptions(QSettings& settings, bool reset)
97 {
98  // These are shared with the core or have a command-line parameter
99  // and we want command-line parameters to overwrite the GUI settings.
100  //
101  // If setting doesn't exist create it with defaults.
102  //
103  // If gArgs.SoftSetArg() or gArgs.SoftSetBoolArg() return false we were overridden
104  // by command-line and show this in the UI.
105  // Main
106 
107  // Default database cache is bumped from the original 100 MiB value.
108  // If we still have the old setting "nDatabaseCache" then:
109  // - if the value is equal to the old default (100 MiB), update the new setting "nDatabaseCache2"
110  // to the new default value (300 MiB)
111  // - if the value is different, then copy it to "nDatabaseCache2"
112  // - remove the old setting
113  if (settings.contains("nDatabaseCache")) {
114  qint64 saved_dbcache = settings.value("nDatabaseCache").toLongLong();
115  settings.setValue("nDatabaseCache2", saved_dbcache != 100 ? saved_dbcache : (qint64)nDefaultDbCache);
116  settings.remove("nDatabaseCache");
117  }
118 
119  if (!settings.contains("nDatabaseCache2") || reset)
120  settings.setValue("nDatabaseCache2", (qint64)nDefaultDbCache);
121  if (!gArgs.SoftSetArg("-dbcache", settings.value("nDatabaseCache2").toString().toStdString()))
122  addOverriddenOption("-dbcache");
123 
124  if (!settings.contains("nThreadsScriptVerif") || reset)
125  settings.setValue("nThreadsScriptVerif", DEFAULT_SCRIPTCHECK_THREADS);
126  if (!gArgs.SoftSetArg("-par", settings.value("nThreadsScriptVerif").toString().toStdString()))
127  addOverriddenOption("-par");
128 
129  if (reset) {
130  refreshDataView();
131  }
132 }
133 
135 {
136  if (!settings.contains("bSpendZeroConfChange") || reset)
137  settings.setValue("bSpendZeroConfChange", false);
138  if (!gArgs.SoftSetBoolArg("-spendzeroconfchange", settings.value("bSpendZeroConfChange").toBool()))
139  addOverriddenOption("-spendzeroconfchange");
140  if (reset) {
141  refreshDataView();
142  }
143 }
144 
146 {
147  if (!settings.contains("fUseUPnP") || reset)
148  settings.setValue("fUseUPnP", DEFAULT_UPNP);
149  if (!gArgs.SoftSetBoolArg("-upnp", settings.value("fUseUPnP").toBool()))
150  addOverriddenOption("-upnp");
151 
152  if (!settings.contains("fUseNatpmp") || reset )
153  settings.setValue("fUseNatpmp", DEFAULT_NATPMP);
154  if (!gArgs.SoftSetBoolArg("-natpmp", settings.value("fUseNatpmp").toBool()))
155  addOverriddenOption("-natpmp");
156 
157  if (!settings.contains("fListen") || reset)
158  settings.setValue("fListen", DEFAULT_LISTEN);
159  if (!gArgs.SoftSetBoolArg("-listen", settings.value("fListen").toBool()))
160  addOverriddenOption("-listen");
161 
162  if (!settings.contains("fUseProxy") || reset)
163  settings.setValue("fUseProxy", false);
164  if (!settings.contains("addrProxy") || reset)
165  settings.setValue("addrProxy", "127.0.0.1:9050");
166  // Only try to set -proxy, if user has enabled fUseProxy
167  if (settings.value("fUseProxy").toBool() && !gArgs.SoftSetArg("-proxy", settings.value("addrProxy").toString().toStdString()))
168  addOverriddenOption("-proxy");
169  else if (!settings.value("fUseProxy").toBool() && !gArgs.GetArg("-proxy", "").empty())
170  addOverriddenOption("-proxy");
171 
172  if (reset) {
173  refreshDataView();
174  }
175 }
176 
178 {
179  if (!settings.contains("fMinimizeToTray") || reset)
180  settings.setValue("fMinimizeToTray", false);
181  fMinimizeToTray = settings.value("fMinimizeToTray").toBool();
182 
183  if (!settings.contains("fMinimizeOnClose") || reset)
184  settings.setValue("fMinimizeOnClose", false);
185  fMinimizeOnClose = settings.value("fMinimizeOnClose").toBool();
186 
187  if (reset) {
188  refreshDataView();
189  }
190 }
191 
193 {
194  if (!settings.contains("nDisplayUnit") || reset)
195  settings.setValue("nDisplayUnit", BitcoinUnits::PIV);
196  nDisplayUnit = settings.value("nDisplayUnit").toInt();
197  if (!settings.contains("digits") || reset)
198  settings.setValue("digits", "2");
199  if (!settings.contains("theme") || reset)
200  settings.setValue("theme", "");
201  if (!settings.contains("fCSSexternal") || reset)
202  settings.setValue("fCSSexternal", false);
203  if (!settings.contains("language") || reset)
204  settings.setValue("language", "");
205  if (!gArgs.SoftSetArg("-lang", settings.value("language").toString().toStdString()))
206  addOverriddenOption("-lang");
207 
208  if (settings.contains("nAnonymizePivxAmount") || reset)
209  gArgs.SoftSetArg("-anonymizepivxamount", settings.value("nAnonymizePivxAmount").toString().toStdString());
210 
211  if (!settings.contains("strThirdPartyTxUrls") || reset)
212  settings.setValue("strThirdPartyTxUrls", "");
213  strThirdPartyTxUrls = settings.value("strThirdPartyTxUrls", "").toString();
214 
215  fHideCharts = gArgs.GetBoolArg("-hidecharts", false);
216 
217  if (reset) {
218  refreshDataView();
219  }
220 }
221 
223 {
224  QSettings settings;
225 
226  // Remove all entries from our QSettings object
227  settings.clear();
228  resetSettings = true; // Needed in pivx.cpp during shutdown to also remove the window positions
229 
230  // default setting for OptionsModel::StartAtStartup - disabled
233 }
234 
235 int OptionsModel::rowCount(const QModelIndex& parent) const
236 {
237  return OptionIDRowCount;
238 }
239 
240 // read QSettings values and return them
241 QVariant OptionsModel::data(const QModelIndex& index, int role) const
242 {
243  if (role == Qt::EditRole) {
244  QSettings settings;
245  switch (index.row()) {
246  case StartAtStartup:
248  case MinimizeToTray:
249  return fMinimizeToTray;
250  case MapPortUPnP:
251 #ifdef USE_UPNP
252  return settings.value("fUseUPnP");
253 #else
254  return false;
255 #endif // USE_UPNP
256  case MapPortNatpmp:
257 #ifdef USE_NATPMP
258  return settings.value("fUseNatpmp");
259 #else
260  return false;
261 #endif // USE_NATPMP
262  case MinimizeOnClose:
263  return fMinimizeOnClose;
264 
265  // default proxy
266  case ProxyUse:
267  return settings.value("fUseProxy", false);
268  case ProxyIP: {
269  // contains IP at index 0 and port at index 1
270  QStringList strlIpPort = GUIUtil::SplitSkipEmptyParts(settings.value("addrProxy").toString(), ":");
271  return strlIpPort.at(0);
272  }
273  case ProxyPort: {
274  // contains IP at index 0 and port at index 1
275  QStringList strlIpPort = GUIUtil::SplitSkipEmptyParts(settings.value("addrProxy").toString(), ":");
276  return strlIpPort.at(1);
277  }
278 
279 #ifdef ENABLE_WALLET
280  case SpendZeroConfChange:
281  return settings.value("bSpendZeroConfChange");
282  case ShowMasternodesTab:
283  return settings.value("fShowMasternodesTab");
284 #endif
285  case DisplayUnit:
286  return nDisplayUnit;
287  case ThirdPartyTxUrls:
288  return strThirdPartyTxUrls;
289  case Digits:
290  return settings.value("digits");
291  case Theme:
292  return settings.value("theme");
293  case Language:
294  return settings.value("language");
295  case CoinControlFeatures:
296  return fCoinControlFeatures;
298  return showColdStakingScreen;
299  case DatabaseCache:
300  return settings.value("nDatabaseCache2");
301  case ThreadsScriptVerif:
302  return settings.value("nThreadsScriptVerif");
303  case HideCharts:
304  return fHideCharts;
305  case HideZeroBalances:
306  return settings.value("fHideZeroBalances");
307  case HideOrphans:
308  return settings.value("fHideOrphans");
309  case Listen:
310  return settings.value("fListen");
311  default:
312  return QVariant();
313  }
314  }
315  return QVariant();
316 }
317 
318 // write QSettings values
319 bool OptionsModel::setData(const QModelIndex& index, const QVariant& value, int role)
320 {
321  bool successful = true; /* set to false on parse error */
322  if (role == Qt::EditRole) {
323  QSettings settings;
324  switch (index.row()) {
325  case StartAtStartup:
326  successful = GUIUtil::SetStartOnSystemStartup(value.toBool());
327  break;
328  case MinimizeToTray:
329  fMinimizeToTray = value.toBool();
330  settings.setValue("fMinimizeToTray", fMinimizeToTray);
331  break;
332  case MapPortUPnP: // core option - can be changed on-the-fly
333  settings.setValue("fUseUPnP", value.toBool());
334  break;
335  case MapPortNatpmp: // core option - can be changed on-the-fly
336  settings.setValue("fUseNatpmp", value.toBool());
337  break;
338  case MinimizeOnClose:
339  fMinimizeOnClose = value.toBool();
340  settings.setValue("fMinimizeOnClose", fMinimizeOnClose);
341  break;
342 
343  // default proxy
344  case ProxyUse:
345  if (settings.value("fUseProxy") != value) {
346  settings.setValue("fUseProxy", value.toBool());
347  setRestartRequired(true);
348  }
349  break;
350  case ProxyIP: {
351  // contains current IP at index 0 and current port at index 1
352  QStringList strlIpPort = GUIUtil::SplitSkipEmptyParts(settings.value("addrProxy").toString(), ":");
353  // if that key doesn't exist or has a changed IP
354  if (!settings.contains("addrProxy") || strlIpPort.at(0) != value.toString()) {
355  // construct new value from new IP and current port
356  QString strNewValue = value.toString() + ":" + strlIpPort.at(1);
357  settings.setValue("addrProxy", strNewValue);
358  setRestartRequired(true);
359  }
360  } break;
361  case ProxyPort: {
362  // contains current IP at index 0 and current port at index 1
363  QStringList strlIpPort = GUIUtil::SplitSkipEmptyParts(settings.value("addrProxy").toString(), ":");
364  // if that key doesn't exist or has a changed port
365  if (!settings.contains("addrProxy") || strlIpPort.at(1) != value.toString()) {
366  // construct new value from current IP and new port
367  QString strNewValue = strlIpPort.at(0) + ":" + value.toString();
368  settings.setValue("addrProxy", strNewValue);
369  setRestartRequired(true);
370  }
371  } break;
372 #ifdef ENABLE_WALLET
373  case SpendZeroConfChange:
374  if (settings.value("bSpendZeroConfChange") != value) {
375  settings.setValue("bSpendZeroConfChange", value);
376  setRestartRequired(true);
377  }
378  break;
379  case ShowMasternodesTab:
380  if (settings.value("fShowMasternodesTab") != value) {
381  settings.setValue("fShowMasternodesTab", value);
382  setRestartRequired(true);
383  }
384  break;
385 #endif
386  case DisplayUnit:
387  setDisplayUnit(value);
388  break;
389  case ThirdPartyTxUrls:
390  if (strThirdPartyTxUrls != value.toString()) {
391  strThirdPartyTxUrls = value.toString();
392  settings.setValue("strThirdPartyTxUrls", strThirdPartyTxUrls);
393  setRestartRequired(true);
394  }
395  break;
396  case Digits:
397  if (settings.value("digits") != value) {
398  settings.setValue("digits", value);
399  setRestartRequired(true);
400  }
401  break;
402  case Theme:
403  if (settings.value("theme") != value) {
404  settings.setValue("theme", value);
405  setRestartRequired(true);
406  }
407  break;
408  case Language:
409  if (settings.value("language") != value) {
410  settings.setValue("language", value);
411  setRestartRequired(true);
412  }
413  break;
414  case HideCharts:
415  fHideCharts = value.toBool(); // memory only
417  break;
418  case HideZeroBalances:
419  fHideZeroBalances = value.toBool();
420  settings.setValue("fHideZeroBalances", fHideZeroBalances);
422  break;
423  case HideOrphans:
424  fHideOrphans = value.toBool();
425  settings.setValue("fHideOrphans", fHideOrphans);
427  break;
428  case CoinControlFeatures:
429  fCoinControlFeatures = value.toBool();
430  settings.setValue("fCoinControlFeatures", fCoinControlFeatures);
432  break;
434  this->showColdStakingScreen = value.toBool();
435  settings.setValue("fShowColdStakingScreen", this->showColdStakingScreen);
437  break;
438  case DatabaseCache:
439  if (settings.value("nDatabaseCache2") != value) {
440  settings.setValue("nDatabaseCache2", value);
441  setRestartRequired(true);
442  }
443  break;
444  case ThreadsScriptVerif:
445  if (settings.value("nThreadsScriptVerif") != value) {
446  settings.setValue("nThreadsScriptVerif", value);
447  setRestartRequired(true);
448  }
449  break;
450  case Listen:
451  if (settings.value("fListen") != value) {
452  settings.setValue("fListen", value);
453  setRestartRequired(true);
454  }
455  break;
456  default:
457  break;
458  }
459  }
460 
461  Q_EMIT dataChanged(index, index);
462 
463  return successful;
464 }
465 
467 void OptionsModel::setDisplayUnit(const QVariant& value)
468 {
469  if (!value.isNull()) {
470  QSettings settings;
471  nDisplayUnit = value.toInt();
472  settings.setValue("nDisplayUnit", nDisplayUnit);
474  }
475 }
476 
478 {
479  QSettings settings;
480  return settings.setValue("fRestartRequired", fRequired);
481 }
482 
484 {
485  QSettings settings;
486  return settings.value("fRestartRequired", false).toBool();
487 }
bool SoftSetArg(const std::string &strArg, const std::string &strValue)
Set an argument if it doesn't already have a value.
Definition: system.cpp:473
std::string GetArg(const std::string &strArg, const std::string &strDefault) const
Return string argument or default value.
Definition: system.cpp:449
bool SoftSetBoolArg(const std::string &strArg, bool fValue)
Set a boolean argument if it doesn't already have a value.
Definition: system.cpp:481
bool GetBoolArg(const std::string &strArg, bool fDefault) const
Return boolean argument or default value.
Definition: system.cpp:465
QString strOverriddenByCommandLine
Definition: optionsmodel.h:115
void hideChartsChanged(bool)
OptionsModel(QObject *parent=0)
void hideZeroBalancesChanged(bool)
void setWalletDefaultOptions(QSettings &settings, bool reset=false)
void hideOrphansChanged(bool)
bool fCoinControlFeatures
Definition: optionsmodel.h:109
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole)
void setDisplayUnit(const QVariant &value)
Updates current unit in memory, settings and emits displayUnitChanged(newUnit) signal.
void coinControlFeaturesChanged(bool)
void setNetworkDefaultOptions(QSettings &settings, bool reset=false)
QString strThirdPartyTxUrls
Definition: optionsmodel.h:108
bool resetSettings
Definition: optionsmodel.h:83
@ ShowColdStakingScreen
Definition: optionsmodel.h:56
void setMainDefaultOptions(QSettings &settings, bool reset=false)
void setWindowDefaultOptions(QSettings &settings, bool reset=false)
bool isRestartRequired()
void displayUnitChanged(int unit)
void showHideColdStakingScreen(bool)
void refreshDataView()
bool fHideZeroBalances
Definition: optionsmodel.h:112
bool fMinimizeToTray
Definition: optionsmodel.h:104
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const
void setDisplayDefaultOptions(QSettings &settings, bool reset=false)
int rowCount(const QModelIndex &parent=QModelIndex()) const
QString language
Definition: optionsmodel.h:106
void addOverriddenOption(const std::string &option)
Add option to list of GUI options overridden through command line/config file.
bool fMinimizeOnClose
Definition: optionsmodel.h:105
void setRestartRequired(bool fRequired)
bool showColdStakingScreen
Definition: optionsmodel.h:110
CMasternodeConfig masternodeConfig
bool SetStartOnSystemStartup(bool fAutoStart)
Definition: guiutil.cpp:602
bool GetStartOnSystemStartup()
Definition: guiutil.cpp:598
QStringList SplitSkipEmptyParts(const QString &string, const SeparatorType &separator)
Splits the string into substrings wherever separator occurs, and returns the list of those strings.
Definition: guiutil.h:214
QSettings * settings
Definition: qtutils.cpp:197
ArgsManager gArgs
Definition: system.cpp:89