diff --git a/electrum/gui/icons/spinner.gif b/electrum/gui/icons/spinner.gif new file mode 100644 index 000000000..0dbdd7819 Binary files /dev/null and b/electrum/gui/icons/spinner.gif differ diff --git a/electrum/gui/qt/send_tab.py b/electrum/gui/qt/send_tab.py index ed99e4984..ee1af66d5 100644 --- a/electrum/gui/qt/send_tab.py +++ b/electrum/gui/qt/send_tab.py @@ -4,9 +4,10 @@ from decimal import Decimal from typing import Optional, TYPE_CHECKING, Sequence, List, Callable -from PyQt5.QtCore import pyqtSignal, QPoint +from PyQt5.QtCore import pyqtSignal, QPoint, QSize, Qt from PyQt5.QtWidgets import (QLabel, QVBoxLayout, QGridLayout, QHBoxLayout, QWidget, QToolTip, QPushButton, QApplication) +from PyQt5.QtGui import QMovie, QColor from electrum.i18n import _ from electrum.logging import Logger @@ -22,7 +23,7 @@ from .amountedit import AmountEdit, BTCAmountEdit, SizedFreezableLineEdit from .paytoedit import InvalidPaymentIdentifier from .util import (WaitingDialog, HelpLabel, MessageBoxMixin, EnterButton, char_width_in_lineedit, get_iconname_camera, get_iconname_qrcode, - read_QIcon, ColorScheme) + read_QIcon, ColorScheme, icon_path) from .confirm_tx_dialog import ConfirmTxDialog if TYPE_CHECKING: @@ -127,6 +128,15 @@ class SendTab(QWidget, MessageBoxMixin, Logger): self.paste_button.setMaximumWidth(35) grid.addWidget(self.paste_button, 0, 5) + self.spinner = QMovie(icon_path('spinner.gif')) + self.spinner.setScaledSize(QSize(24, 24)) + self.spinner.setBackgroundColor(QColor('black')) + self.spinner_l = QLabel() + self.spinner_l.setMargin(5) + self.spinner_l.setVisible(False) + self.spinner_l.setMovie(self.spinner) + grid.addWidget(self.spinner_l, 0, 1, 1, 4, Qt.AlignRight) + self.save_button = EnterButton(_("Save"), self.do_save_invoice) self.save_button.setEnabled(False) self.send_button = EnterButton(_("Pay") + "...", self.do_pay_or_get_invoice) @@ -185,6 +195,13 @@ class SendTab(QWidget, MessageBoxMixin, Logger): self.notify_merchant_done_signal.connect(self.on_notify_merchant_done) self.payto_e.paymentIdentifierChanged.connect(self._handle_payment_identifier) + def showSpinner(self, b): + self.spinner_l.setVisible(b) + if b: + self.spinner.start() + else: + self.spinner.stop() + def on_amount_changed(self, text): # FIXME: implement full valid amount check to enable/disable Pay button pi_valid = self.payto_e.payment_identifier.is_valid() if self.payto_e.payment_identifier else False @@ -325,12 +342,9 @@ class SendTab(QWidget, MessageBoxMixin, Logger): run_hook('do_clear', self) def prepare_for_send_tab_network_lookup(self): - self.window.show_send_tab() # FIXME why is this here - #for e in [self.payto_e, self.message_e]: - # self.payto_e.setFrozen(True) for btn in [self.save_button, self.send_button, self.clear_button]: btn.setEnabled(False) - # self.payto_e.setTextNoCheck(_("please wait...")) + self.showSpinner(True) def payment_request_error(self, error): self.show_message(error) @@ -430,6 +444,7 @@ class SendTab(QWidget, MessageBoxMixin, Logger): # TODO: resolve can happen while typing, we don't want message dialogs to pop up # currently we don't set error for emaillike recipients to avoid just that self.logger.debug('payment identifier resolve done') + self.showSpinner(False) if pi.error: self.show_error(pi.error) self.do_clear() @@ -481,6 +496,7 @@ class SendTab(QWidget, MessageBoxMixin, Logger): return self.amount_e.get_amount() or 0 def on_finalize_done(self, pi): + self.showSpinner(False) self.update_fields() if pi.error: self.show_error(pi.error)