sendcoinsdialog.h raw

   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
 157