diff --git a/src/qt/forms/sendcoinsentry.ui b/src/qt/forms/sendcoinsentry.ui
--- a/src/qt/forms/sendcoinsentry.ui
+++ b/src/qt/forms/sendcoinsentry.ui
@@ -163,7 +163,7 @@
-
-
+
-
@@ -177,6 +177,13 @@
+ -
+
+
+ Use available balance
+
+
+
-
diff --git a/src/qt/sendcoinsdialog.h b/src/qt/sendcoinsdialog.h
--- a/src/qt/sendcoinsdialog.h
+++ b/src/qt/sendcoinsdialog.h
@@ -82,6 +82,7 @@
void on_buttonChooseFee_clicked();
void on_buttonMinimizeFee_clicked();
void removeEntry(SendCoinsEntry *entry);
+ void useAvailableBalance(SendCoinsEntry *entry);
void updateDisplayUnit();
void coinControlFeatureChanged(bool);
void coinControlButtonClicked();
diff --git a/src/qt/sendcoinsdialog.cpp b/src/qt/sendcoinsdialog.cpp
--- a/src/qt/sendcoinsdialog.cpp
+++ b/src/qt/sendcoinsdialog.cpp
@@ -437,6 +437,8 @@
ui->entries->addWidget(entry);
connect(entry, SIGNAL(removeEntry(SendCoinsEntry *)), this,
SLOT(removeEntry(SendCoinsEntry *)));
+ connect(entry, SIGNAL(useAvailableBalance(SendCoinsEntry *)), this,
+ SLOT(useAvailableBalance(SendCoinsEntry *)));
connect(entry, SIGNAL(payAmountChanged()), this,
SLOT(coinControlUpdateLabels()));
connect(entry, SIGNAL(subtractFeeFromAmountChanged()), this,
@@ -634,6 +636,31 @@
minimizeFeeSection(true);
}
+void SendCoinsDialog::useAvailableBalance(SendCoinsEntry *entry) {
+ // Get CCoinControl instance if CoinControl is enabled or create a new one.
+ CCoinControl coin_control;
+ if (model->getOptionsModel()->getCoinControlFeatures()) {
+ coin_control = *CoinControlDialog::coinControl;
+ }
+
+ // Calculate available amount to send.
+ Amount amount = model->getBalance(&coin_control);
+ for (int i = 0; i < ui->entries->count(); ++i) {
+ SendCoinsEntry *e =
+ qobject_cast(ui->entries->itemAt(i)->widget());
+ if (e && !e->isHidden() && e != entry) {
+ amount -= e->getValue().amount;
+ }
+ }
+
+ if (amount > Amount::zero()) {
+ entry->checkSubtractFeeFromAmount();
+ entry->setAmount(amount);
+ } else {
+ entry->setAmount(Amount::zero());
+ }
+}
+
void SendCoinsDialog::setMinimumFee() {
ui->radioCustomPerKilobyte->setChecked(true);
ui->customFee->setValue(CWallet::GetRequiredFee(1000));
diff --git a/src/qt/sendcoinsentry.h b/src/qt/sendcoinsentry.h
--- a/src/qt/sendcoinsentry.h
+++ b/src/qt/sendcoinsentry.h
@@ -38,6 +38,7 @@
void setValue(const SendCoinsRecipient &value);
void setAddress(const QString &address);
+ void setAmount(const Amount amount);
/** Set up the tab chain manually, as Qt messes up the tab chain by default
* in some cases
@@ -49,14 +50,17 @@
public Q_SLOTS:
void clear();
+ void checkSubtractFeeFromAmount();
Q_SIGNALS:
void removeEntry(SendCoinsEntry *entry);
+ void useAvailableBalance(SendCoinsEntry *entry);
void payAmountChanged();
void subtractFeeFromAmountChanged();
private Q_SLOTS:
void deleteClicked();
+ void useAvailableBalanceClicked();
void on_payTo_textChanged(const QString &address);
void on_addressBookButton_clicked();
void on_pasteButton_clicked();
diff --git a/src/qt/sendcoinsentry.cpp b/src/qt/sendcoinsentry.cpp
--- a/src/qt/sendcoinsentry.cpp
+++ b/src/qt/sendcoinsentry.cpp
@@ -60,6 +60,8 @@
connect(ui->deleteButton_is, SIGNAL(clicked()), this,
SLOT(deleteClicked()));
connect(ui->deleteButton_s, SIGNAL(clicked()), this, SLOT(deleteClicked()));
+ connect(ui->useAvailableBalanceButton, SIGNAL(clicked()), this,
+ SLOT(useAvailableBalanceClicked()));
}
SendCoinsEntry::~SendCoinsEntry() {
@@ -118,18 +120,30 @@
updateDisplayUnit();
}
+void SendCoinsEntry::checkSubtractFeeFromAmount() {
+ ui->checkboxSubtractFeeFromAmount->setChecked(true);
+}
+
void SendCoinsEntry::deleteClicked() {
Q_EMIT removeEntry(this);
}
+void SendCoinsEntry::useAvailableBalanceClicked() {
+ Q_EMIT useAvailableBalance(this);
+}
+
bool SendCoinsEntry::validate() {
- if (!model) return false;
+ if (!model) {
+ return false;
+ }
// Check input validity
bool retval = true;
// Skip checks for payment request
- if (recipient.paymentRequest.IsInitialized()) return retval;
+ if (recipient.paymentRequest.IsInitialized()) {
+ return retval;
+ }
if (!model->validateAddress(ui->payTo->text())) {
ui->payTo->setValid(false);
@@ -226,6 +240,10 @@
ui->payAmount->setFocus();
}
+void SendCoinsEntry::setAmount(const Amount amount) {
+ ui->payAmount->setValue(amount);
+}
+
bool SendCoinsEntry::isClear() {
return ui->payTo->text().isEmpty() && ui->payTo_is->text().isEmpty() &&
ui->payTo_s->text().isEmpty();