qml: handle DataOverflow in qeqr.py and QRImage
This commit is contained in:
@@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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')
|
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)
|
||||||
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 }
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user