diff --git a/bmp.py b/bmp.py index bfdd165b..b4bd4102 100644 --- a/bmp.py +++ b/bmp.py @@ -193,7 +193,23 @@ class BitMap(object): f.close() +def save_qrcode(qr, filename): + bitmap = BitMap( 35*8, 35*8 ) + #print len(bitmap.bitarray) + bitmap.bitarray = [] + 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( filename ) diff --git a/electrum4a.py b/electrum4a.py index f2477644..1698cc96 100755 --- a/electrum4a.py +++ b/electrum4a.py @@ -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() diff --git a/gui_qt.py b/gui_qt.py index 9f47da50..6206612c 100644 --- 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_()