New port numbers
[electrum-nvc.git] / gui / qt / qrcodewidget.py
index b1033af..c2ef8b1 100644 (file)
@@ -3,46 +3,43 @@ from PyQt4.QtCore import *
 import PyQt4.QtCore as QtCore
 import PyQt4.QtGui as QtGui
 
-from electrum import bmp, pyqrnative
+import os
+import qrcode
+
+import electrum_nvc
+from electrum_nvc import bmp
+from electrum_nvc.i18n import _
 
 
 class QRCodeWidget(QWidget):
 
-    def __init__(self, data = None):
+    def __init__(self, data = None, fixedSize=False):
         QWidget.__init__(self)
-        self.addr = None
+        self.data = 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.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)
+            if not self.fixedSize:
+                k = len(self.qr.get_matrix())
+                self.setMinimumSize(k*5,k*5)
+        else:
             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):
+        self.update()
 
-        if not self.addr:
+    def paintEvent(self, e):
+        if not self.data:
             return
 
         black = QColor(0, 0, 0, 255)
@@ -53,27 +50,32 @@ class QRCodeWidget(QWidget):
             qp.begin(self)
             qp.setBrush(white)
             qp.setPen(white)
-            qp.drawRect(0, 0, 198, 198)
+            r = qp.viewport()
+            qp.drawRect(0, 0, r.width(), r.height())
             qp.end()
             return
-        k = self.qr.getModuleCount()
+
+        matrix = self.qr.get_matrix()
+        k = len(matrix)
         qp = QtGui.QPainter()
         qp.begin(self)
         r = qp.viewport()
-        boxsize = min(r.width(), r.height())*0.8/k
+
+        margin = 10
+        framesize = min(r.width(), r.height())
+        boxsize = int( (framesize - 2*margin)/k )
         size = k*boxsize
         left = (r.width() - size)/2
-        top = (r.height() - size)/2         
+        top = (r.height() - size)/2
 
-        # Make a white margin around the QR in case of dark theme use:
-        margin = 10
+        # 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))
 
         for r in range(k):
             for c in range(k):
-                if self.qr.isDark(r, c):
+                if matrix[r][c]:
                     qp.setBrush(black)
                     qp.setPen(black)
                 else:
@@ -82,3 +84,52 @@ class QRCodeWidget(QWidget):
                 qp.drawRect(left+c*boxsize, top+r*boxsize, boxsize, boxsize)
         qp.end()
         
+
+
+class QRDialog(QDialog):
+
+    def __init__(self, data, parent=None, title = "", show_text=False):
+        QDialog.__init__(self, parent)
+
+        d = self
+        d.setWindowTitle(title)
+        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)
+
+        config = electrum_nvc.get_config()
+        if config:
+            filename = os.path.join(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)
+