a4af83117c4bc64e989017a6a862e4b31e843652
[electrum-nvc.git] / gui / qrcodewidget.py
1 from PyQt4.QtGui import *
2 from PyQt4.QtCore import *
3 import PyQt4.QtCore as QtCore
4 import PyQt4.QtGui as QtGui
5
6 import bmp, pyqrnative, qrscanner
7
8
9 class QRCodeWidget(QWidget):
10
11     def __init__(self, data = None, size=4):
12         QWidget.__init__(self)
13         self.setMinimumSize(210, 210)
14         self.addr = None
15         self.qr = None
16         self.size = size
17         if data:
18             self.set_addr(data)
19             self.update_qr()
20
21     def set_addr(self, addr):
22         if self.addr != addr:
23             self.addr = addr
24             self.qr = None
25             self.update()
26
27     def update_qr(self):
28         if self.addr and not self.qr:
29             self.qr = pyqrnative.QRCode(self.size, pyqrnative.QRErrorCorrectLevel.L)
30             self.qr.addData(self.addr)
31             self.qr.make()
32             self.update()
33
34     def paintEvent(self, e):
35
36         if not self.addr:
37             return
38
39         black = QColor(0, 0, 0, 255)
40         white = QColor(255, 255, 255, 255)
41
42         if not self.qr:
43             qp = QtGui.QPainter()
44             qp.begin(self)
45             qp.setBrush(white)
46             qp.setPen(white)
47             qp.drawRect(0, 0, 198, 198)
48             qp.end()
49             return
50  
51         k = self.qr.getModuleCount()
52         qp = QtGui.QPainter()
53         qp.begin(self)
54         r = qp.viewport()
55         boxsize = min(r.width(), r.height())*0.8/k
56         size = k*boxsize
57         left = (r.width() - size)/2
58         top = (r.height() - size)/2         
59
60         for r in range(k):
61             for c in range(k):
62                 if self.qr.isDark(r, c):
63                     qp.setBrush(black)
64                     qp.setPen(black)
65                 else:
66                     qp.setBrush(white)
67                     qp.setPen(white)
68                 qp.drawRect(left+c*boxsize, top+r*boxsize, boxsize, boxsize)
69         qp.end()
70