fix #2614: define non-linear scale for static fees

This commit is contained in:
ThomasV 2017-10-21 11:15:59 +02:00
parent 1d2253f0d8
commit 198cc9d737
4 changed files with 16 additions and 24 deletions

View File

@ -58,7 +58,6 @@ class FeeDialog(Factory.Popup):
Factory.Popup.__init__(self) Factory.Popup.__init__(self)
self.app = app self.app = app
self.config = config self.config = config
self.fee_step = self.config.max_fee_rate() / 10
self.fee_rate = self.config.fee_per_kb() self.fee_rate = self.config.fee_per_kb()
self.callback = callback self.callback = callback
self.dynfees = self.config.get('dynamic_fees', True) self.dynfees = self.config.get('dynamic_fees', True)
@ -77,9 +76,9 @@ class FeeDialog(Factory.Popup):
slider.step = 1 slider.step = 1
slider.value = self.config.get('fee_level', 2) slider.value = self.config.get('fee_level', 2)
else: else:
slider.range = (1, 10) slider.range = (0, 9)
slider.step = 1 slider.step = 1
slider.value = min(self.fee_rate / self.fee_step, 10) slider.value = self.config.static_fee_index(self.fee_rate)
def get_fee_text(self, value): def get_fee_text(self, value):
if self.ids.dynfees.active: if self.ids.dynfees.active:
@ -88,7 +87,7 @@ class FeeDialog(Factory.Popup):
dynfee = self.config.dynfee(value) dynfee = self.config.dynfee(value)
tooltip += '\n' + (self.app.format_amount_and_units(dynfee)) + '/kB' tooltip += '\n' + (self.app.format_amount_and_units(dynfee)) + '/kB'
else: else:
fee_rate = value * self.fee_step fee_rate = self.config.static_fee(value)
tooltip = self.app.format_amount_and_units(fee_rate) + '/kB' tooltip = self.app.format_amount_and_units(fee_rate) + '/kB'
if self.config.has_fee_estimates(): if self.config.has_fee_estimates():
i = self.config.reverse_dynfee(fee_rate) i = self.config.reverse_dynfee(fee_rate)
@ -101,7 +100,7 @@ class FeeDialog(Factory.Popup):
if self.dynfees: if self.dynfees:
self.config.set_key('fee_level', value, True) self.config.set_key('fee_level', value, True)
else: else:
self.config.set_key('fee_per_kb', value * self.fee_step, True) self.config.set_key('fee_per_kb', self.config.static_fee(value), True)
self.callback() self.callback()
def on_slider(self, value): def on_slider(self, value):

View File

@ -28,7 +28,7 @@ class FeeSlider(QSlider):
def moved(self, pos): def moved(self, pos):
with self.lock: with self.lock:
fee_rate = self.config.dynfee(pos) if self.dyn else pos * self.fee_step fee_rate = self.config.dynfee(pos) if self.dyn else self.config.static_fee(pos)
tooltip = self.get_tooltip(pos, fee_rate) tooltip = self.get_tooltip(pos, fee_rate)
QToolTip.showText(QCursor.pos(), tooltip, self) QToolTip.showText(QCursor.pos(), tooltip, self)
self.setToolTip(tooltip) self.setToolTip(tooltip)
@ -55,10 +55,9 @@ class FeeSlider(QSlider):
self.setRange(0, 4) self.setRange(0, 4)
self.setValue(pos) self.setValue(pos)
else: else:
self.fee_step = self.config.max_fee_rate() / 10
fee_rate = self.config.fee_per_kb() fee_rate = self.config.fee_per_kb()
pos = min(fee_rate / self.fee_step, 10) pos = self.config.static_fee_index(fee_rate)
self.setRange(1, 10) self.setRange(0, 9)
self.setValue(pos) self.setValue(pos)
tooltip = self.get_tooltip(pos, fee_rate) tooltip = self.get_tooltip(pos, fee_rate)
self.setToolTip(tooltip) self.setToolTip(tooltip)

View File

@ -2437,21 +2437,6 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
fee_widgets.append((dynfee_cb, None)) fee_widgets.append((dynfee_cb, None))
dynfee_cb.stateChanged.connect(on_dynfee) dynfee_cb.stateChanged.connect(on_dynfee)
def on_maxfee(x):
m = maxfee_e.get_amount()
if m: self.config.set_key('max_fee_rate', m)
self.fee_slider.update()
def update_maxfee():
d = self.config.is_dynfee()
maxfee_e.setDisabled(d)
maxfee_label.setDisabled(d)
maxfee_label = HelpLabel(_('Max static fee'), _('Max value of the static fee slider'))
maxfee_e = BTCkBEdit(self.get_decimal_point)
maxfee_e.setAmount(self.config.max_fee_rate())
maxfee_e.textChanged.connect(on_maxfee)
update_maxfee()
fee_widgets.append((maxfee_label, maxfee_e))
feebox_cb = QCheckBox(_('Edit fees manually')) feebox_cb = QCheckBox(_('Edit fees manually'))
feebox_cb.setChecked(self.config.get('show_fee', False)) feebox_cb.setChecked(self.config.get('show_fee', False))
feebox_cb.setToolTip(_("Show fee edit box in send tab.")) feebox_cb.setToolTip(_("Show fee edit box in send tab."))

View File

@ -41,6 +41,8 @@ class SimpleConfig(PrintError):
They are taken in order (1. overrides config options set in 2., that They are taken in order (1. overrides config options set in 2., that
override config set in 3.) override config set in 3.)
""" """
fee_rates = [5000, 10000, 20000, 30000, 50000, 70000, 100000, 150000, 200000, 300000]
def __init__(self, options={}, read_system_config_function=None, def __init__(self, options={}, read_system_config_function=None,
read_user_config_function=None, read_user_dir_function=None): read_user_config_function=None, read_user_dir_function=None):
@ -230,6 +232,13 @@ class SimpleConfig(PrintError):
min_target = -1 min_target = -1
return min_target return min_target
def static_fee(self, i):
return self.fee_rates[i]
def static_fee_index(self, value):
dist = list(map(lambda x: abs(x - value), self.fee_rates))
return min(range(len(dist)), key=dist.__getitem__)
def has_fee_estimates(self): def has_fee_estimates(self):
return len(self.fee_estimates)==4 return len(self.fee_estimates)==4