2 changed files with 48 additions and 250 deletions
@ -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] |
|
||||||
@ -1,31 +1,71 @@ |
|||||||
#:import os os |
#:import os os |
||||||
|
|
||||||
Popup: |
Popup: |
||||||
title: "Balance" |
title: "Electrum" |
||||||
confirmed: 0 |
confirmed: 0 |
||||||
unconfirmed: 0 |
unconfirmed: 0 |
||||||
unmatured: 0 |
unmatured: 0 |
||||||
on_parent: |
on_parent: |
||||||
self.confirmed, self.unconfirmed, self.x = app.wallet.get_balance() |
self.confirmed, self.unconfirmed, self.unmatured = app.wallet.get_balance() |
||||||
BoxLayout: |
BoxLayout: |
||||||
orientation: 'vertical' |
orientation: 'vertical' |
||||||
spacing: '1dp' |
spacing: '1dp' |
||||||
GridLayout: |
GridLayout: |
||||||
cols:2 |
cols:2 |
||||||
Label: |
Label: |
||||||
text: _("Wallet:") |
text: _("Wallet Name:") |
||||||
|
text_size: self.size |
||||||
|
halign: 'left' |
||||||
Label: |
Label: |
||||||
text: os.path.basename(app.wallet.storage.path) |
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: |
Label: |
||||||
text: _("Confirmed:") |
|
||||||
Label: |
|
||||||
text: app.format_amount_and_units(root.confirmed) |
text: app.format_amount_and_units(root.confirmed) |
||||||
|
opacity: 1 if root.confirmed else 0 |
||||||
|
text_size: self.size |
||||||
|
halign: 'left' |
||||||
Label: |
Label: |
||||||
text: _("Unconfirmed:") |
text: _("Unconfirmed") + ':' |
||||||
|
text_size: self.size |
||||||
|
halign: 'left' |
||||||
|
opacity: 1 if root.unconfirmed else 0 |
||||||
Label: |
Label: |
||||||
text: app.format_amount_and_units(root.unconfirmed) |
text: app.format_amount_and_units(root.unconfirmed) |
||||||
|
opacity: 1 if root.unconfirmed else 0 |
||||||
|
text_size: self.size |
||||||
|
halign: 'left' |
||||||
Label: |
Label: |
||||||
text: "Unmatured:" |
text: _("Unmatured") + ':' |
||||||
|
text_size: self.size |
||||||
|
halign: 'left' |
||||||
|
opacity: 1 if root.unmatured else 0 |
||||||
Label: |
Label: |
||||||
text: app.format_amount_and_units(root.unmatured) |
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 |
||||||
|
|||||||
Loading…
Reference in new issue