URI: 
       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)