bundle dependencies in 'packages' dir. use qrcode instead of pyqrnative
[electrum-nvc.git] / gui / qt / 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 os
7 import qrcode
8
9 from electrum import bmp
10 from electrum.i18n import _
11
12
13 class QRCodeWidget(QWidget):
14
15     def __init__(self, data = None):
16         QWidget.__init__(self)
17         self.data = None
18         self.qr = None
19         self.setData(data)
20
21
22     def setData(self, data):
23         if self.data != data:
24             self.data = data
25         if self.data:
26             self.qr = qrcode.QRCode()
27             self.qr.add_data(self.data)
28             k = len(self.qr.get_matrix())
29             self.setMinimumSize(k*5,k*5)
30         else:
31             self.qr = None
32
33         self.update()
34  
35
36     def paintEvent(self, e):
37         if not self.data:
38             return
39
40         black = QColor(0, 0, 0, 255)
41         white = QColor(255, 255, 255, 255)
42
43         if not self.qr:
44             qp = QtGui.QPainter()
45             qp.begin(self)
46             qp.setBrush(white)
47             qp.setPen(white)
48             r = qp.viewport()
49             qp.drawRect(0, 0, r.width(), r.height())
50             qp.end()
51             return
52
53         matrix = self.qr.get_matrix()
54         k = len(matrix)
55         qp = QtGui.QPainter()
56         qp.begin(self)
57         r = qp.viewport()
58
59         margin = 10
60         framesize = min(r.width(), r.height())
61         boxsize = int( (framesize - 2*margin)/k )
62         size = k*boxsize
63         left = (r.width() - size)/2
64         top = (r.height() - size)/2
65
66         # Make a white margin around the QR in case of dark theme use
67         qp.setBrush(white)
68         qp.setPen(white)
69         qp.drawRect(left-margin, top-margin, size+(margin*2), size+(margin*2))
70
71         for r in range(k):
72             for c in range(k):
73                 if matrix[r][c]:
74                     qp.setBrush(black)
75                     qp.setPen(black)
76                 else:
77                     qp.setBrush(white)
78                     qp.setPen(white)
79                 qp.drawRect(left+c*boxsize, top+r*boxsize, boxsize, boxsize)
80         qp.end()
81         
82
83
84 class QRDialog(QDialog):
85
86     def __init__(self, data, parent=None, title = "", show_text=False):
87         QDialog.__init__(self, parent)
88
89         d = self
90         d.setWindowTitle(title)
91         vbox = QVBoxLayout()
92         qrw = QRCodeWidget(data)
93         vbox.addWidget(qrw, 1)
94         if show_text:
95             text = QTextEdit()
96             text.setText(data)
97             text.setReadOnly(True)
98             vbox.addWidget(text)
99         hbox = QHBoxLayout()
100         hbox.addStretch(1)
101
102         if parent:
103             self.config = parent.config
104             filename = os.path.join(self.config.path, "qrcode.bmp")
105
106             def print_qr():
107                 bmp.save_qrcode(qrw.qr, filename)
108                 QMessageBox.information(None, _('Message'), _("QR code saved to file") + " " + filename, _('OK'))
109
110             def copy_to_clipboard():
111                 bmp.save_qrcode(qrw.qr, filename)
112                 self.parent().app.clipboard().setImage(QImage(filename))
113                 QMessageBox.information(None, _('Message'), _("QR code saved to clipboard"), _('OK'))
114
115                 b = QPushButton(_("Copy"))
116                 hbox.addWidget(b)
117                 b.clicked.connect(copy_to_clipboard)
118
119                 b = QPushButton(_("Save"))
120                 hbox.addWidget(b)
121                 b.clicked.connect(print_qr)
122
123         b = QPushButton(_("Close"))
124         hbox.addWidget(b)
125         b.clicked.connect(d.accept)
126         b.setDefault(True)
127
128         vbox.addLayout(hbox)
129         d.setLayout(vbox)
130