tkivy: split mainscreen.kv into dynamically loaded .kv files - electrum - Electrum Bitcoin wallet
HTML git clone https://git.parazyd.org/electrum
DIR Log
DIR Files
DIR Refs
DIR Submodules
---
DIR commit 65ecbf990d712fd152ef6d1f8e5a3a7401839df1
DIR parent d68042e76e3f194c9ec43524a7f79844a4703ce7
HTML Author: ThomasV <thomasv@electrum.org>
Date: Tue, 6 Oct 2015 09:59:29 +0200
kivy: split mainscreen.kv into dynamically loaded .kv files
Diffstat:
M gui/kivy/main.kv | 452 ++++++++++++++++++++++++++++---
M gui/kivy/main_window.py | 288 +++++++++++--------------------
M gui/kivy/theming/light-0.png | 0
M gui/kivy/theming/light.atlas | 4 ++--
M gui/kivy/theming/light/logo.png | 0
D gui/kivy/uix/console.py | 319 -------------------------------
M gui/kivy/uix/dialogs/carousel_dial… | 5 +++--
M gui/kivy/uix/screens.py | 146 +++++++++++++++++++++++++++----
A gui/kivy/uix/ui_screens/contacts.kv | 93 +++++++++++++++++++++++++++++++
A gui/kivy/uix/ui_screens/history.kv | 224 +++++++++++++++++++++++++++++++
A gui/kivy/uix/ui_screens/network.kv | 10 ++++++++++
A gui/kivy/uix/ui_screens/receive.kv | 171 +++++++++++++++++++++++++++++++
A gui/kivy/uix/ui_screens/send.kv | 243 +++++++++++++++++++++++++++++++
A gui/kivy/uix/ui_screens/settings.kv | 27 +++++++++++++++++++++++++++
A gui/kivy/uix/ui_screens/wallet.kv | 14 ++++++++++++++
15 files changed, 1430 insertions(+), 566 deletions(-)
---
DIR diff --git a/gui/kivy/main.kv b/gui/kivy/main.kv
t@@ -1,4 +1,6 @@
#:import Window kivy.core.window.Window
+#:import Factory kivy.factory.Factory
+#:import _ electrum.i18n._
# Custom Global Widgets
t@@ -7,6 +9,79 @@
size_hint: 1, None
height: self.minimum_height
+<LightOptions@SpinnerOption>
+ font_size: '14sp'
+ border: 4, 4, 4, 4
+ color: 0.439, 0.439, 0.439, .8
+ background_normal: 'atlas://gui/kivy/theming/light/action_button_group'
+ background_down: 'atlas://gui/kivy/theming/light/overflow_btn_dn'
+ size_hint_y: None
+ height: '48dp'
+ text_size: self.size[0] - dp(20), self.size[1]
+ halign: 'left'
+ valign: 'middle'
+ shorten: True
+ on_press:
+ ddn = self.parent.parent
+ Factory.Animation(opacity=0, d=.25).start(ddn)
+
+<OppositeDropDown@DropDown>
+ #auto_width: False
+ size_hint: None, None
+ size: self.container.minimum_size if self.container else (0, 0)
+ on_container: if args[1]: self.container.padding = '4dp', '4dp', '4dp', '4dp'
+ canvas.before:
+ Color:
+ rgba: 1, 1, 1, 1
+ BorderImage:
+ pos:self.pos
+ border: 20, 20, 20, 20
+ source: 'atlas://gui/kivy/theming/light/dropdown_background'
+ size: self.size
+
+<OppositeSpinner@CSpinner>
+ dropdown_cls: Factory.OppositeDropDown
+ option_cls: Factory.LightOptions
+ border: 20, 20, 9, 9
+ background_normal: 'atlas://gui/kivy/theming/light/action_group_dark'
+ background_down: self.background_normal
+ values: ('Copy to clipboard', 'Send Payment')
+ size_hint: None, 1
+ width: '12dp'
+ on_release:
+ ddn = self._dropdown
+ ddn.opacity = 0
+ Factory.Animation(opacity=1, d=.25).start(ddn)
+
+
+<BlueSpinner@BoxLayout>
+ foreground_color: 1, 1, 1, 1
+ spacing: '9dp'
+ text: ''
+ values: ('', )
+ icon: ''
+ Image:
+ source: root.icon
+ size_hint: None, None
+ size: '22dp', '22dp'
+ pos_hint: {'center_y': .5}
+ OppositeSpinner:
+ color: root.foreground_color
+ background_normal: 'atlas://gui/kivy/theming/light/action_group_light'
+ markup: False
+ shorten: True
+ font_size: '16dp'
+ size_hint: 1, .7
+ pos_hint: {'center_y': .5}
+ text: root.text
+ text_size: self.size
+ halign: 'left'
+ valign: 'middle'
+ on_text:
+ root.text = args[1]
+ values: root.values
+
+
<IconButton@ButtonBehavior+Image>
allow_stretch: True
size_hint_x: None
t@@ -50,39 +125,8 @@
background_normal: 'atlas://gui/kivy/theming/light/textinput_active'
-<CreateAccountButtonBlue@Button>
- canvas.after:
- Color
- rgba: 1, 1, 1, 1 if self.disabled else 0
- Rectangle:
- texture: self.texture
- size: self.size
- pos: self.pos
- Color
- rgba: .5, .5, .5, .5 if self.disabled else 0
- Rectangle:
- texture: self.texture
- size: self.size
- pos: self.x - dp(1), self.y + dp(1)
- border: 15, 5, 5, 5
- background_color: (1, 1, 1, 1) if self.disabled else (.203, .490, .741, 1 if self.state == 'normal' else .75)
- size_hint: 1, None
- height: '48sp'
- text_size: self.size
- halign: 'center'
- valign: 'middle'
- root: None
- background_normal: 'atlas://gui/kivy/theming/light/btn_create_account'
- background_down: 'atlas://gui/kivy/theming/light/btn_create_account'
- background_disabled_normal: 'atlas://gui/kivy/theming/light/btn_create_act_disabled'
- on_press: if self.root: self.root.dispatch('on_press', self)
- on_release: if self.root: self.root.dispatch('on_release', self)
-
-
-<CreateAccountButtonGreen@CreateAccountButtonBlue>
- background_color: (1, 1, 1, 1) if self.disabled else (.415, .717, 0, 1 if self.state == 'normal' else .75)
###########################
-## Gloabal Defaults
+# Global Defaults
###########################
<TextInput>
on_focus: app._focused_widget = root
t@@ -127,11 +171,346 @@
size_hint: 1, 1
width: 0 if root.fs else (root.width - img.width)
-StencilView:
- manager: None
+
+
+<WalletActionPrevious@ActionPrevious>
+ app_icon: 'atlas://gui/kivy/theming/light/' + ('wallets' if app.ui_mode[0] != 't' else 'tab_btn')
+ with_previous: False
+ size_hint: None, 1
+ mipmap: True
+ on_release: app.root.children[0].toggle_drawer()
+
+
+<SendReceiveToggle@BoxLayout>
+ padding: '5dp', '5dp'
+ size_hint: 1, None
+ height: '45dp'
+ canvas.before:
+ Color:
+ rgba: 1, 1, 1, 1
+ BorderImage:
+ border: 12, 12, 12, 12
+ source: 'atlas://gui/kivy/theming/light/card'
+ size: self.width + dp(3), self.height
+ pos: self.x - dp(1.5), self.y
+
+<SendReceiveCardTop@GridLayout>
+ canvas.before:
+ BorderImage:
+ border: 9, 9, 9, 9
+ source: 'atlas://gui/kivy/theming/light/card_top'
+ size: self.size
+ pos:self.pos
+ padding: '12dp', '22dp', '12dp', 0
+ cols: 1
+ size_hint: 1, None
+ height: '120dp'
+ spacing: '4dp'
+
+<SendReceiveBlueBottom@GridLayout>
+ canvas.before:
+ Color:
+ rgba: .238, .585, .878, 1
+ BorderImage:
+ border: 9, 9, 9, 9
+ source: 'atlas://gui/kivy/theming/light/card_bottom'
+ size: self.size
+ pos: self.pos
+ Color:
+ rgba: 1, 1, 1, 1
+
+ item_height: dp(42)
+ foreground_color: .843, .914, .972, 1
+ cols: 1
+ padding: '12dp', 0
+
+
+<SendToggle@ToggleButton>
+ source: ''
+ group: 'transfer_type'
+ markup: False
+ bold: True
+ border: 4, 4, 4, 4
+ background_normal: self.background_down
+ color:
+ (.140, .140, .140, 1) if self.state == 'down' else (.796, .796, .796, 1)
+ canvas.after:
+ Color:
+ rgba: 1, 1, 1, 1
+ Image:
+ source: root.source
+ color: root.color
+ size: '30dp', '30dp'
+ center_x: root.center_x - ((root.texture_size[0]/2)+(self.width/1.5))
+ center_y: root.center_y
+
+
+<CardSeparator@Widget>
+ size_hint: 1, None
+ height: dp(1)
+ color: .909, .909, .909, 1
+ canvas:
+ Color:
+ rgba: root.color if root.color else (0, 0, 0, 0)
+ Rectangle:
+ size: self.size
+ pos: self.pos
+
+<AddressSelector@BlueSpinner>
+ icon: 'atlas://gui/kivy/theming/light/globe'
+ values: app.wallet.addresses() if app.wallet else []
+ text: _("Select Your address")
+
+
+<ElectrumScreen>
+ ScrollView:
+ do_scroll_x: False
+ do_scroll_y: False if root.fullscreen else (content.height > root.height - dp(16))
+ AnchorLayout:
+ size_hint_y: None
+ height: root.height if root.fullscreen else max(root.height, content.height)
+ GridLayout:
+ id: content
+ cols: 1
+ spacing: '8dp'
+ padding: '8dp'
+ size_hint: (1, 1) if root.fullscreen else (.8, None)
+ height: self.height if root.fullscreen else self.minimum_height
+
+
+<TabbedCarousel>
+ carousel: carousel
+ do_default_tab: False
+ Carousel:
+ scroll_timeout: 190
+ anim_type: 'out_quart'
+ min_move: .05
+ anim_move_duration: .1
+ anim_cancel_duration: .54
+ scroll_distance: '10dp'
+ on_index: root.on_index(*args)
+ id: carousel
+
+
+<CarouselIndicator@TabbedCarousel>
+ tab_pos: 'bottom_mid'
+ tab_height: '32dp'
+ tab_width: self.tab_height
+ #background_image: 'atlas://data/images/defaulttheme/action_item'
+ strip_border: 0, 0, 0, 0
+
+<CloseButton@IconButton>
+ source: 'atlas://gui/kivy/theming/light/closebutton'
+ opacity: 1 if self.state == 'normal' else .75
+ size_hint: None, None
+ size: '27dp', '27dp'
+
+<-CarouselDialog>
+ header_color: '#707070ff'
+ text_color: 0.701, 0.701, 0.701, 1
+ title_size: '13sp'
+ title: ''
+ separator_color: 0.89, 0.89, 0.89, 1
+ background: 'atlas://gui/kivy/theming/light/tab_btn'
+ carousel_content: carousel_content
canvas.before:
Color:
+ rgba: 0, 0, 0, .9
+ Rectangle:
+ size: Window.size
+ pos: 0, 0
+ Color:
rgba: 1, 1, 1, 1
- Rectangle
+ BorderImage:
+ border: 12, 12, 12, 12
+ source: 'atlas://gui/kivy/theming/light/dialog'
+ size: root.width, root.height - self.carousel_content.tab_height if self.carousel_content else 0
+ pos: root.x, self.y + self.carousel_content.tab_height if self.carousel_content else 10
+ BoxLayout:
+ orientation: 'vertical'
+ GridLayout:
+ cols: 1
+ size_hint: 1, None
+ height: self.minimum_height
+ padding: 0, '7sp'
+ Label:
+ font_size: root.title_size
+ text: u'[color={}]{}[/color]'.format(root.header_color, root.title)
+ text_size: self.width, None
+ halign: 'left'
+ size_hint: 1, None
+ height: self.texture_size[1]
+ CardSeparator:
+ color: root.separator_color
+ height: root.separator_height
+ FloatLayout:
+ size_hint: None, None
+ size: 0, 0
+ CloseButton:
+ id: but_close
+ top: root.top - dp(10)
+ right: root.right - dp(10)
+ on_release: root.dismiss()
+ CarouselIndicator:
+ id: carousel_content
+
+
+<CleanHeader@TabbedPanelHeader>
+ border: 0, 0, 16, 0
+ markup: False
+ text_size: self.size
+ halign: 'center'
+ valign: 'middle'
+ bold: True
+ font_size: '12.5sp'
+ background_normal: 'atlas://gui/kivy/theming/light/tab_btn'
+ background_disabled_normal: 'atlas://gui/kivy/theming/light/tab_btn_disabled'
+ background_down: 'atlas://gui/kivy/theming/light/tab_btn_pressed'
+ #canvas.before:
+ # Color:
+ # rgba: .6, .6, .6, .7
+ # Rectangle:
+ # size: self.size
+ # pos: self.x + 1, self.y - 1
+ # texture: self.texture
+
+
+<ColoredLabel@Label>:
+ font_size: '48sp'
+ color: (.6, .6, .6, 1)
+ canvas.before:
+ Color:
+ rgb: (.9, .9, .9)
+ Rectangle:
+ pos: self.x + sp(2), self.y + sp(2)
+ size: self.width - sp(4), self.height - sp(4)
+
+
+
+<ScreenTabs@Screen>
+ TabbedCarousel:
+ id: panel
+ tab_height: '48dp'
+ default_tab: send_tab
+ strip_border: 0, 0, 0, 0
+
+ HistoryScreen:
+ id: history_screen
+ tab: history_tab
+
+ SendScreen:
+ id: send_screen
+ tab: send_tab
+
+ ReceiveScreen:
+ id: receive_screen
+ tab: receive_tab
+
+ ContactsScreen:
+ id: contacts_screen
+ tab: contacts_tab
+
+ CleanHeader:
+ id: history_tab
+ text: _('History')
+ slide: 0
+ CleanHeader:
+ id: send_tab
+ text: _('Send')
+ slide: 1
+ CleanHeader:
+ id: receive_tab
+ text: _('Receive')
+ slide: 2
+ CleanHeader:
+ id: contacts_tab
+ text: _('Contacts')
+ slide: 3
+
+
+<ActionButton>:
+ border: 4, 0, 0, 0
+ #background_down: 'atlas://gui/kivy/theming/light/overflow_btn_dn'
+
+<OverflowButton@ActionButton>
+ text_size: dp(50), None
+ last: False
+ halign: 'left'
+ valign: 'middle'
+ overflow: None
+ #background_normal:
+ # 'atlas://gui/kivy/theming/light/' +\
+ # ('action_button_group'\
+ # if (self.inside_group and not self.last) else 'tab_btn')
+
+ #on_press:
+ # ddn = self.overflow._dropdown
+ # Factory.Animation.cancel_all(ddn)
+ # anim = Factory.Animation(opacity=0, d=.25)
+ # anim.bind(on_complete=ddn.dismiss)
+ # anim.start(ddn)
+
+BoxLayout:
+
+ orientation: 'vertical'
+
+ canvas.before:
+ Color:
+ rgb: .6, .6, .6
+ Rectangle:
size: self.size
- pos: self.pos
-\ No newline at end of file
+ source: 'gui/kivy/data/background.png'
+
+ ActionBar:
+
+ ActionView:
+ id: av
+
+ ActionPrevious:
+ app_icon: 'atlas://gui/kivy/theming/light/logo'
+ with_previous: False
+ on_release: app.on_back()
+
+ ActionButton:
+ id: action_status
+ important: True
+ size_hint: 1, 1
+ markup: True
+ mipmap: True
+ bold: True
+ markup: True
+ color: 1, 1, 1, 1
+ text:
+ "[color=#777777]{}[/color]"\
+ .format(app.status)
+ font_size: '22dp'
+ minimum_width: '1dp'
+
+ ActionOverflow:
+ id: action_overflow
+ width: '60dp'
+ OverflowButton:
+ text: _('Network')
+ overflow: action_overflow
+ on_release: app.popup_dialog('network')
+ OverflowButton:
+ text: _('Wallet')
+ overflow: action_overflow
+ on_release: app.popup_dialog('wallet')
+ OverflowButton:
+ text: _('Preferences')
+ overflow: action_overflow
+ on_release: app.popup_dialog('settings')
+
+ ScreenManager:
+ id: manager
+ #tabs: Factory.ScreenTabs()
+ ScreenTabs:
+ id: tabs
+ name: "tabs"
+
+ #on_current_screen:
+ #spnr.text = args[1].name
+ #idx = app.screen_names.index(args[1].name)
+ #if idx > -1: app.hierarchy.append(idx)
+ #args
DIR diff --git a/gui/kivy/main_window.py b/gui/kivy/main_window.py
t@@ -9,11 +9,6 @@ from electrum.contacts import Contacts
from electrum import bitcoin
from electrum.util import profiler, print_error
-from kivy.config import Config
-Config.set('modules', 'screen', 'droid2')
-Config.set('graphics', 'width', '480')
-Config.set('graphics', 'height', '840')
-
from kivy.app import App
from kivy.core.window import Window
from kivy.logger import Logger
t@@ -23,8 +18,7 @@ from kivy.properties import (OptionProperty, AliasProperty, ObjectProperty,
from kivy.cache import Cache
from kivy.clock import Clock
from kivy.factory import Factory
-
-from electrum_gui.kivy.uix.drawer import Drawer
+from kivy.metrics import inch, metrics
# lazy imports for factory so that widgets can be used in kv
Factory.register('InstallWizard',
t@@ -34,15 +28,31 @@ Factory.register('ELTextInput', module='electrum_gui.kivy.uix.screens')
# delayed imports: for startup speed on android
-notification = app = Decimal = ref = format_satoshis = Builder = None
-inch = None
+notification = app = ref = format_satoshis = Builder = None
util = False
-re = None
+
+from decimal import Decimal
+import re
# register widget cache for keeping memory down timeout to forever to cache
# the data
Cache.register('electrum_widgets', timeout=0)
+from kivy.uix.screenmanager import Screen
+from kivy.uix.tabbedpanel import TabbedPanel
+
+class ElectrumScreen(Screen):
+ fullscreen = BooleanProperty(False)
+ #def add_widget(self, *args):
+ # if 'content' in self.ids:
+ # return self.ids.content.add_widget(*args)
+ # return super(ElectrumScreen, self).add_widget(*args)
+
+
+Factory.register('TabbedCarousel', module='electrum_gui.kivy.uix.screens')
+
+
+
class ElectrumWindow(App):
def _get_bu(self):
t@@ -102,11 +112,9 @@ class ElectrumWindow(App):
:attr:`electrum_config` is a `ObjectProperty`, defaults to None.
'''
- status = StringProperty(_('Uninitialised'))
- '''The status of the connection should show the balance when connected
+ status = StringProperty(_('Not Connected'))
+ balance = StringProperty('')
- :attr:`status` is a `StringProperty` defaults to 'uninitialised'
- '''
def _get_num_zeros(self):
try:
t@@ -136,11 +144,8 @@ class ElectrumWindow(App):
return int(p * x)
- navigation_higherarchy = ListProperty([])
- '''This is a list of the current navigation higherarchy of the app used to
- navigate using back button.
-
- :attr:`navigation_higherarchy` is s `ListProperty` defaults to []
+ hierarchy = ListProperty([])
+ '''used to navigate with the back button.
'''
_orientation = OptionProperty('landscape',
t@@ -239,6 +244,8 @@ class ElectrumWindow(App):
global Builder
if not Builder:
from kivy.lang import Builder
+
+
return Builder.load_file('gui/kivy/main.kv')
def _pause(self):
t@@ -252,6 +259,7 @@ class ElectrumWindow(App):
def on_start(self):
''' This is the start point of the kivy ui
'''
+ Logger.info("dpi: {} {}".format(metrics.dpi, metrics.dpi_rounded))
win = Window
win.bind(size=self.on_size,
on_keyboard=self.on_keyboard)
t@@ -299,6 +307,14 @@ class ElectrumWindow(App):
if self.wallet:
self.wallet.stop_threads()
+ def on_back(self):
+ try:
+ self.hierarchy.pop()()
+ except IndexError:
+ # capture back button and pause app.
+ self._pause()
+
+
def on_keyboard_height(self, window, height):
win = window
active_widg = win.children[0]
t@@ -351,6 +367,12 @@ class ElectrumWindow(App):
self.init_ui()
self.load_wallet(wallet)
+ def popup_dialog(self, name):
+ popup = Builder.load_file('gui/kivy/uix/ui_screens/'+name+'.kv')
+ popup.open()
+
+
+
@profiler
def init_ui(self):
''' Initialize The Ux part of electrum. This function performs the basic
t@@ -366,13 +388,15 @@ class ElectrumWindow(App):
self.completions = []
# setup UX
- self.screens = ['mainscreen',]
+ self.screens = {}
#setup lazy imports for mainscreen
Factory.register('AnimatedPopup',
module='electrum_gui.kivy.uix.dialogs')
- Factory.register('TabbedCarousel',
- module='electrum_gui.kivy.uix.screens')
+
+ #Factory.register('TabbedCarousel',
+ # module='electrum_gui.kivy.uix.screens')
+
Factory.register('ScreenDashboard',
module='electrum_gui.kivy.uix.screens')
#Factory.register('EffectWidget',
t@@ -386,17 +410,26 @@ class ElectrumWindow(App):
# preload widgets. Remove this if you want to load the widgets on demand
Cache.append('electrum_widgets', 'AnimatedPopup', Factory.AnimatedPopup())
- Cache.append('electrum_widgets', 'TabbedCarousel', Factory.TabbedCarousel())
+
+ #Cache.append('electrum_widgets', 'TabbedCarousel', Factory.TabbedCarousel())
+
Cache.append('electrum_widgets', 'QRCodeWidget', Factory.QRCodeWidget())
Cache.append('electrum_widgets', 'CSpinner', Factory.CSpinner())
# load and focus the ui
#Load mainscreen
- dr = Builder.load_file('gui/kivy/uix/ui_screens/mainscreen.kv')
- self.root.add_widget(dr)
- self.root.manager = manager = dr.ids.manager
- self.root.main_screen = m = manager.screens[0]
- self.tabs = m.ids.tabs
+
+ #dr = Builder.load_file('gui/kivy/uix/ui_screens/mainscreen.kv')
+ #self.root.add_widget(dr)
+ #self.root.manager = manager = dr.ids.manager
+ #self.root.main_screen = m = manager.screens[0]
+ #self.tabs = m.ids.tabs
+
+ self.root.manager = self.root.ids['manager']
+ self.recent_activity_card = None
+ self.history_screen = None
+ self.contacts_screen = None
+ self.wallet_screen = None
#TODO
# load left_menu
t@@ -411,6 +444,7 @@ class ElectrumWindow(App):
self.wallet = None
+
def create_quote_text(self, btc_balance, mode='normal'):
'''
'''
t@@ -473,10 +507,6 @@ class ElectrumWindow(App):
if not self.wallet:
return
- global Decimal
- if not Decimal:
- from decimal import Decimal
-
unconfirmed = ''
quote_text = ''
t@@ -487,34 +517,38 @@ class ElectrumWindow(App):
server_height = self.network.get_server_height()
server_lag = self.network.get_local_height() - server_height
if not self.wallet.up_to_date or server_height == 0:
- text = _("Synchronizing...")
+ self.status = _("Synchronizing...")
elif server_lag > 1:
- text = _("Server is lagging (%d blocks)"%server_lag)
+ self.status = _("Server lagging (%d blocks)"%server_lag)
else:
c, u, x = self.wallet.get_account_balance(self.current_account)
text = self.format_amount(c)
+ self.balance = text
if u:
unconfirmed = " [%s unconfirmed]" %( self.format_amount(u, True).strip())
if x:
unmatured = " [%s unmatured]"%(self.format_amount(x, True).strip())
+ self.balance = text.strip()
quote_text = self.create_quote_text(Decimal(c+u+x)/100000000, mode='symbol') or ''
+ self.status = self.balance
else:
- text = _("Not connected")
- try:
- status_card = self.root.main_screen.ids.tabs.ids.\
- screen_dashboard.ids.status_card
- except AttributeError:
- return
- self.status = text.strip()
+ self.status = _("Not connected")
+
+ return
+
+ print self.root.manager.ids
+
+ #try:
+ status_card = self.root.main_screen.ids.tabs.ids.\
+ screen_dashboard.ids.status_card
+ #except AttributeError:
+ # return
+
status_card.quote_text = quote_text.strip()
status_card.uncomfirmed = unconfirmed.strip()
def format_amount(self, x, is_diff=False, whitespaces=False):
- '''
- '''
- global format_satoshis
- if not format_satoshis:
- from electrum.util import format_satoshis
+ from electrum.util import format_satoshis
return format_satoshis(x, is_diff, self.num_zeros,
self.decimal_point, whitespaces)
t@@ -532,116 +566,16 @@ class ElectrumWindow(App):
self.update_history_tab()
self.update_contacts_tab()
- def parse_histories(self, items):
- for item in items:
- tx_hash, conf, value, timestamp, balance = item
- time_str = _("unknown")
- if conf > 0:
- try:
- time_str = datetime.datetime.fromtimestamp(
- timestamp).isoformat(' ')[:-3]
- except Exception:
- time_str = _("error")
-
- if conf == -1:
- time_str = _('unverified')
- icon = "atlas://gui/kivy/theming/light/close"
- elif conf == 0:
- time_str = _('pending')
- icon = "atlas://gui/kivy/theming/light/unconfirmed"
- elif conf < 6:
- time_str = '' # add new to fix error when conf < 0
- conf = max(1, conf)
- icon = "atlas://gui/kivy/theming/light/clock{}".format(conf)
- else:
- icon = "atlas://gui/kivy/theming/light/confirmed"
-
- if value is not None:
- v_str = self.format_amount(value, True).replace(',','.')
- else:
- v_str = '--'
-
- balance_str = self.format_amount(balance).replace(',','.')
-
- if tx_hash:
- label, is_default_label = self.wallet.get_label(tx_hash)
- else:
- label = _('Pruned transaction outputs')
- is_default_label = False
-
- yield (conf, icon, time_str, label, v_str, balance_str, tx_hash)
@profiler
def update_history_tab(self, see_all=False):
- try:
- history_card = self.root.main_screen.ids.tabs.ids.\
- screen_dashboard.ids.recent_activity_card
- except AttributeError:
- return
- histories = self.parse_histories(reversed(
- self.wallet.get_history(self.current_account)))
-
- # repopulate History Card
- last_widget = history_card.ids.content.children[-1]
- history_card.ids.content.clear_widgets()
- history_add = history_card.ids.content.add_widget
- history_add(last_widget)
- RecentActivityItem = Factory.RecentActivityItem
- global Decimal, ref
- if not ref:
- from weakref import ref
- if not Decimal:
- from decimal import Decimal
-
- get_history_rate = self.get_history_rate
- count = 0
- for items in histories:
- count += 1
- conf, icon, date_time, address, amount, balance, tx = items
- ri = RecentActivityItem()
- ri.icon = icon
- ri.date = date_time
- mintimestr = date_time.split()[0]
- ri.address = address
- ri.amount = amount
- ri.quote_text = get_history_rate(ref(ri),
- Decimal(amount),
- mintimestr)
- ri.balance = balance
- ri.confirmations = conf
- ri.tx_hash = tx
- history_add(ri)
- if count == 8 and not see_all:
- break
-
- history_card.ids.btn_see_all.opacity = (0 if count < 8 else 1)
-
+ if self.history_screen:
+ self.history_screen.update(see_all)
def update_contacts_tab(self):
- contact_list = self.root.main_screen.ids.tabs.ids.\
- screen_contacts.ids.contact_container
- #contact_list.clear_widgets()
+ if self.contacts_screen:
+ self.contacts_screen.update()
- child = -1
- children = contact_list.children
-
- for key in sorted(self.contacts.keys()):
- _type, address = self.contacts[key]
- label = self.wallet.labels.get(address, '')
- child += 1
- try:
- if children[child].label == label:
- continue
- except IndexError:
- pass
- tx = self.wallet.get_num_tx(address)
- ci = Factory.ContactItem()
- ci.address = address
- ci.label = label
- ci.tx_amount = tx
- contact_list.add_widget(ci)
-
- #self.run_hook('update_contacts_tab')
def do_send(self):
app = App.get_running_app()
t@@ -650,9 +584,6 @@ class ElectrumWindow(App):
label = unicode(scrn.message_e.text)
r = unicode(scrn.payto_e.text).strip()
# label or alias, with address in brackets
- global re
- if not re:
- import re
m = re.match('(.*?)\s*\<([1-9A-HJ-NP-Za-km-z]{26,})\>', r)
to_address = m.group(2) if m else r
t@@ -774,46 +705,23 @@ class ElectrumWindow(App):
def on_size(self, instance, value):
width, height = value
self._orientation = 'landscape' if width > height else 'portrait'
-
- global inch
- if not inch:
- from kivy.metrics import inch
-
self._ui_mode = 'tablet' if min(width, height) > inch(3.51) else 'phone'
- Logger.debug('orientation: {} ui_mode: {}'.format(self._orientation,
- self._ui_mode))
-
- def load_screen(self, index=0, direction='left', manager=None, switch=True):
- ''' Load the appropriate screen as mentioned in the parameters.
- '''
+ #Logger.info("size: {} {}".format(width, height))
+ #Logger.info('orientation: {}'.format(self._orientation))
+ #Logger.info('ui_mode: {}'.format(self._ui_mode))
+
+ def load_screen(self, name, direction='left', manager=None):
+ screen = self.screens.get(name)
+ if screen is None:
+ screen = Builder.load_file('gui/kivy/uix/ui_screens/' + name + '.kv')
+ screen.name = name
+ self.screens[name] = screen
manager = manager or self.root.manager
- screen = Builder.load_file('gui/kivy/uix/ui_screens/'\
- + self.screens[index] + '.kv')
- screen.name = self.screens[index]
- if switch:
- manager.switch_to(screen, direction=direction)
- return screen
-
- def load_next_screen(self):
- '''
- '''
- manager = root.manager
- try:
- self.load_screen(self.screens.index(manager.current_screen.name)+1,
- manager=manager)
- except IndexError:
- self.load_screen()
+ manager.switch_to(screen, direction=direction)
- def load_previous_screen(self):
- ''' Load the previous screen from disk.
- '''
- manager = root.manager
- try:
- self.load_screen(self.screens.index(manager.current_screen.name)-1,
- direction='right',
- manager=manager)
- except IndexError:
- pass
+ def load_history(self):
+ #Builder.load_file('gui/kivy/uix/ui_screens/history.kv')
+ print "load history", self.root.manager.ids.history
def save_new_contact(self, address, label):
address = unicode(address)
DIR diff --git a/gui/kivy/theming/light-0.png b/gui/kivy/theming/light-0.png
Binary files differ.
DIR diff --git a/gui/kivy/theming/light.atlas b/gui/kivy/theming/light.atlas
t@@ -1 +1 @@
parazyd.org:70 /git/electrum/commit/65ecbf990d712fd152ef6d1f8e5a3a7401839df1.gph:966: line too long