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);