Browse Source

Merge #11316: [qt] Add use available balance in send coins dialog (CryptAxe, promag)

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

Pull request description:

  This is an alternative to #11098 to handle #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 #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
0.16
MarcoFalke 7 years ago
parent
commit
22cdf93c06
No known key found for this signature in database
GPG Key ID: D2EA4850E7528B25
  1. 9
      src/qt/forms/sendcoinsentry.ui
  2. 26
      src/qt/sendcoinsdialog.cpp
  3. 1
      src/qt/sendcoinsdialog.h
  4. 16
      src/qt/sendcoinsentry.cpp
  5. 4
      src/qt/sendcoinsentry.h

9
src/qt/forms/sendcoinsentry.ui

@ -163,7 +163,7 @@
</widget> </widget>
</item> </item>
<item row="2" column="1"> <item row="2" column="1">
<layout class="QHBoxLayout" name="horizontalLayoutAmount" stretch="0,1"> <layout class="QHBoxLayout" name="horizontalLayoutAmount" stretch="0,1,0">
<item> <item>
<widget class="BitcoinAmountField" name="payAmount"/> <widget class="BitcoinAmountField" name="payAmount"/>
</item> </item>
@ -177,6 +177,13 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QPushButton" name="useAvailableBalanceButton">
<property name="text">
<string>Use available balance</string>
</property>
</widget>
</item>
</layout> </layout>
</item> </item>
<item row="3" column="0"> <item row="3" column="0">

26
src/qt/sendcoinsdialog.cpp

@ -402,6 +402,7 @@ SendCoinsEntry *SendCoinsDialog::addEntry()
entry->setModel(model); entry->setModel(model);
ui->entries->addWidget(entry); ui->entries->addWidget(entry);
connect(entry, SIGNAL(removeEntry(SendCoinsEntry*)), this, SLOT(removeEntry(SendCoinsEntry*))); 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(payAmountChanged()), this, SLOT(coinControlUpdateLabels()));
connect(entry, SIGNAL(subtractFeeFromAmountChanged()), this, SLOT(coinControlUpdateLabels())); connect(entry, SIGNAL(subtractFeeFromAmountChanged()), this, SLOT(coinControlUpdateLabels()));
@ -599,6 +600,31 @@ void SendCoinsDialog::on_buttonMinimizeFee_clicked()
minimizeFeeSection(true); 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() void SendCoinsDialog::setMinimumFee()
{ {
ui->customFee->setValue(GetRequiredFee(1000)); ui->customFee->setValue(GetRequiredFee(1000));

1
src/qt/sendcoinsdialog.h

@ -76,6 +76,7 @@ private Q_SLOTS:
void on_buttonChooseFee_clicked(); void on_buttonChooseFee_clicked();
void on_buttonMinimizeFee_clicked(); void on_buttonMinimizeFee_clicked();
void removeEntry(SendCoinsEntry* entry); void removeEntry(SendCoinsEntry* entry);
void useAvailableBalance(SendCoinsEntry* entry);
void updateDisplayUnit(); void updateDisplayUnit();
void coinControlFeatureChanged(bool); void coinControlFeatureChanged(bool);
void coinControlButtonClicked(); void coinControlButtonClicked();

16
src/qt/sendcoinsentry.cpp

@ -48,6 +48,7 @@ SendCoinsEntry::SendCoinsEntry(const PlatformStyle *_platformStyle, QWidget *par
connect(ui->deleteButton, SIGNAL(clicked()), this, SLOT(deleteClicked())); connect(ui->deleteButton, SIGNAL(clicked()), this, SLOT(deleteClicked()));
connect(ui->deleteButton_is, 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->deleteButton_s, SIGNAL(clicked()), this, SLOT(deleteClicked()));
connect(ui->useAvailableBalanceButton, SIGNAL(clicked()), this, SLOT(useAvailableBalanceClicked()));
} }
SendCoinsEntry::~SendCoinsEntry() SendCoinsEntry::~SendCoinsEntry()
@ -112,11 +113,21 @@ void SendCoinsEntry::clear()
updateDisplayUnit(); updateDisplayUnit();
} }
void SendCoinsEntry::checkSubtractFeeFromAmount()
{
ui->checkboxSubtractFeeFromAmount->setChecked(true);
}
void SendCoinsEntry::deleteClicked() void SendCoinsEntry::deleteClicked()
{ {
Q_EMIT removeEntry(this); Q_EMIT removeEntry(this);
} }
void SendCoinsEntry::useAvailableBalanceClicked()
{
Q_EMIT useAvailableBalance(this);
}
bool SendCoinsEntry::validate() bool SendCoinsEntry::validate()
{ {
if (!model) if (!model)
@ -228,6 +239,11 @@ void SendCoinsEntry::setAddress(const QString &address)
ui->payAmount->setFocus(); ui->payAmount->setFocus();
} }
void SendCoinsEntry::setAmount(const CAmount &amount)
{
ui->payAmount->setValue(amount);
}
bool SendCoinsEntry::isClear() bool SendCoinsEntry::isClear()
{ {
return ui->payTo->text().isEmpty() && ui->payTo_is->text().isEmpty() && ui->payTo_s->text().isEmpty(); return ui->payTo->text().isEmpty() && ui->payTo_is->text().isEmpty() && ui->payTo_s->text().isEmpty();

4
src/qt/sendcoinsentry.h

@ -38,6 +38,7 @@ public:
void setValue(const SendCoinsRecipient &value); void setValue(const SendCoinsRecipient &value);
void setAddress(const QString &address); 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 /** 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). * (issue https://bugreports.qt-project.org/browse/QTBUG-10907).
@ -48,14 +49,17 @@ public:
public Q_SLOTS: public Q_SLOTS:
void clear(); void clear();
void checkSubtractFeeFromAmount();
Q_SIGNALS: Q_SIGNALS:
void removeEntry(SendCoinsEntry *entry); void removeEntry(SendCoinsEntry *entry);
void useAvailableBalance(SendCoinsEntry* entry);
void payAmountChanged(); void payAmountChanged();
void subtractFeeFromAmountChanged(); void subtractFeeFromAmountChanged();
private Q_SLOTS: private Q_SLOTS:
void deleteClicked(); void deleteClicked();
void useAvailableBalanceClicked();
void on_payTo_textChanged(const QString &address); void on_payTo_textChanged(const QString &address);
void on_addressBookButton_clicked(); void on_addressBookButton_clicked();
void on_pasteButton_clicked(); void on_pasteButton_clicked();

Loading…
Cancel
Save