another plugin for qrscanner
This commit is contained in:
@@ -42,7 +42,7 @@ from electrum.wallet import format_satoshis
|
||||
from electrum.bitcoin import Transaction, is_valid
|
||||
from electrum import mnemonic
|
||||
|
||||
import bmp, pyqrnative, qrscanner
|
||||
import bmp, pyqrnative
|
||||
import exchange_rate
|
||||
|
||||
from decimal import Decimal
|
||||
@@ -620,24 +620,7 @@ class ElectrumWindow(QMainWindow):
|
||||
self.payto_e = QLineEdit()
|
||||
grid.addWidget(QLabel(_('Pay to')), 1, 0)
|
||||
grid.addWidget(self.payto_e, 1, 1, 1, 3)
|
||||
|
||||
def fill_from_qr():
|
||||
qrcode = qrscanner.scan_qr()
|
||||
if 'address' in qrcode:
|
||||
self.payto_e.setText(qrcode['address'])
|
||||
if 'amount' in qrcode:
|
||||
self.amount_e.setText(str(qrcode['amount']))
|
||||
if 'label' in qrcode:
|
||||
self.message_e.setText(qrcode['label'])
|
||||
if 'message' in qrcode:
|
||||
self.message_e.setText("%s (%s)" % (self.message_e.text(), qrcode['message']))
|
||||
|
||||
|
||||
if qrscanner.is_available():
|
||||
b = QPushButton(_("Scan QR code"))
|
||||
b.clicked.connect(fill_from_qr)
|
||||
grid.addWidget(b, 1, 5)
|
||||
|
||||
|
||||
grid.addWidget(HelpButton(_('Recipient of the funds.') + '\n\n' + _('You may enter a Bitcoin address, a label from your list of contacts (a list of completions will be proposed), or an alias (email-like address that forwards to a Bitcoin address)')), 1, 4)
|
||||
|
||||
completer = QCompleter()
|
||||
@@ -714,6 +697,7 @@ class ElectrumWindow(QMainWindow):
|
||||
self.amount_e.textChanged.connect(lambda: entry_changed(False) )
|
||||
self.fee_e.textChanged.connect(lambda: entry_changed(True) )
|
||||
|
||||
self.wallet.run_hook('create_send_tab',(self,grid))
|
||||
return w2
|
||||
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ from PyQt4.QtCore import *
|
||||
import PyQt4.QtCore as QtCore
|
||||
import PyQt4.QtGui as QtGui
|
||||
|
||||
import bmp, pyqrnative, qrscanner
|
||||
import bmp, pyqrnative
|
||||
|
||||
|
||||
class QRCodeWidget(QWidget):
|
||||
|
||||
@@ -1,83 +0,0 @@
|
||||
from electrum.util import print_error
|
||||
|
||||
try:
|
||||
import zbar
|
||||
except ImportError:
|
||||
print_error("Install zbar package to enable QR scans")
|
||||
zbar = None
|
||||
|
||||
from urlparse import urlparse, parse_qs
|
||||
|
||||
def is_available():
|
||||
if not zbar:
|
||||
return False
|
||||
|
||||
try:
|
||||
proc = zbar.Processor()
|
||||
proc.init()
|
||||
except zbar.SystemError:
|
||||
# Cannot open video device
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def scan_qr():
|
||||
proc = zbar.Processor()
|
||||
proc.init()
|
||||
proc.visible = True
|
||||
|
||||
while True:
|
||||
try:
|
||||
proc.process_one()
|
||||
except:
|
||||
# User closed the preview window
|
||||
return {}
|
||||
|
||||
for r in proc.results:
|
||||
if str(r.type) != 'QRCODE':
|
||||
continue
|
||||
|
||||
return parse_uri(r.data)
|
||||
|
||||
def parse_uri(uri):
|
||||
if ':' not in uri:
|
||||
# It's just an address (not BIP21)
|
||||
return {'address': uri}
|
||||
|
||||
if '//' not in uri:
|
||||
# Workaround for urlparse, it don't handle bitcoin: URI properly
|
||||
uri = uri.replace(':', '://')
|
||||
|
||||
uri = urlparse(uri)
|
||||
result = {'address': uri.netloc}
|
||||
|
||||
if uri.path.startswith('?'):
|
||||
params = parse_qs(uri.path[1:])
|
||||
else:
|
||||
params = parse_qs(uri.path)
|
||||
|
||||
for k,v in params.items():
|
||||
if k in ('amount', 'label', 'message'):
|
||||
result[k] = v[0]
|
||||
|
||||
return result
|
||||
|
||||
if __name__ == '__main__':
|
||||
# Run some tests
|
||||
|
||||
assert(parse_uri('1Marek48fwU7mugmSe186do2QpUkBnpzSN') ==
|
||||
{'address': '1Marek48fwU7mugmSe186do2QpUkBnpzSN'})
|
||||
|
||||
assert(parse_uri('bitcoin://1Marek48fwU7mugmSe186do2QpUkBnpzSN') ==
|
||||
{'address': '1Marek48fwU7mugmSe186do2QpUkBnpzSN'})
|
||||
|
||||
assert(parse_uri('bitcoin:1Marek48fwU7mugmSe186do2QpUkBnpzSN') ==
|
||||
{'address': '1Marek48fwU7mugmSe186do2QpUkBnpzSN'})
|
||||
|
||||
assert(parse_uri('bitcoin:1Marek48fwU7mugmSe186do2QpUkBnpzSN?amount=10') ==
|
||||
{'amount': '10', 'address': '1Marek48fwU7mugmSe186do2QpUkBnpzSN'})
|
||||
|
||||
assert(parse_uri('bitcoin:1Marek48fwU7mugmSe186do2QpUkBnpzSN?amount=10&label=slush&message=Small%20tip%20to%20slush') ==
|
||||
{'amount': '10', 'label': 'slush', 'message': 'Small tip to slush', 'address': '1Marek48fwU7mugmSe186do2QpUkBnpzSN'})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user