Browse Source

[gui] Defer coin control instancing

Defer the GUI coin control instancing so that argument processing
is taken into account for the default coin control values.

Github-Pull: #12327
Rebased-From: 6558f8acc363e1141f2864ee9be2bc7e980842a3
Tree-SHA512: 213b350fdb334e409ce01f7f6d6de30cada752201d9ff96a6f93f96e9f80f8baa6e6b251087c01b04d6317bcb805201d6667de27e174612a39b4982bb4793375
0.16
João Barbosa 7 years ago committed by Wladimir J. van der Laan
parent
commit
0dc6a30ef3
No known key found for this signature in database
GPG Key ID: 1E4AED62986CD25D
  1. 23
      src/qt/coincontroldialog.cpp
  2. 2
      src/qt/coincontroldialog.h
  3. 20
      src/qt/sendcoinsdialog.cpp

23
src/qt/coincontroldialog.cpp

@ -31,7 +31,6 @@
#include <QTreeWidget> #include <QTreeWidget>
QList<CAmount> CoinControlDialog::payAmounts; QList<CAmount> CoinControlDialog::payAmounts;
CCoinControl* CoinControlDialog::coinControl = new CCoinControl();
bool CoinControlDialog::fSubtractFeeFromAmount = false; bool CoinControlDialog::fSubtractFeeFromAmount = false;
bool CCoinControlWidgetItem::operator<(const QTreeWidgetItem &other) const { bool CCoinControlWidgetItem::operator<(const QTreeWidgetItem &other) const {
@ -193,7 +192,7 @@ void CoinControlDialog::buttonSelectAllClicked()
ui->treeWidget->topLevelItem(i)->setCheckState(COLUMN_CHECKBOX, state); ui->treeWidget->topLevelItem(i)->setCheckState(COLUMN_CHECKBOX, state);
ui->treeWidget->setEnabled(true); ui->treeWidget->setEnabled(true);
if (state == Qt::Unchecked) if (state == Qt::Unchecked)
coinControl->UnSelectAll(); // just to be sure coinControl()->UnSelectAll(); // just to be sure
CoinControlDialog::updateLabels(model, this); CoinControlDialog::updateLabels(model, this);
} }
@ -379,11 +378,11 @@ void CoinControlDialog::viewItemChanged(QTreeWidgetItem* item, int column)
COutPoint outpt(uint256S(item->text(COLUMN_TXHASH).toStdString()), item->text(COLUMN_VOUT_INDEX).toUInt()); COutPoint outpt(uint256S(item->text(COLUMN_TXHASH).toStdString()), item->text(COLUMN_VOUT_INDEX).toUInt());
if (item->checkState(COLUMN_CHECKBOX) == Qt::Unchecked) if (item->checkState(COLUMN_CHECKBOX) == Qt::Unchecked)
coinControl->UnSelect(outpt); coinControl()->UnSelect(outpt);
else if (item->isDisabled()) // locked (this happens if "check all" through parent node) else if (item->isDisabled()) // locked (this happens if "check all" through parent node)
item->setCheckState(COLUMN_CHECKBOX, Qt::Unchecked); item->setCheckState(COLUMN_CHECKBOX, Qt::Unchecked);
else else
coinControl->Select(outpt); coinControl()->Select(outpt);
// selection changed -> update labels // selection changed -> update labels
if (ui->treeWidget->isEnabled()) // do not update on every click for (un)select all if (ui->treeWidget->isEnabled()) // do not update on every click for (un)select all
@ -446,7 +445,7 @@ void CoinControlDialog::updateLabels(WalletModel *model, QDialog* dialog)
std::vector<COutPoint> vCoinControl; std::vector<COutPoint> vCoinControl;
std::vector<COutput> vOutputs; std::vector<COutput> vOutputs;
coinControl->ListSelected(vCoinControl); coinControl()->ListSelected(vCoinControl);
model->getOutputs(vCoinControl, vOutputs); model->getOutputs(vCoinControl, vOutputs);
for (const COutput& out : vOutputs) { for (const COutput& out : vOutputs) {
@ -456,7 +455,7 @@ void CoinControlDialog::updateLabels(WalletModel *model, QDialog* dialog)
COutPoint outpt(txhash, out.i); COutPoint outpt(txhash, out.i);
if (model->isSpent(outpt)) if (model->isSpent(outpt))
{ {
coinControl->UnSelect(outpt); coinControl()->UnSelect(outpt);
continue; continue;
} }
@ -509,7 +508,7 @@ void CoinControlDialog::updateLabels(WalletModel *model, QDialog* dialog)
nBytes -= 34; nBytes -= 34;
// Fee // Fee
nPayFee = GetMinimumFee(nBytes, *coinControl, ::mempool, ::feeEstimator, nullptr /* FeeCalculation */); nPayFee = GetMinimumFee(nBytes, *coinControl(), ::mempool, ::feeEstimator, nullptr /* FeeCalculation */);
if (nPayAmount > 0) if (nPayAmount > 0)
{ {
@ -600,6 +599,12 @@ void CoinControlDialog::updateLabels(WalletModel *model, QDialog* dialog)
label->setVisible(nChange < 0); label->setVisible(nChange < 0);
} }
CCoinControl* CoinControlDialog::coinControl()
{
static CCoinControl coin_control;
return &coin_control;
}
void CoinControlDialog::updateView() void CoinControlDialog::updateView()
{ {
if (!model || !model->getOptionsModel() || !model->getAddressTableModel()) if (!model || !model->getOptionsModel() || !model->getAddressTableModel())
@ -703,13 +708,13 @@ void CoinControlDialog::updateView()
if (model->isLockedCoin(txhash, out.i)) if (model->isLockedCoin(txhash, out.i))
{ {
COutPoint outpt(txhash, out.i); COutPoint outpt(txhash, out.i);
coinControl->UnSelect(outpt); // just to be sure coinControl()->UnSelect(outpt); // just to be sure
itemOutput->setDisabled(true); itemOutput->setDisabled(true);
itemOutput->setIcon(COLUMN_CHECKBOX, platformStyle->SingleColorIcon(":/icons/lock_closed")); itemOutput->setIcon(COLUMN_CHECKBOX, platformStyle->SingleColorIcon(":/icons/lock_closed"));
} }
// set checkbox // set checkbox
if (coinControl->IsSelected(COutPoint(txhash, out.i))) if (coinControl()->IsSelected(COutPoint(txhash, out.i)))
itemOutput->setCheckState(COLUMN_CHECKBOX, Qt::Checked); itemOutput->setCheckState(COLUMN_CHECKBOX, Qt::Checked);
} }

2
src/qt/coincontroldialog.h

@ -52,7 +52,7 @@ public:
static void updateLabels(WalletModel*, QDialog*); static void updateLabels(WalletModel*, QDialog*);
static QList<CAmount> payAmounts; static QList<CAmount> payAmounts;
static CCoinControl *coinControl; static CCoinControl *coinControl();
static bool fSubtractFeeFromAmount; static bool fSubtractFeeFromAmount;
private: private:

20
src/qt/sendcoinsdialog.cpp

@ -256,7 +256,7 @@ void SendCoinsDialog::on_sendButton_clicked()
// Always use a CCoinControl instance, use the CoinControlDialog instance if CoinControl has been enabled // Always use a CCoinControl instance, use the CoinControlDialog instance if CoinControl has been enabled
CCoinControl ctrl; CCoinControl ctrl;
if (model->getOptionsModel()->getCoinControlFeatures()) if (model->getOptionsModel()->getCoinControlFeatures())
ctrl = *CoinControlDialog::coinControl; ctrl = *CoinControlDialog::coinControl();
updateCoinControlState(ctrl); updateCoinControlState(ctrl);
@ -367,7 +367,7 @@ void SendCoinsDialog::on_sendButton_clicked()
if (sendStatus.status == WalletModel::OK) if (sendStatus.status == WalletModel::OK)
{ {
accept(); accept();
CoinControlDialog::coinControl->UnSelectAll(); CoinControlDialog::coinControl()->UnSelectAll();
coinControlUpdateLabels(); coinControlUpdateLabels();
} }
fNewRecipientAllowed = true; fNewRecipientAllowed = true;
@ -604,7 +604,7 @@ void SendCoinsDialog::useAvailableBalance(SendCoinsEntry* entry)
// Get CCoinControl instance if CoinControl is enabled or create a new one. // Get CCoinControl instance if CoinControl is enabled or create a new one.
CCoinControl coin_control; CCoinControl coin_control;
if (model->getOptionsModel()->getCoinControlFeatures()) { if (model->getOptionsModel()->getCoinControlFeatures()) {
coin_control = *CoinControlDialog::coinControl; coin_control = *CoinControlDialog::coinControl();
} }
// Calculate available amount to send. // Calculate available amount to send.
@ -754,7 +754,7 @@ void SendCoinsDialog::coinControlFeatureChanged(bool checked)
ui->frameCoinControl->setVisible(checked); ui->frameCoinControl->setVisible(checked);
if (!checked && model) // coin control features disabled if (!checked && model) // coin control features disabled
CoinControlDialog::coinControl->SetNull(); CoinControlDialog::coinControl()->SetNull();
coinControlUpdateLabels(); coinControlUpdateLabels();
} }
@ -773,7 +773,7 @@ void SendCoinsDialog::coinControlChangeChecked(int state)
{ {
if (state == Qt::Unchecked) if (state == Qt::Unchecked)
{ {
CoinControlDialog::coinControl->destChange = CNoDestination(); CoinControlDialog::coinControl()->destChange = CNoDestination();
ui->labelCoinControlChangeLabel->clear(); ui->labelCoinControlChangeLabel->clear();
} }
else else
@ -789,7 +789,7 @@ void SendCoinsDialog::coinControlChangeEdited(const QString& text)
if (model && model->getAddressTableModel()) if (model && model->getAddressTableModel())
{ {
// Default to no change address until verified // Default to no change address until verified
CoinControlDialog::coinControl->destChange = CNoDestination(); CoinControlDialog::coinControl()->destChange = CNoDestination();
ui->labelCoinControlChangeLabel->setStyleSheet("QLabel{color:red;}"); ui->labelCoinControlChangeLabel->setStyleSheet("QLabel{color:red;}");
const CTxDestination dest = DecodeDestination(text.toStdString()); const CTxDestination dest = DecodeDestination(text.toStdString());
@ -812,7 +812,7 @@ void SendCoinsDialog::coinControlChangeEdited(const QString& text)
QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Cancel); QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Cancel);
if(btnRetVal == QMessageBox::Yes) if(btnRetVal == QMessageBox::Yes)
CoinControlDialog::coinControl->destChange = dest; CoinControlDialog::coinControl()->destChange = dest;
else else
{ {
ui->lineEditCoinControlChange->setText(""); ui->lineEditCoinControlChange->setText("");
@ -831,7 +831,7 @@ void SendCoinsDialog::coinControlChangeEdited(const QString& text)
else else
ui->labelCoinControlChangeLabel->setText(tr("(no label)")); ui->labelCoinControlChangeLabel->setText(tr("(no label)"));
CoinControlDialog::coinControl->destChange = dest; CoinControlDialog::coinControl()->destChange = dest;
} }
} }
} }
@ -843,7 +843,7 @@ void SendCoinsDialog::coinControlUpdateLabels()
if (!model || !model->getOptionsModel()) if (!model || !model->getOptionsModel())
return; return;
updateCoinControlState(*CoinControlDialog::coinControl); updateCoinControlState(*CoinControlDialog::coinControl());
// set pay amounts // set pay amounts
CoinControlDialog::payAmounts.clear(); CoinControlDialog::payAmounts.clear();
@ -861,7 +861,7 @@ void SendCoinsDialog::coinControlUpdateLabels()
} }
} }
if (CoinControlDialog::coinControl->HasSelected()) if (CoinControlDialog::coinControl()->HasSelected())
{ {
// actual coin control calculation // actual coin control calculation
CoinControlDialog::updateLabels(model, this); CoinControlDialog::updateLabels(model, this);

Loading…
Cancel
Save