tMerge pull request #5833 from SomberNight/201912_qt_blocking_waiting_dialog - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 7324817ff3915012b4f978d8b629657c382d7f70 DIR parent 308517d473d18fdc5a377e7296e0e6ab3f6c92b8 HTML Author: ThomasV <thomasv@electrum.org> Date: Thu, 12 Dec 2019 17:53:03 +0100 Merge pull request #5833 from SomberNight/201912_qt_blocking_waiting_dialog Qt: introduce BlockingWaitingDialog Diffstat: M electrum/gui/qt/confirm_tx_dialog.… | 4 ++-- M electrum/gui/qt/util.py | 24 ++++++++++++++++++++++-- 2 files changed, 24 insertions(+), 4 deletions(-) --- DIR diff --git a/electrum/gui/qt/confirm_tx_dialog.py b/electrum/gui/qt/confirm_tx_dialog.py t@@ -34,7 +34,7 @@ from electrum.transaction import Transaction, PartialTransaction from electrum.simple_config import FEERATE_WARNING_HIGH_FEE from electrum.wallet import InternalAddressCorruption -from .util import WindowModalDialog, ColorScheme, HelpLabel, Buttons, CancelButton +from .util import WindowModalDialog, ColorScheme, HelpLabel, Buttons, CancelButton, BlockingWaitingDialog from .fee_slider import FeeSlider t@@ -156,7 +156,7 @@ class ConfirmTxDialog(TxEditor, WindowModalDialog): self.send_button.clicked.connect(self.on_send) self.send_button.setDefault(True) vbox.addLayout(Buttons(CancelButton(self), self.send_button)) - self.update_tx() + BlockingWaitingDialog(window, _("Preparing transaction..."), self.update_tx) self.update() self.is_send = False DIR diff --git a/electrum/gui/qt/util.py b/electrum/gui/qt/util.py t@@ -9,7 +9,7 @@ import os import webbrowser from functools import partial, lru_cache -from typing import NamedTuple, Callable, Optional, TYPE_CHECKING, Union, List, Dict +from typing import NamedTuple, Callable, Optional, TYPE_CHECKING, Union, List, Dict, Any from PyQt5.QtGui import (QFont, QColor, QCursor, QPixmap, QStandardItem, QPalette, QIcon, QFontMetrics) t@@ -280,7 +280,7 @@ class WindowModalDialog(QDialog, MessageBoxMixin): class WaitingDialog(WindowModalDialog): '''Shows a please wait dialog whilst running a task. It is not necessary to maintain a reference to this dialog.''' - def __init__(self, parent, message, task, on_success=None, on_error=None): + def __init__(self, parent: QWidget, message: str, task, on_success=None, on_error=None): assert parent if isinstance(parent, MessageBoxMixin): parent = parent.top_level_window() t@@ -305,6 +305,26 @@ class WaitingDialog(WindowModalDialog): self.message_label.setText(msg) +class BlockingWaitingDialog(WindowModalDialog): + """Shows a waiting dialog whilst running a task. + Should be called from the GUI thread. The GUI thread will be blocked while + the task is running; the point of the dialog is to provide feedback + to the user regarding what is going on. + """ + def __init__(self, parent: QWidget, message: str, task: Callable[[], Any]): + assert parent + if isinstance(parent, MessageBoxMixin): + parent = parent.top_level_window() + WindowModalDialog.__init__(self, parent, _("Please wait")) + self.message_label = QLabel(message) + vbox = QVBoxLayout(self) + vbox.addWidget(self.message_label) + self.show() + QCoreApplication.processEvents() + task() + self.accept() + + def line_dialog(parent, title, label, ok_label, default=None): dialog = WindowModalDialog(parent, title) dialog.setMinimumWidth(500)