PRCYCoin  2.0.0.7rc1
P2P Digital Currency
optionsdialog.cpp
Go to the documentation of this file.
1 // Copyright (c) 2011-2013 The Bitcoin developers
2 // Distributed under the MIT/X11 software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #if defined(HAVE_CONFIG_H)
7 #endif
8 
9 #include "optionsdialog.h"
10 #include "ui_optionsdialog.h"
11 
12 #include "bitcoinunits.h"
13 #include "guiutil.h"
14 #include "optionsmodel.h"
15 
16 #include "main.h" // for MAX_SCRIPTCHECK_THREADS
17 #include "netbase.h"
18 #include "txdb.h" // for -dbcache defaults
19 
20 #ifdef ENABLE_WALLET
21 #include "wallet/wallet.h" // for CWallet::minTxFee
22 #endif
23 
24 #include <boost/thread.hpp>
25 
26 #include <QDataWidgetMapper>
27 #include <QDir>
28 #include <QIntValidator>
29 #include <QLocale>
30 #include <QMessageBox>
31 #include <QTimer>
32 
33 OptionsDialog::OptionsDialog(QWidget* parent, bool enableWallet) : QDialog(parent, Qt::WindowSystemMenuHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint),
34  ui(new Ui::OptionsDialog),
35  model(0),
36  mapper(0),
37  fProxyIpValid(true)
38 {
39  ui->setupUi(this);
40  GUIUtil::restoreWindowGeometry("nOptionsDialogWindow", this->size(), this);
41 
42  /* Main elements init */
43  ui->databaseCache->setMinimum(nMinDbCache);
44  ui->databaseCache->setMaximum(nMaxDbCache);
45  ui->threadsScriptVerif->setMinimum(-(int)boost::thread::hardware_concurrency());
46  ui->threadsScriptVerif->setMaximum(MAX_SCRIPTCHECK_THREADS);
47 
48 /* Network elements init */
49 #ifndef USE_UPNP
50  ui->mapPortUpnp->setEnabled(false);
51 #endif
52 
53  ui->proxyIp->setEnabled(false);
54  ui->proxyPort->setEnabled(false);
55  ui->proxyPort->setValidator(new QIntValidator(1, 65535, this));
56 
57  connect(ui->connectSocks, SIGNAL(toggled(bool)), ui->proxyIp, SLOT(setEnabled(bool)));
58  connect(ui->connectSocks, SIGNAL(toggled(bool)), ui->proxyPort, SLOT(setEnabled(bool)));
59 
60  ui->proxyIp->installEventFilter(this);
61  ui->proxyPort->installEventFilter(this);
62 
63 /* Window elements init */
64 #ifdef Q_OS_MAC
65  /* remove Window tab on Mac */
66  ui->tabWidget->removeTab(ui->tabWidget->indexOf(ui->tabWindow));
67 #endif
68 
69  /* remove Wallet tab in case of -disablewallet */
70  if (!enableWallet) {
71  ui->tabWidget->removeTab(ui->tabWidget->indexOf(ui->tabWallet));
72  }
73 
74  /* Display elements init */
75 
76  /* Number of displayed decimal digits selector */
77  QString digits;
78  for (int index = 2; index <= 8; index++) {
79  digits.setNum(index);
80  ui->digits->addItem(digits, digits);
81  }
82 
83  /* Language selector */
84  QDir translations(":translations");
85  ui->lang->addItem(QString("(") + tr("default") + QString(")"), QVariant(""));
86  Q_FOREACH (const QString& langStr, translations.entryList()) {
87  QLocale locale(langStr);
88 
90  if(langStr.contains("_"))
91  {
93  ui->lang->addItem(locale.nativeLanguageName() + QString(" - ") + locale.nativeCountryName() + QString(" (") + langStr + QString(")"), QVariant(langStr));
94  }
95  else
96  {
98  ui->lang->addItem(locale.nativeLanguageName() + QString(" (") + langStr + QString(")"), QVariant(langStr));
99  }
100  }
101  ui->thirdPartyTxUrls->setPlaceholderText("https://example.com/tx/%s");
102 
103  ui->unit->setModel(new BitcoinUnits(this));
104 
105  /* Widget-to-option mapper */
106  mapper = new QDataWidgetMapper(this);
107  mapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit);
108  mapper->setOrientation(Qt::Vertical);
109 
110  /* setup/change UI elements when proxy IP is invalid/valid */
111  connect(this, SIGNAL(proxyIpChecks(QValidatedLineEdit*, QLineEdit*)), this, SLOT(doProxyIpChecks(QValidatedLineEdit*, QLineEdit*)));
112 }
113 
115 {
116  GUIUtil::saveWindowGeometry("nOptionsDialogWindow", this);
117  delete ui;
118 }
119 
121 {
122  this->model = model;
123 
124  if (model) {
125  /* check if client restart is needed and show persistent message */
126  if (model->isRestartRequired())
127  showRestartWarning(true);
128 
129  QString strLabel = model->getOverriddenByCommandLine();
130  if (strLabel.isEmpty())
131  strLabel = tr("none");
132  ui->overriddenByCommandLineLabel->setText(strLabel);
133 
134  mapper->setModel(model);
135  setMapper();
136  mapper->toFirst();
137 
138  /* keep consistency for action triggered elsewhere */
139  connect(model, SIGNAL(hideOrphansChanged(bool)), this, SLOT(updateHideOrphans(bool)));
140  }
141 
142  /* warn when one of the following settings changes by user action (placed here so init via mapper doesn't trigger them) */
143 
144  /* Main */
145  connect(ui->databaseCache, SIGNAL(valueChanged(int)), this, SLOT(showRestartWarning()));
146  connect(ui->threadsScriptVerif, SIGNAL(valueChanged(int)), this, SLOT(showRestartWarning()));
147  /* Wallet */
148  connect(ui->spendZeroConfChange, SIGNAL(clicked(bool)), this, SLOT(showRestartWarning()));
149  /* Network */
150  connect(ui->allowIncoming, SIGNAL(clicked(bool)), this, SLOT(showRestartWarning()));
151  connect(ui->connectSocks, SIGNAL(clicked(bool)), this, SLOT(showRestartWarning()));
152  /* Display */
153  connect(ui->digits, SIGNAL(valueChanged()), this, SLOT(showRestartWarning()));
154  connect(ui->theme, SIGNAL(valueChanged(int)), this, SLOT(showRestartWarning()));
155  connect(ui->lang, SIGNAL(valueChanged()), this, SLOT(showRestartWarning()));
156  connect(ui->thirdPartyTxUrls, SIGNAL(textChanged(const QString&)), this, SLOT(showRestartWarning()));
157  connect(ui->showMasternodesTab, SIGNAL(clicked(bool)), this, SLOT(showRestartWarning()));
158 }
159 
161 {
162  /* Main */
163  mapper->addMapping(ui->bitcoinAtStartup, OptionsModel::StartAtStartup);
164  mapper->addMapping(ui->threadsScriptVerif, OptionsModel::ThreadsScriptVerif);
165  mapper->addMapping(ui->databaseCache, OptionsModel::DatabaseCache);
166 
167  /* Wallet */
168  mapper->addMapping(ui->spendZeroConfChange, OptionsModel::SpendZeroConfChange);
169  mapper->addMapping(ui->coinControlFeatures, OptionsModel::CoinControlFeatures);
170 
171  /* Network */
172  mapper->addMapping(ui->mapPortUpnp, OptionsModel::MapPortUPnP);
173  mapper->addMapping(ui->allowIncoming, OptionsModel::Listen);
174 
175  mapper->addMapping(ui->connectSocks, OptionsModel::ProxyUse);
176  mapper->addMapping(ui->proxyIp, OptionsModel::ProxyIP);
177  mapper->addMapping(ui->proxyPort, OptionsModel::ProxyPort);
178 
179  /* Window */
180 #ifndef Q_OS_MAC
181  mapper->addMapping(ui->minimizeToTray, OptionsModel::MinimizeToTray);
182  mapper->addMapping(ui->minimizeOnClose, OptionsModel::MinimizeOnClose);
183 #endif
184 
185  /* Display */
186  mapper->addMapping(ui->digits, OptionsModel::Digits);
187  mapper->addMapping(ui->theme, OptionsModel::Theme);
188  mapper->addMapping(ui->lang, OptionsModel::Language);
189  mapper->addMapping(ui->unit, OptionsModel::DisplayUnit);
190  mapper->addMapping(ui->thirdPartyTxUrls, OptionsModel::ThirdPartyTxUrls);
191  //mapper->addMapping(ui->checkBoxHideOrphans, OptionsModel::HideOrphans); //not currently hooked up to anything
192 
193  /* Masternode Tab */
194  mapper->addMapping(ui->showMasternodesTab, OptionsModel::ShowMasternodesTab);
195 }
196 
198 {
199  /* prevent enabling of the OK button when data modified, if there is an invalid proxy address present */
200  if (fProxyIpValid)
201  setOkButtonState(true);
202 }
203 
205 {
206  setOkButtonState(false);
207 }
208 
210 {
211  ui->okButton->setEnabled(fState);
212 }
213 
215 {
216  if (model) {
217  // confirmation dialog
218  QMessageBox::StandardButton btnRetVal = QMessageBox::question(this, tr("Confirm options reset"),
219  tr("Client restart required to activate changes.") + "<br><br>" + tr("Client will be shutdown, do you want to proceed?"),
220  QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Cancel);
221 
222  if (btnRetVal == QMessageBox::Cancel)
223  return;
224 
225  /* reset all options and close GUI */
226  model->Reset();
227  QApplication::quit();
228  }
229 }
230 
232 {
233  mapper->submit();
235  accept();
236 }
237 
239 {
240  reject();
241 }
242 
243 void OptionsDialog::showRestartWarning(bool fPersistent)
244 {
245  ui->statusLabel->setStyleSheet("QLabel { color: red; }");
246 
247  if (fPersistent) {
248  ui->statusLabel->setText(tr("Client restart required to activate changes."));
249  } else {
250  ui->statusLabel->setText(tr("This change would require a client restart."));
251  // clear non-persistent status label after 10 seconds
252  // Todo: should perhaps be a class attribute, if we extend the use of statusLabel
253  QTimer::singleShot(10000, this, SLOT(clearStatusLabel()));
254  }
255 }
256 
258 {
259  ui->statusLabel->clear();
260 }
261 
263 {
264  if (ui->checkBoxHideOrphans->isChecked() != fHide)
265  ui->checkBoxHideOrphans->setChecked(fHide);
266 }
267 
268 void OptionsDialog::doProxyIpChecks(QValidatedLineEdit* pUiProxyIp, QLineEdit* pUiProxyPort)
269 {
270  const std::string strAddrProxy = pUiProxyIp->text().toStdString();
271  const int nProxyPort = pUiProxyPort->text().toInt();
272  CService addrProxy(LookupNumeric(strAddrProxy.c_str(), nProxyPort));
273 
274  // Check for a valid IPv4 / IPv6 address
275  if (!(fProxyIpValid = addrProxy.IsValid())) {
276  disableOkButton();
277  pUiProxyIp->setValid(false);
278  ui->statusLabel->setStyleSheet("QLabel { color: red; }");
279  ui->statusLabel->setText(tr("The supplied proxy address is invalid."));
280  return;
281  }
282  // Check proxy port
283  if (!pUiProxyPort->hasAcceptableInput()) {
284  disableOkButton();
285  ui->statusLabel->setStyleSheet("QLabel { color: red; }");
286  ui->statusLabel->setText(tr("The supplied proxy port is invalid."));
287  return;
288  }
289 
290  proxyType checkProxy = proxyType(addrProxy);
291  if (!checkProxy.IsValid()) {
292  disableOkButton();
293  ui->statusLabel->setStyleSheet("QLabel { color: red; }");
294  ui->statusLabel->setText(tr("The supplied proxy settings are invalid."));
295  return;
296  }
297 
298  enableOkButton();
299  ui->statusLabel->clear();
300 }
301 
302 bool OptionsDialog::eventFilter(QObject* object, QEvent* event)
303 {
304  if (event->type() == QEvent::FocusOut) {
305  if (object == ui->proxyIp || object == ui->proxyPort) {
306  Q_EMIT proxyIpChecks(ui->proxyIp, ui->proxyPort);
307  }
308  }
309  return QDialog::eventFilter(object, event);
310 }
OptionsDialog
Preferences dialog.
Definition: optionsdialog.h:24
CService
A combination of a network address (CNetAddr) and a (TCP) port.
Definition: netaddress.h:133
proxyType::IsValid
bool IsValid() const
Definition: netbase.h:34
OptionsModel::Digits
@ Digits
Definition: optionsmodel.h:35
OptionsModel::MinimizeOnClose
@ MinimizeOnClose
Definition: optionsmodel.h:29
OptionsDialog::on_okButton_clicked
void on_okButton_clicked()
Definition: optionsdialog.cpp:231
OptionsModel::isRestartRequired
bool isRestartRequired()
Definition: optionsmodel.cpp:373
OptionsDialog::on_cancelButton_clicked
void on_cancelButton_clicked()
Definition: optionsdialog.cpp:238
OptionsModel::ThreadsScriptVerif
@ ThreadsScriptVerif
Definition: optionsmodel.h:39
OptionsModel::DisplayUnit
@ DisplayUnit
Definition: optionsmodel.h:33
OptionsModel::getOverriddenByCommandLine
const QString & getOverriddenByCommandLine()
Definition: optionsmodel.h:63
OptionsModel::Listen
@ Listen
Definition: optionsmodel.h:44
OptionsDialog::enableOkButton
void enableOkButton()
Definition: optionsdialog.cpp:197
OptionsDialog::OptionsDialog
OptionsDialog(QWidget *parent, bool enableWallet)
Definition: optionsdialog.cpp:33
wallet.h
OptionsDialog::model
OptionsModel * model
Definition: optionsdialog.h:60
OptionsDialog::proxyIpChecks
void proxyIpChecks(QValidatedLineEdit *pUiProxyIp, QLineEdit *pUiProxyPort)
OptionsModel::ProxyPort
@ ProxyPort
Definition: optionsmodel.h:32
OptionsModel::DatabaseCache
@ DatabaseCache
Definition: optionsmodel.h:40
OptionsModel::SpendZeroConfChange
@ SpendZeroConfChange
Definition: optionsmodel.h:41
proxyType
Definition: netbase.h:28
OptionsModel::MinimizeToTray
@ MinimizeToTray
Definition: optionsmodel.h:27
OptionsModel::Reset
void Reset()
Definition: optionsmodel.cpp:148
OptionsModel::ProxyUse
@ ProxyUse
Definition: optionsmodel.h:30
CWallet::MarkDirty
void MarkDirty()
Definition: wallet.cpp:1162
OptionsModel::ShowMasternodesTab
@ ShowMasternodesTab
Definition: optionsmodel.h:43
OptionsModel
Interface from Qt to configuration data structure for Bitcoin client.
Definition: optionsmodel.h:18
OptionsModel::Theme
@ Theme
Definition: optionsmodel.h:36
prcycoin-config.h
OptionsDialog::setMapper
void setMapper()
Definition: optionsdialog.cpp:160
GUIUtil::saveWindowGeometry
void saveWindowGeometry(const QString &strSetting, QWidget *parent)
Save window size and position.
Definition: guiutil.cpp:691
OptionsModel::StartAtStartup
@ StartAtStartup
Definition: optionsmodel.h:26
BitcoinUnits
PRCY unit definitions.
Definition: bitcoinunits.h:50
OptionsDialog::on_resetButton_clicked
void on_resetButton_clicked()
Definition: optionsdialog.cpp:214
QValidatedLineEdit
Line edit that can be marked as "invalid" to show input validation feedback.
Definition: qvalidatedlineedit.h:13
CNetAddr::IsValid
bool IsValid() const
Definition: netaddress.cpp:188
OptionsDialog::setModel
void setModel(OptionsModel *model)
Definition: optionsdialog.cpp:120
guiutil.h
OptionsDialog::ui
Ui::OptionsDialog * ui
Definition: optionsdialog.h:59
optionsdialog.h
OptionsModel::CoinControlFeatures
@ CoinControlFeatures
Definition: optionsmodel.h:38
OptionsDialog::clearStatusLabel
void clearStatusLabel()
Definition: optionsdialog.cpp:257
OptionsModel::ProxyIP
@ ProxyIP
Definition: optionsmodel.h:31
OptionsDialog::fProxyIpValid
bool fProxyIpValid
Definition: optionsdialog.h:62
OptionsDialog::showRestartWarning
void showRestartWarning(bool fPersistent=false)
Definition: optionsdialog.cpp:243
OptionsModel::ThirdPartyTxUrls
@ ThirdPartyTxUrls
Definition: optionsmodel.h:34
OptionsModel::MapPortUPnP
@ MapPortUPnP
Definition: optionsmodel.h:28
Ui
Definition: 2faconfirmdialog.h:7
QValidatedLineEdit::setValid
void setValid(bool valid)
Definition: qvalidatedlineedit.cpp:17
main.h
OptionsModel::Language
@ Language
Definition: optionsmodel.h:37
OptionsDialog::mapper
QDataWidgetMapper * mapper
Definition: optionsdialog.h:61
OptionsDialog::doProxyIpChecks
void doProxyIpChecks(QValidatedLineEdit *pUiProxyIp, QLineEdit *pUiProxyPort)
Definition: optionsdialog.cpp:268
LookupNumeric
CService LookupNumeric(const char *pszName, int portDefault)
Definition: netbase.cpp:234
OptionsDialog::eventFilter
bool eventFilter(QObject *object, QEvent *event)
Definition: optionsdialog.cpp:302
bitcoinunits.h
OptionsDialog::disableOkButton
void disableOkButton()
Definition: optionsdialog.cpp:204
OptionsDialog::~OptionsDialog
~OptionsDialog()
Definition: optionsdialog.cpp:114
netbase.h
OptionsDialog::setOkButtonState
void setOkButtonState(bool fState)
Definition: optionsdialog.cpp:209
optionsmodel.h
OptionsDialog::updateHideOrphans
void updateHideOrphans(bool fHide)
Definition: optionsdialog.cpp:262
pwalletMain
CWallet * pwalletMain
Definition: wallet.cpp:49
txdb.h
GUIUtil::restoreWindowGeometry
void restoreWindowGeometry(const QString &strSetting, const QSize &defaultSize, QWidget *parent)
Restore window size and position.
Definition: guiutil.cpp:704