From 4c36c456649708dd2cb25802acf7e9aea75bc3cc Mon Sep 17 00:00:00 2001 From: SomberNight Date: Mon, 15 Feb 2021 10:06:14 +0100 Subject: [PATCH] qt bump fee: add "advanced" button, allow choosing strategy --- electrum/gui/qt/rbf_dialog.py | 62 +++++++++++++++++++++++++++++++---- 1 file changed, 56 insertions(+), 6 deletions(-) diff --git a/electrum/gui/qt/rbf_dialog.py b/electrum/gui/qt/rbf_dialog.py index 3c8c7a0ad..843dc4c7d 100644 --- a/electrum/gui/qt/rbf_dialog.py +++ b/electrum/gui/qt/rbf_dialog.py @@ -4,15 +4,18 @@ from typing import TYPE_CHECKING -from PyQt5.QtWidgets import QCheckBox, QLabel, QVBoxLayout, QGridLayout +from PyQt5.QtWidgets import (QCheckBox, QLabel, QVBoxLayout, QGridLayout, QWidget, + QPushButton, QHBoxLayout, QComboBox) -from electrum.i18n import _ -from electrum.transaction import PartialTransaction from .amountedit import FeerateEdit from .fee_slider import FeeSlider, FeeComboBox from .util import (ColorScheme, WindowModalDialog, Buttons, OkButton, WWLabel, CancelButton) +from electrum.i18n import _ +from electrum.transaction import PartialTransaction +from electrum.wallet import BumpFeeStrategy + if TYPE_CHECKING: from .main_window import ElectrumWindow @@ -43,6 +46,7 @@ class _BaseRBFDialog(WindowModalDialog): vbox.addWidget(WWLabel(help_text)) ok_button = OkButton(self) + self.adv_button = QPushButton(_("Show advanced settings")) warning_label = WWLabel('\n') warning_label.setStyleSheet(ColorScheme.RED.as_stylesheet()) self.feerate_e = FeerateEdit(lambda: 0) @@ -84,14 +88,36 @@ class _BaseRBFDialog(WindowModalDialog): grid.addWidget(fee_slider, 3, 1) grid.addWidget(fee_combo, 3, 2) vbox.addLayout(grid) - self.cb_is_final = QCheckBox(_('Final')) - vbox.addWidget(self.cb_is_final) + self._add_advanced_options_cont(vbox) vbox.addWidget(warning_label) - vbox.addLayout(Buttons(CancelButton(self), ok_button)) + + btns_hbox = QHBoxLayout() + btns_hbox.addWidget(self.adv_button) + btns_hbox.addStretch(1) + btns_hbox.addWidget(CancelButton(self)) + btns_hbox.addWidget(ok_button) + vbox.addLayout(btns_hbox) def rbf_func(self, fee_rate) -> PartialTransaction: raise NotImplementedError() # implemented by subclasses + def _add_advanced_options_cont(self, vbox: QVBoxLayout) -> None: + adv_vbox = QVBoxLayout() + adv_vbox.setContentsMargins(0, 0, 0, 0) + adv_widget = QWidget() + adv_widget.setLayout(adv_vbox) + adv_widget.setVisible(False) + def show_adv_settings(): + self.adv_button.setEnabled(False) + adv_widget.setVisible(True) + self.adv_button.clicked.connect(show_adv_settings) + self._add_advanced_options(adv_vbox) + vbox.addWidget(adv_widget) + + def _add_advanced_options(self, adv_vbox: QVBoxLayout) -> None: + self.cb_is_final = QCheckBox(_('Final')) + adv_vbox.addWidget(self.cb_is_final) + def run(self) -> None: if not self.exec_(): return @@ -133,8 +159,32 @@ class BumpFeeDialog(_BaseRBFDialog): txid=self.txid, new_fee_rate=fee_rate, coins=self.window.get_coins(), + strategies=self.option_index_to_strats[self.strat_combo.currentIndex()], ) + def _add_advanced_options(self, adv_vbox: QVBoxLayout) -> None: + self.cb_is_final = QCheckBox(_('Final')) + adv_vbox.addWidget(self.cb_is_final) + + self.strat_combo = QComboBox() + options = [ + _("decrease change, or add new inputs, or decrease any outputs"), + _("decrease change, or decrease any outputs"), + _("decrease payment"), + ] + self.option_index_to_strats = { + 0: [BumpFeeStrategy.COINCHOOSER, BumpFeeStrategy.DECREASE_CHANGE], + 1: [BumpFeeStrategy.DECREASE_CHANGE], + 2: [BumpFeeStrategy.DECREASE_PAYMENT], + } + self.strat_combo.addItems(options) + self.strat_combo.setCurrentIndex(0) + strat_hbox = QHBoxLayout() + strat_hbox.addWidget(QLabel(_("Strategy") + ":")) + strat_hbox.addWidget(self.strat_combo) + strat_hbox.addStretch(1) + adv_vbox.addLayout(strat_hbox) + class DSCancelDialog(_BaseRBFDialog):