commit 1bbb211671e46702ec913f5bddffbb0665ff6bbc
parent a1681eeeba4c212dcbb6087f1ed3201378492bd8
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:
13 files changed, 242 insertions(+), 28 deletions(-)
diff --git a/data/fonts/Roboto-Bold.ttf b/data/fonts/Roboto-Bold.ttf
Binary files differ.
diff --git a/data/fonts/Roboto.ttf b/data/fonts/Roboto.ttf
Binary files differ.
diff --git a/data/fonts/tron/License.txt b/data/fonts/tron/License.txt
@@ -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
diff --git a/data/fonts/tron/Readme.txt b/data/fonts/tron/Readme.txt
@@ -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
diff --git a/data/fonts/tron/Tr2n.ttf b/data/fonts/tron/Tr2n.ttf
Binary files differ.
diff --git a/gui/kivy/dialog.py b/gui/kivy/dialog.py
@@ -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
diff --git a/gui/kivy/installwizard.py b/gui/kivy/installwizard.py
@@ -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
@@ -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'):
diff --git a/gui/kivy/main_window.py b/gui/kivy/main_window.py
@@ -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):
@@ -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)
@@ -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
@@ -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()
@@ -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')
@@ -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(
@@ -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'),
diff --git a/gui/kivy/plugins/__init__.py b/gui/kivy/plugins/__init__.py
@@ -0,0 +1 @@
+
diff --git a/gui/kivy/plugins/exchange_rate.py b/gui/kivy/plugins/exchange_rate.py
@@ -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)
+
diff --git a/gui/kivy/theming/light/stepper_restore_password.png b/gui/kivy/theming/light/stepper_restore_password.png
Binary files differ.
diff --git a/gui/kivy/theming/light/stepper_restore_seed.png b/gui/kivy/theming/light/stepper_restore_seed.png
Binary files differ.
diff --git a/icons/electrum_android_launcher_icon.png b/icons/electrum_android_launcher_icon.png
Binary files differ.