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