1
0

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
This commit is contained in:
SomberNight
2023-01-02 13:38:05 +00:00
parent 459a7e2eaa
commit 85ec4b2f61

View File

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