qt: wizard run_upgrades
This commit is contained in:
@@ -43,8 +43,7 @@ except Exception as e:
|
|||||||
"you may try 'sudo apt-get install python3-pyqt5'") from e
|
"you may try 'sudo apt-get install python3-pyqt5'") from e
|
||||||
|
|
||||||
from PyQt5.QtGui import QGuiApplication
|
from PyQt5.QtGui import QGuiApplication
|
||||||
from PyQt5.QtWidgets import (QApplication, QSystemTrayIcon, QWidget, QMenu,
|
from PyQt5.QtWidgets import QApplication, QSystemTrayIcon, QWidget, QMenu, QMessageBox
|
||||||
QMessageBox)
|
|
||||||
from PyQt5.QtCore import QObject, pyqtSignal, QTimer, Qt
|
from PyQt5.QtCore import QObject, pyqtSignal, QTimer, Qt
|
||||||
import PyQt5.QtCore as QtCore
|
import PyQt5.QtCore as QtCore
|
||||||
|
|
||||||
@@ -68,7 +67,7 @@ from electrum.gui import BaseElectrumGui
|
|||||||
from electrum.simple_config import SimpleConfig
|
from electrum.simple_config import SimpleConfig
|
||||||
|
|
||||||
from .installwizard import InstallWizard, WalletAlreadyOpenInMemory
|
from .installwizard import InstallWizard, WalletAlreadyOpenInMemory
|
||||||
from .util import read_QIcon, ColorScheme, custom_message_box, MessageBoxMixin
|
from .util import read_QIcon, ColorScheme, custom_message_box, MessageBoxMixin, WWLabel
|
||||||
from .main_window import ElectrumWindow
|
from .main_window import ElectrumWindow
|
||||||
from .network_dialog import NetworkDialog
|
from .network_dialog import NetworkDialog
|
||||||
from .stylesheet_patcher import patch_qt_stylesheet
|
from .stylesheet_patcher import patch_qt_stylesheet
|
||||||
@@ -403,15 +402,15 @@ class ElectrumGui(BaseElectrumGui, Logger):
|
|||||||
return window
|
return window
|
||||||
|
|
||||||
def _start_wizard_to_select_or_create_wallet(self, path) -> Optional[Abstract_Wallet]:
|
def _start_wizard_to_select_or_create_wallet(self, path) -> Optional[Abstract_Wallet]:
|
||||||
dialog = QENewWalletWizard(self.config, self.app, self.plugins, self.daemon, path)
|
wizard = QENewWalletWizard(self.config, self.app, self.plugins, self.daemon, path)
|
||||||
result = dialog.exec()
|
result = wizard.exec()
|
||||||
# TODO: use dialog.open() instead to avoid new event loop spawn?
|
# TODO: use dialog.open() instead to avoid new event loop spawn?
|
||||||
self.logger.info(f'{result}')
|
self.logger.info(f'{result}')
|
||||||
if result == QENewWalletWizard.Rejected:
|
if result == QENewWalletWizard.Rejected:
|
||||||
self.logger.info('ok bye bye')
|
self.logger.info('ok bye bye')
|
||||||
return
|
return
|
||||||
|
|
||||||
d = dialog.get_wizard_data()
|
d = wizard.get_wizard_data()
|
||||||
|
|
||||||
if d['wallet_is_open']:
|
if d['wallet_is_open']:
|
||||||
for window in self.windows:
|
for window in self.windows:
|
||||||
@@ -421,8 +420,8 @@ class ElectrumGui(BaseElectrumGui, Logger):
|
|||||||
|
|
||||||
if not d['wallet_exists']:
|
if not d['wallet_exists']:
|
||||||
self.logger.info('about to create wallet')
|
self.logger.info('about to create wallet')
|
||||||
dialog.create_storage()
|
wizard.create_storage()
|
||||||
wallet_file = dialog.path
|
wallet_file = wizard.path
|
||||||
else:
|
else:
|
||||||
wallet_file = d['wallet_name']
|
wallet_file = d['wallet_name']
|
||||||
|
|
||||||
@@ -430,9 +429,12 @@ class ElectrumGui(BaseElectrumGui, Logger):
|
|||||||
if storage.is_encrypted_with_user_pw() or storage.is_encrypted_with_hw_device():
|
if storage.is_encrypted_with_user_pw() or storage.is_encrypted_with_hw_device():
|
||||||
storage.decrypt(d['password'])
|
storage.decrypt(d['password'])
|
||||||
|
|
||||||
db = WalletDB(storage.read(), storage=storage, manual_upgrades=False)
|
db = WalletDB(storage.read(), storage=storage, manual_upgrades=True)
|
||||||
# TODO
|
if db.requires_split() or db.requires_upgrade():
|
||||||
# wizard.run_upgrades(storage, db)
|
try:
|
||||||
|
wizard.run_upgrades(db)
|
||||||
|
except UserCancelled:
|
||||||
|
return
|
||||||
# TODO
|
# TODO
|
||||||
# return if wallet creation is not complete
|
# return if wallet creation is not complete
|
||||||
# if storage is None or db.get_action():
|
# if storage is None or db.get_action():
|
||||||
|
|||||||
@@ -1,13 +1,14 @@
|
|||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import threading
|
import threading
|
||||||
|
import time
|
||||||
|
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
from PyQt5.QtCore import Qt, QTimer, QRect, pyqtSignal
|
from PyQt5.QtCore import Qt, QTimer, QRect, pyqtSignal
|
||||||
from PyQt5.QtGui import QPen, QPainter, QPalette
|
from PyQt5.QtGui import QPen, QPainter, QPalette
|
||||||
from PyQt5.QtWidgets import (QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton, QWidget,
|
from PyQt5.QtWidgets import (QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton, QWidget,
|
||||||
QFileDialog, QSlider, QGridLayout)
|
QFileDialog, QSlider, QGridLayout, QDialog, QApplication)
|
||||||
|
|
||||||
from electrum.bip32 import is_bip32_derivation, BIP32Node, normalize_bip32_derivation, xpub_type
|
from electrum.bip32 import is_bip32_derivation, BIP32Node, normalize_bip32_derivation, xpub_type
|
||||||
from electrum.daemon import Daemon
|
from electrum.daemon import Daemon
|
||||||
@@ -15,7 +16,7 @@ from electrum.i18n import _
|
|||||||
from electrum.keystore import bip44_derivation, bip39_to_seed, purpose48_derivation
|
from electrum.keystore import bip44_derivation, bip39_to_seed, purpose48_derivation
|
||||||
from electrum.plugin import run_hook, HardwarePluginLibraryUnavailable
|
from electrum.plugin import run_hook, HardwarePluginLibraryUnavailable
|
||||||
from electrum.storage import StorageReadWriteError
|
from electrum.storage import StorageReadWriteError
|
||||||
from electrum.util import WalletFileException, get_new_wallet_name
|
from electrum.util import WalletFileException, get_new_wallet_name, UserCancelled
|
||||||
from electrum.wallet import wallet_types
|
from electrum.wallet import wallet_types
|
||||||
from .wizard import QEAbstractWizard, WizardComponent
|
from .wizard import QEAbstractWizard, WizardComponent
|
||||||
from electrum.logging import get_logger, Logger
|
from electrum.logging import get_logger, Logger
|
||||||
@@ -26,7 +27,7 @@ from electrum.gui.qt.bip39_recovery_dialog import Bip39RecoveryDialog
|
|||||||
from electrum.gui.qt.password_dialog import PasswordLayout, PW_NEW, MSG_ENTER_PASSWORD, PasswordLayoutForHW
|
from electrum.gui.qt.password_dialog import PasswordLayout, PW_NEW, MSG_ENTER_PASSWORD, PasswordLayoutForHW
|
||||||
from electrum.gui.qt.seed_dialog import SeedLayout, MSG_PASSPHRASE_WARN_ISSUE4566, KeysLayout
|
from electrum.gui.qt.seed_dialog import SeedLayout, MSG_PASSPHRASE_WARN_ISSUE4566, KeysLayout
|
||||||
from electrum.gui.qt.util import (PasswordLineEdit, char_width_in_lineedit, WWLabel, InfoButton, font_height,
|
from electrum.gui.qt.util import (PasswordLineEdit, char_width_in_lineedit, WWLabel, InfoButton, font_height,
|
||||||
ChoiceWidget)
|
ChoiceWidget, MessageBoxMixin)
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from electrum.simple_config import SimpleConfig
|
from electrum.simple_config import SimpleConfig
|
||||||
@@ -46,7 +47,7 @@ MSG_HW_STORAGE_ENCRYPTION = _("Set wallet file encryption.") + '\n'\
|
|||||||
+ _("Note: If you enable this setting, you will need your hardware device to open your wallet.")
|
+ _("Note: If you enable this setting, you will need your hardware device to open your wallet.")
|
||||||
|
|
||||||
|
|
||||||
class QENewWalletWizard(NewWalletWizard, QEAbstractWizard):
|
class QENewWalletWizard(NewWalletWizard, QEAbstractWizard, MessageBoxMixin):
|
||||||
_logger = get_logger(__name__)
|
_logger = get_logger(__name__)
|
||||||
|
|
||||||
def __init__(self, config: 'SimpleConfig', app: 'QElectrumApplication', plugins: 'Plugins', daemon: Daemon, path, parent=None):
|
def __init__(self, config: 'SimpleConfig', app: 'QElectrumApplication', plugins: 'Plugins', daemon: Daemon, path, parent=None):
|
||||||
@@ -162,6 +163,66 @@ class QENewWalletWizard(NewWalletWizard, QEAbstractWizard):
|
|||||||
self._password = data['password']
|
self._password = data['password']
|
||||||
self.path = path
|
self.path = path
|
||||||
|
|
||||||
|
def run_upgrades(self, db: 'WalletDB') -> None:
|
||||||
|
storage = db.storage
|
||||||
|
path = storage.path
|
||||||
|
if db.requires_split():
|
||||||
|
msg = _(
|
||||||
|
"The wallet '{}' contains multiple accounts, which are no longer supported since Electrum 2.7.\n\n"
|
||||||
|
"Do you want to split your wallet into multiple files?").format(path)
|
||||||
|
if not self.question(msg):
|
||||||
|
return
|
||||||
|
file_list = db.split_accounts(path)
|
||||||
|
msg = _('Your accounts have been moved to') + ':\n' + '\n'.join(file_list) + '\n\n' + _(
|
||||||
|
'Do you want to delete the old file') + ':\n' + path
|
||||||
|
if self.question(msg):
|
||||||
|
os.remove(path)
|
||||||
|
self.show_warning(_('The file was removed'))
|
||||||
|
# raise now, to avoid having the old storage opened
|
||||||
|
raise UserCancelled()
|
||||||
|
if db.requires_upgrade():
|
||||||
|
self.waiting_dialog(db.upgrade, _('Upgrading wallet format...'))
|
||||||
|
|
||||||
|
def waiting_dialog(self, task, msg, on_finished=None):
|
||||||
|
dialog = QDialog()
|
||||||
|
label = WWLabel(msg)
|
||||||
|
vbox = QVBoxLayout()
|
||||||
|
vbox.addSpacing(100)
|
||||||
|
label.setMinimumWidth(300)
|
||||||
|
label.setAlignment(Qt.AlignCenter)
|
||||||
|
vbox.addWidget(label)
|
||||||
|
vbox.addSpacing(100)
|
||||||
|
dialog.setLayout(vbox)
|
||||||
|
dialog.setModal(True)
|
||||||
|
|
||||||
|
exc = None
|
||||||
|
|
||||||
|
def task_wrap(task, dialog):
|
||||||
|
nonlocal exc
|
||||||
|
try:
|
||||||
|
task()
|
||||||
|
except Exception as e:
|
||||||
|
exc = e
|
||||||
|
|
||||||
|
t = threading.Thread(target=task_wrap, args=(task, dialog))
|
||||||
|
t.start()
|
||||||
|
|
||||||
|
dialog.show()
|
||||||
|
|
||||||
|
while True:
|
||||||
|
QApplication.processEvents()
|
||||||
|
t.join(1.0/60)
|
||||||
|
if not t.is_alive():
|
||||||
|
break
|
||||||
|
|
||||||
|
dialog.close()
|
||||||
|
|
||||||
|
if exc:
|
||||||
|
raise exc
|
||||||
|
|
||||||
|
if on_finished:
|
||||||
|
on_finished()
|
||||||
|
|
||||||
|
|
||||||
class WCWalletName(WizardComponent):
|
class WCWalletName(WizardComponent):
|
||||||
def __init__(self, parent, wizard):
|
def __init__(self, parent, wizard):
|
||||||
|
|||||||
Reference in New Issue
Block a user