electrum-bitcoinprivate/gui/qt/qrcodewidget.py

134 lines
3.6 KiB
Python
Raw Normal View History

2017-01-22 10:25:24 -08:00
2017-09-22 20:54:38 -07:00
from PyQt5.QtCore import *
from PyQt5.QtGui import *
2017-09-22 20:54:38 -07:00
import PyQt5.QtGui as QtGui
from PyQt5.QtWidgets import (
QApplication, QVBoxLayout, QTextEdit, QHBoxLayout, QPushButton, QWidget)
2013-03-03 04:50:08 -08:00
import os
import qrcode
2019-12-24 03:21:35 -08:00
import electrum_bitcoinprivate
from electrum_bitcoinprivate.i18n import _
2017-01-22 10:25:24 -08:00
from .util import WindowModalDialog
2013-03-03 04:50:08 -08:00
class QRCodeWidget(QWidget):
2014-06-17 05:58:12 -07:00
def __init__(self, data = None, fixedSize=False):
2013-03-03 04:50:08 -08:00
QWidget.__init__(self)
self.data = None
2013-03-03 04:50:08 -08:00
self.qr = None
2014-06-17 05:58:12 -07:00
self.fixedSize=fixedSize
if fixedSize:
self.setFixedSize(fixedSize, fixedSize)
self.setData(data)
def setData(self, data):
if self.data != data:
self.data = data
if self.data:
self.qr = qrcode.QRCode()
self.qr.add_data(self.data)
2014-06-17 05:58:12 -07:00
if not self.fixedSize:
k = len(self.qr.get_matrix())
self.setMinimumSize(k*5,k*5)
else:
2013-03-03 04:50:08 -08:00
self.qr = None
self.update()
2013-03-03 04:50:08 -08:00
def paintEvent(self, e):
if not self.data:
2013-03-03 04:50:08 -08:00
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)
r = qp.viewport()
qp.drawRect(0, 0, r.width(), r.height())
2013-03-03 04:50:08 -08:00
qp.end()
return
matrix = self.qr.get_matrix()
k = len(matrix)
2013-03-03 04:50:08 -08:00
qp = QtGui.QPainter()
qp.begin(self)
r = qp.viewport()
margin = 10
framesize = min(r.width(), r.height())
boxsize = int( (framesize - 2*margin)/k )
2013-03-03 04:50:08 -08:00
size = k*boxsize
left = (r.width() - size)/2
top = (r.height() - size)/2
2013-03-03 04:50:08 -08:00
# Make a white margin around the QR in case of dark theme use
qp.setBrush(white)
qp.setPen(white)
qp.drawRect(left-margin, top-margin, size+(margin*2), size+(margin*2))
qp.setBrush(black)
qp.setPen(black)
2013-03-03 04:50:08 -08:00
for r in range(k):
for c in range(k):
if matrix[r][c]:
qp.drawRect(left+c*boxsize, top+r*boxsize, boxsize - 1, boxsize - 1)
2013-03-03 04:50:08 -08:00
qp.end()
2014-06-14 03:17:44 -07:00
class QRDialog(WindowModalDialog):
2014-06-14 03:17:44 -07:00
def __init__(self, data, parent=None, title = "", show_text=False):
WindowModalDialog.__init__(self, parent, title)
2014-06-14 03:17:44 -07:00
vbox = QVBoxLayout()
qrw = QRCodeWidget(data)
2017-09-23 13:16:36 -07:00
qscreen = QApplication.primaryScreen()
2014-06-14 03:17:44 -07:00
vbox.addWidget(qrw, 1)
if show_text:
text = QTextEdit()
text.setText(data)
text.setReadOnly(True)
vbox.addWidget(text)
hbox = QHBoxLayout()
hbox.addStretch(1)
2019-12-24 03:21:35 -08:00
config = electrum_bitcoinprivate.get_config()
if config:
2016-02-23 06:27:00 -08:00
filename = os.path.join(config.path, "qrcode.png")
2014-06-14 03:17:44 -07:00
def print_qr():
2017-09-23 13:16:36 -07:00
p = qscreen.grabWindow(qrw.winId())
2016-02-23 06:27:00 -08:00
p.save(filename, 'png')
self.show_message(_("QR code saved to file") + " " + filename)
2014-06-14 03:17:44 -07:00
def copy_to_clipboard():
2017-09-23 13:16:36 -07:00
p = qscreen.grabWindow(qrw.winId())
2018-04-05 16:42:04 -07:00
QApplication.clipboard().setPixmap(p)
self.show_message(_("QR code copied to clipboard"))
2014-06-14 03:17:44 -07:00
b = QPushButton(_("Copy"))
hbox.addWidget(b)
b.clicked.connect(copy_to_clipboard)
2014-06-14 03:17:44 -07:00
b = QPushButton(_("Save"))
hbox.addWidget(b)
b.clicked.connect(print_qr)
2014-06-14 03:17:44 -07:00
b = QPushButton(_("Close"))
hbox.addWidget(b)
b.clicked.connect(self.accept)
2014-06-14 03:17:44 -07:00
b.setDefault(True)
vbox.addLayout(hbox)
self.setLayout(vbox)