/ src / qt / sendcoinsdialog.h
sendcoinsdialog.h
  1  // Copyright (c) 2011-present The Bitcoin 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  #ifndef BITCOIN_QT_SENDCOINSDIALOG_H
  6  #define BITCOIN_QT_SENDCOINSDIALOG_H
  7  
  8  #include <primitives/transaction_identifier.h>
  9  #include <qt/clientmodel.h>
 10  #include <qt/walletmodel.h>
 11  
 12  #include <QDialog>
 13  #include <QMessageBox>
 14  #include <QString>
 15  #include <QTimer>
 16  
 17  class PlatformStyle;
 18  class SendCoinsEntry;
 19  class SendCoinsRecipient;
 20  enum class SynchronizationState;
 21  namespace wallet {
 22  class CCoinControl;
 23  } // namespace wallet
 24  
 25  namespace Ui {
 26      class SendCoinsDialog;
 27  }
 28  
 29  QT_BEGIN_NAMESPACE
 30  class QUrl;
 31  QT_END_NAMESPACE
 32  
 33  /** Dialog for sending bitcoins */
 34  class SendCoinsDialog : public QDialog
 35  {
 36      Q_OBJECT
 37  
 38  public:
 39      explicit SendCoinsDialog(const PlatformStyle *platformStyle, QWidget *parent = nullptr);
 40      ~SendCoinsDialog();
 41  
 42      void setClientModel(ClientModel *clientModel);
 43      void setModel(WalletModel *model);
 44  
 45      /** Set up the tab chain manually, as Qt messes up the tab chain by default in some cases (issue https://bugreports.qt-project.org/browse/QTBUG-10907).
 46       */
 47      QWidget *setupTabChain(QWidget *prev);
 48  
 49      void setAddress(const QString &address);
 50      void pasteEntry(const SendCoinsRecipient &rv);
 51      bool handlePaymentRequest(const SendCoinsRecipient &recipient);
 52  
 53      // Only used for testing-purposes
 54      wallet::CCoinControl* getCoinControl() { return m_coin_control.get(); }
 55  
 56  public Q_SLOTS:
 57      void clear();
 58      void reject() override;
 59      void accept() override;
 60      SendCoinsEntry *addEntry();
 61      void updateTabsAndLabels();
 62      void setBalance(const interfaces::WalletBalances& balances);
 63  
 64  Q_SIGNALS:
 65      void coinsSent(const Txid& txid);
 66  
 67  private:
 68      Ui::SendCoinsDialog *ui;
 69      ClientModel* clientModel{nullptr};
 70      WalletModel* model{nullptr};
 71      std::unique_ptr<wallet::CCoinControl> m_coin_control;
 72      std::unique_ptr<WalletModelTransaction> m_current_transaction;
 73      bool fNewRecipientAllowed{true};
 74      bool fFeeMinimized{true};
 75      const PlatformStyle *platformStyle;
 76  
 77      // Copy PSBT to clipboard and offer to save it.
 78      void presentPSBT(PartiallySignedTransaction& psbt);
 79      // Process WalletModel::SendCoinsReturn and generate a pair consisting
 80      // of a message and message flags for use in Q_EMIT message().
 81      // Additional parameter msgArg can be used via .arg(msgArg).
 82      void processSendCoinsReturn(const WalletModel::SendCoinsReturn &sendCoinsReturn, const QString &msgArg = QString());
 83      void minimizeFeeSection(bool fMinimize);
 84      // Format confirmation message
 85      bool PrepareSendText(QString& question_string, QString& informative_text, QString& detailed_text);
 86      /* Sign PSBT using external signer.
 87       *
 88       * @param[in,out] psbtx the PSBT to sign
 89       * @param[in,out] mtx needed to attempt to finalize
 90       * @param[in,out] complete whether the PSBT is complete (a successfully signed multisig transaction may not be complete)
 91       *
 92       * @returns false if any failure occurred, which may include the user rejection of a transaction on the device.
 93       */
 94      bool signWithExternalSigner(PartiallySignedTransaction& psbt, CMutableTransaction& mtx, bool& complete);
 95      void updateFeeMinimizedLabel();
 96      void updateCoinControlState();
 97  
 98  private Q_SLOTS:
 99      void sendButtonClicked(bool checked);
100      void on_buttonChooseFee_clicked();
101      void on_buttonMinimizeFee_clicked();
102      void removeEntry(SendCoinsEntry* entry);
103      void useAvailableBalance(SendCoinsEntry* entry);
104      void refreshBalance();
105      void coinControlFeatureChanged(bool);
106      void coinControlButtonClicked();
107  #if (QT_VERSION >= QT_VERSION_CHECK(6, 7, 0))
108      void coinControlChangeChecked(Qt::CheckState);
109  #else
110      void coinControlChangeChecked(int);
111  #endif
112      void coinControlChangeEdited(const QString &);
113      void coinControlUpdateLabels();
114      void coinControlClipboardQuantity();
115      void coinControlClipboardAmount();
116      void coinControlClipboardFee();
117      void coinControlClipboardAfterFee();
118      void coinControlClipboardBytes();
119      void coinControlClipboardChange();
120      void updateFeeSectionControls();
121      void updateNumberOfBlocks(int count, const QDateTime& blockDate, double nVerificationProgress, SyncType synctype, SynchronizationState sync_state);
122      void updateSmartFeeLabel();
123  
124  Q_SIGNALS:
125      // Fired when a message should be reported to the user
126      void message(const QString &title, const QString &message, unsigned int style);
127  };
128  
129  
130  #define SEND_CONFIRM_DELAY   3
131  
132  class SendConfirmationDialog : public QMessageBox
133  {
134      Q_OBJECT
135  
136  public:
137      SendConfirmationDialog(const QString& title, const QString& text, const QString& informative_text = "", const QString& detailed_text = "", int secDelay = SEND_CONFIRM_DELAY, bool enable_send = true, bool always_show_unsigned = true, QWidget* parent = nullptr);
138      /* Returns QMessageBox::Cancel, QMessageBox::Yes when "Send" is
139         clicked and QMessageBox::Save when "Create Unsigned" is clicked. */
140      int exec() override;
141  
142  private Q_SLOTS:
143      void countDown();
144      void updateButtons();
145  
146  private:
147      QAbstractButton *yesButton;
148      QAbstractButton *m_psbt_button;
149      QTimer countDownTimer;
150      int secDelay;
151      QString confirmButtonText{tr("Send")};
152      bool m_enable_send;
153      QString m_psbt_button_text{tr("Create Unsigned")};
154  };
155  
156  #endif // BITCOIN_QT_SENDCOINSDIALOG_H