URI: 
       trebase to master and add resources, numerous other small fixes - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 1bbb211671e46702ec913f5bddffbb0665ff6bbc
   DIR parent a1681eeeba4c212dcbb6087f1ed3201378492bd8
  HTML Author: qua-non <akshayaurora@gmail.com>
       Date:   Tue,  4 Mar 2014 23:32:03 +0530
       
       rebase to master and add resources, numerous other small fixes
       
       Diffstat:
         A data/fonts/Roboto-Bold.ttf          |       0 
         A data/fonts/Roboto.ttf               |       0 
         A data/fonts/tron/License.txt         |       5 +++++
         A data/fonts/tron/Readme.txt          |      22 ++++++++++++++++++++++
         A data/fonts/tron/Tr2n.ttf            |       0 
         M gui/kivy/dialog.py                  |       2 +-
         M gui/kivy/installwizard.py           |      29 ++++++++++++++---------------
         M gui/kivy/main_window.py             |      32 +++++++++++++++++++------------
         A gui/kivy/plugins/__init__.py        |       1 +
         A gui/kivy/plugins/exchange_rate.py   |     179 +++++++++++++++++++++++++++++++
         A gui/kivy/theming/light/stepper_res… |       0 
         A gui/kivy/theming/light/stepper_res… |       0 
         A icons/electrum_android_launcher_ic… |       0 
       
       13 files changed, 242 insertions(+), 28 deletions(-)
       ---
   DIR diff --git a/data/fonts/Roboto-Bold.ttf b/data/fonts/Roboto-Bold.ttf
       Binary files differ.
   DIR diff --git a/data/fonts/Roboto.ttf b/data/fonts/Roboto.ttf
       Binary files differ.
   DIR diff --git a/data/fonts/tron/License.txt b/data/fonts/tron/License.txt
       t@@ -0,0 +1,4 @@
       +Copyright (c) 2010-2011, Jeff Bell [www.randombell.com] | [jeffbell@randombell.com].
       +This font may be distributed freely however must retain this document as well as the Readme.txt file.
       +This Font Software is licensed under the SIL Open Font License, Version 1.1.
       +This license is available with a FAQ at: http://scripts.sil.org/OFL
       +\ No newline at end of file
   DIR diff --git a/data/fonts/tron/Readme.txt b/data/fonts/tron/Readme.txt
       t@@ -0,0 +1,21 @@
       +TR2N v1.3
       +
       +ABOUT THE FONT:
       +A font based upon the poster text for TRON LEGACY.
       +
       +The font is different from the pre-existing TRON font currently on the web.  Similar in minor aspects but different in most.  Style based upon text from different region posters.
       +
       +UPDATE HISTORY:
       +3/7/11 - Adjusted the letter B (both lowercase and uppercase), capped off the ends of T, P and R, added a few more punctuation marks, as well as added the TR and TP ligature to allow for the solid bar connect as in the poster art.
       +
       +1/22/11 - Made minor corrections to all previous letters and punctuation.  Corrected issue with number 8's top filling in.
       +
       +ABOUT THE AUTHOR:
       +Jeff Bell has produced fonts before, but this is the first one in over 10 years.  His original 3 fonts were under the name DJ-JOHNNYRKA and include "CASPER", "BEVERLY HILLS COP", "THE GODFATHER" and "FIDDUMS FAMILY".
       +
       +For more information on Jeff Bell and his work can be found online:
       +
       +www.randombell.com
       +www.damovieman.deviantart.com
       +http://www.imdb.com/name/nm3983081/
       +http://www.vimeo.com/user4004969/videos
       +\ No newline at end of file
   DIR diff --git a/data/fonts/tron/Tr2n.ttf b/data/fonts/tron/Tr2n.ttf
       Binary files differ.
   DIR diff --git a/gui/kivy/dialog.py b/gui/kivy/dialog.py
       t@@ -501,7 +501,7 @@ class RestoreSeedDialog(CreateAccountDialog):
                    app.navigation_higherarchy.append(_back)
        
            def on_key_down(self, keyboard, keycode, key, modifiers):
       -        if keycode[1] == 'enter':
       +        if keycode[0] in (13, 271):
                    self.on_enter()
                    return True
                #super
   DIR diff --git a/gui/kivy/installwizard.py b/gui/kivy/installwizard.py
       t@@ -68,18 +68,19 @@ class InstallWizard(Widget):
                if not button:
                    return self.dispatch('on_wizard_complete', None)
        
       -        wallet = Wallet(self.storage)
       -        gap = self.config.get('gap_limit', 5)
       -        if gap !=5:
       -            wallet.gap_limit = gap_limit
       -            wallet.storage.put('gap_limit', gap, True)
       +        #gap = self.config.get('gap_limit', 5)
       +        #if gap !=5:
       +        #    wallet.gap_limit = gap_limit
       +        #    wallet.storage.put('gap_limit', gap, True)
        
                dialog.close()
                if button == dialog.ids.create:
                    # create
       +            wallet = Wallet(self.storage)
                    self.change_password_dialog(wallet=wallet)
                elif button == dialog.ids.restore:
                    # restore
       +            wallet = None
                    self.restore_seed_dialog(wallet)
                #if button == dialog.ids.watching:
                #TODO: not available in the new design
       t@@ -102,20 +103,18 @@ class InstallWizard(Widget):
        
                seed = unicode(_dlg.ids.text_input_seed.text)
                if not seed:
       -            app.show_error(_("No seed!"))
       +            app.show_error(_("No seed!"), duration=.5)
                    return
        
                try:
       -            wallet.init_seed(seed)
       -        except Exception:
       -            import traceback
       -            traceback.print_exc(file=sys.stdout)
       -            app.show_error(_('No account tied to this seedphrase'))#, exit=True)
       -            return
       -
       +            wallet = Wallet.from_seed(seed, self.storage)
       +        except Exception as err:
       +            _dlg.close()
       +            return app.show_error(str(err) + '\n App will now exit',
       +                           exit=True, modal=True, duration=.5)
                _dlg.close()
       -        self.change_password_dialog(wallet=wallet, mode='restore')
       -        return
       +        return self.change_password_dialog(wallet=wallet, mode='restore')
       +
        
            def init_seed_dialog(self, wallet=None, instance=None, password=None,
                                 wallet_name=None, mode='create'):
   DIR diff --git a/gui/kivy/main_window.py b/gui/kivy/main_window.py
       t@@ -40,7 +40,7 @@ class ElectrumWindow(App):
            status = StringProperty(_('Uninitialised'))
            '''The status of the connection should show the balance when connected
        
       -    :attr:`status` is a `StringProperty` defaults to _'uninitialised'
       +    :attr:`status` is a `StringProperty` defaults to 'uninitialised'
            '''
        
            def _get_num_zeros(self):
       t@@ -144,14 +144,15 @@ class ElectrumWindow(App):
                self.exchanger = None
        
                super(ElectrumWindow, self).__init__(**kwargs)
       +
                self.network = network = kwargs.get('network')
                self.electrum_config = config = kwargs.get('config')
        
                # create triggers so as to minimize updation a max of 5 times a sec
       -        self._trigger_update_status = Clock.create_trigger(self.update_status,
       -                                                           .2)
       -        self._trigger_update_console = Clock.create_trigger(self.update_console,
       -                                                            .2)
       +        self._trigger_update_status =\
       +            Clock.create_trigger(self.update_status, .2)
       +        self._trigger_update_console =\
       +            Clock.create_trigger(self.update_console, .2)
                self._trigger_notify_transactions = \
                    Clock.create_trigger(self.notify_transactions, .2)
        
       t@@ -197,7 +198,8 @@ class ElectrumWindow(App):
                self.on_resume()
        
            def on_stop(self):
       -        self.wallet.stop_threads()
       +        if self.wallet:
       +            self.wallet.stop_threads()
        
            def on_back(self):
                ''' Manage screen hierarchy
       t@@ -251,7 +253,6 @@ class ElectrumWindow(App):
                    Logger.debug('Electrum: No Wallet set/found. Exiting...')
                    app.show_error('Electrum: No Wallet set/found. Exiting...',
                                   exit=True)
       -        Logger.info('wizard complete')
        
        
                self.init_ui()
       t@@ -322,7 +323,7 @@ class ElectrumWindow(App):
                '''
                '''
                if not self.exchanger:
       -            from plugins.exchange_rate import Exchanger
       +            from electrum_gui.kivy.plugins.exchange_rate import Exchanger
                    self.exchanger = Exchanger(self)
                    self.exchanger.start()
                quote_currency = self.electrum_config.get("currency", 'EUR')
       t@@ -701,7 +702,8 @@ class ElectrumWindow(App):
                           arrow_pos=None,
                           exit=False,
                           icon='atlas://gui/kivy/theming/light/error',
       -                   duration=0):
       +                   duration=0,
       +                   modal=False):
                ''' Show a error Message Bubble.
                '''
                self.show_info_bubble(
       t@@ -711,18 +713,24 @@ class ElectrumWindow(App):
                            pos=pos or Window.center,
                            arrow_pos=arrow_pos,
                            exit=exit,
       -                    duration=duration)
       +                    duration=duration,
       +                    modal=modal)
        
            def show_info(self, error,
                           width='200dp',
                           pos=None,
                           arrow_pos=None,
                           exit=False,
       -                   duration=0):
       +                   duration=0,
       +                   modal=False):
                ''' Show a Info Message Bubble.
                '''
                self.show_error(error, icon='atlas://gui/kivy/theming/light/error',
       -                        duration=duration)
       +                        duration=duration,
       +                        modal=modal,
       +                        exit=exit,
       +                        pos=pos,
       +                        arrow_pos=arrow_pos)
        
            def show_info_bubble(self,
                            text=_('Hello World'),
   DIR diff --git a/gui/kivy/plugins/__init__.py b/gui/kivy/plugins/__init__.py
       t@@ -0,0 +1 @@
       + 
   DIR diff --git a/gui/kivy/plugins/exchange_rate.py b/gui/kivy/plugins/exchange_rate.py
       t@@ -0,0 +1,179 @@
       +# -*- encoding: utf8 -*-
       +
       +'''Module exchange_rate:
       +
       +This module is responsible for getting the conversion rates between different
       +currencies.
       +'''
       +
       +from kivy.network.urlrequest import UrlRequest
       +#kivy.event import EventDispatcher
       +from kivy.clock import Clock
       +import decimal
       +import json
       +
       +class Exchanger(object):
       +    '''
       +    '''
       +
       +    symbols = {'ALL': 'Lek', 'AED': 'د.إ', 'AFN':'؋', 'ARS': '$', 'AMD': '֏',
       +        'AWG': 'ƒ', 'ANG': 'ƒ', 'AOA': 'Kz', 'BDT': '৳', 'BHD': 'BD',
       +        'BIF': 'FBu', 'BTC': 'BTC', 'BTN': 'Nu',
       +        'AUD': '$', 'AZN': 'ман', 'BSD': '$', 'BBD': '$', 'BYR': 'p',
       +        'BZD': 'BZ$', 'BMD': '$', 'BOB': '$b', 'BAM': 'KM', 'BWP': 'P',
       +        'BGN': 'лв', 'BRL': 'R$', 'BND': '$', 'KHR': '៛', 'CAD': '$',
       +        'KYD': '$', 'USD': '$', 'CLP': '$', 'CNY': '¥', 'COP': '$', 'CRC': '₡',
       +        'HRK': 'kn', 'CUP':'₱', 'CZK': 'Kč', 'DKK': 'kr', 'DOP': 'RD$',
       +        'XCD': '$', 'EGP': '£', 'SVC': '$' , 'EEK': 'kr', 'EUR': '€',
       +        'FKP': '£', 'FJD': '$', 'GHC': '¢', 'GIP': '£', 'GTQ': 'Q', 'GBP': '£',
       +        'GYD': '$', 'HNL': 'L', 'HKD': '$', 'HUF': 'Ft', 'ISK': 'kr',
       +        'INR': '₹', 'IDR': 'Rp', 'IRR': '﷼', 'IMP': '£', 'ILS': '₪',
       +        'JMD': 'J$', 'JPY': '¥', 'JEP': '£', 'KZT': 'лв', 'KPW': '₩',
       +        'KRW': '₩', 'KGS': 'лв', 'LAK': '₭', 'LVL': 'Ls'}
       +
       +    def __init__(self, parent):
       +        self.parent = parent
       +        self.quote_currencies = None
       +        self.exchanges = ('BlockChain', 'Coinbase', 'CoinDesk')
       +        try:
       +            self.use_exchange =  parent.electrum_config.get('use_exchange',
       +                                                            'BlockChain')
       +        except AttributeError:
       +            self.use_exchange = 'BlockChain'
       +        self.currencies = self.symbols.keys()
       +
       +    def exchange(self, btc_amount, quote_currency):
       +        if self.quote_currencies is None:
       +            return None
       +        quote_currencies = self.quote_currencies.copy()
       +        if quote_currency not in quote_currencies:
       +            return None
       +        if self.use_exchange == "CoinDesk":
       +            try:
       +                connection = httplib.HTTPSConnection('api.coindesk.com')
       +                connection.request("GET", "/v1/bpi/currentprice/" + str(quote_currency) + ".json")
       +            except Exception:
       +                return
       +            resp = connection.getresponse()
       +            if resp.reason == httplib.responses[httplib.NOT_FOUND]:
       +                return
       +            try:
       +                resp_rate = json.loads(resp.read())
       +            except Exception:
       +                return
       +            return btc_amount * decimal.Decimal(str(resp_rate["bpi"][str(quote_currency)]["rate_float"]))
       +        return btc_amount * decimal.Decimal(quote_currencies[quote_currency])
       +
       +    def check_rates(self, dt):
       +        if self.use_exchange == 'BlockChain':
       +            self.check_blockchain()
       +        elif self.use_exchange == 'CoinDesk':
       +            self.check_coindesk()
       +        elif self.use_exchange == 'Coinbase':
       +            self.check_coinbase()
       +
       +    def check_coindesk(self):
       +
       +        def _lookup_rate(response, quote_id):
       +            return decimal.Decimal(str(response[str(quote_id)]["15m"]))
       +
       +        def on_success(request, response):
       +            quote_currencies = {}
       +            try:
       +                for r in response:
       +                    quote_currencies[r] = _lookup_rate(response, r)
       +                self.quote_currencies = quote_currencies
       +            except KeyError:
       +                pass
       +            self.parent.set_currencies(quote_currencies)
       +
       +        def on_failure(*args):
       +            pass
       +
       +        def on_error(*args):
       +            pass
       +
       +        def on_redirect(*args):
       +            pass
       +
       +        req = UrlRequest(
       +            url='https://api.coindesk.com/v1/bpi/supported-currencies.json',
       +                        on_success=on_success,
       +                        on_failure=on_failure,
       +                        on_error=on_error,
       +                        on_redirect=on_redirect,
       +                        timeout=5)
       +
       +    def check_coinbase(self):
       +
       +        def _lookup_rate(response, quote_id):
       +            return decimal.Decimal(str(response[str(quote_id)]))
       +
       +        def on_success(request, response):
       +            quote_currencies = {}
       +            try:
       +                for r in response:
       +                    if r[:7] == "btc_to_":
       +                        quote_currencies[r[7:].upper()] =\
       +                            _lookup_rate(response, r)
       +                self.quote_currencies = quote_currencies
       +            except KeyError:
       +                pass
       +            self.parent.set_currencies(quote_currencies)
       +
       +        def on_failure(*args):
       +            pass
       +
       +        def on_error(*args):
       +            pass
       +
       +        def on_redirect(*args):
       +            pass
       +
       +        req = UrlRequest(
       +            url='https://coinbase.com/api/v1/currencies/exchange_rates',
       +            on_success=on_success,
       +            on_failure=on_failure,
       +            on_error=on_error,
       +            on_redirect=on_redirect,
       +            timeout=5)
       +
       +    def check_blockchain(self):
       +
       +        def _lookup_rate(response, quote_id):
       +            return decimal.Decimal(str(response[str(quote_id)]["15m"]))
       +
       +        def on_success(request, response):
       +            quote_currencies = {}
       +            try:
       +                for r in response:
       +                    quote_currencies[r] = _lookup_rate(response, r)
       +                self.quote_currencies = quote_currencies
       +            except KeyError:
       +                pass
       +            self.parent.set_currencies(quote_currencies)
       +
       +        def on_failure(*args):
       +            pass
       +
       +        def on_error(*args):
       +            pass
       +
       +        def on_redirect(*args):
       +            pass
       +
       +        req = UrlRequest(url='https://blockchain.info/ticker',
       +                        on_success=on_success,
       +                        on_failure=on_failure,
       +                        on_error=on_error,
       +                        on_redirect=on_redirect,
       +                        timeout=5)
       +
       +    def start(self):
       +        # check every 5 seconds
       +        self.check_rates(0)
       +        Clock.schedule_interval(self.check_rates, 5)
       +
       +    def stop(self):
       +        Clock.unschedule(self.check_rates)
       +
   DIR diff --git a/gui/kivy/theming/light/stepper_restore_password.png b/gui/kivy/theming/light/stepper_restore_password.png
       Binary files differ.
   DIR diff --git a/gui/kivy/theming/light/stepper_restore_seed.png b/gui/kivy/theming/light/stepper_restore_seed.png
       Binary files differ.
   DIR diff --git a/icons/electrum_android_launcher_icon.png b/icons/electrum_android_launcher_icon.png
       Binary files differ.