Compare commits
2 Commits
06576cbef3
...
5b109384cf
| Author | SHA1 | Date | |
|---|---|---|---|
|
5b109384cf
|
|||
|
fe81fac3d4
|
@@ -30,6 +30,7 @@ from electrum import constants, json_db
|
|||||||
from electrum.logging import get_logger
|
from electrum.logging import get_logger
|
||||||
from electrum.plugin import BasePlugin
|
from electrum.plugin import BasePlugin
|
||||||
from electrum.transaction import tx_from_any
|
from electrum.transaction import tx_from_any
|
||||||
|
from electrum.util import classproperty
|
||||||
|
|
||||||
_logger = get_logger(__name__)
|
_logger = get_logger(__name__)
|
||||||
|
|
||||||
@@ -169,9 +170,12 @@ class BalPlugin(BasePlugin):
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Human-readable chain name ("bitcoin", "testnet", "regtest", ...).
|
# Human-readable chain name ("bitcoin", "testnet", "regtest", ...).
|
||||||
chainname = (
|
# Must be a classproperty (not a plain class attribute) because the class
|
||||||
constants.net.NET_NAME if constants.net.NET_NAME != "mainnet" else "bitcoin"
|
# is defined before constants.net is set to the correct network — a plain
|
||||||
)
|
# attribute would capture "bitcoin" and never update.
|
||||||
|
@classproperty
|
||||||
|
def chainname(cls):
|
||||||
|
return constants.net.NET_NAME if constants.net.NET_NAME != "mainnet" else "bitcoin"
|
||||||
|
|
||||||
# Default geometry hint for some dialogs (kept from the original code).
|
# Default geometry hint for some dialogs (kept from the original code).
|
||||||
SIZE = (159, 97)
|
SIZE = (159, 97)
|
||||||
|
|||||||
@@ -112,8 +112,6 @@ def is_tor_active():
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
chainname = BalPlugin.chainname
|
|
||||||
|
|
||||||
|
|
||||||
class Willexecutors:
|
class Willexecutors:
|
||||||
|
|
||||||
@@ -146,9 +144,9 @@ class Willexecutors:
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def save(bal_plugin, willexecutors):
|
def save(bal_plugin, willexecutors):
|
||||||
_logger.debug(f"save {willexecutors},{chainname}")
|
_logger.debug(f"save {willexecutors},{BalPlugin.chainname}")
|
||||||
aw = bal_plugin.WILLEXECUTORS.get()
|
aw = bal_plugin.WILLEXECUTORS.get()
|
||||||
aw[chainname] = willexecutors
|
aw[BalPlugin.chainname] = willexecutors
|
||||||
bal_plugin.WILLEXECUTORS.set(aw)
|
bal_plugin.WILLEXECUTORS.set(aw)
|
||||||
_logger.debug(f"saved: {aw}")
|
_logger.debug(f"saved: {aw}")
|
||||||
# bal_plugin.WILLEXECUTORS.set(willexecutors)
|
# bal_plugin.WILLEXECUTORS.set(willexecutors)
|
||||||
@@ -158,7 +156,7 @@ class Willexecutors:
|
|||||||
bal_plugin, update=False, bal_window: Any = None, force=False, task=True
|
bal_plugin, update=False, bal_window: Any = None, force=False, task=True
|
||||||
):
|
):
|
||||||
willexecutors = bal_plugin.WILLEXECUTORS.get()
|
willexecutors = bal_plugin.WILLEXECUTORS.get()
|
||||||
willexecutors = willexecutors.get(chainname, {})
|
willexecutors = willexecutors.get(BalPlugin.chainname, {})
|
||||||
to_del = []
|
to_del = []
|
||||||
for w in willexecutors:
|
for w in willexecutors:
|
||||||
if not isinstance(willexecutors[w], dict):
|
if not isinstance(willexecutors[w], dict):
|
||||||
@@ -172,7 +170,7 @@ class Willexecutors:
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
del willexecutors[w]
|
del willexecutors[w]
|
||||||
bal = bal_plugin.WILLEXECUTORS.default.get(chainname, {})
|
bal = bal_plugin.WILLEXECUTORS.default.get(BalPlugin.chainname, {})
|
||||||
for bal_url, bal_executor in bal.items():
|
for bal_url, bal_executor in bal.items():
|
||||||
if bal_url not in willexecutors:
|
if bal_url not in willexecutors:
|
||||||
_logger.debug(f"force add {bal_url} willexecutor")
|
_logger.debug(f"force add {bal_url} willexecutor")
|
||||||
@@ -368,7 +366,7 @@ class Willexecutors:
|
|||||||
_logger.debug(f"{willexecutor['url']}: {willexecutor['txs']}")
|
_logger.debug(f"{willexecutor['url']}: {willexecutor['txs']}")
|
||||||
if w := Willexecutors.send_request(
|
if w := Willexecutors.send_request(
|
||||||
"post",
|
"post",
|
||||||
willexecutor["url"] + "/" + chainname + "/pushtxs",
|
willexecutor["url"] + "/" + BalPlugin.chainname + "/pushtxs",
|
||||||
data=willexecutor["txs"].encode("ascii"),
|
data=willexecutor["txs"].encode("ascii"),
|
||||||
timeout=timeout,
|
timeout=timeout,
|
||||||
max_retries=max_retries,
|
max_retries=max_retries,
|
||||||
@@ -408,7 +406,7 @@ class Willexecutors:
|
|||||||
# single short timeout instead of retrying 10x with sleeps, which
|
# single short timeout instead of retrying 10x with sleeps, which
|
||||||
# used to freeze the UI for minutes per unreachable server.
|
# used to freeze the UI for minutes per unreachable server.
|
||||||
w = Willexecutors.send_request(
|
w = Willexecutors.send_request(
|
||||||
"get", url + "/" + chainname + "/info",
|
"get", url + "/" + BalPlugin.chainname + "/info",
|
||||||
timeout=timeout, max_retries=max_retries, retry_sleep=retry_sleep,
|
timeout=timeout, max_retries=max_retries, retry_sleep=retry_sleep,
|
||||||
)
|
)
|
||||||
if isinstance(w, dict):
|
if isinstance(w, dict):
|
||||||
@@ -788,7 +786,7 @@ class Willexecutors:
|
|||||||
welist_server = welist_server if welist_server[-1] == '/' else welist_server+'/'
|
welist_server = welist_server if welist_server[-1] == '/' else welist_server+'/'
|
||||||
willexecutors = Willexecutors.send_request(
|
willexecutors = Willexecutors.send_request(
|
||||||
"get",
|
"get",
|
||||||
f"{welist_server}data/{chainname}?page=0&limit=100",
|
f"{welist_server}data/{BalPlugin.chainname}?page=0&limit=100",
|
||||||
)
|
)
|
||||||
if not isinstance(willexecutors, dict):
|
if not isinstance(willexecutors, dict):
|
||||||
_logger.warning(
|
_logger.warning(
|
||||||
|
|||||||
@@ -643,8 +643,7 @@ class BalBuildWillDialog(BalDialog):
|
|||||||
return None, tx
|
return None, tx
|
||||||
except NoHeirsException:
|
except NoHeirsException:
|
||||||
self.msg_set_status("Checking variables", varrow,"No Heirs",self.COLOR_ERROR)
|
self.msg_set_status("Checking variables", varrow,"No Heirs",self.COLOR_ERROR)
|
||||||
#self.msg_set_checking("No Heirs")
|
return "no_heirs", None
|
||||||
return False, None
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise e
|
raise e
|
||||||
try:
|
try:
|
||||||
@@ -1439,6 +1438,10 @@ class BalBuildWillDialog(BalDialog):
|
|||||||
self._add_no_willexecutor_buttons()
|
self._add_no_willexecutor_buttons()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if self.have_to_sign == "no_heirs":
|
||||||
|
self._add_no_heirs_buttons()
|
||||||
|
return
|
||||||
|
|
||||||
_logger.debug("have to sign {}".format(self.have_to_sign))
|
_logger.debug("have to sign {}".format(self.have_to_sign))
|
||||||
password = None
|
password = None
|
||||||
if self.have_to_sign is None:
|
if self.have_to_sign is None:
|
||||||
@@ -1646,6 +1649,70 @@ class BalBuildWillDialog(BalDialog):
|
|||||||
on_error=self.on_error_phase1,
|
on_error=self.on_error_phase1,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------ #
|
||||||
|
# No-heirs error handling (mirrors the no-willexecutor pattern above)
|
||||||
|
# ------------------------------------------------------------------ #
|
||||||
|
|
||||||
|
def _add_no_heirs_buttons(self):
|
||||||
|
"""Add "Heirs", "Wizard" and "Close" buttons when no heirs are
|
||||||
|
configured."""
|
||||||
|
if getattr(self, "_no_heirs_buttons_added", False):
|
||||||
|
return
|
||||||
|
self._no_heirs_buttons_added = True
|
||||||
|
btn_row = QHBoxLayout()
|
||||||
|
btn_row.addStretch(1)
|
||||||
|
|
||||||
|
heirs_btn = QPushButton(_("Heirs"))
|
||||||
|
heirs_btn.clicked.connect(self._open_heir_dialog)
|
||||||
|
btn_row.addWidget(heirs_btn)
|
||||||
|
|
||||||
|
wizard_btn = QPushButton(_("\U0001f52e Wizard"))
|
||||||
|
wizard_btn.clicked.connect(self._open_heirs_wizard)
|
||||||
|
btn_row.addWidget(wizard_btn)
|
||||||
|
|
||||||
|
close_btn = QPushButton(_("Close"))
|
||||||
|
close_btn.clicked.connect(self.close)
|
||||||
|
btn_row.addWidget(close_btn)
|
||||||
|
|
||||||
|
self._no_heirs_layout = btn_row
|
||||||
|
self.vbox.addLayout(btn_row)
|
||||||
|
self.resize(self.vbox.sizeHint())
|
||||||
|
|
||||||
|
def _open_heir_dialog(self):
|
||||||
|
"""Open the heirs management dialog, then retry the build."""
|
||||||
|
d = HeirsDialog(self.bal_window, parent=self)
|
||||||
|
d.exec()
|
||||||
|
self._retry_build_after_heirs()
|
||||||
|
|
||||||
|
def _open_heirs_wizard(self):
|
||||||
|
"""Close the build-will dialog and open the wizard at the heirs
|
||||||
|
step so the user can add heirs."""
|
||||||
|
self.close()
|
||||||
|
wizard = BalWizardDialog(self.bal_window)
|
||||||
|
wizard.exec()
|
||||||
|
|
||||||
|
def _retry_build_after_heirs(self):
|
||||||
|
"""Remove the no-heirs buttons, reset the message panel,
|
||||||
|
and re-run ``task_phase1`` on the same thread."""
|
||||||
|
self._no_heirs_buttons_added = False
|
||||||
|
if self._no_heirs_layout:
|
||||||
|
while self._no_heirs_layout.count():
|
||||||
|
item = self._no_heirs_layout.takeAt(0)
|
||||||
|
w = item.widget()
|
||||||
|
if w:
|
||||||
|
w.setParent(None)
|
||||||
|
w.deleteLater()
|
||||||
|
self.vbox.removeItem(self._no_heirs_layout)
|
||||||
|
self._no_heirs_layout = None
|
||||||
|
self.labels = []
|
||||||
|
self.msg_update()
|
||||||
|
self.thread.add(
|
||||||
|
self.task_phase1,
|
||||||
|
on_success=self.on_success_phase1,
|
||||||
|
on_done=self.on_accept,
|
||||||
|
on_error=self.on_error_phase1,
|
||||||
|
)
|
||||||
|
|
||||||
def _ics_provider(self):
|
def _ics_provider(self):
|
||||||
"""Return the .ics content for the current will data."""
|
"""Return the .ics content for the current will data."""
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
@@ -2197,3 +2264,49 @@ class WillExecutorDialog(BalDialog, MessageBoxMixin):
|
|||||||
event.accept()
|
event.accept()
|
||||||
|
|
||||||
|
|
||||||
|
class HeirsDialog(BalDialog, MessageBoxMixin):
|
||||||
|
def __init__(self, bal_window, parent=None):
|
||||||
|
if not parent:
|
||||||
|
parent = bal_window.window
|
||||||
|
BalDialog.__init__(self, parent, bal_window.bal_plugin)
|
||||||
|
self.bal_plugin = bal_window.bal_plugin
|
||||||
|
self.bal_window = bal_window
|
||||||
|
|
||||||
|
self.setWindowTitle(_("Heirs"))
|
||||||
|
self.setMinimumSize(800, 300)
|
||||||
|
|
||||||
|
from .lists import HeirListWidget
|
||||||
|
vbox = QVBoxLayout(self)
|
||||||
|
self.heir_list_widget = HeirListWidget(bal_window, self)
|
||||||
|
vbox.addWidget(self.heir_list_widget)
|
||||||
|
|
||||||
|
btn_row = QHBoxLayout()
|
||||||
|
new_heir_btn = QPushButton(_("New Heir"))
|
||||||
|
new_heir_btn.clicked.connect(self._add_heir)
|
||||||
|
btn_row.addWidget(new_heir_btn)
|
||||||
|
|
||||||
|
import_btn = QPushButton(_("Import"))
|
||||||
|
import_btn.clicked.connect(self._import_heirs)
|
||||||
|
btn_row.addWidget(import_btn)
|
||||||
|
|
||||||
|
export_btn = QPushButton(_("Export"))
|
||||||
|
export_btn.clicked.connect(self._export_heirs)
|
||||||
|
btn_row.addWidget(export_btn)
|
||||||
|
|
||||||
|
btn_row.addStretch(1)
|
||||||
|
vbox.addLayout(btn_row)
|
||||||
|
|
||||||
|
def _add_heir(self):
|
||||||
|
self.bal_window.new_heir_dialog()
|
||||||
|
self.heir_list_widget.update()
|
||||||
|
|
||||||
|
def _import_heirs(self):
|
||||||
|
self.bal_window.import_heirs()
|
||||||
|
self.heir_list_widget.update()
|
||||||
|
|
||||||
|
def _export_heirs(self):
|
||||||
|
self.bal_window.export_heirs()
|
||||||
|
|
||||||
|
def closeEvent(self, event):
|
||||||
|
event.accept()
|
||||||
|
|
||||||
|
|||||||
@@ -491,14 +491,6 @@ class Plugin(BalPlugin, EventListener):
|
|||||||
self.MAX_WILLEXECUTOR_FEE, minimum=0, maximum=10000000
|
self.MAX_WILLEXECUTOR_FEE, minimum=0, maximum=10000000
|
||||||
)
|
)
|
||||||
|
|
||||||
# "No will-executor TX" checkbox. Bound to the persisted NO_WILLEXECUTOR
|
|
||||||
# config (default ON, see plugin_base.py), the SAME config used by the
|
|
||||||
# checkbox inside the "Build your will" wizard's will-executor download
|
|
||||||
# window, so the two stay in sync automatically. When enabled the plugin
|
|
||||||
# also builds a will that does not require a will-executor (e.g. it can
|
|
||||||
# be saved on a USB stick and a copy given to the heirs).
|
|
||||||
heir_no_willexecutor = BalCheckBox(self.NO_WILLEXECUTOR)
|
|
||||||
|
|
||||||
# "Rebuild will on wallet close" checkbox. Bound to the persisted
|
# "Rebuild will on wallet close" checkbox. Bound to the persisted
|
||||||
# REBUILD_ON_CLOSE config (default ON). When ticked, closing the wallet
|
# REBUILD_ON_CLOSE config (default ON). When ticked, closing the wallet
|
||||||
# / quitting Electrum runs the "Build your will" wizard to rebuild and
|
# / quitting Electrum runs the "Build your will" wizard to rebuild and
|
||||||
@@ -704,35 +696,13 @@ class Plugin(BalPlugin, EventListener):
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
grid.addWidget(_make_reset_btn(self.EDITABLE_DATES, heir_editable_dates, "check"), 3, 3)
|
grid.addWidget(_make_reset_btn(self.EDITABLE_DATES, heir_editable_dates, "check"), 3, 3)
|
||||||
# "Add transaction without will-executor" setting (formerly labelled
|
|
||||||
# "No will-executor TX"). When ON the plugin ALSO builds the backup
|
|
||||||
# inheritance transaction that does NOT require a will-executor (the
|
|
||||||
# "celeste"/light-blue one shown in the will list): it can be saved on a
|
|
||||||
# USB stick and a copy handed to the heirs. When OFF only the
|
|
||||||
# transactions destined to the selected will-executors are built.
|
|
||||||
#
|
|
||||||
# Placed here (row 5, right below "Panel editable Date and Fee" and above
|
|
||||||
# "Number of reminders") at the user's request so related options sit
|
|
||||||
# together. The remaining grid rows below were renumbered accordingly.
|
|
||||||
add_widget(
|
|
||||||
grid,
|
|
||||||
"Add transaction without willexecutor",
|
|
||||||
heir_no_willexecutor,
|
|
||||||
4,
|
|
||||||
(
|
|
||||||
"Create a will that does not require a Will-executor; it can be "
|
|
||||||
"saved, for example, on a USB stick, and a copy can be given to "
|
|
||||||
"the heirs."
|
|
||||||
),
|
|
||||||
)
|
|
||||||
grid.addWidget(_make_reset_btn(self.NO_WILLEXECUTOR, heir_no_willexecutor, "check"), 4, 3)
|
|
||||||
# Max willexecutor fee: maximum fee (in satoshi) allowed for a single
|
# Max willexecutor fee: maximum fee (in satoshi) allowed for a single
|
||||||
# will-executor. Visible to all users (BASIC and ADVANCED).
|
# will-executor. Visible to all users (BASIC and ADVANCED).
|
||||||
add_widget(
|
add_widget(
|
||||||
grid,
|
grid,
|
||||||
"Max Will-Executor Fee (satoshi)",
|
"Max Will-Executor Fee (satoshi)",
|
||||||
heir_max_willexecutor_fee,
|
heir_max_willexecutor_fee,
|
||||||
5,
|
4,
|
||||||
(
|
(
|
||||||
"Maximum fee (in satoshi) allowed to be paid to a single "
|
"Maximum fee (in satoshi) allowed to be paid to a single "
|
||||||
"will-executor. If a will-executor charges more than this, "
|
"will-executor. If a will-executor charges more than this, "
|
||||||
@@ -740,14 +710,14 @@ class Plugin(BalPlugin, EventListener):
|
|||||||
"Default: 500,000 satoshi (0.005 BTC)."
|
"Default: 500,000 satoshi (0.005 BTC)."
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
grid.addWidget(_make_reset_btn(self.MAX_WILLEXECUTOR_FEE, heir_max_willexecutor_fee, "spin"), 5, 3)
|
grid.addWidget(_make_reset_btn(self.MAX_WILLEXECUTOR_FEE, heir_max_willexecutor_fee, "spin"), 4, 3)
|
||||||
# User Type selector placed BEFORE the advanced-only settings so the
|
# User Type selector placed BEFORE the advanced-only settings so the
|
||||||
# user chooses basic/advanced first, then sees the relevant options.
|
# user chooses basic/advanced first, then sees the relevant options.
|
||||||
add_widget(
|
add_widget(
|
||||||
grid,
|
grid,
|
||||||
"User Type",
|
"User Type",
|
||||||
user_type_combo,
|
user_type_combo,
|
||||||
6,
|
5,
|
||||||
(
|
(
|
||||||
"Choose how much detail the plugin shows.\n\n"
|
"Choose how much detail the plugin shows.\n\n"
|
||||||
"BASIC: simplified interface, safe configuration for most "
|
"BASIC: simplified interface, safe configuration for most "
|
||||||
@@ -758,7 +728,7 @@ class Plugin(BalPlugin, EventListener):
|
|||||||
"editable."
|
"editable."
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
grid.addWidget(_make_reset_btn(self.USER_TYPE, user_type_combo, "user_type"), 6, 3)
|
grid.addWidget(_make_reset_btn(self.USER_TYPE, user_type_combo, "user_type"), 5, 3)
|
||||||
# Number of reminders, event summary and event description are visible
|
# Number of reminders, event summary and event description are visible
|
||||||
# only in ADVANCED mode. In BASIC mode the factory defaults are always
|
# only in ADVANCED mode. In BASIC mode the factory defaults are always
|
||||||
# used and these settings are hidden.
|
# used and these settings are hidden.
|
||||||
@@ -767,11 +737,11 @@ class Plugin(BalPlugin, EventListener):
|
|||||||
"How many reminder alarms the exported calendar (.ics) event "
|
"How many reminder alarms the exported calendar (.ics) event "
|
||||||
"contains. Range: 1 to 5 (default 3). Only used in ADVANCED mode."
|
"contains. Range: 1 to 5 (default 3). Only used in ADVANCED mode."
|
||||||
)
|
)
|
||||||
grid.addWidget(_hide_if_basic(lbl_num_reminders), 7, 0)
|
grid.addWidget(_hide_if_basic(lbl_num_reminders), 6, 0)
|
||||||
grid.addWidget(_hide_if_basic(heir_num_reminders), 7, 1)
|
grid.addWidget(_hide_if_basic(heir_num_reminders), 6, 1)
|
||||||
grid.addWidget(_hide_if_basic(help_num_reminders), 7, 2)
|
grid.addWidget(_hide_if_basic(help_num_reminders), 6, 2)
|
||||||
reset_btn_6 = _make_reset_btn(self.NUM_REMINDERS, heir_num_reminders, "spin")
|
reset_btn_6 = _make_reset_btn(self.NUM_REMINDERS, heir_num_reminders, "spin")
|
||||||
grid.addWidget(_hide_if_basic(reset_btn_6), 7, 3)
|
grid.addWidget(_hide_if_basic(reset_btn_6), 6, 3)
|
||||||
|
|
||||||
lbl_event_summary = QLabel(_("Event summary"))
|
lbl_event_summary = QLabel(_("Event summary"))
|
||||||
help_event_summary = HelpButton(
|
help_event_summary = HelpButton(
|
||||||
@@ -781,11 +751,11 @@ class Plugin(BalPlugin, EventListener):
|
|||||||
" $heirs_complete: list of heirs name,address,amount\n"
|
" $heirs_complete: list of heirs name,address,amount\n"
|
||||||
"Only used in ADVANCED mode."
|
"Only used in ADVANCED mode."
|
||||||
)
|
)
|
||||||
grid.addWidget(_hide_if_basic(lbl_event_summary), 8, 0)
|
grid.addWidget(_hide_if_basic(lbl_event_summary), 7, 0)
|
||||||
grid.addWidget(_hide_if_basic(edit_event_summary), 8, 1)
|
grid.addWidget(_hide_if_basic(edit_event_summary), 7, 1)
|
||||||
grid.addWidget(_hide_if_basic(help_event_summary), 8, 2)
|
grid.addWidget(_hide_if_basic(help_event_summary), 7, 2)
|
||||||
reset_btn_7 = _make_reset_btn(self.EVENT_SUMMARY, edit_event_summary, "line")
|
reset_btn_7 = _make_reset_btn(self.EVENT_SUMMARY, edit_event_summary, "line")
|
||||||
grid.addWidget(_hide_if_basic(reset_btn_7), 8, 3)
|
grid.addWidget(_hide_if_basic(reset_btn_7), 7, 3)
|
||||||
|
|
||||||
lbl_event_description = QLabel(_("Event description"))
|
lbl_event_description = QLabel(_("Event description"))
|
||||||
help_event_description = HelpButton(
|
help_event_description = HelpButton(
|
||||||
@@ -795,11 +765,11 @@ class Plugin(BalPlugin, EventListener):
|
|||||||
" $heirs_complete: list of heirs name,address,amount\n"
|
" $heirs_complete: list of heirs name,address,amount\n"
|
||||||
"Only used in ADVANCED mode."
|
"Only used in ADVANCED mode."
|
||||||
)
|
)
|
||||||
grid.addWidget(_hide_if_basic(lbl_event_description), 9, 0)
|
grid.addWidget(_hide_if_basic(lbl_event_description), 8, 0)
|
||||||
grid.addWidget(_hide_if_basic(edit_event_description), 9, 1)
|
grid.addWidget(_hide_if_basic(edit_event_description), 8, 1)
|
||||||
grid.addWidget(_hide_if_basic(help_event_description), 9, 2)
|
grid.addWidget(_hide_if_basic(help_event_description), 8, 2)
|
||||||
reset_btn_8 = _make_reset_btn(self.EVENT_DESCRIPTION, edit_event_description, "text")
|
reset_btn_8 = _make_reset_btn(self.EVENT_DESCRIPTION, edit_event_description, "text")
|
||||||
grid.addWidget(_hide_if_basic(reset_btn_8), 9, 3)
|
grid.addWidget(_hide_if_basic(reset_btn_8), 8, 3)
|
||||||
# Welist server URL: shown only in ADVANCED mode. In BASIC mode the
|
# Welist server URL: shown only in ADVANCED mode. In BASIC mode the
|
||||||
# factory default is always used and the setting is hidden.
|
# factory default is always used and the setting is hidden.
|
||||||
lbl_welist_server = QLabel(_("Welist Server URL"))
|
lbl_welist_server = QLabel(_("Welist Server URL"))
|
||||||
@@ -807,11 +777,11 @@ class Plugin(BalPlugin, EventListener):
|
|||||||
"URL of the server that provides the will-executor list. "
|
"URL of the server that provides the will-executor list. "
|
||||||
"Only available in ADVANCED mode."
|
"Only available in ADVANCED mode."
|
||||||
)
|
)
|
||||||
grid.addWidget(_hide_if_basic(lbl_welist_server), 10, 0)
|
grid.addWidget(_hide_if_basic(lbl_welist_server), 9, 0)
|
||||||
grid.addWidget(_hide_if_basic(edit_welist_server), 10, 1)
|
grid.addWidget(_hide_if_basic(edit_welist_server), 9, 1)
|
||||||
grid.addWidget(_hide_if_basic(help_welist_server), 10, 2)
|
grid.addWidget(_hide_if_basic(help_welist_server), 9, 2)
|
||||||
reset_btn_9 = _make_reset_btn(self.WELIST_SERVER, edit_welist_server, "line")
|
reset_btn_9 = _make_reset_btn(self.WELIST_SERVER, edit_welist_server, "line")
|
||||||
grid.addWidget(_hide_if_basic(reset_btn_9), 10, 3)
|
grid.addWidget(_hide_if_basic(reset_btn_9), 9, 3)
|
||||||
|
|
||||||
lbl_calendar_app = QLabel(_("Calendar app command"))
|
lbl_calendar_app = QLabel(_("Calendar app command"))
|
||||||
help_calendar_app = HelpButton(
|
help_calendar_app = HelpButton(
|
||||||
@@ -819,11 +789,11 @@ class Plugin(BalPlugin, EventListener):
|
|||||||
"Leave empty to use the system default (xdg-open/open/start).\n"
|
"Leave empty to use the system default (xdg-open/open/start).\n"
|
||||||
"Only used in ADVANCED mode."
|
"Only used in ADVANCED mode."
|
||||||
)
|
)
|
||||||
grid.addWidget(_hide_if_basic(lbl_calendar_app), 11, 0)
|
grid.addWidget(_hide_if_basic(lbl_calendar_app), 10, 0)
|
||||||
grid.addWidget(_hide_if_basic(edit_calendar_app), 11, 1)
|
grid.addWidget(_hide_if_basic(edit_calendar_app), 10, 1)
|
||||||
grid.addWidget(_hide_if_basic(help_calendar_app), 11, 2)
|
grid.addWidget(_hide_if_basic(help_calendar_app), 10, 2)
|
||||||
reset_btn_10 = _make_reset_btn(self.CALENDAR_APP, edit_calendar_app, "line")
|
reset_btn_10 = _make_reset_btn(self.CALENDAR_APP, edit_calendar_app, "line")
|
||||||
grid.addWidget(_hide_if_basic(reset_btn_10), 11, 3)
|
grid.addWidget(_hide_if_basic(reset_btn_10), 10, 3)
|
||||||
|
|
||||||
# Save-in-history toggle and history label: advanced-only rows. The
|
# Save-in-history toggle and history label: advanced-only rows. The
|
||||||
# label field is disabled while the checkbox is off (see
|
# label field is disabled while the checkbox is off (see
|
||||||
@@ -836,11 +806,11 @@ class Plugin(BalPlugin, EventListener):
|
|||||||
" {willexecutor}: replaced with the will-executor URL of the item\n"
|
" {willexecutor}: replaced with the will-executor URL of the item\n"
|
||||||
"Only used in ADVANCED mode."
|
"Only used in ADVANCED mode."
|
||||||
)
|
)
|
||||||
grid.addWidget(_hide_if_basic(lbl_save_history), 12, 0)
|
grid.addWidget(_hide_if_basic(lbl_save_history), 11, 0)
|
||||||
grid.addWidget(_hide_if_basic(heir_save_history), 12, 1)
|
grid.addWidget(_hide_if_basic(heir_save_history), 11, 1)
|
||||||
grid.addWidget(_hide_if_basic(help_save_history), 12, 2)
|
grid.addWidget(_hide_if_basic(help_save_history), 11, 2)
|
||||||
reset_btn_11 = _make_reset_btn(self.SAVE_HISTORY, heir_save_history, "check")
|
reset_btn_11 = _make_reset_btn(self.SAVE_HISTORY, heir_save_history, "check")
|
||||||
grid.addWidget(_hide_if_basic(reset_btn_11), 12, 3)
|
grid.addWidget(_hide_if_basic(reset_btn_11), 11, 3)
|
||||||
|
|
||||||
lbl_history_label = QLabel(_("History label"))
|
lbl_history_label = QLabel(_("History label"))
|
||||||
help_history_label = HelpButton(
|
help_history_label = HelpButton(
|
||||||
@@ -850,11 +820,11 @@ class Plugin(BalPlugin, EventListener):
|
|||||||
" {willexecutor}: replaced with the will-executor URL of the item\n"
|
" {willexecutor}: replaced with the will-executor URL of the item\n"
|
||||||
"Only used in ADVANCED mode."
|
"Only used in ADVANCED mode."
|
||||||
)
|
)
|
||||||
grid.addWidget(_hide_if_basic(lbl_history_label), 13, 0)
|
grid.addWidget(_hide_if_basic(lbl_history_label), 12, 0)
|
||||||
grid.addWidget(_hide_if_basic(edit_history_label), 13, 1)
|
grid.addWidget(_hide_if_basic(edit_history_label), 12, 1)
|
||||||
grid.addWidget(_hide_if_basic(help_history_label), 13, 2)
|
grid.addWidget(_hide_if_basic(help_history_label), 12, 2)
|
||||||
reset_btn_12 = _make_reset_btn(self.HISTORY_LABEL, edit_history_label, "line")
|
reset_btn_12 = _make_reset_btn(self.HISTORY_LABEL, edit_history_label, "line")
|
||||||
grid.addWidget(_hide_if_basic(reset_btn_12), 13, 3)
|
grid.addWidget(_hide_if_basic(reset_btn_12), 12, 3)
|
||||||
|
|
||||||
# NOTE: the ADVANCED-only widgets above have ALREADY been given their
|
# NOTE: the ADVANCED-only widgets above have ALREADY been given their
|
||||||
# correct initial visibility inline (via _hide_if_basic) BEFORE being
|
# correct initial visibility inline (via _hide_if_basic) BEFORE being
|
||||||
@@ -863,12 +833,12 @@ class Plugin(BalPlugin, EventListener):
|
|||||||
# the Windows relayout flicker. Do NOT reintroduce a post-hoc
|
# the Windows relayout flicker. Do NOT reintroduce a post-hoc
|
||||||
# setVisible() loop here.
|
# setVisible() loop here.
|
||||||
|
|
||||||
grid.addWidget(heir_repush, 14, 0)
|
grid.addWidget(heir_repush, 13, 0)
|
||||||
grid.addWidget(
|
grid.addWidget(
|
||||||
HelpButton(
|
HelpButton(
|
||||||
"Broadcast all transactions to willexecutors including those already pushed"
|
"Broadcast all transactions to willexecutors including those already pushed"
|
||||||
),
|
),
|
||||||
14,
|
13,
|
||||||
2,
|
2,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -882,13 +852,13 @@ class Plugin(BalPlugin, EventListener):
|
|||||||
"When disabled, the will is only rebuilt when you press Check or "
|
"When disabled, the will is only rebuilt when you press Check or "
|
||||||
"Prepare. The last built state is still saved to the wallet."
|
"Prepare. The last built state is still saved to the wallet."
|
||||||
)
|
)
|
||||||
grid.addWidget(lbl_rebuild_on_close, 15, 0)
|
grid.addWidget(lbl_rebuild_on_close, 14, 0)
|
||||||
grid.addWidget(heir_rebuild_on_close, 15, 1)
|
grid.addWidget(heir_rebuild_on_close, 14, 1)
|
||||||
grid.addWidget(help_rebuild_on_close, 15, 2)
|
grid.addWidget(help_rebuild_on_close, 14, 2)
|
||||||
reset_btn_rebuild_on_close = _make_reset_btn(
|
reset_btn_rebuild_on_close = _make_reset_btn(
|
||||||
self.REBUILD_ON_CLOSE, heir_rebuild_on_close, "check"
|
self.REBUILD_ON_CLOSE, heir_rebuild_on_close, "check"
|
||||||
)
|
)
|
||||||
grid.addWidget(reset_btn_rebuild_on_close, 15, 3)
|
grid.addWidget(reset_btn_rebuild_on_close, 14, 3)
|
||||||
|
|
||||||
# "Rebuild automatically on new transactions" row (always visible,
|
# "Rebuild automatically on new transactions" row (always visible,
|
||||||
# BASIC + ADVANCED), right below the "Rebuild will on wallet close"
|
# BASIC + ADVANCED), right below the "Rebuild will on wallet close"
|
||||||
@@ -906,13 +876,13 @@ class Plugin(BalPlugin, EventListener):
|
|||||||
"When disabled (default), the will is only rebuilt on Check / "
|
"When disabled (default), the will is only rebuilt on Check / "
|
||||||
"Prepare / wallet close."
|
"Prepare / wallet close."
|
||||||
)
|
)
|
||||||
grid.addWidget(lbl_auto_rebuild, 16, 0)
|
grid.addWidget(lbl_auto_rebuild, 15, 0)
|
||||||
grid.addWidget(heir_auto_rebuild, 16, 1)
|
grid.addWidget(heir_auto_rebuild, 15, 1)
|
||||||
grid.addWidget(help_auto_rebuild, 16, 2)
|
grid.addWidget(help_auto_rebuild, 15, 2)
|
||||||
reset_btn_auto_rebuild = _make_reset_btn(
|
reset_btn_auto_rebuild = _make_reset_btn(
|
||||||
self.AUTO_REBUILD, heir_auto_rebuild, "check"
|
self.AUTO_REBUILD, heir_auto_rebuild, "check"
|
||||||
)
|
)
|
||||||
grid.addWidget(reset_btn_auto_rebuild, 16, 3)
|
grid.addWidget(reset_btn_auto_rebuild, 15, 3)
|
||||||
|
|
||||||
# ----------------------------------------------------------------- #
|
# ----------------------------------------------------------------- #
|
||||||
# Group C / C4b: "Reset" button that restores the dialog settings to #
|
# Group C / C4b: "Reset" button that restores the dialog settings to #
|
||||||
@@ -938,7 +908,6 @@ class Plugin(BalPlugin, EventListener):
|
|||||||
(self.AUTO_SIGN, heir_auto_sign, "check"),
|
(self.AUTO_SIGN, heir_auto_sign, "check"),
|
||||||
(self.EDITABLE_DATES, heir_editable_dates, "check"),
|
(self.EDITABLE_DATES, heir_editable_dates, "check"),
|
||||||
(self.NUM_REMINDERS, heir_num_reminders, "spin"),
|
(self.NUM_REMINDERS, heir_num_reminders, "spin"),
|
||||||
(self.NO_WILLEXECUTOR, heir_no_willexecutor, "check"),
|
|
||||||
(self.MAX_WILLEXECUTOR_FEE, heir_max_willexecutor_fee, "spin"),
|
(self.MAX_WILLEXECUTOR_FEE, heir_max_willexecutor_fee, "spin"),
|
||||||
(self.EVENT_SUMMARY, edit_event_summary, "line"),
|
(self.EVENT_SUMMARY, edit_event_summary, "line"),
|
||||||
(self.EVENT_DESCRIPTION, edit_event_description, "text"),
|
(self.EVENT_DESCRIPTION, edit_event_description, "text"),
|
||||||
|
|||||||
Reference in New Issue
Block a user