tqt wizard: tweak GoBack behaviour to recalc inputs to previous dialog - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 08118ca1674f58860b5a5a639372c95bc012eb80 DIR parent e2544b893a401128bc28678cf463694418ad65d1 HTML Author: SomberNight <somber.night@protonmail.com> Date: Sat, 11 Apr 2020 15:50:12 +0200 qt wizard: tweak GoBack behaviour to recalc inputs to previous dialog follow-up f13f46c555b979b265c7da9b6e340b6342f9e4b0 When on dialog n user presses "Back", - previously, we went back to when dialog n-1 appeared - now, go back to just after dialog n-2 finishes This way, any calculations between when dialog n-2 finishes and dialog n-1 appears will rerun, potentially populating dialog n-1 differently. Namely if the user presses back on the confirm_seed_dialog, we want to go back to the show_seed_dialog but with a freshly generated seed. Diffstat: M electrum/base_wizard.py | 3 +++ M electrum/gui/qt/installwizard.py | 22 ++++++++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) --- DIR diff --git a/electrum/base_wizard.py b/electrum/base_wizard.py t@@ -60,6 +60,9 @@ class ScriptTypeNotSupported(Exception): pass class GoBack(Exception): pass +class ReRunDialog(Exception): pass + + class ChooseHwDeviceAgain(Exception): pass DIR diff --git a/electrum/gui/qt/installwizard.py b/electrum/gui/qt/installwizard.py t@@ -19,7 +19,7 @@ from PyQt5.QtWidgets import (QWidget, QDialog, QLabel, QHBoxLayout, QMessageBox, from electrum.wallet import Wallet, Abstract_Wallet from electrum.storage import WalletStorage, StorageReadWriteError from electrum.util import UserCancelled, InvalidPassword, WalletFileException, get_new_wallet_name -from electrum.base_wizard import BaseWizard, HWD_SETUP_DECRYPT_WALLET, GoBack +from electrum.base_wizard import BaseWizard, HWD_SETUP_DECRYPT_WALLET, GoBack, ReRunDialog from electrum.i18n import _ from .seed_dialog import SeedLayout, KeysLayout t@@ -97,6 +97,7 @@ def wizard_dialog(func): run_next = kwargs['run_next'] wizard = args[0] # type: InstallWizard while True: + #wizard.logger.debug(f"dialog stack. len: {len(wizard._stack)}. stack: {wizard._stack}") wizard.back_button.setText(_('Back') if wizard.can_go_back() else _('Cancel')) # current dialog try: t@@ -110,11 +111,24 @@ def wizard_dialog(func): raise # next dialog try: - run_next(*out) - except GoBack: + while True: + try: + run_next(*out) + except ReRunDialog: + # restore state, and then let the loop re-run next + wizard.go_back(rerun_previous=False) + else: + break + except GoBack as e: # to go back from the next dialog, we ask the wizard to restore state wizard.go_back(rerun_previous=False) - # and we re-run the current dialog (by continuing) + # and we re-run the current dialog + if wizard.can_go_back(): + # also rerun any calculations that might have populated the inputs to the current dialog, + # by going back to just after the *previous* dialog finished + raise ReRunDialog() from e + else: + continue else: break return func_wrapper