Browse Source

qml: handle DataOverflow in qeqr.py and QRImage

master
Sander van Grieken 3 years ago
parent
commit
4517b3c2bb
  1. 11
      electrum/gui/qml/components/controls/QRImage.qml
  2. 20
      electrum/gui/qml/qeqr.py

11
electrum/gui/qml/components/controls/QRImage.qml

@ -1,4 +1,5 @@
import QtQuick 2.6 import QtQuick 2.6
import QtQuick.Controls 2.15
Item { Item {
id: root id: root
@ -17,10 +18,10 @@ Item {
} }
Image { Image {
source: qrdata && render ? 'image://qrgen/' + qrdata : '' source: qrdata && render && qrprops.modules > 0 ? 'image://qrgen/' + qrdata : ''
Rectangle { Rectangle {
visible: root.render visible: root.render && qrprops.valid
color: 'white' color: 'white'
x: (parent.width - width) / 2 x: (parent.width - width) / 2
y: (parent.height - height) / 2 y: (parent.height - height) / 2
@ -28,6 +29,7 @@ Item {
height: qrprops.icon_modules * qrprops.box_size height: qrprops.icon_modules * qrprops.box_size
Image { Image {
visible: qrprops.valid
source: '../../../icons/electrum.png' source: '../../../icons/electrum.png'
x: 1 x: 1
y: 1 y: 1
@ -36,5 +38,10 @@ Item {
scale: 0.9 scale: 0.9
} }
} }
Label {
visible: !qrprops.valid
text: qsTr('Data too big for QR')
anchors.centerIn: parent
}
} }
} }

20
electrum/gui/qml/qeqr.py

@ -1,5 +1,7 @@
import asyncio import asyncio
import qrcode import qrcode
from qrcode.exceptions import DataOverflowError
import math import math
import urllib import urllib
@ -143,6 +145,7 @@ class QEQRImageProvider(QQuickImageProvider):
# calculate best box_size # calculate best box_size
pixelsize = min(self._max_size, 400) pixelsize = min(self._max_size, 400)
try:
modules = 17 + 4 * qr.best_fit() + qr.border * 2 modules = 17 + 4 * qr.best_fit() + qr.border * 2
qr.box_size = math.floor(pixelsize/modules) qr.box_size = math.floor(pixelsize/modules)
@ -150,6 +153,12 @@ class QEQRImageProvider(QQuickImageProvider):
pimg = qr.make_image(fill_color='black', back_color='white') pimg = qr.make_image(fill_color='black', back_color='white')
self.qimg = ImageQt.ImageQt(pimg) self.qimg = ImageQt.ImageQt(pimg)
except DataOverflowError:
# fake it
modules = 17 + qr.border * 2
box_size = math.floor(pixelsize/modules)
self.qimg = QImage(box_size * modules, box_size * modules, QImage.Format_RGB32)
self.qimg.fill(QColor('gray'))
return self.qimg, self.qimg.size() return self.qimg, self.qimg.size()
# helper for placing icon exactly where it should go on the QR code # helper for placing icon exactly where it should go on the QR code
@ -167,12 +176,17 @@ class QEQRImageProviderHelper(QObject):
# calculate best box_size # calculate best box_size
pixelsize = min(self._max_size, 400) pixelsize = min(self._max_size, 400)
try:
modules = 17 + 4 * qr.best_fit() + qr.border * 2 modules = 17 + 4 * qr.best_fit() + qr.border * 2
qr.box_size = math.floor(pixelsize/modules) valid = True
except DataOverflowError:
# fake it
modules = 17 + qr.border * 2
valid = False
qr.box_size = math.floor(pixelsize/modules)
# calculate icon width in modules # calculate icon width in modules
icon_modules = int(modules / 5) icon_modules = int(modules / 5)
icon_modules += (icon_modules+1)%2 # force odd icon_modules += (icon_modules+1)%2 # force odd
return { 'modules': modules, 'box_size': qr.box_size, 'icon_modules': icon_modules } return { 'modules': modules, 'box_size': qr.box_size, 'icon_modules': icon_modules, 'valid' : valid }

Loading…
Cancel
Save