Skip to content

Commit

Permalink
Merge bitcoin#11316: [qt] Add use available balance in send coins dia…
Browse files Browse the repository at this point in the history
…log (CryptAxe, promag)

d052e38 [qt] Add use available balance in send coins dialog (CryptAxe)

Pull request description:

  This is an alternative to bitcoin#11098 to handle bitcoin#11033 where a new button `Use available balance` is added to each entry. When activated, the available balance is calculated by using the coin control (if any) and then it's subtracted the remaining recipient amounts. If this amount is positive then the `Subtract fee from amount` is automatically selected.

  Comparing to bitcoin#11098, this has the advantage to avoid the fair amount division over the recipients and allows to fine adjust the amounts in multiple iterations.

  Started from @CryptAxe commit 89e9eda to credit some code.

  <img width="965" alt="screen shot 2017-09-13 at 01 32 44" src="https://user-images.githubusercontent.com/3534524/30354518-e1bee31c-9824-11e7-9354-300aa63cdfd0.png">
  <img width="964" alt="screen shot 2017-09-13 at 01 44 57" src="https://user-images.githubusercontent.com/3534524/30354598-5731ac9c-9825-11e7-9d5f-8781988ed219.png">

Tree-SHA512: 01d20c13fd8b6c2a0ca1d74d3a9027c6922e6dccd3b08e59d5a72636be7072ed5eca7ebc5d431299497dd3374e83753220ad4174d8bc46dadb4b2f54973036a5
  • Loading branch information
MarcoFalke authored and PastaPastaPasta committed Jan 12, 2020
1 parent ce5b846 commit e6d244e
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 1 deletion.
9 changes: 8 additions & 1 deletion src/qt/forms/sendcoinsentry.ui
Expand Up @@ -151,7 +151,7 @@
</widget>
</item>
<item row="2" column="1">
<layout class="QHBoxLayout" name="horizontalLayoutAmount" stretch="0,1">
<layout class="QHBoxLayout" name="horizontalLayoutAmount" stretch="0,1,0">
<item>
<widget class="BitcoinAmountField" name="payAmount"/>
</item>
Expand All @@ -165,6 +165,13 @@
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="useAvailableBalanceButton">
<property name="text">
<string>Use available balance</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="3" column="0">
Expand Down
26 changes: 26 additions & 0 deletions src/qt/sendcoinsdialog.cpp
Expand Up @@ -497,6 +497,7 @@ SendCoinsEntry *SendCoinsDialog::addEntry()
entry->setModel(model);
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, SLOT(coinControlUpdateLabels()));

Expand Down Expand Up @@ -707,6 +708,31 @@ void SendCoinsDialog::on_buttonMinimizeFee_clicked()
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.
CAmount amount = model->getBalance(&coin_control);
for (int i = 0; i < ui->entries->count(); ++i) {
SendCoinsEntry* e = qobject_cast<SendCoinsEntry*>(ui->entries->itemAt(i)->widget());
if (e && !e->isHidden() && e != entry) {
amount -= e->getValue().amount;
}
}

if (amount > 0) {
entry->checkSubtractFeeFromAmount();
entry->setAmount(amount);
} else {
entry->setAmount(0);
}
}

void SendCoinsDialog::setMinimumFee()
{
ui->customFee->setValue(GetRequiredFee(1000));
Expand Down
1 change: 1 addition & 0 deletions src/qt/sendcoinsdialog.h
Expand Up @@ -79,6 +79,7 @@ private Q_SLOTS:
void on_buttonChooseFee_clicked();
void on_buttonMinimizeFee_clicked();
void removeEntry(SendCoinsEntry* entry);
void useAvailableBalance(SendCoinsEntry* entry);
void updateDisplayUnit();
void coinControlFeatureChanged(bool);
void coinControlButtonClicked();
Expand Down
16 changes: 16 additions & 0 deletions src/qt/sendcoinsentry.cpp
Expand Up @@ -50,6 +50,7 @@ SendCoinsEntry::SendCoinsEntry(const PlatformStyle *_platformStyle, QWidget *par
connect(ui->deleteButton, SIGNAL(clicked()), this, SLOT(deleteClicked()));
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()
Expand Down Expand Up @@ -114,11 +115,21 @@ void SendCoinsEntry::clear()
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)
Expand Down Expand Up @@ -230,6 +241,11 @@ void SendCoinsEntry::setAddress(const QString &address)
ui->payAmount->setFocus();
}

void SendCoinsEntry::setAmount(const CAmount &amount)
{
ui->payAmount->setValue(amount);
}

bool SendCoinsEntry::isClear()
{
return ui->payTo->text().isEmpty() && ui->payTo_is->text().isEmpty() && ui->payTo_s->text().isEmpty();
Expand Down
4 changes: 4 additions & 0 deletions src/qt/sendcoinsentry.h
Expand Up @@ -38,6 +38,7 @@ class SendCoinsEntry : public QStackedWidget

void setValue(const SendCoinsRecipient &value);
void setAddress(const QString &address);
void setAmount(const CAmount &amount);

/** 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).
Expand All @@ -48,14 +49,17 @@ class SendCoinsEntry : public QStackedWidget

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();
Expand Down

0 comments on commit e6d244e

Please sign in to comment.