move qrscanner from plugins to lib

This commit is contained in:
ThomasV 2014-08-23 17:45:47 +02:00
parent 867597cd91
commit 89b8078549
4 changed files with 63 additions and 162 deletions

View File

@ -2570,6 +2570,25 @@ class ElectrumWindow(QMainWindow):
grid.addWidget(showtx_cb, 6, 0)
grid.addWidget(HelpButton(_('Display the details of your transactions before broadcasting it.')), 6, 2)
from electrum import qrscanner
system_cameras = qrscanner._find_system_cameras()
qr_combo = QComboBox()
on_change = lambda x: self.config.set_key("video_device", str(qr_combo.itemData(x).toString()), True)
qr_combo.currentIndexChanged.connect(on_change)
qr_combo.addItem("Default","default")
for camera, device in system_cameras.items():
qr_combo.addItem(camera, device)
#combo.addItem("Manually specify a device", config.get("video_device"))
index = qr_combo.findData(self.config.get("video_device"))
qr_combo.setCurrentIndex(index)
qr_label = QLabel(_('Video Device') + ':')
grid.addWidget(qr_label, 7, 0)
grid.addWidget(qr_combo, 7, 1)
qr_combo.setEnabled(qrscanner.zbar is not None)
help_msg = _("Install the zbar package to enable this.\nOn linux, type: 'apt-get install python-zbar'")
grid.addWidget(HelpButton(help_msg), 7, 2)
vbox.addLayout(grid)
vbox.addStretch(1)
vbox.addLayout(ok_cancel_buttons(d))

View File

@ -34,8 +34,12 @@ class QRTextEdit(QPlainTextEdit):
QRDialog(str(self.toPlainText())).exec_()
def qr_input(self):
from electrum.plugins import run_hook
data = run_hook('scan_qr_hook')
from electrum import qrscanner
try:
data = qrscanner.scan_qr(self.win.config)
except BaseException, e:
QMessageBox.warning(self.win, _('Error'), _(e), _('OK'))
return
if type(data) != str:
return
self.setText(data)

38
lib/qrscanner.py Normal file
View File

@ -0,0 +1,38 @@
import os
try:
import zbar
except ImportError:
zbar = None
def scan_qr(config):
if not zbar:
return
device = config.get("video_device", "default")
if device == 'default':
device = ''
proc = zbar.Processor()
proc.init(video_device=device)
proc.visible = True
while True:
try:
proc.process_one()
except Exception:
# User closed the preview window
return {}
for r in proc.results:
if str(r.type) != 'QRCODE':
continue
return r.data
def _find_system_cameras():
device_root = "/sys/class/video4linux"
devices = {} # Name -> device
if os.path.exists(device_root):
for device in os.listdir(device_root):
name = open(os.path.join(device_root, device, 'name')).read()
name = name.strip('\n')
devices[name] = os.path.join("/dev",device)
return devices

View File

@ -1,160 +0,0 @@
from electrum.util import print_error
from urlparse import urlparse, parse_qs
from PyQt4.QtGui import QPushButton, QMessageBox, QDialog, QVBoxLayout, QHBoxLayout, QGridLayout, QLabel, QLineEdit, QComboBox
from PyQt4.QtCore import Qt
from electrum.i18n import _
import re
import os
from electrum import Transaction
from electrum.bitcoin import MIN_RELAY_TX_FEE, is_valid
from electrum_gui.qt.qrcodewidget import QRCodeWidget
from electrum import bmp
from electrum_gui.qt import HelpButton, EnterButton
import json
try:
import zbar
except ImportError:
zbar = None
from electrum import BasePlugin
class Plugin(BasePlugin):
def fullname(self): return 'QR scans'
def description(self): return "QR Scans.\nInstall the zbar package to enable this plugin.\nOn linux, type: 'apt-get install python-zbar'"
def __init__(self, gui, name):
BasePlugin.__init__(self, gui, name)
self._is_available = self._init()
def _init(self):
if not zbar:
return False
try:
proc = zbar.Processor()
proc.init(video_device=self.video_device())
except zbar.UnsupportedError:
return False
except zbar.SystemError:
# Cannot open video device
pass
#return False
return True
def init(self):
self.win = self.gui.main_window
def is_available(self):
return self._is_available
def is_enabled(self):
return True
def scan_qr_hook(self):
proc = zbar.Processor()
try:
proc.init(video_device=self.video_device())
except zbar.SystemError, e:
QMessageBox.warning(self.win, _('Error'), _(e), _('OK'))
return
proc.visible = True
while True:
try:
proc.process_one()
except Exception:
# User closed the preview window
return {}
for r in proc.results:
if str(r.type) != 'QRCODE':
continue
return r.data
def video_device(self):
device = self.config.get("video_device", "default")
if device == 'default':
device = ''
return device
def requires_settings(self):
return True
def settings_widget(self, window):
return EnterButton(_('Settings'), self.settings_dialog)
def _find_system_cameras(self):
device_root = "/sys/class/video4linux"
devices = {} # Name -> device
if os.path.exists(device_root):
for device in os.listdir(device_root):
name = open(os.path.join(device_root, device, 'name')).read()
devices[name] = os.path.join("/dev",device)
return devices
def settings_dialog(self):
system_cameras = self._find_system_cameras()
d = QDialog()
layout = QGridLayout(d)
layout.addWidget(QLabel("Choose a video device:"),0,0)
# Create a combo box with the available video devices:
combo = QComboBox()
# on change trigger for video device selection, makes the
# manual device selection only appear when needed:
def on_change(x):
combo_text = str(combo.itemText(x))
combo_data = combo.itemData(x)
if combo_text == "Manually specify a device":
custom_device_label.setVisible(True)
self.video_device_edit.setVisible(True)
if self.config.get("video_device") == "default":
self.video_device_edit.setText("")
else:
self.video_device_edit.setText(self.config.get("video_device",''))
else:
custom_device_label.setVisible(False)
self.video_device_edit.setVisible(False)
self.video_device_edit.setText(combo_data.toString())
# on save trigger for the video device selection window,
# stores the chosen video device on close.
def on_save():
device = str(self.video_device_edit.text())
self.config.set_key("video_device", device)
d.accept()
custom_device_label = QLabel("Video device: ")
custom_device_label.setVisible(False)
layout.addWidget(custom_device_label,1,0)
self.video_device_edit = QLineEdit()
self.video_device_edit.setVisible(False)
layout.addWidget(self.video_device_edit, 1,1,2,2)
combo.currentIndexChanged.connect(on_change)
combo.addItem("Default","default")
for camera, device in system_cameras.items():
combo.addItem(camera, device)
combo.addItem("Manually specify a device",self.config.get("video_device"))
# Populate the previously chosen device:
index = combo.findData(self.config.get("video_device"))
combo.setCurrentIndex(index)
layout.addWidget(combo,0,1)
self.accept = QPushButton(_("Done"))
self.accept.clicked.connect(on_save)
layout.addWidget(self.accept,4,2)
if d.exec_():
return True
else:
return False