diff --git a/src/qt/forms/sendcoinsdialog.ui b/src/qt/forms/sendcoinsdialog.ui --- a/src/qt/forms/sendcoinsdialog.ui +++ b/src/qt/forms/sendcoinsdialog.ui @@ -1059,44 +1059,15 @@ 30 - - + + 0 - - 23 - - - 1 - - - 0 - - - Qt::Horizontal - - - false - - - false - - - QSlider::NoTicks - - - - - - - - normal - - + - + Qt::Horizontal @@ -1108,33 +1079,6 @@ - - - - (count) - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - fast - - - diff --git a/src/qt/sendcoinsdialog.cpp b/src/qt/sendcoinsdialog.cpp --- a/src/qt/sendcoinsdialog.cpp +++ b/src/qt/sendcoinsdialog.cpp @@ -30,6 +30,26 @@ #include #include +static const std::array confTargets = { + {2, 4, 6, 12, 24, 48, 144, 504, 1008}}; +int getConfTargetForIndex(int index) { + if (index + 1 > static_cast(confTargets.size())) { + return confTargets.back(); + } + if (index < 0) { + return confTargets[0]; + } + return confTargets[index]; +} +int getIndexForConfTarget(int target) { + for (unsigned int i = 0; i < confTargets.size(); i++) { + if (confTargets[i] >= target) { + return i; + } + } + return confTargets.size() - 1; +} + SendCoinsDialog::SendCoinsDialog(const PlatformStyle *_platformStyle, QWidget *parent) : QDialog(parent), ui(new Ui::SendCoinsDialog), clientModel(0), model(0), @@ -197,11 +217,18 @@ coinControlUpdateLabels(); // fee section - connect(ui->sliderSmartFee, SIGNAL(valueChanged(int)), this, + for (const int &n : confTargets) { + ui->confTargetSelector->addItem( + tr("%1 (%2 blocks)") + .arg(GUIUtil::formatNiceTimeOffset( + n * Params().GetConsensus().nPowTargetSpacing)) + .arg(n)); + } + connect(ui->confTargetSelector, SIGNAL(currentIndexChanged(int)), this, SLOT(updateSmartFeeLabel())); - connect(ui->sliderSmartFee, SIGNAL(valueChanged(int)), this, + connect(ui->confTargetSelector, SIGNAL(currentIndexChanged(int)), this, SLOT(updateGlobalFeeVariables())); - connect(ui->sliderSmartFee, SIGNAL(valueChanged(int)), this, + connect(ui->confTargetSelector, SIGNAL(currentIndexChanged(int)), this, SLOT(coinControlUpdateLabels())); connect(ui->groupFee, SIGNAL(buttonClicked(int)), this, SLOT(updateFeeSectionControls())); @@ -235,12 +262,21 @@ // set the smartfee-sliders default value (wallets default conf.target // or last stored value) QSettings settings; - if (settings.value("nSmartFeeSliderPosition").toInt() == 0) { - ui->sliderSmartFee->setValue(ui->sliderSmartFee->maximum() - - model->getDefaultConfirmTarget() + 2); + if (settings.value("nSmartFeeSliderPosition").toInt() != 0) { + // migrate nSmartFeeSliderPosition to nConfTarget + // nConfTarget is available since 0.18.7 (replaced + // nSmartFeeSliderPosition) 25 == old slider range + int nConfirmTarget = + 25 - settings.value("nSmartFeeSliderPosition").toInt(); + settings.setValue("nConfTarget", nConfirmTarget); + settings.remove("nSmartFeeSliderPosition"); + } + if (settings.value("nConfTarget").toInt() == 0) { + ui->confTargetSelector->setCurrentIndex( + getIndexForConfTarget(model->getDefaultConfirmTarget())); } else { - ui->sliderSmartFee->setValue( - settings.value("nSmartFeeSliderPosition").toInt()); + ui->confTargetSelector->setCurrentIndex( + getIndexForConfTarget(settings.value("nConfTarget").toInt())); } } } @@ -250,7 +286,9 @@ settings.setValue("fFeeSectionMinimized", fFeeMinimized); settings.setValue("nFeeRadio", ui->groupFee->checkedId()); settings.setValue("nCustomFeeRadio", ui->groupCustomFee->checkedId()); - settings.setValue("nSmartFeeSliderPosition", ui->sliderSmartFee->value()); + settings.setValue( + "nConfTarget", + getConfTargetForIndex(ui->confTargetSelector->currentIndex())); settings.setValue("nTransactionFee", qint64(ui->customFee->value() / SATOSHI)); settings.setValue("fPayOnlyMinFee", ui->checkBoxMinimumFee->isChecked()); @@ -302,7 +340,7 @@ } if (ui->radioSmartFee->isChecked()) { ctrl.nConfirmTarget = - ui->sliderSmartFee->maximum() - ui->sliderSmartFee->value() + 2; + getConfTargetForIndex(ui->confTargetSelector->currentIndex()); } else { ctrl.nConfirmTarget = 0; } @@ -694,14 +732,11 @@ } void SendCoinsDialog::updateFeeSectionControls() { - ui->sliderSmartFee->setEnabled(ui->radioSmartFee->isChecked()); + ui->confTargetSelector->setEnabled(ui->radioSmartFee->isChecked()); ui->labelSmartFee->setEnabled(ui->radioSmartFee->isChecked()); ui->labelSmartFee2->setEnabled(ui->radioSmartFee->isChecked()); ui->labelSmartFee3->setEnabled(ui->radioSmartFee->isChecked()); ui->labelFeeEstimation->setEnabled(ui->radioSmartFee->isChecked()); - ui->labelSmartFeeNormal->setEnabled(ui->radioSmartFee->isChecked()); - ui->labelSmartFeeFast->setEnabled(ui->radioSmartFee->isChecked()); - ui->confirmationTargetLabel->setEnabled(ui->radioSmartFee->isChecked()); ui->checkBoxMinimumFee->setEnabled(ui->radioCustomFee->isChecked()); ui->labelMinFeeWarning->setEnabled(ui->radioCustomFee->isChecked()); ui->radioCustomPerKilobyte->setEnabled( @@ -717,19 +752,10 @@ void SendCoinsDialog::updateGlobalFeeVariables() { if (ui->radioSmartFee->isChecked()) { - int nConfirmTarget = - ui->sliderSmartFee->maximum() - ui->sliderSmartFee->value() + 2; payTxFee = CFeeRate(Amount::zero()); // set nMinimumTotalFee to 0 to not accidentally pay a custom fee CoinControlDialog::coinControl->nMinimumTotalFee = Amount::zero(); - - // show the estimated required time for confirmation - ui->confirmationTargetLabel->setText( - GUIUtil::formatDurationStr( - nConfirmTarget * - model->getChainParams().GetConsensus().nPowTargetSpacing) + - " / " + tr("%n block(s)", "", nConfirmTarget)); } else { payTxFee = CFeeRate(Amount(ui->customFee->value())); @@ -776,7 +802,7 @@ } int nBlocksToConfirm = - ui->sliderSmartFee->maximum() - ui->sliderSmartFee->value() + 2; + getConfTargetForIndex(ui->confTargetSelector->currentIndex()); int estimateFoundAtBlocks = nBlocksToConfirm; CFeeRate feeRate = g_mempool.estimateSmartFee(nBlocksToConfirm, &estimateFoundAtBlocks);