more QR code capabilities: encode amount, save to file
authorThomasV <thomasv@gitorious>
Tue, 1 May 2012 15:06:14 +0000 (17:06 +0200)
committerThomasV <thomasv@gitorious>
Tue, 1 May 2012 15:06:14 +0000 (17:06 +0200)
bmp.py
electrum4a.py
gui_qt.py

diff --git a/bmp.py b/bmp.py
index bfdd165..b4bd410 100644 (file)
--- a/bmp.py
+++ b/bmp.py
@@ -193,7 +193,23 @@ class BitMap(object):
     f.close()\r
   \r
 \r
-\r
+def save_qrcode(qr, filename):\r
+    bitmap = BitMap( 35*8, 35*8 )\r
+    #print len(bitmap.bitarray)\r
+    bitmap.bitarray = []\r
+    k = 33\r
+    for r in range(35):\r
+        tmparray = [ 0 ] * 35*8\r
+\r
+        if 0 < r < 34:\r
+            for c in range(k):\r
+                if qr.isDark(r-1, c):\r
+                    tmparray[ (1+c)*8:(2+c)*8] = [1]*8\r
+\r
+        for i in range(8):\r
+            bitmap.bitarray.append( tmparray[:] )\r
+\r
+    bitmap.saveFile( filename )\r
 \r
   \r
     \r
index f247764..1698cc9 100755 (executable)
@@ -26,7 +26,7 @@ from wallet import format_satoshis
 from decimal import Decimal
 import mnemonic
 
-import datetime
+import datetime, re
 
 
 
@@ -606,6 +606,10 @@ def main_loop():
             elif out == "receive":
                 global receive_addr
                 receive_addr = select_from_addresses()
+                amount = modal_input('Amount', 'Amount you want receive. ', '', "numberDecimal")
+                if amount:
+                    receive_addr = 'bitcoin:%s?amount=%s'%(receive_addr, amount)
+
                 if not receive_addr:
                     out = None
 
@@ -656,9 +660,16 @@ def payto_loop():
                 code = droid.scanBarcode()
                 r = code.result
                 if r:
-                    addr = r['extras']['SCAN_RESULT']
-                    if addr:
-                        droid.fullSetProperty("recipient","text",addr)
+                    data = r['extras']['SCAN_RESULT']
+                    if data:
+                        if re.match('^bitcoin:', data):
+                            payto, amount, label, _, _, _, _ = wallet.parse_url(data, None, None)
+                            droid.fullSetProperty("recipient", "text",payto)
+                            droid.fullSetProperty("amount", "text", amount)
+                            droid.fullSetProperty("label", "text", label)
+                        else:
+                            droid.fullSetProperty("recipient", "text", data)
+
                     
         elif event["name"] in menu_commands:
             out = event["name"]
@@ -923,29 +934,16 @@ def make_bitmap(addr):
     # fixme: this is highly inefficient
     droid.dialogCreateSpinnerProgress("please wait")
     droid.dialogShow()
-    import pyqrnative, bmp
-    qr = pyqrnative.QRCode(4, pyqrnative.QRErrorCorrectLevel.H)
-    qr.addData(addr)
-    qr.make()
-    k = qr.getModuleCount()
-    bitmap = bmp.BitMap( 35*8, 35*8 )
-    print len(bitmap.bitarray)
-    bitmap.bitarray = []
-    assert k == 33
-
-    for r in range(35):
-        tmparray = [ 0 ] * 35*8
-
-        if 0 < r < 34:
-            for c in range(k):
-                if qr.isDark(r-1, c):
-                    tmparray[ (1+c)*8:(2+c)*8] = [1]*8
-
-        for i in range(8):
-            bitmap.bitarray.append( tmparray[:] )
-
-    bitmap.saveFile( "/sdcard/sl4a/qrcode.bmp" )
-    droid.dialogDismiss()
+    try:
+        import pyqrnative, bmp
+        qr = pyqrnative.QRCode(4, pyqrnative.QRErrorCorrectLevel.L)
+        qr.addData(addr)
+        qr.make()
+        k = qr.getModuleCount()
+        assert k == 33
+        bmp.save_qrcode(qr,"/sdcard/sl4a/qrcode.bmp")
+    finally:
+        droid.dialogDismiss()
 
         
 
