mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-05 10:17:30 -05:00
246e878e78
a8b5f1b133
gui: Fix manual coin control with multiple wallets loaded (João Barbosa) Pull request description: This PR ensures each loaded wallet has a dedicated coin control in the send view which is manipulated by the coin control dialog. This is an alternative to #17457. Two main differences are: - scope reduced - no unnecessary changes unrelated to the fix; - approach taken - coin control instance now belongs to the send view. All problems raised in #17457 reviews no longer apply due to the approach taken - https://github.com/bitcoin/bitcoin/pull/17457#pullrequestreview-319297589 and https://github.com/bitcoin/bitcoin/pull/17457#issuecomment-555920829) No change in behavior if only one wallet is loaded. Closes #15725. ACKs for top commit: jonasschnelli: utACKa8b5f1b133
ryanofsky: Code review ACKa8b5f1b133
. Code changes are very straightforward, just replacing global CCoinControl object with SendCoinsDialog member. Not sure if this means coin control settings are reset between payments. It would be good to note in the PR description or release notes if single wallet behavior is affected hebasto: ACKa8b5f1b133
Sjors: tACKa8b5f1b133
Tree-SHA512: 3ad9c51bab6f28ec0e90efbd6f43fa510c81dafb2eff0b8c3724efcee3e030054a10be013e27cefe35763374c5f6d7af8c02658736964f733d7e38b646b5df65
130 lines
4 KiB
C++
130 lines
4 KiB
C++
// Copyright (c) 2011-2019 The Bitcoin Core developers
|
|
// Distributed under the MIT software license, see the accompanying
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
#ifndef BITCOIN_QT_SENDCOINSDIALOG_H
|
|
#define BITCOIN_QT_SENDCOINSDIALOG_H
|
|
|
|
#include <qt/walletmodel.h>
|
|
|
|
#include <QDialog>
|
|
#include <QMessageBox>
|
|
#include <QString>
|
|
#include <QTimer>
|
|
|
|
class CCoinControl;
|
|
class ClientModel;
|
|
class PlatformStyle;
|
|
class SendCoinsEntry;
|
|
class SendCoinsRecipient;
|
|
|
|
namespace Ui {
|
|
class SendCoinsDialog;
|
|
}
|
|
|
|
QT_BEGIN_NAMESPACE
|
|
class QUrl;
|
|
QT_END_NAMESPACE
|
|
|
|
/** Dialog for sending bitcoins */
|
|
class SendCoinsDialog : public QDialog
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
explicit SendCoinsDialog(const PlatformStyle *platformStyle, QWidget *parent = nullptr);
|
|
~SendCoinsDialog();
|
|
|
|
void setClientModel(ClientModel *clientModel);
|
|
void setModel(WalletModel *model);
|
|
|
|
/** 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).
|
|
*/
|
|
QWidget *setupTabChain(QWidget *prev);
|
|
|
|
void setAddress(const QString &address);
|
|
void pasteEntry(const SendCoinsRecipient &rv);
|
|
bool handlePaymentRequest(const SendCoinsRecipient &recipient);
|
|
|
|
public Q_SLOTS:
|
|
void clear();
|
|
void reject() override;
|
|
void accept() override;
|
|
SendCoinsEntry *addEntry();
|
|
void updateTabsAndLabels();
|
|
void setBalance(const interfaces::WalletBalances& balances);
|
|
|
|
Q_SIGNALS:
|
|
void coinsSent(const uint256& txid);
|
|
|
|
private:
|
|
Ui::SendCoinsDialog *ui;
|
|
ClientModel *clientModel;
|
|
WalletModel *model;
|
|
std::unique_ptr<CCoinControl> m_coin_control;
|
|
std::unique_ptr<WalletModelTransaction> m_current_transaction;
|
|
bool fNewRecipientAllowed;
|
|
bool fFeeMinimized;
|
|
const PlatformStyle *platformStyle;
|
|
|
|
// Process WalletModel::SendCoinsReturn and generate a pair consisting
|
|
// of a message and message flags for use in Q_EMIT message().
|
|
// Additional parameter msgArg can be used via .arg(msgArg).
|
|
void processSendCoinsReturn(const WalletModel::SendCoinsReturn &sendCoinsReturn, const QString &msgArg = QString());
|
|
void minimizeFeeSection(bool fMinimize);
|
|
// Format confirmation message
|
|
bool PrepareSendText(QString& question_string, QString& informative_text, QString& detailed_text);
|
|
void updateFeeMinimizedLabel();
|
|
// Update the passed in CCoinControl with state from the GUI
|
|
void updateCoinControlState(CCoinControl& ctrl);
|
|
|
|
private Q_SLOTS:
|
|
void on_sendButton_clicked();
|
|
void on_buttonChooseFee_clicked();
|
|
void on_buttonMinimizeFee_clicked();
|
|
void removeEntry(SendCoinsEntry* entry);
|
|
void useAvailableBalance(SendCoinsEntry* entry);
|
|
void updateDisplayUnit();
|
|
void coinControlFeatureChanged(bool);
|
|
void coinControlButtonClicked();
|
|
void coinControlChangeChecked(int);
|
|
void coinControlChangeEdited(const QString &);
|
|
void coinControlUpdateLabels();
|
|
void coinControlClipboardQuantity();
|
|
void coinControlClipboardAmount();
|
|
void coinControlClipboardFee();
|
|
void coinControlClipboardAfterFee();
|
|
void coinControlClipboardBytes();
|
|
void coinControlClipboardLowOutput();
|
|
void coinControlClipboardChange();
|
|
void updateFeeSectionControls();
|
|
void updateSmartFeeLabel();
|
|
|
|
Q_SIGNALS:
|
|
// Fired when a message should be reported to the user
|
|
void message(const QString &title, const QString &message, unsigned int style);
|
|
};
|
|
|
|
|
|
#define SEND_CONFIRM_DELAY 3
|
|
|
|
class SendConfirmationDialog : public QMessageBox
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
SendConfirmationDialog(const QString& title, const QString& text, const QString& informative_text = "", const QString& detailed_text = "", int secDelay = SEND_CONFIRM_DELAY, const QString& confirmText = "Send", QWidget* parent = nullptr);
|
|
int exec() override;
|
|
|
|
private Q_SLOTS:
|
|
void countDown();
|
|
void updateYesButton();
|
|
|
|
private:
|
|
QAbstractButton *yesButton;
|
|
QTimer countDownTimer;
|
|
int secDelay;
|
|
QString confirmButtonText;
|
|
};
|
|
|
|
#endif // BITCOIN_QT_SENDCOINSDIALOG_H
|