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. 38
      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
}
} }
} }

38
electrum/gui/qml/qeqr.py

@ -1,12 +1,14 @@
import asyncio import asyncio
import qrcode import qrcode
from qrcode.exceptions import DataOverflowError
import math import math
import urllib import urllib
from PIL import Image, ImageQt from PIL import Image, ImageQt
from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QRect, QPoint from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QRect, QPoint
from PyQt5.QtGui import QImage,QColor from PyQt5.QtGui import QImage, QColor
from PyQt5.QtQuick import QQuickImageProvider from PyQt5.QtQuick import QQuickImageProvider
from electrum.logging import get_logger from electrum.logging import get_logger
@ -143,13 +145,20 @@ class QEQRImageProvider(QQuickImageProvider):
# calculate best box_size # calculate best box_size
pixelsize = min(self._max_size, 400) pixelsize = min(self._max_size, 400)
modules = 17 + 4 * qr.best_fit() + qr.border * 2 try:
qr.box_size = math.floor(pixelsize/modules) modules = 17 + 4 * qr.best_fit() + qr.border * 2
qr.box_size = math.floor(pixelsize/modules)
qr.make(fit=True)
qr.make(fit=True)
pimg = qr.make_image(fill_color='black', back_color='white')
self.qimg = ImageQt.ImageQt(pimg) pimg = qr.make_image(fill_color='black', back_color='white')
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)
modules = 17 + 4 * qr.best_fit() + qr.border * 2 try:
qr.box_size = math.floor(pixelsize/modules) modules = 17 + 4 * qr.best_fit() + qr.border * 2
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