fix(bal): black bar on cancelled invalidation + editable fee follows dates (v0.3.6)

Two GUI fixes bundled together (v0.3.6):

- Fix #10 (black bar): in dialogs.py on_success_phase1, the cancelled
  invalidation branch no longer calls the blocking self.wait(3)+self.close().
  wait() uses time.sleep() and runs in the GUI thread, freezing the UI so the
  'Building Will' dialog could not repaint the area it just resized, leaving a
  black rectangle at the bottom. It now shows 'Aborted' plus the existing
  non-blocking Close button (_add_close_button), consistent with the other
  end-of-flow branches.

- Fix #11 (editable fee): in widgets.py WillSettingsWidget.apply_editable_dates,
  the fee widget (baltx_fees) now follows the same 'Editable dates' setting as
  the locktime/threshold widgets (set_read_only(not editable_dates)) instead of
  being forced read-only. With the setting ticked, dates AND fee are editable
  outside the wizard; unticked, all three are read-only. Default stays OFF.

Version bumped 0.3.5 -> 0.3.6 (manifest.json, __init__.py, plugin_base.py,
VERSION). CHANGELOG: entries #10 and #11. ruff clean; full suite 239 passed.
This commit is contained in:
2026-06-28 23:01:38 -04:00
parent edbb3b32ce
commit dd2e160a17
7 changed files with 87 additions and 12 deletions

View File

@@ -1 +1 @@
0.3.4
0.3.6

View File

@@ -34,4 +34,4 @@ The plugin targets Electrum 4.7.2 (the last stable release exposing
``json_db.register_dict``) and PyQt6.
"""
__version__ = "0.3.4"
__version__ = "0.3.6"

View File

@@ -91,7 +91,7 @@ class BalPlugin(BasePlugin):
"""
_version = None
__version__ = "0.3.4" # AUTOMATICALLY GENERATED DO NOT EDIT
__version__ = "0.3.6" # AUTOMATICALLY GENERATED DO NOT EDIT
# Command used to open an .ics calendar file, per operating system.
default_app = {

View File

@@ -917,9 +917,19 @@ class BalBuildWillDialog(BalDialog):
_("Invalidate your old will"), parent=self
)
if password is False:
# The user cancelled the password prompt for the invalidation.
# We must NOT call self.wait(3) here: on_success_phase1 runs in
# the GUI thread, so wait()'s time.sleep() would freeze the UI
# for several seconds. While frozen the dialog cannot repaint
# the area it just resized, leaving a black, undrawn rectangle
# at the bottom of the "Building Will" window (the reported bug).
#
# Instead, mark the invalidation as "Aborted" and offer a
# non-blocking "Close" button (the same helper used by the
# normal finish path), so the user can read the outcome and
# dismiss the dialog when they want, without blocking the GUI.
self.msg_set_invalidating(_("Aborted"))
self.wait(3)
self.close()
self._add_close_button()
return
self.thread.add(
partial(self.invalidate_task, password, self.bal_window, tx),

View File

@@ -705,13 +705,15 @@ class WillSettingsWidget(QWidget):
self.apply_editable_dates()
def apply_editable_dates(self):
"""Re-read the EDITABLE_DATES setting and lock/unlock the date fields.
"""Re-read the EDITABLE_DATES setting and lock/unlock the editable fields.
Outside the "Build your will" wizard (``read_only=True``) the
delivery-time and check-alive dates are display-only by default. When
the user ticks "Editable dates" in the settings they become editable
here too. The fee field always stays read-only outside the wizard,
because C2 only concerns the dates.
delivery-time, check-alive dates AND the mining fee are display-only by
default. When the user ticks "Editable dates" in the settings, all three
fields (locktime, threshold and fee) become editable here too; when it
is unticked they all go back to read-only. The fee follows exactly the
same rule as the dates (it used to stay always read-only, but the user
asked for the fee to be editable together with the dates).
This is safe to call repeatedly: it only adjusts the read-only state of
the already-created sub-widgets, it does not rebuild anything. It is the
@@ -732,7 +734,9 @@ class WillSettingsWidget(QWidget):
self.widgets["locktime"].set_read_only(not editable_dates)
self.widgets["threshold"].set_read_only(not editable_dates)
self.widgets["baltx_fees"].set_read_only(True)
# The fee now follows the very same "Editable dates" rule as the dates:
# editable outside the wizard only when the setting is ticked.
self.widgets["baltx_fees"].set_read_only(not editable_dates)
def create_alarms(self, alarm_start, alarm_end):
"""Build the VALARM reminder blocks for the .ics event (Group D / D1).

View File

@@ -1,7 +1,7 @@
{
"name": "bal",
"fullname": "Bitcoin After Life",
"version": "0.3.4",
"version": "0.3.6",
"description": "Provides free and decentralized Bitcoin inheritance support. Build time-locked 'will' transactions that transfer funds to your heirs if you stop refreshing them (dead-man's switch), optionally relayed by will-executor servers.",
"author": "Svatantrya",
"licence": "MIT",