commit 4284f4feb3e35e2d5c9b1d274081d4da126bab92
parent f8e13c5c330c892698356ec35858785ce8dc012f
Author: SomberNight <somber.night@protonmail.com>
Date: Sat, 21 Jul 2018 23:09:46 +0200
fix #4575
Diffstat:
5 files changed, 34 insertions(+), 10 deletions(-)
diff --git a/electrum/gui/kivy/main_window.py b/electrum/gui/kivy/main_window.py
@@ -391,9 +391,16 @@ class ElectrumWindow(App):
popup.export = self.export_private_keys
popup.open()
- def qr_dialog(self, title, data, show_text=False):
+ def qr_dialog(self, title, data, show_text=False, text_for_clipboard=None):
from .uix.dialogs.qr_dialog import QRDialog
- popup = QRDialog(title, data, show_text)
+ def on_qr_failure():
+ popup.dismiss()
+ msg = _('Failed to display QR code.')
+ if text_for_clipboard:
+ msg += '\n' + _('Text copied to clipboard.')
+ self._clipboard.copy(text_for_clipboard)
+ Clock.schedule_once(lambda dt: self.show_info(msg))
+ popup = QRDialog(title, data, show_text, on_qr_failure)
popup.open()
def scan_qr(self, on_complete):
diff --git a/electrum/gui/kivy/uix/dialogs/qr_dialog.py b/electrum/gui/kivy/uix/dialogs/qr_dialog.py
@@ -36,11 +36,12 @@ Builder.load_string('''
''')
class QRDialog(Factory.Popup):
- def __init__(self, title, data, show_text):
+ def __init__(self, title, data, show_text, failure_cb=None):
Factory.Popup.__init__(self)
self.title = title
self.data = data
self.show_text = show_text
+ self.failure_cb = failure_cb
def on_open(self):
- self.ids.qr.set_data(self.data)
+ self.ids.qr.set_data(self.data, self.failure_cb)
diff --git a/electrum/gui/kivy/uix/dialogs/tx_dialog.py b/electrum/gui/kivy/uix/dialogs/tx_dialog.py
@@ -179,6 +179,7 @@ class TxDialog(Factory.Popup):
def show_qr(self):
from electrum.bitcoin import base_encode, bfh
- text = bfh(str(self.tx))
+ raw_tx = str(self.tx)
+ text = bfh(raw_tx)
text = base_encode(text, base=43)
- self.app.qr_dialog(_("Raw Transaction"), text)
+ self.app.qr_dialog(_("Raw Transaction"), text, text_for_clipboard=raw_tx)
diff --git a/electrum/gui/kivy/uix/qrcodewidget.py b/electrum/gui/kivy/uix/qrcodewidget.py
@@ -5,6 +5,7 @@ from threading import Thread
from functools import partial
import qrcode
+from qrcode import exceptions
from kivy.uix.floatlayout import FloatLayout
from kivy.graphics.texture import Texture
@@ -50,15 +51,23 @@ class QRCodeWidget(FloatLayout):
self.data = None
self.qr = None
self._qrtexture = None
+ self.failure_cb = None
def on_data(self, instance, value):
if not (self.canvas or value):
return
- self.update_qr()
-
- def set_data(self, data):
+ try:
+ self.update_qr()
+ except qrcode.exceptions.DataOverflowError:
+ if self.failure_cb:
+ self.failure_cb()
+ else:
+ raise
+
+ def set_data(self, data, failure_cb=None):
if self.data == data:
return
+ self.failure_cb = failure_cb
MinSize = 210 if len(data) < 128 else 500
self.setMinimumSize((MinSize, MinSize))
self.data = data
diff --git a/electrum/gui/qt/transaction_dialog.py b/electrum/gui/qt/transaction_dialog.py
@@ -31,6 +31,9 @@ from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
+import qrcode
+from qrcode import exceptions
+
from electrum.bitcoin import base_encode
from electrum.i18n import _
from electrum.plugin import run_hook
@@ -183,8 +186,11 @@ class TxDialog(QDialog, MessageBoxMixin):
text = base_encode(text, base=43)
try:
self.main_window.show_qrcode(text, 'Transaction', parent=self)
+ except qrcode.exceptions.DataOverflowError:
+ self.show_error(_('Failed to display QR code.') + '\n' +
+ _('Transaction is too large in size.'))
except Exception as e:
- self.show_message(str(e))
+ self.show_error(_('Failed to display QR code.') + '\n' + str(e))
def sign(self):
def sign_done(success):