tkivy: improve status dialog - electrum - Electrum Bitcoin wallet (HTM) git clone https://git.parazyd.org/electrum (DIR) Log (DIR) Files (DIR) Refs (DIR) Submodules --- (DIR) commit 23d16154a90de84aa145ad46d492161ff09cfc85 (DIR) parent e2d00c61cd45db13eef1c13ea5731ae4f84b4436 (HTM) Author: ThomasV <thomasv@electrum.org> Date: Mon, 18 Jan 2016 15:20:01 +0100 kivy: improve status dialog Diffstat: D gui/kivy/uix/dialogs/carousel_dial… | 242 ------------------------------- M gui/kivy/uix/ui_screens/status.kv | 56 ++++++++++++++++++++++++++----- 2 files changed, 48 insertions(+), 250 deletions(-) --- (DIR) diff --git a/gui/kivy/uix/dialogs/carousel_dialog.py b/gui/kivy/uix/dialogs/carousel_dialog.py t@@ -1,242 +0,0 @@ -''' Dialogs intended to be used along with a slidable carousel inside -and indicators on either top, left, bottom or right side. These indicators can -be touched to travel to a particular slide. -''' -from electrum.i18n import _ - - -from kivy.app import App -from kivy.clock import Clock -from kivy.properties import NumericProperty, ObjectProperty -from kivy.factory import Factory -from kivy.lang import Builder - -import weakref - - -class CarouselHeader(Factory.TabbedPanelHeader): - '''Tabbed Panel Header with a circular image on top to be used as a - indicator for the current slide. - ''' - - slide = NumericProperty(0) - ''' indicates the link to carousels slide''' - - -class CarouselDialog(Factory.AnimatedPopup): - ''' A Popup dialog with a CarouselIndicator used as the content. - ''' - - carousel_content = ObjectProperty(None) - - def add_widget(self, widget, index=0): - if isinstance(widget, Factory.Carousel): - super(CarouselDialog, self).add_widget(widget, index) - return - if 'carousel_content' not in self.ids.keys(): - super(CarouselDialog, self).add_widget(widget) - return - self.carousel_content.add_widget(widget, index) - - -class WalletAddressesDialog(CarouselDialog): - ''' Show current wallets and their addresses using qrcode widget - ''' - - def __init__(self, **kwargs): - self._loaded = False - super(WalletAddressesDialog, self).__init__(**kwargs) - - def on_activate(self): - # do activate routine here - slide = None - - if not self._loaded: - self._loaded = True - CarouselHeader = Factory.CarouselHeader - ch = CarouselHeader() - ch.slide = 0 # idx - slide = Factory.ScreenAddress() - - slide.tab = ch - - self.add_widget(slide) - self.add_widget(ch) - - app = App.get_running_app() - if not slide: - slide = self.carousel_content.carousel.slides[0] - - # add a tab for each wallet - self.wallet_name = app.wallet.get_account_names()[0] - labels = app.wallet.labels - - addresses = app.wallet.addresses() - _labels = {} - - for address in addresses: - _labels[labels.get(address, address)] = address - - slide.labels = _labels - Clock.schedule_once(lambda dt: self._setup_slide(slide)) - - def _setup_slide(self, slide): - btn_address = slide.ids.btn_address - btn_address.values = values = slide.labels.keys() - if not btn_address.text: - btn_address.text = values[0] - - -class RecentActivityDialog(CarouselDialog): - ''' - ''' - def on_activate(self): - - # animate to first slide - #carousel = self.carousel_content.carousel - #carousel.load_slide(carousel.slides[0]) - - item = self.item - try: - self.address = item.address - except ReferenceError: - self.dismiss() - return - - self.amount = item.amount[1:] - self.amount_color = item.amount_color - self.confirmations = item.confirmations - self.quote_text = item.quote_text - date_time = item.date.split() - if len(date_time) == 2: - self.date = date_time[0] - self.time = date_time[1] - self.status = 'Validated' - else: - self.date = item.date - self.status = 'Pending' - self.tx_hash = item.tx_hash - - app = App.get_running_app() - - tx_hash = item.tx_hash - tx = app.wallet.transactions.get(tx_hash) - tx.deserialize() - - if tx_hash in app.wallet.transactions.keys(): - is_relevant, is_mine, v, fee = app.wallet.get_wallet_delta(tx) - conf, timestamp = app.wallet.get_confirmations(tx_hash) - else: - is_mine = False - - self.is_mine = is_mine - - if is_mine: - if fee is not None: - self.fee = app.format_amount(fee) - else: - self.fee = 'unknown' - - labels = app.wallet.labels - addresses = app.wallet.addresses() - _labels = {} - - self.wallet_name = app.wallet.get_account_names()['0'] - for address in addresses: - _labels[labels.get(address, address)] = address - - self.labels = _labels - - def open(self): - self._trans_actv = self._det_actv = self._in_actv\ - = self._out_actv = False - super(RecentActivityDialog, self).open() - - def dismiss(self): - if self._in_actv: - self.ids.list_inputs.content = "" - self.ids.list_inputs.clear_widgets() - if self._out_actv: - self.ids.list_outputs.content = "" - self.ids.list_outputs.clear_widgets() - super(RecentActivityDialog, self).dismiss() - - def dropdown_selected(self, value): - app = App.get_running_app() - try: - labels = self.labels - except AttributeError: - return - - address = labels.get(self.address, self.address[1:]) - - if value.startswith(_('Copy')): - app.copy(address) - elif value.startswith(_('Send')): - app.send_payment(address) - self.dismiss() - - def activate_screen_transactionid(self, screen): - if self._trans_actv: - return - - self._trans_actv = True - Clock.schedule_once( - lambda dt: self._activate_screen_transactionid(screen), .1) - - def _activate_screen_transactionid(self, screen): - content = screen.content - if not content: - content = Factory.RecentActivityScrTransID() - screen.content = content - screen.add_widget(content) - content.tx_hash = self.tx_hash - content.text_color = self.text_color - content.carousel_content = self.carousel_content - - def activate_screen_inputs(self, screen): - if self._in_actv: - return - - self._in_actv = True - Clock.schedule_once( - lambda dt: self._activate_screen_inputs(screen), .1) - - def _activate_screen_inputs(self, screen): - content = screen.content - if not content: - content = Factory.RecentActivityScrInputs() - screen.content = content - screen.add_widget(content) - self.populate_inputs_outputs(content, 'in') - - def activate_screen_outputs(self, screen): - if self._out_actv: - return - - self._out_actv = True - Clock.schedule_once( - lambda dt: self._activate_screen_outputs(screen), .1) - - def _activate_screen_outputs(self, screen): - content = screen.content - if not content: - content = Factory.RecentActivityScrOutputs() - screen.content = content - screen.add_widget(content) - self.populate_inputs_outputs(content, 'out') - - def populate_inputs_outputs(self, content, mode): - app = App.get_running_app() - tx_hash = self.tx_hash - if tx_hash: - tx = app.wallet.transactions.get(tx_hash) - tx.deserialize() - if mode == 'out': - content.data = \ - [(address, app.format_amount(value))\ - for _type, address, value in tx.outputs] - else: - content.data = \ - [(input['address'], input['prevout_hash'])\ - for input in tx.inputs] (DIR) diff --git a/gui/kivy/uix/ui_screens/status.kv b/gui/kivy/uix/ui_screens/status.kv t@@ -1,31 +1,71 @@ #:import os os Popup: - title: "Balance" + title: "Electrum" confirmed: 0 unconfirmed: 0 unmatured: 0 on_parent: - self.confirmed, self.unconfirmed, self.x = app.wallet.get_balance() + self.confirmed, self.unconfirmed, self.unmatured = app.wallet.get_balance() BoxLayout: orientation: 'vertical' spacing: '1dp' GridLayout: cols:2 Label: - text: _("Wallet:") + text: _("Wallet Name:") + text_size: self.size + halign: 'left' Label: text: os.path.basename(app.wallet.storage.path) + text_size: self.size + halign: 'left' + Label: + text: _("Wallet type:") + text_size: self.size + halign: 'left' + Label: + text: app.wallet.wallet_type + text_size: self.size + halign: 'left' + Label: + text: _("Balance") + ':' + text_size: self.size + halign: 'left' + Label: + text: app.format_amount_and_units(root.confirmed + root.unconfirmed + root.unmatured) + text_size: self.size + halign: 'left' + + Label: + text: _("Confirmed") + ':' + opacity: 1 if root.confirmed else 0 + text_size: self.size + halign: 'left' Label: - text: _("Confirmed:") - Label: text: app.format_amount_and_units(root.confirmed) + opacity: 1 if root.confirmed else 0 + text_size: self.size + halign: 'left' Label: - text: _("Unconfirmed:") + text: _("Unconfirmed") + ':' + text_size: self.size + halign: 'left' + opacity: 1 if root.unconfirmed else 0 Label: text: app.format_amount_and_units(root.unconfirmed) + opacity: 1 if root.unconfirmed else 0 + text_size: self.size + halign: 'left' Label: - text: "Unmatured:" + text: _("Unmatured") + ':' + text_size: self.size + halign: 'left' + opacity: 1 if root.unmatured else 0 Label: text: app.format_amount_and_units(root.unmatured) - Widget + opacity: 1 if root.unmatured else 0 + text_size: self.size + halign: 'left' + Widget: + size_hint: None, 1