PIVX Core  5.6.99
P2P Digital Currency
requestdialog.cpp
Go to the documentation of this file.
1 // Copyright (c) 2019-2022 The PIVX Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #include "requestdialog.h"
6 #include "ui_requestdialog.h"
7 
8 #include "guiutil.h"
9 #include "optionsmodel.h"
10 #include "qtutils.h"
11 
12 #include <QListView>
13 
14 RequestDialog::RequestDialog(QWidget *parent) :
15  FocusedDialog(parent),
16  ui(new Ui::RequestDialog)
17 {
18  ui->setupUi(this);
19 
20  this->setStyleSheet(parent->styleSheet());
21  setCssProperty(ui->frame, "container-dialog");
22 
23  // Text
24  setCssProperty(ui->labelTitle, "text-title-dialog");
25  setCssProperty(ui->labelMessage, "text-main-grey");
26 
27  // Combo Coins
28  setCssProperty(ui->comboBoxCoin, "btn-combo-coins");
29  setCssProperty(ui->comboContainer, "container-purple");
30 
31  // Label
32  setCssProperty(ui->labelSubtitleLabel, "text-title2-dialog");
33  setCssEditLineDialog(ui->lineEditLabel, true);
34 
35  // Amount
36  setCssProperty(ui->labelSubtitleAmount, "text-title2-dialog");
37  setCssEditLineDialog(ui->lineEditAmount, true);
38  GUIUtil::setupAmountWidget(ui->lineEditAmount, this);
39 
40  // Description
41  setCssProperty(ui->labelSubtitleDescription, "text-title2-dialog");
42  setCssEditLineDialog(ui->lineEditDescription, true);
43 
44  // Stack
45  ui->stack->setCurrentIndex(pos);
46  // Request QR Page
47  // Address
48  ui->labelAddress->setText(tr("Error"));
49  setCssProperty(ui->labelAddress, "text-main-grey-big");
50 
51  // Buttons
52  setCssProperty(ui->btnEsc, "ic-close");
53  setCssProperty(ui->btnCancel, "btn-dialog-cancel");
54  setCssBtnPrimary(ui->btnSave);
55  setCssBtnPrimary(ui->btnCopyAddress);
56  setCssBtnPrimary(ui->btnCopyUrl);
57 
58  connect(ui->btnCancel, &QPushButton::clicked, this, &RequestDialog::close);
59  connect(ui->btnEsc, &QPushButton::clicked, this, &RequestDialog::close);
60  connect(ui->btnSave, &QPushButton::clicked, this, &RequestDialog::accept);
61  // TODO: Change copy address for save image (the method is already implemented in other class called exportQr or something like that)
62  connect(ui->btnCopyAddress, &QPushButton::clicked, this, &RequestDialog::onCopyClicked);
63  connect(ui->btnCopyUrl, &QPushButton::clicked, this, &RequestDialog::onCopyUriClicked);
64 }
65 
67 {
68  this->walletModel = model;
69  ui->comboBoxCoin->setText(BitcoinUnits::name(this->walletModel->getOptionsModel()->getDisplayUnit()));
70 }
71 
72 void RequestDialog::setPaymentRequest(bool _isPaymentRequest)
73 {
74  this->isPaymentRequest = _isPaymentRequest;
75  if (!this->isPaymentRequest) {
76  ui->labelMessage->setText(tr("Creates an address to receive coin delegations and be able to stake them."));
77  ui->labelTitle->setText(tr("New Cold Staking Address"));
78  ui->labelSubtitleAmount->setText(tr("Amount (optional)"));
79  }
80 }
81 
83 {
84  if (walletModel) {
85  QString labelStr = ui->lineEditLabel->text();
86 
87  if (!this->isPaymentRequest) {
88  // Add specific checks for cold staking address creation
89  if (labelStr.isEmpty()) {
90  inform(tr("Address label cannot be empty"));
91  return;
92  }
93  }
94 
95  int displayUnit = walletModel->getOptionsModel()->getDisplayUnit();
96  auto value = ui->lineEditAmount->text().isEmpty() ? 0 :
97  GUIUtil::parseValue(ui->lineEditAmount->text(), displayUnit);
98 
99  if (value <= 0 && this->isPaymentRequest) {
100  inform(tr("Invalid amount"));
101  return;
102  }
103 
104  info = new SendCoinsRecipient();
105  info->label = labelStr;
106  info->amount = value;
107  info->message = ui->lineEditDescription->text();
108 
109  // address
110  std::string label = info->label.isEmpty() ? "" : info->label.toStdString();
111  QString title;
112 
114  if (this->isPaymentRequest) {
115  r = walletModel->getNewAddress(label);
116  title = tr("Request for ") + BitcoinUnits::format(displayUnit, info->amount, false, BitcoinUnits::separatorAlways) + " " + BitcoinUnits::name(displayUnit);
117  } else {
118  r = walletModel->getNewStakingAddress(label);
119  title = tr("Cold Staking Address Generated");
120  }
121 
122  if (!r) {
123  // TODO: notify user about this error
124  close();
125  return;
126  }
127 
128  info->address = QString::fromStdString(r.getObjResult()->ToString());
129  ui->labelTitle->setText(title);
130 
132  ui->labelAddress->setText(info->address);
133  ui->buttonsStack->setVisible(false);
134  pos = 1;
135  ui->stack->setCurrentIndex(pos);
136  }
137 }
138 
140 {
141  if (info) {
143  res = 2;
144  QDialog::accept();
145  }
146 }
147 
149 {
150  if (info) {
152  res = 1;
153  QDialog::accept();
154  }
155 }
156 
157 void RequestDialog::showEvent(QShowEvent *event)
158 {
159  if (ui->lineEditAmount) ui->lineEditAmount->setFocus();
160 }
161 
162 void RequestDialog::updateQr(const QString& str)
163 {
164  QString uri = GUIUtil::formatBitcoinURI(*info);
165  ui->labelQrImg->setText("");
166  QString error;
167  QPixmap pixmap = encodeToQr(uri, error);
168  if (!pixmap.isNull()) {
169  ui->labelQrImg->setPixmap(pixmap.scaled(ui->labelQrImg->width(), ui->labelQrImg->height()));
170  } else {
171  ui->labelQrImg->setText(!error.isEmpty() ? error : "Error encoding address");
172  }
173 }
174 
175 void RequestDialog::inform(const QString& text)
176 {
177  if (!snackBar)
178  snackBar = new SnackBar(nullptr, this);
179  snackBar->setText(text);
180  snackBar->resize(this->width(), snackBar->height());
181  openDialog(snackBar, this);
182 }
183 
185 {
186  delete ui;
187 }
static QString format(int unit, const CAmount &amount, bool plussign=false, SeparatorStyle separators=separatorStandard, bool cleanRemainderZeros=true)
Format as string.
static QString name(int unit, bool isZpiv=false)
Short name.
const Optional< T > & getObjResult() const
int getDisplayUnit()
Definition: optionsmodel.h:74
RequestDialog(QWidget *parent=nullptr)
SnackBar * snackBar
Definition: requestdialog.h:44
Ui::RequestDialog * ui
Definition: requestdialog.h:40
void updateQr(const QString &str)
void accept() override
void setWalletModel(WalletModel *model)
void onCopyUriClicked()
WalletModel * walletModel
Definition: requestdialog.h:43
bool isPaymentRequest
Definition: requestdialog.h:42
void showEvent(QShowEvent *event) override
void inform(const QString &text)
void setPaymentRequest(bool _isPaymentRequest)
SendCoinsRecipient * info
Definition: requestdialog.h:46
void setText(const QString &text)
Definition: snackbar.cpp:51
Interface to PIVX wallet from Qt view code.
Definition: walletmodel.h:109
CallResult< Destination > getNewAddress(const std::string &label="") const
OptionsModel * getOptionsModel()
CallResult< Destination > getNewStakingAddress(const std::string &label="") const
Return a new address used to receive for delegated cold stake purpose.
void setupAmountWidget(QLineEdit *widget, QWidget *parent)
Definition: guiutil.cpp:141
QString formatBitcoinURI(const SendCoinsRecipient &info)
Definition: guiutil.cpp:218
void setClipboard(const QString &str)
Definition: guiutil.cpp:670
void setCssEditLineDialog(QLineEdit *edit, bool isValid, bool forceUpdate)
Definition: qtutils.cpp:287
void setCssProperty(std::initializer_list< QWidget * > args, const QString &value)
Definition: qtutils.cpp:334
QPixmap encodeToQr(const QString &str, QString &errorStr, const QColor &qrColor)
Definition: qtutils.cpp:102
void setCssBtnPrimary(QPushButton *btn, bool forceUpdate)
Definition: qtutils.cpp:302
bool openDialog(QDialog *widget, QWidget *gui)
Definition: qtutils.cpp:23
bool error(const char *fmt, const Args &... args)
Definition: system.h:77