Browse Source

qml: add loader overlay, avoid interacting with the to-be-unloaded wallet

master
Sander van Grieken 3 years ago
parent
commit
278486602b
  1. 12
      electrum/gui/qml/components/Wallets.qml
  2. 24
      electrum/gui/qml/components/main.qml
  3. 14
      electrum/gui/qml/qedaemon.py

12
electrum/gui/qml/components/Wallets.qml

@ -14,12 +14,13 @@ Pane {
padding: 0 padding: 0
function createWallet() { function createWallet() {
var dialog = app.newWalletWizard.createObject(rootItem) var dialog = app.newWalletWizard.createObject(app)
dialog.open() dialog.open()
dialog.walletCreated.connect(function() { dialog.walletCreated.connect(function() {
Daemon.availableWallets.reload() Daemon.availableWallets.reload()
// and load the new wallet // and load the new wallet
Daemon.load_wallet(dialog.path, dialog.wizard_data['password']) Daemon.load_wallet(dialog.path, dialog.wizard_data['password'])
app.stack.pop()
}) })
} }
@ -57,6 +58,7 @@ Pane {
onClicked: { onClicked: {
Daemon.load_wallet(model.path) Daemon.load_wallet(model.path)
app.stack.pop()
} }
RowLayout { RowLayout {
@ -118,12 +120,4 @@ Pane {
} }
} }
Connections {
target: Daemon
function onWalletLoaded() {
Daemon.availableWallets.reload()
app.stack.pop()
}
}
} }

24
electrum/gui/qml/components/main.qml

@ -171,6 +171,30 @@ ApplicationWindow
} }
} }
Pane {
id: walletLoadingPane
parent: Overlay.overlay
anchors.fill: parent
background: Rectangle { color: Material.dialogColor }
visible: Daemon.loading
ColumnLayout {
anchors.centerIn: parent
spacing: 2 * constants.paddingXLarge
Label {
Layout.alignment: Qt.AlignHCenter
text: qsTr('Opening wallet...')
font.pixelSize: constants.fontSizeXXLarge
}
BusyIndicator {
Layout.alignment: Qt.AlignHCenter
running: Daemon.loading
}
}
}
Timer { Timer {
id: coverTimer id: coverTimer
interval: 10 interval: 10

14
electrum/gui/qml/qedaemon.py

@ -118,6 +118,7 @@ class QEDaemon(AuthMixin, QObject):
_name = None _name = None
_use_single_password = False _use_single_password = False
_password = None _password = None
_loading = False
_backendWalletLoaded = pyqtSignal([str], arguments=['password']) _backendWalletLoaded = pyqtSignal([str], arguments=['password'])
@ -125,6 +126,7 @@ class QEDaemon(AuthMixin, QObject):
fxChanged = pyqtSignal() fxChanged = pyqtSignal()
newWalletWizardChanged = pyqtSignal() newWalletWizardChanged = pyqtSignal()
serverConnectWizardChanged = pyqtSignal() serverConnectWizardChanged = pyqtSignal()
loadingChanged = pyqtSignal()
walletLoaded = pyqtSignal([str,str], arguments=['name','path']) walletLoaded = pyqtSignal([str,str], arguments=['name','path'])
walletRequiresPassword = pyqtSignal([str,str], arguments=['name','path']) walletRequiresPassword = pyqtSignal([str,str], arguments=['name','path'])
@ -178,6 +180,9 @@ class QEDaemon(AuthMixin, QObject):
return return
def load_wallet_task(): def load_wallet_task():
self._loading = True
self.loadingChanged.emit()
try: try:
wallet = self.daemon.load_wallet(self._path, password) wallet = self.daemon.load_wallet(self._path, password)
@ -202,8 +207,11 @@ class QEDaemon(AuthMixin, QObject):
except WalletFileException as e: except WalletFileException as e:
self._logger.error(str(e)) self._logger.error(str(e))
self.walletOpenError.emit(str(e)) self.walletOpenError.emit(str(e))
finally:
self._loading = False
self.loadingChanged.emit()
threading.Thread(target=load_wallet_task).start() threading.Thread(target=load_wallet_task, daemon=True).start()
@pyqtSlot() @pyqtSlot()
@pyqtSlot(str) @pyqtSlot(str)
@ -252,6 +260,10 @@ class QEDaemon(AuthMixin, QObject):
self.availableWallets.remove_wallet(path) self.availableWallets.remove_wallet(path)
@pyqtProperty(bool, notify=loadingChanged)
def loading(self):
return self._loading
@pyqtProperty(QEWallet, notify=walletLoaded) @pyqtProperty(QEWallet, notify=walletLoaded)
def currentWallet(self): def currentWallet(self):
return self._current_wallet return self._current_wallet

Loading…
Cancel
Save