fix #4575
This commit is contained in:
@@ -391,9 +391,16 @@ class ElectrumWindow(App):
|
|||||||
popup.export = self.export_private_keys
|
popup.export = self.export_private_keys
|
||||||
popup.open()
|
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
|
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()
|
popup.open()
|
||||||
|
|
||||||
def scan_qr(self, on_complete):
|
def scan_qr(self, on_complete):
|
||||||
|
|||||||
@@ -36,11 +36,12 @@ Builder.load_string('''
|
|||||||
''')
|
''')
|
||||||
|
|
||||||
class QRDialog(Factory.Popup):
|
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)
|
Factory.Popup.__init__(self)
|
||||||
self.title = title
|
self.title = title
|
||||||
self.data = data
|
self.data = data
|
||||||
self.show_text = show_text
|
self.show_text = show_text
|
||||||
|
self.failure_cb = failure_cb
|
||||||
|
|
||||||
def on_open(self):
|
def on_open(self):
|
||||||
self.ids.qr.set_data(self.data)
|
self.ids.qr.set_data(self.data, self.failure_cb)
|
||||||
|
|||||||
@@ -179,6 +179,7 @@ class TxDialog(Factory.Popup):
|
|||||||
|
|
||||||
def show_qr(self):
|
def show_qr(self):
|
||||||
from electrum.bitcoin import base_encode, bfh
|
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)
|
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)
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ from threading import Thread
|
|||||||
from functools import partial
|
from functools import partial
|
||||||
|
|
||||||
import qrcode
|
import qrcode
|
||||||
|
from qrcode import exceptions
|
||||||
|
|
||||||
from kivy.uix.floatlayout import FloatLayout
|
from kivy.uix.floatlayout import FloatLayout
|
||||||
from kivy.graphics.texture import Texture
|
from kivy.graphics.texture import Texture
|
||||||
@@ -50,15 +51,23 @@ class QRCodeWidget(FloatLayout):
|
|||||||
self.data = None
|
self.data = None
|
||||||
self.qr = None
|
self.qr = None
|
||||||
self._qrtexture = None
|
self._qrtexture = None
|
||||||
|
self.failure_cb = None
|
||||||
|
|
||||||
def on_data(self, instance, value):
|
def on_data(self, instance, value):
|
||||||
if not (self.canvas or value):
|
if not (self.canvas or value):
|
||||||
return
|
return
|
||||||
self.update_qr()
|
try:
|
||||||
|
self.update_qr()
|
||||||
|
except qrcode.exceptions.DataOverflowError:
|
||||||
|
if self.failure_cb:
|
||||||
|
self.failure_cb()
|
||||||
|
else:
|
||||||
|
raise
|
||||||
|
|
||||||
def set_data(self, data):
|
def set_data(self, data, failure_cb=None):
|
||||||
if self.data == data:
|
if self.data == data:
|
||||||
return
|
return
|
||||||
|
self.failure_cb = failure_cb
|
||||||
MinSize = 210 if len(data) < 128 else 500
|
MinSize = 210 if len(data) < 128 else 500
|
||||||
self.setMinimumSize((MinSize, MinSize))
|
self.setMinimumSize((MinSize, MinSize))
|
||||||
self.data = data
|
self.data = data
|
||||||
|
|||||||
@@ -31,6 +31,9 @@ from PyQt5.QtCore import *
|
|||||||
from PyQt5.QtGui import *
|
from PyQt5.QtGui import *
|
||||||
from PyQt5.QtWidgets import *
|
from PyQt5.QtWidgets import *
|
||||||
|
|
||||||
|
import qrcode
|
||||||
|
from qrcode import exceptions
|
||||||
|
|
||||||
from electrum.bitcoin import base_encode
|
from electrum.bitcoin import base_encode
|
||||||
from electrum.i18n import _
|
from electrum.i18n import _
|
||||||
from electrum.plugin import run_hook
|
from electrum.plugin import run_hook
|
||||||
@@ -183,8 +186,11 @@ class TxDialog(QDialog, MessageBoxMixin):
|
|||||||
text = base_encode(text, base=43)
|
text = base_encode(text, base=43)
|
||||||
try:
|
try:
|
||||||
self.main_window.show_qrcode(text, 'Transaction', parent=self)
|
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:
|
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(self):
|
||||||
def sign_done(success):
|
def sign_done(success):
|
||||||
|
|||||||
Reference in New Issue
Block a user