forked from bitcoinafterlife/bal-electrum-plugin
Behavior-preserving refactor of the original BAL plugin with clean separation
of business logic from the PyQt GUI.
Layout:
bal/core/ GUI-free logic (util, plugin_base, heirs, will, willexecutors)
bal/gui/qt/ PyQt6 presentation (theme, common, widgets, calendar, dialogs,
lists, window, plugin)
bal/qt.py Qt entry-point shim (works as internal and external zip plugin)
bal/manifest.json standard-conforming metadata
Tooling:
build_zip.py deterministic, zipimport-friendly archive builder
tests/smoke_test.py imports + behavior regression test
tests/external_zip_test.py reproduces Electrum's external-zip loading
Targets Electrum 4.7.2 + PyQt6. Logic kept byte-identical where possible.
60 lines
2.4 KiB
Python
60 lines
2.4 KiB
Python
"""
|
|
bal.gui.qt.theme
|
|
================
|
|
|
|
Pure presentation helpers for the Qt layer.
|
|
|
|
This is where colours and other look-and-feel decisions live, kept apart from
|
|
the core inheritance logic. In particular it hosts :func:`status_color`, which
|
|
used to be ``WillItem.get_color()`` inside ``will.py``.
|
|
|
|
The status flags themselves are computed by the core layer
|
|
(:class:`bal.core.will.WillItem`); this module only translates a will item's
|
|
status into a colour for the transaction list / detail views.
|
|
"""
|
|
|
|
# Status -> hex colour. The first matching status (checked in priority order)
|
|
# wins. These are exactly the colours the original ``WillItem.get_color`` used,
|
|
# so the GUI looks identical after the refactor.
|
|
#
|
|
# The order matters: e.g. an INVALIDATED tx must show orange even if it also
|
|
# carries other flags, so INVALIDATED is checked before everything else.
|
|
_STATUS_COLOR_PRIORITY = (
|
|
("INVALIDATED", "#f87838"), # orange - tx can no longer be mined
|
|
("REPLACED", "#ff97e9"), # pink - superseded by another tx
|
|
("CONFIRMED", "#bfbfbf"), # grey - already mined
|
|
("PENDING", "#ffce30"), # yellow - in mempool, waiting
|
|
)
|
|
|
|
# Default colour used when no status in the priority list matches.
|
|
_DEFAULT_COLOR = "#ffffff"
|
|
|
|
|
|
def status_color(will_item) -> str:
|
|
"""Return the display colour (``"#rrggbb"``) for a :class:`WillItem`.
|
|
|
|
This is a faithful, behaviour-preserving port of the old
|
|
``WillItem.get_color()`` method. The slightly irregular handling of the
|
|
push/check states (which is not a simple priority list) is reproduced
|
|
exactly as in the original code.
|
|
"""
|
|
# First, the simple priority-ordered statuses.
|
|
for status, color in _STATUS_COLOR_PRIORITY:
|
|
if will_item.get_status(status):
|
|
return color
|
|
|
|
# The remaining states need the original branching because of the
|
|
# CHECK_FAIL / CHECKED interaction.
|
|
if will_item.get_status("CHECK_FAIL") and not will_item.get_status("CHECKED"):
|
|
return "#e83845" # red - server check failed
|
|
elif will_item.get_status("CHECKED"):
|
|
return "#8afa6c" # green - server confirmed it stored the tx
|
|
elif will_item.get_status("PUSH_FAIL"):
|
|
return "#e83845" # red - failed to push to will-executor
|
|
elif will_item.get_status("PUSHED"):
|
|
return "#73f3c8" # teal - pushed to will-executor
|
|
elif will_item.get_status("COMPLETE"):
|
|
return "#2bc8ed" # blue - signed
|
|
else:
|
|
return _DEFAULT_COLOR
|