|
|
|
|
@ -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) |
|
|
|
|
|