index 9f47da5..6206612 100644 (file)
--- a/gui_qt.py
+++ b/gui_qt.py
@@ -96,11 +96,14 @@ class StatusBarButton(QPushButton):
 class QRCodeWidget(QWidget):
 
     def __init__(self, addr):
-        import pyqrnative
         super(QRCodeWidget, self).__init__()
-        self.addr = addr
         self.setGeometry(300, 300, 350, 350)
-        self.qr = pyqrnative.QRCode(4, pyqrnative.QRErrorCorrectLevel.H)
+        self.set_addr(addr)
+
+    def set_addr(self, addr):
+        import pyqrnative
+        self.addr = addr
+        self.qr = pyqrnative.QRCode(4, pyqrnative.QRErrorCorrectLevel.L)
         self.qr.addData(addr)
         self.qr.make()
         
@@ -524,7 +527,7 @@ class ElectrumWindow(QMainWindow):
             addr = unicode( i.text(0) )
             return addr
 
-        qrButton = EnterButton("QR",lambda: ElectrumWindow.showqrcode(get_addr(l)))
+        qrButton = EnterButton("QR",lambda: self.show_address_qrcode(get_addr(l)))
 
         def copy2clipboard(addr):
             self.app.clipboard().setText(addr)
@@ -657,18 +660,75 @@ class ElectrumWindow(QMainWindow):
               + ' '.join(mnemonic.mn_encode(seed)) + "\""
 
         QMessageBox.information(parent, 'Seed', msg, 'OK')
-        ElectrumWindow.showqrcode(seed)
+        ElectrumWindow.show_seed_qrcode(seed)
 
     @staticmethod
-    def showqrcode(address):
+    def show_seed_qrcode(seed):
+        if not seed: return
+        d = QDialog(None)
+        d.setModal(1)
+        d.setWindowTitle(seed)
+        d.setMinimumSize(270, 300)
+        vbox = QVBoxLayout()
+        vbox.addWidget(QRCodeWidget(seed))
+        hbox = QHBoxLayout()
+        hbox.addStretch(1)
+        b = QPushButton("OK")
+        hbox.addWidget(b)
+        b.clicked.connect(d.accept)
+
+        vbox.addLayout(hbox)
+        d.setLayout(vbox)
+        d.exec_()
+
+    def show_address_qrcode(self,address):
         if not address: return
         d = QDialog(None)
         d.setModal(1)
         d.setWindowTitle(address)
-        d.setMinimumSize(270, 300)
+        d.setMinimumSize(270, 350)
         vbox = QVBoxLayout()
-        vbox.addWidget(QRCodeWidget(address))
-        vbox.addLayout(ok_cancel_buttons(d))
+        qrw = QRCodeWidget(address)
+        vbox.addWidget(qrw)
+
+        hbox = QHBoxLayout()
+        amount_e = QLineEdit()
+        hbox.addWidget(QLabel('Amount'))
+        hbox.addWidget(amount_e)
+        vbox.addLayout(hbox)
+
+        #hbox = QHBoxLayout()
+        #label_e = QLineEdit()
+        #hbox.addWidget(QLabel('Label'))
+        #hbox.addWidget(label_e)
+        #vbox.addLayout(hbox)
+
+        def amount_changed():
+            amount = numbify(amount_e)
+            #label = str( label_e.getText() )
+            if amount is not None:
+                qrw.set_addr('bitcoin:%s?amount=%s'%(address,str( Decimal(amount) /100000000)))
+            else:
+                qrw.set_addr( address )
+            qrw.repaint()
+
+        def do_save():
+            import bmp
+            bmp.save_qrcode(qrw.qr, "qrcode.bmp")
+            self.show_message("QR code saved to file 'qrcode.bmp'")
+            
+        amount_e.textChanged.connect( amount_changed )
+
+        hbox = QHBoxLayout()
+        hbox.addStretch(1)
+        b = QPushButton("Save")
+        b.clicked.connect(do_save)
+        hbox.addWidget(b)
+        b = QPushButton("Close")
+        hbox.addWidget(b)
+        b.clicked.connect(d.accept)
+
+        vbox.addLayout(hbox)
         d.setLayout(vbox)
         d.exec_()