You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
137 lines
4.0 KiB
137 lines
4.0 KiB
from PyQt4.QtGui import *
|
|
from PyQt4.QtCore import *
|
|
import PyQt4.QtCore as QtCore
|
|
import PyQt4.QtGui as QtGui
|
|
|
|
from electrum import bmp, pyqrnative
|
|
|
|
|
|
class QRCodeWidget(QWidget):
|
|
|
|
def __init__(self, data = None):
|
|
QWidget.__init__(self)
|
|
self.addr = None
|
|
self.qr = None
|
|
if data:
|
|
self.set_addr(data)
|
|
self.update_qr()
|
|
|
|
def set_addr(self, addr):
|
|
if self.addr != addr:
|
|
if len(addr) < 128:
|
|
MinSize = 210
|
|
else:
|
|
MinSize = 500
|
|
self.setMinimumSize(MinSize, MinSize)
|
|
self.addr = addr
|
|
self.qr = None
|
|
self.update()
|
|
|
|
def update_qr(self):
|
|
if self.addr and not self.qr:
|
|
for size in range(len(pyqrnative.QRUtil.PATTERN_POSITION_TABLE)): # [4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32]:
|
|
try:
|
|
self.qr = pyqrnative.QRCode(size, pyqrnative.QRErrorCorrectLevel.L)
|
|
self.qr.addData(self.addr)
|
|
self.qr.make()
|
|
break
|
|
except Exception:
|
|
self.qr=None
|
|
continue
|
|
self.update()
|
|
|
|
def paintEvent(self, e):
|
|
|
|
if not self.addr:
|
|
return
|
|
|
|
black = QColor(0, 0, 0, 255)
|
|
white = QColor(255, 255, 255, 255)
|
|
|
|
if not self.qr:
|
|
qp = QtGui.QPainter()
|
|
qp.begin(self)
|
|
qp.setBrush(white)
|
|
qp.setPen(white)
|
|
qp.drawRect(0, 0, 198, 198)
|
|
qp.end()
|
|
return
|
|
|
|
k = self.qr.getModuleCount()
|
|
qp = QtGui.QPainter()
|
|
qp.begin(self)
|
|
r = qp.viewport()
|
|
boxsize = min(r.width(), r.height())*0.8/k
|
|
size = k*boxsize
|
|
left = (r.width() - size)/2
|
|
top = (r.height() - size)/2
|
|
|
|
# Make a white margin around the QR in case of dark theme use:
|
|
margin = 10
|
|
qp.setBrush(white)
|
|
qp.drawRect(left-margin, top-margin, size+(margin*2), size+(margin*2))
|
|
|
|
for r in range(k):
|
|
for c in range(k):
|
|
if self.qr.isDark(r, c):
|
|
qp.setBrush(black)
|
|
qp.setPen(black)
|
|
else:
|
|
qp.setBrush(white)
|
|
qp.setPen(white)
|
|
qp.drawRect(left+c*boxsize, top+r*boxsize, boxsize, boxsize)
|
|
qp.end()
|
|
|
|
|
|
import os
|
|
from electrum.i18n import _
|
|
|
|
class QRDialog(QDialog):
|
|
|
|
def __init__(self, data, parent=None, title = "", show_text=False):
|
|
QDialog.__init__(self, parent)
|
|
|
|
d = self
|
|
d.setModal(1)
|
|
d.setWindowTitle(title)
|
|
d.setMinimumSize(270, 300)
|
|
vbox = QVBoxLayout()
|
|
qrw = QRCodeWidget(data)
|
|
vbox.addWidget(qrw, 1)
|
|
if show_text:
|
|
text = QTextEdit()
|
|
text.setText(data)
|
|
text.setReadOnly(True)
|
|
vbox.addWidget(text)
|
|
hbox = QHBoxLayout()
|
|
hbox.addStretch(1)
|
|
|
|
if parent:
|
|
self.config = parent.config
|
|
filename = os.path.join(self.config.path, "qrcode.bmp")
|
|
|
|
def print_qr():
|
|
bmp.save_qrcode(qrw.qr, filename)
|
|
QMessageBox.information(None, _('Message'), _("QR code saved to file") + " " + filename, _('OK'))
|
|
|
|
def copy_to_clipboard():
|
|
bmp.save_qrcode(qrw.qr, filename)
|
|
self.parent().app.clipboard().setImage(QImage(filename))
|
|
QMessageBox.information(None, _('Message'), _("QR code saved to clipboard"), _('OK'))
|
|
|
|
b = QPushButton(_("Copy"))
|
|
hbox.addWidget(b)
|
|
b.clicked.connect(copy_to_clipboard)
|
|
|
|
b = QPushButton(_("Save"))
|
|
hbox.addWidget(b)
|
|
b.clicked.connect(print_qr)
|
|
|
|
b = QPushButton(_("Close"))
|
|
hbox.addWidget(b)
|
|
b.clicked.connect(d.accept)
|
|
b.setDefault(True)
|
|
|
|
vbox.addLayout(hbox)
|
|
d.setLayout(vbox)
|
|
|
|
|