Browse Source

qt gui: display nice error if QR code data overflows

there is existing handler-code at e.g.
1a7634e615/electrum/gui/qt/transaction_dialog.py (L309)
but we should make sure setData() always raises the exc when needed,
as paintEvent() is too late for nice handling.

closes https://github.com/spesmilo/electrum/issues/4288
closes https://github.com/spesmilo/electrum/issues/4280
master
SomberNight 3 years ago
parent
commit
824ce64e66
No known key found for this signature in database
GPG Key ID: B33B5F232C6271E9
  1. 22
      electrum/gui/qt/qrcodewidget.py

22
electrum/gui/qt/qrcodewidget.py

@ -1,6 +1,7 @@
from typing import Optional from typing import Optional
import qrcode import qrcode
import qrcode.exceptions
from PyQt5.QtGui import QColor, QPen from PyQt5.QtGui import QColor, QPen
import PyQt5.QtGui as QtGui import PyQt5.QtGui as QtGui
@ -16,6 +17,10 @@ from electrum.simple_config import SimpleConfig
from .util import WindowModalDialog, WWLabel, getSaveFileName from .util import WindowModalDialog, WWLabel, getSaveFileName
class QrCodeDataOverflow(qrcode.exceptions.DataOverflowError):
pass
class QRCodeWidget(QWidget): class QRCodeWidget(QWidget):
def __init__(self, data=None, *, manual_size: bool = False): def __init__(self, data=None, *, manual_size: bool = False):
@ -27,20 +32,25 @@ class QRCodeWidget(QWidget):
self.setData(data) self.setData(data)
def setData(self, data): def setData(self, data):
if self.data != data: if data:
self.data = data qr = qrcode.QRCode(
if self.data:
self.qr = qrcode.QRCode(
error_correction=qrcode.constants.ERROR_CORRECT_L, error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10, box_size=10,
border=0, border=0,
) )
self.qr.add_data(self.data) try:
qr.add_data(data)
qr_matrix = qr.get_matrix() # test that data fits in QR code
except (ValueError, qrcode.exceptions.DataOverflowError) as e:
raise QrCodeDataOverflow() from e
self.qr = qr
self.data = data
if not self._manual_size: if not self._manual_size:
k = len(self.qr.get_matrix()) k = len(qr_matrix)
self.setMinimumSize(k * 5, k * 5) self.setMinimumSize(k * 5, k * 5)
else: else:
self.qr = None self.qr = None
self.data = None
self.update() self.update()

Loading…
Cancel
Save