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