From f442cc31e4e6bc5abbdadf06738e5ee33da7511b Mon Sep 17 00:00:00 2001 From: akshayaurora Date: Tue, 24 Jun 2014 22:09:11 +0530 Subject: [PATCH] Abstract and enable qrscanner dialog for send screen. --- gui/kivy/main_window.py | 8 ++++++++ gui/kivy/qr_scanner/__init__.py | 1 + gui/kivy/qr_scanner/scanner_camera.py | 21 ++++++++++++++------- gui/kivy/uix/dialogs/new_contact.py | 7 +------ gui/kivy/uix/dialogs/qr_scanner.py | 11 ++++++++--- gui/kivy/uix/screens.py | 11 ++++++----- gui/kivy/uix/ui_screens/mainscreen.kv | 2 +- 7 files changed, 39 insertions(+), 22 deletions(-) diff --git a/gui/kivy/main_window.py b/gui/kivy/main_window.py index cc58bfd27..6468aa368 100644 --- a/gui/kivy/main_window.py +++ b/gui/kivy/main_window.py @@ -200,6 +200,14 @@ class ElectrumWindow(App): def set_url(self, instance, url): self.gui_object.set_url(url) + def scan_qr(self, on_complete): + dlg = Cache.get('electrum_widgets', 'QrScannerDialog') + if not dlg: + dlg = Factory.QrScannerDialog() + Cache.append('electrum_widgets', 'QrScannerDialog', dlg) + dlg.bind(on_complete=on_complete) + dlg.open() + def build(self): global Builder if not Builder: diff --git a/gui/kivy/qr_scanner/__init__.py b/gui/kivy/qr_scanner/__init__.py index 0b9d850bd..9cee248c3 100644 --- a/gui/kivy/qr_scanner/__init__.py +++ b/gui/kivy/qr_scanner/__init__.py @@ -56,4 +56,5 @@ class ScannerBase(AnchorLayout): QRScanner = core_select_lib('qr_scanner', ( ('android', 'scanner_android', 'ScannerAndroid'), ('camera', 'scanner_camera', 'ScannerCamera')), False, 'electrum_gui.kivy') + Factory.register('QRScanner', cls=QRScanner) diff --git a/gui/kivy/qr_scanner/scanner_camera.py b/gui/kivy/qr_scanner/scanner_camera.py index 7458ba3c7..3acb1b7a8 100644 --- a/gui/kivy/qr_scanner/scanner_camera.py +++ b/gui/kivy/qr_scanner/scanner_camera.py @@ -1,22 +1,28 @@ from kivy.uix.camera import Camera from kivy.clock import Clock +from kivy.utils import platform -import iconv from electrum_gui.kivy.qr_scanner import ScannerBase + +import iconv + try: from zbar import ImageScanner, Config, Image, Symbol except ImportError: - raise SystemError('unable to import zbar please make sure you have it installed') + raise SystemError('unable to import zbar please make sure you have' + ' it installed.\nFor mac osx: `brew install zbar then\n`' + '`pip install https://github.com/npinchot/zbar/archive/d3c1611ad2411fbdc3e79eb96ca704a63d30ae69.zip`') try: - import Image as PILImage + from PIL import Image as PILImage except ImportError: - raise SystemError('unable to import Pil/pillow please install one of the two.') + raise SystemError('unable to import Pil/pillow' + ' please install one of the two.') __all__ = ('ScannerCamera', ) class ScannerCamera(ScannerBase): - '''Widget that use the kivy.uix.camera.Camera and zbar to detect qrcode. - When found, the `symbols` will be updated + '''Widget that use the kivy.uix.camera.Camera and zbar to detect + qrcode. When found, the `symbols` will be updated ''' def __init__(self, **kwargs): @@ -48,7 +54,8 @@ class ScannerCamera(ScannerBase): self._camera.play = False Clock.unschedule(self._detect_qrcode_frame) # TODO: testing for various platforms(windows, mac) - self._camera._camera._pipeline.set_state(1) + if platform == 'linux': + self._camera._camera._pipeline.set_state(1) #self._camera = None def _detect_qrcode_frame(self, *args): diff --git a/gui/kivy/uix/dialogs/new_contact.py b/gui/kivy/uix/dialogs/new_contact.py index 371283d32..fdb457384 100644 --- a/gui/kivy/uix/dialogs/new_contact.py +++ b/gui/kivy/uix/dialogs/new_contact.py @@ -9,12 +9,7 @@ class NewContactDialog(Factory.AnimatedPopup): def load_qr_scanner(self): self.dismiss() - dlg = Cache.get('electrum_widgets', 'QrScannerDialog') - if not dlg: - dlg = Factory.QrScannerDialog() - Cache.append('electrum_widgets', 'QrScannerDialog', dlg) - dlg.bind(on_complete=self.on_complete) - dlg.open() + App.get_running_app().scan_qr(on_complete=self.on_complete) def on_complete(self, instance, uri): self.new_contact(uri=uri) diff --git a/gui/kivy/uix/dialogs/qr_scanner.py b/gui/kivy/uix/dialogs/qr_scanner.py index 6b1b902e7..6b51fe38c 100644 --- a/gui/kivy/uix/dialogs/qr_scanner.py +++ b/gui/kivy/uix/dialogs/qr_scanner.py @@ -4,9 +4,9 @@ from kivy.lang import Builder Factory.register('QRScanner', module='electrum_gui.kivy.qr_scanner') -class QrScannerDialog(Factory.AnimaterPopup): +class QrScannerDialog(Factory.AnimatedPopup): - __events__('on_complete', ) + __events__ = ('on_complete', ) def on_symbols(self, instance, value): instance.stop() @@ -18,6 +18,11 @@ class QrScannerDialog(Factory.AnimaterPopup): #message = uir.get('message', '') self.dispatch('on_omplete', uri) + def on_complete(self): + ''' Default Handler for on_complete event. + ''' + pass + Builder.load_string(''' @@ -27,7 +32,7 @@ Builder.load_string(''' title_size: '24sp' border: 7, 7, 7, 7 size_hint: None, None - size: '320dp', '270dp' + size: '340dp', '290dp' pos_hint: {'center_y': .53} separator_color: .89, .89, .89, 1 separator_height: '1.2dp' diff --git a/gui/kivy/uix/screens.py b/gui/kivy/uix/screens.py index 7ea78e127..3b9450b51 100644 --- a/gui/kivy/uix/screens.py +++ b/gui/kivy/uix/screens.py @@ -101,12 +101,13 @@ class MainScreen(Factory.Screen): class ScreenSend(CScreen): - def scan_qr(self): - pop = Factory.QrScannerDialog(on_complete=self.set_qr_data) - pop.open() - def set_qr_data(self, uri): - self.ids.payto_e + self.ids.payto_e.text = uri.get('address') + self.ids.message_e.text = uri.get('message') + self.ids.amount_e.text = uri.get('amount') + #label = uri.get('label') + #if label: + # TODO: update label, add to contacts class ScreenReceive(CScreen): diff --git a/gui/kivy/uix/ui_screens/mainscreen.kv b/gui/kivy/uix/ui_screens/mainscreen.kv index 109523f89..30b882316 100644 --- a/gui/kivy/uix/ui_screens/mainscreen.kv +++ b/gui/kivy/uix/ui_screens/mainscreen.kv @@ -336,7 +336,7 @@ pos_hint: {'center_y': .5} size_hint: None, None size: '22dp', '22dp' - on_release: root.scan_qr() + on_release: app.scan_qr(on_complete=root.set_qr_data) CardSeparator opacity: message_selection.opacity color: blue_bottom.foreground_color