more QR code capabilities: encode amount, save to file
This commit is contained in:
parent
50e5f910a7
commit
9050a41381
16
bmp.py
16
bmp.py
|
@ -193,7 +193,23 @@ class BitMap(object):
|
||||||
f.close()
|
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 )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@ from wallet import format_satoshis
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
import mnemonic
|
import mnemonic
|
||||||
|
|
||||||
import datetime
|
import datetime, re
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -606,6 +606,10 @@ def main_loop():
|
||||||
elif out == "receive":
|
elif out == "receive":
|
||||||
global receive_addr
|
global receive_addr
|
||||||
receive_addr = select_from_addresses()
|
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:
|
if not receive_addr:
|
||||||
out = None
|
out = None
|
||||||
|
|
||||||
|
@ -656,9 +660,16 @@ def payto_loop():
|
||||||
code = droid.scanBarcode()
|
code = droid.scanBarcode()
|
||||||
r = code.result
|
r = code.result
|
||||||
if r:
|
if r:
|
||||||
addr = r['extras']['SCAN_RESULT']
|
data = r['extras']['SCAN_RESULT']
|
||||||
if addr:
|
if data:
|
||||||
droid.fullSetProperty("recipient","text",addr)
|
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:
|
elif event["name"] in menu_commands:
|
||||||
out = event["name"]
|
out = event["name"]
|
||||||
|
@ -923,29 +934,16 @@ def make_bitmap(addr):
|
||||||
# fixme: this is highly inefficient
|
# fixme: this is highly inefficient
|
||||||
droid.dialogCreateSpinnerProgress("please wait")
|
droid.dialogCreateSpinnerProgress("please wait")
|
||||||
droid.dialogShow()
|
droid.dialogShow()
|
||||||
import pyqrnative, bmp
|
try:
|
||||||
qr = pyqrnative.QRCode(4, pyqrnative.QRErrorCorrectLevel.H)
|
import pyqrnative, bmp
|
||||||
qr.addData(addr)
|
qr = pyqrnative.QRCode(4, pyqrnative.QRErrorCorrectLevel.L)
|
||||||
qr.make()
|
qr.addData(addr)
|
||||||
k = qr.getModuleCount()
|
qr.make()
|
||||||
bitmap = bmp.BitMap( 35*8, 35*8 )
|
k = qr.getModuleCount()
|
||||||
print len(bitmap.bitarray)
|
assert k == 33
|
||||||
bitmap.bitarray = []
|
bmp.save_qrcode(qr,"/sdcard/sl4a/qrcode.bmp")
|
||||||
assert k == 33
|
finally:
|
||||||
|
droid.dialogDismiss()
|
||||||
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()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
78
gui_qt.py
78
gui_qt.py
|
@ -96,11 +96,14 @@ class StatusBarButton(QPushButton):
|
||||||
class QRCodeWidget(QWidget):
|
class QRCodeWidget(QWidget):
|
||||||
|
|
||||||
def __init__(self, addr):
|
def __init__(self, addr):
|
||||||
import pyqrnative
|
|
||||||
super(QRCodeWidget, self).__init__()
|
super(QRCodeWidget, self).__init__()
|
||||||
self.addr = addr
|
|
||||||
self.setGeometry(300, 300, 350, 350)
|
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.addData(addr)
|
||||||
self.qr.make()
|
self.qr.make()
|
||||||
|
|
||||||
|
@ -524,7 +527,7 @@ class ElectrumWindow(QMainWindow):
|
||||||
addr = unicode( i.text(0) )
|
addr = unicode( i.text(0) )
|
||||||
return addr
|
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):
|
def copy2clipboard(addr):
|
||||||
self.app.clipboard().setText(addr)
|
self.app.clipboard().setText(addr)
|
||||||
|
@ -657,18 +660,75 @@ class ElectrumWindow(QMainWindow):
|
||||||
+ ' '.join(mnemonic.mn_encode(seed)) + "\""
|
+ ' '.join(mnemonic.mn_encode(seed)) + "\""
|
||||||
|
|
||||||
QMessageBox.information(parent, 'Seed', msg, 'OK')
|
QMessageBox.information(parent, 'Seed', msg, 'OK')
|
||||||
ElectrumWindow.showqrcode(seed)
|
ElectrumWindow.show_seed_qrcode(seed)
|
||||||
|
|
||||||
@staticmethod
|
@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
|
if not address: return
|
||||||
d = QDialog(None)
|
d = QDialog(None)
|
||||||
d.setModal(1)
|
d.setModal(1)
|
||||||
d.setWindowTitle(address)
|
d.setWindowTitle(address)
|
||||||
d.setMinimumSize(270, 300)
|
d.setMinimumSize(270, 350)
|
||||||
vbox = QVBoxLayout()
|
vbox = QVBoxLayout()
|
||||||
vbox.addWidget(QRCodeWidget(address))
|
qrw = QRCodeWidget(address)
|
||||||
vbox.addLayout(ok_cancel_buttons(d))
|
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.setLayout(vbox)
|
||||||
d.exec_()
|
d.exec_()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue