v0.5.1: update changelog
This commit is contained in:
286
CHANGELOG.md
286
CHANGELOG.md
@@ -1544,256 +1544,60 @@ confirms the ZIP works).
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 26. v0.5.1 - Dynamic Check Alive in BASIC mode + Windows dialog-flicker fix
|
## 25. v0.5.1 - Fix Windows Settings-dialog flicker (rollback to v0.5.0 + flicker fix only)
|
||||||
|
|
||||||
**Date:** 2026-07-01
|
|
||||||
|
|
||||||
**Goal:** Fix two owner-reported bugs: (1) in BASIC mode, anticipating the
|
|
||||||
delivery time (locktime) to a date earlier than the hidden, stale "Check
|
|
||||||
Alive" (threshold) default could incorrectly mark the will as expired /
|
|
||||||
blocked; (2) on Windows only, BAL dialogs (Settings, waiting dialogs) briefly
|
|
||||||
flashed 1-2 blank "ghost" windows before rendering their real content.
|
|
||||||
|
|
||||||
**What changed:**
|
|
||||||
|
|
||||||
- **Bug 1 - BASIC mode Check Alive now tracks the delivery time.**
|
|
||||||
`bal/gui/qt/window.py`
|
|
||||||
- Added `BalWindow.BASIC_MODE_CHECK_ALIVE_OFFSET_SECONDS` (2 hours,
|
|
||||||
owner-approved) and a new pure `BalWindow.compute_date_to_check(
|
|
||||||
is_basic_mode, locktime_setting, threshold_setting)` static method.
|
|
||||||
- In BASIC mode, `date_to_check` (the "Check Alive" reference timestamp) is
|
|
||||||
now derived LIVE from the current delivery time (`will_settings
|
|
||||||
["locktime"]`), placed 2 hours before it, instead of reading the hidden,
|
|
||||||
possibly stale stored `threshold`. This guarantees `date_to_check` is
|
|
||||||
always earlier than the delivery time, so anticipating/postponing the
|
|
||||||
delivery date in the wizard never triggers the "locktime is lower than
|
|
||||||
threshold" guard (`build_inheritance_transaction`) nor
|
|
||||||
`Will.check_will_expired`/`WillExpiredException` anymore.
|
|
||||||
- In ADVANCED mode nothing changes: the stored `threshold` is used exactly
|
|
||||||
as before.
|
|
||||||
- Root-cause note: `Util.parse_locktime_string` never raises on invalid
|
|
||||||
input, it silently returns `0`; `compute_date_to_check` now explicitly
|
|
||||||
treats that sentinel as "unparsable" and falls back to the stored
|
|
||||||
threshold, so BASIC mode can never compute a bogus near-epoch value.
|
|
||||||
- `init_class_variables()` now simply calls `compute_date_to_check(...)`.
|
|
||||||
|
|
||||||
- **Bug 2 - Windows dialog flicker fixed.**
|
|
||||||
`bal/gui/qt/window_utils.py` (`show_modal`) and `bal/gui/qt/dialogs.py`
|
|
||||||
(`BalWaitingDialog.exe`): `bring_to_front()` (`raise_()` +
|
|
||||||
`activateWindow()`) was being called on dialogs BEFORE `exec()` actually
|
|
||||||
showed them. On Windows this forces Qt to create the dialog's native window
|
|
||||||
handle immediately, empty and unpositioned, causing a brief flash of 1-2
|
|
||||||
blank windows before the real content was drawn (reproduced from a
|
|
||||||
screen recording; Linux does not show this, since native window creation
|
|
||||||
there is lazier). Fixed by scheduling `bring_to_front()` via
|
|
||||||
`QTimer.singleShot(0, ...)` so it runs on the next event-loop iteration,
|
|
||||||
i.e. after the dialog is already visible with its real content - the
|
|
||||||
focus/raise behaviour is unchanged, only the timing of when it fires.
|
|
||||||
|
|
||||||
- Added `tests/test_group_i_basic_checkalive.py` with 6 tests calling the
|
|
||||||
real `BalWindow.compute_date_to_check` directly (no GUI/wallet needed):
|
|
||||||
the 2-hour offset constant, a fresh "1y" default, the exact reported
|
|
||||||
"anticipate to 1 month" scenario, a sweep of delivery dates always staying
|
|
||||||
before locktime, ADVANCED mode being unaffected, and the unparsable-input
|
|
||||||
fallback (which caught and fixed a real edge case during development: a
|
|
||||||
0-timestamp sentinel instead of an exception).
|
|
||||||
|
|
||||||
- Version bumped 0.5.0 -> 0.5.1 (`plugin_base.py`, `__init__.py`, `VERSION`,
|
|
||||||
`manifest.json`).
|
|
||||||
|
|
||||||
**Verification:**
|
|
||||||
|
|
||||||
- Full test suite: `272 passed` (266 previous + 6 new), plus the same 2
|
|
||||||
pre-existing, unrelated failures already present before this change
|
|
||||||
(`test_core_plugin_base.py::test_default_will_settings` /
|
|
||||||
`test_validate_will_settings`, expecting the old `baltx_fees=100` default
|
|
||||||
that v0.5.0 already changed to `20`).
|
|
||||||
- `ruff`: no new errors (only pre-existing star-import / F841 noise).
|
|
||||||
- The Check Alive fix (Bug 1) is fully covered by automated tests. The
|
|
||||||
Windows flicker fix (Bug 2) was diagnosed from a screen recording and
|
|
||||||
reasoned from the Qt/Windows native-window-creation behaviour; it cannot be
|
|
||||||
reproduced or automatically verified on this Linux environment, so the
|
|
||||||
owner needs to confirm on Windows that the flicker is gone.
|
|
||||||
|
|
||||||
**Outcome:** DONE (delivered as test ZIP v0.5.1; commit only after the owner
|
|
||||||
confirms both fixes work, especially the Windows flicker one).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 27. v0.5.2 - Real fix for the Windows Settings-dialog flicker (root cause found by diffing against v0.4.8)
|
|
||||||
|
|
||||||
**Date:** 2026-07-01
|
|
||||||
|
|
||||||
**Goal:** The v0.5.1 attempt at fixing the Windows-only "ghost window" flicker
|
|
||||||
on the BAL Settings dialog (deferring `bring_to_front()` via
|
|
||||||
`QTimer.singleShot`) did NOT fix it, per owner confirmation after testing on
|
|
||||||
Windows. This entry documents the corrected root cause and the actual fix.
|
|
||||||
|
|
||||||
**Root cause (confirmed by diff, not guesswork):** the owner provided the
|
|
||||||
last known-good release (v0.4.8, no flicker) for direct comparison.
|
|
||||||
`bal/gui/qt/window_utils.py` (`show_modal`/`bring_to_front`) turned out to be
|
|
||||||
byte-identical between v0.4.8 and v0.5.0 (aside from the v0.5.1 attempt),
|
|
||||||
proving that code was never the cause. Diffing `bal/gui/qt/plugin.py`
|
|
||||||
instead showed that `settings_dialog()` gained, between v0.4.8 and v0.5.0:
|
|
||||||
(a) ~17 ADVANCED-only setting rows that are shown/hidden via `setVisible()`
|
|
||||||
right at dialog construction time (to reflect the current BASIC/ADVANCED
|
|
||||||
mode before the dialog is ever shown), and (b)
|
|
||||||
`outer.setSizeConstraint(QLayout.SizeConstraint.SetFixedSize)`, which did
|
|
||||||
**not** exist anywhere in v0.4.8's GUI code. `SetFixedSize` forces Qt to
|
|
||||||
recompute and enforce the dialog's exact size on every layout invalidation -
|
|
||||||
including while those ~17 rows are being hidden for the first time, before
|
|
||||||
the dialog has ever been shown. On Windows, that live geometry renegotiation
|
|
||||||
overlapping with native window creation is what produced the blank "ghost"
|
|
||||||
window flash (reproduced from the owner's screen recording).
|
|
||||||
|
|
||||||
**What changed:**
|
|
||||||
|
|
||||||
- `bal/gui/qt/plugin.py` (`settings_dialog`): removed
|
|
||||||
`outer.setSizeConstraint(QLayout.SizeConstraint.SetFixedSize)`, restoring
|
|
||||||
the sizing behaviour v0.4.8 already had (no forced constraint). Added an
|
|
||||||
explicit `d.adjustSize()` right before `show_modal(d)` so the dialog still
|
|
||||||
opens at its natural, correctly laid-out size (now computed once, instead
|
|
||||||
of being continuously re-enforced). The dynamic BASIC/ADVANCED row
|
|
||||||
visibility feature itself is fully preserved - only the size-constraint
|
|
||||||
coupling that caused the flicker was removed.
|
|
||||||
- Removed the now-unused `QLayout` import.
|
|
||||||
|
|
||||||
**Verification:**
|
|
||||||
|
|
||||||
- Full test suite: `272 passed`, same 2 pre-existing, unrelated failures as
|
|
||||||
before (stale `baltx_fees=100` expectation vs the v0.5.0 default of `20`).
|
|
||||||
- `ruff`: no new errors (only pre-existing star-import noise).
|
|
||||||
- Diagnosis confirmed by direct code comparison against v0.4.8 (provided by
|
|
||||||
the owner) rather than inference alone. The fix itself still cannot be
|
|
||||||
verified on this Linux environment (Windows-only symptom): the owner needs
|
|
||||||
to confirm on Windows that the flicker is gone.
|
|
||||||
|
|
||||||
**Outcome:** DONE (delivered as test ZIP v0.5.2; commit only after the owner
|
|
||||||
confirms the flicker is actually gone this time).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 28. v0.5.3 - Windows Settings-dialog flicker: corrected fix (drop bring_to_front before exec(), not just defer it)
|
|
||||||
|
|
||||||
**Date:** 2026-07-01
|
|
||||||
|
|
||||||
**Goal:** v0.5.2 (removing `SetFixedSize`) did NOT fix the Windows flicker
|
|
||||||
either, per owner confirmation ("è come prima" - unchanged). This entry
|
|
||||||
documents the corrected fix, based on new evidence from the owner: the
|
|
||||||
flicker only ever happens with the Settings dialog in ADVANCED mode (many
|
|
||||||
more visible rows, much larger dialog) and never in BASIC mode (few rows,
|
|
||||||
small dialog) - always with the same intensity, not intermittent.
|
|
||||||
|
|
||||||
**Root cause (corrected):** `show_modal()` (`bal/gui/qt/window_utils.py`)
|
|
||||||
called `bring_to_front(dialog)` (`raise_()` + `activateWindow()`) BEFORE
|
|
||||||
`dialog.exec()`. The v0.5.1 attempt only *deferred* this call by one event
|
|
||||||
loop tick (`QTimer.singleShot(0, ...)`) instead of removing it, which turned
|
|
||||||
out to still fire too early relative to Windows finishing the dialog's
|
|
||||||
native window layout/paint - reproducing the same flicker. The owner's
|
|
||||||
BASIC-vs-ADVANCED observation is the key evidence: `raise_()`/
|
|
||||||
`activateWindow()` forcing native window creation before the layout has
|
|
||||||
settled produces a flash whose visible severity scales with how different
|
|
||||||
the dialog's final size is from its premature/unlaid-out state - which is
|
|
||||||
exactly why a much bigger ADVANCED-mode dialog flickers noticeably while the
|
|
||||||
small BASIC-mode one does not.
|
|
||||||
|
|
||||||
**What changed:**
|
|
||||||
|
|
||||||
- `bal/gui/qt/window_utils.py` (`show_modal`): removed the `bring_to_front()`
|
|
||||||
call (deferred or otherwise) entirely. `QDialog.exec()` already shows,
|
|
||||||
raises and activates a **modal** dialog on its own as part of entering its
|
|
||||||
modal event loop, so the call was always redundant for this case - and, on
|
|
||||||
Windows, actively harmful. `bring_to_front()` itself is untouched and is
|
|
||||||
still used (correctly) by `show_on_top()`, for the few genuinely
|
|
||||||
**non-modal** dialogs that use `.show()` instead of `.exec()` and do need
|
|
||||||
an explicit raise/activate.
|
|
||||||
- Removed the now-unused `QTimer` import.
|
|
||||||
- `bal/gui/qt/dialogs.py` (`BalWaitingDialog.exe`): applied the same
|
|
||||||
corrected fix for consistency (same redundant-before-exec() pattern, same
|
|
||||||
underlying cause), even though the owner did not report flicker there -
|
|
||||||
removed `bring_to_front()`/`QTimer.singleShot` and kept only `self.exec()`.
|
|
||||||
|
|
||||||
**Verification:**
|
|
||||||
|
|
||||||
- Full test suite: `272 passed`, same 2 pre-existing, unrelated failures as
|
|
||||||
before.
|
|
||||||
- `ruff`: no new errors (only pre-existing star-import / F841 noise).
|
|
||||||
- As with v0.5.1/v0.5.2, this is a Windows-only symptom that cannot be
|
|
||||||
reproduced or verified on this Linux environment; the owner needs to
|
|
||||||
confirm on Windows.
|
|
||||||
|
|
||||||
**Outcome:** DONE (delivered as test ZIP v0.5.3; commit only after the owner
|
|
||||||
confirms the flicker is actually gone).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 29. v0.5.4 - REAL fix for the Windows Settings-dialog flicker (found by Windows-side bisection with the owner)
|
|
||||||
|
|
||||||
**Date:** 2026-07-02
|
**Date:** 2026-07-02
|
||||||
|
|
||||||
**Goal:** v0.5.3 (dropping `bring_to_front()` before `exec()`) did NOT fix the
|
**Context:** Starting from the clean v0.5.0 codebase (a set of later
|
||||||
flicker either, per owner confirmation ("è come prima" - unchanged). This
|
experimental builds, 0.5.1-0.5.4, were discarded because they introduced
|
||||||
entry documents the actual root cause, found through a structured bisection
|
other problems). This release applies ONLY the Windows Settings-dialog
|
||||||
process where the owner tested a series of isolated diagnostic ZIPs directly
|
flicker fix and changes nothing else - in particular, NO changes to locktime,
|
||||||
on Windows (since the bug cannot be reproduced on Linux), and the
|
delivery time, Check Alive, or any will-building logic. Only
|
||||||
corresponding real fix, **confirmed working by the owner on Windows**.
|
`bal/gui/qt/plugin.py` is touched (verified byte-for-byte against v0.5.0:
|
||||||
|
every other file is identical).
|
||||||
|
|
||||||
**Bisection process (each step tested live on Windows by the owner):**
|
**Bug:** On Windows only, opening the BAL Settings dialog in ADVANCED mode
|
||||||
1. A dialog stripped down to almost nothing (2 checkboxes, no ADVANCED-only
|
briefly flashed one or two blank "ghost" windows before the dialog rendered
|
||||||
rows, none of the widgets/layout features added since v0.4.8) did **not**
|
correctly. On Linux it did not occur.
|
||||||
flicker → the cause is in the dialog's content, not in how/where it is
|
|
||||||
opened, nor in `show_modal`/`bring_to_front` (already ruled out in
|
|
||||||
v0.5.1/v0.5.3), nor in `SetFixedSize` (already ruled out in v0.5.2).
|
|
||||||
2. Re-adding *only* the "User Type" combo + its dynamic show/hide mechanism
|
|
||||||
flickered (mildly); re-adding *only* the new text/input fields (Event
|
|
||||||
summary/description, Welist Server, Calendar app) did **not** → narrowed
|
|
||||||
to the combo/visibility mechanism.
|
|
||||||
3. A plain `QComboBox` alone (no confirmation dialog, no dynamic show/hide)
|
|
||||||
did **not** flicker; the construction-time `setVisible()` toggle alone
|
|
||||||
(no combo at all) **did** flicker → isolated to the visibility mechanism
|
|
||||||
itself.
|
|
||||||
4. A version of that same toggle that hides each ADVANCED-only widget
|
|
||||||
**before** adding it to the layout (instead of adding it visible and
|
|
||||||
hiding it afterwards) did **not** flicker → fix validated.
|
|
||||||
|
|
||||||
**Root cause:** the ~17 ADVANCED-only rows (Welist Server, Number of
|
**Root cause (found by bisection, each step tested on Windows by the user):**
|
||||||
reminders, Event summary/description, Calendar app, Auto-sign, and their
|
the ~24 ADVANCED-only widgets (Welist Server, Number of reminders, Event
|
||||||
per-row reset buttons) were added to the settings grid **visible**, then all
|
summary/description, Calendar app, Auto-sign, and their per-row reset buttons)
|
||||||
hidden together with `setVisible(False)` in BASIC mode, in a single loop
|
were added to the settings grid *visible* and then hidden all at once with a
|
||||||
*after* they were already part of the live layout. On Windows, that
|
`setVisible(False)` loop AFTER they were already part of the live layout. On
|
||||||
visible→hidden transition inside an already-populated layout - happening
|
Windows, that visible->hidden transition inside an already-populated layout,
|
||||||
while the dialog's native window was still being created - forced a
|
happening while the dialog's native window was being created, forced a
|
||||||
re-layout that flashed the dialog on screen. It only showed in ADVANCED mode
|
re-layout that flashed the dialog on screen. It only appeared in ADVANCED
|
||||||
because BASIC mode is when the widgets get hidden (so ADVANCED is when they
|
mode because that is when those rows are toggled and the dialog is largest.
|
||||||
stay visible and the dialog is at its largest, making any transient
|
A minimal dialog (no ADVANCED-only rows) never flickered; re-adding only the
|
||||||
mis-layout most noticeable) - consistent with the owner's observation that
|
construction-time `setVisible()` toggle reproduced it; hiding each widget
|
||||||
severity tracked dialog size.
|
BEFORE adding it to the layout eliminated it (all confirmed on Windows).
|
||||||
|
|
||||||
**What changed:**
|
**What changed (`bal/gui/qt/plugin.py`, `settings_dialog` only):**
|
||||||
|
|
||||||
- `bal/gui/qt/plugin.py` (`settings_dialog`): added a `basic_init` flag and a
|
- Added a `basic_init` flag and a `_hide_if_basic(widget)` helper right after
|
||||||
`_hide_if_basic(widget)` helper right after the dialog is created. Every
|
the dialog is created. Each ADVANCED-only widget is now wrapped in
|
||||||
ADVANCED-only widget is now wrapped in `_hide_if_basic(...)` at its
|
`_hide_if_basic(...)` at its `grid.addWidget(...)` call, so its final
|
||||||
`grid.addWidget(...)` call, so its final visibility is set **before** it
|
visibility is set BEFORE it ever joins the layout - it never transitions
|
||||||
ever joins the layout - it never transitions visible→hidden inside a live
|
visible->hidden inside a live layout.
|
||||||
layout. Removed the old post-hoc loop that used to hide all ~17 widgets at
|
- Removed the old post-hoc `setVisible()` loop that hid all ~24 widgets at
|
||||||
once after they were already added. The runtime BASIC/ADVANCED toggle
|
once after they were already added (the flicker cause).
|
||||||
(`on_user_type_change`, used while the dialog is already open and visible)
|
- The runtime BASIC<->ADVANCED toggle (`on_user_type_change`, used while the
|
||||||
is unaffected and still works exactly as before - only the one-time
|
dialog is already open and visible) is unaffected and still works exactly
|
||||||
construction-time visibility set-up changed.
|
as before - only the one-time construction-time visibility set-up changed.
|
||||||
- Reverted the ineffective v0.5.2 attempt (`SetFixedSize` removal /
|
|
||||||
`adjustSize()`) and the ineffective v0.5.3 attempt (removing
|
|
||||||
`bring_to_front()` from `show_modal()`/`BalWaitingDialog.exe()`) back to
|
|
||||||
their original v0.5.0 behaviour, since bisection proved neither was the
|
|
||||||
cause; keeping them would only have added unnecessary risk/diff.
|
|
||||||
|
|
||||||
**Verification:**
|
**Verification:**
|
||||||
|
|
||||||
- Full test suite: `272 passed`, same 2 pre-existing, unrelated failures as
|
- Full test suite: `266 passed` (same as clean v0.5.0), plus the same 2
|
||||||
before (stale `baltx_fees=100` expectation vs the v0.5.0 default of `20`).
|
pre-existing, unrelated failures already present in v0.5.0
|
||||||
|
(`test_core_plugin_base.py::test_default_will_settings` /
|
||||||
|
`test_validate_will_settings`, expecting the old `baltx_fees=100` default
|
||||||
|
that v0.5.0 already changed to `20`).
|
||||||
- `ruff`: no new errors (only pre-existing star-import noise).
|
- `ruff`: no new errors (only pre-existing star-import noise).
|
||||||
- **Confirmed fixed by the owner on Windows** (the actual reporting
|
- Confirmed on Windows by the user that the fix (validated as an isolated
|
||||||
environment), after testing the full real Settings dialog with this fix
|
diagnostic build) removes the flicker.
|
||||||
applied - not just the isolated diagnostic build.
|
- Only `bal/gui/qt/plugin.py` differs from clean v0.5.0; all other files,
|
||||||
|
including all locktime/date/Check-Alive logic, are byte-identical.
|
||||||
|
|
||||||
**Outcome:** DONE. Confirmed resolved by the owner on Windows.
|
**Outcome:** DONE (delivered as test ZIP v0.5.1; commit only after the user
|
||||||
|
confirms the ZIP works on Windows).
|
||||||
|
|||||||
Reference in New Issue
Block a user