You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
215 lines
5.8 KiB
215 lines
5.8 KiB
from kivy.app import App |
|
from kivy.clock import Clock |
|
from kivy.factory import Factory |
|
from kivy.properties import NumericProperty, StringProperty, BooleanProperty |
|
from kivy.core.window import Window |
|
|
|
from electrum_gui.kivy.i18n import _ |
|
|
|
|
|
|
|
class AnimatedPopup(Factory.Popup): |
|
''' An Animated Popup that animates in and out. |
|
''' |
|
|
|
anim_duration = NumericProperty(.36) |
|
'''Duration of animation to be used |
|
''' |
|
|
|
__events__ = ['on_activate', 'on_deactivate'] |
|
|
|
|
|
def on_activate(self): |
|
'''Base function to be overridden on inherited classes. |
|
Called when the popup is done animating. |
|
''' |
|
pass |
|
|
|
def on_deactivate(self): |
|
'''Base function to be overridden on inherited classes. |
|
Called when the popup is done animating. |
|
''' |
|
pass |
|
|
|
def open(self): |
|
'''Do the initialization of incoming animation here. |
|
Override to set your custom animation. |
|
''' |
|
def on_complete(*l): |
|
self.dispatch('on_activate') |
|
|
|
self.opacity = 0 |
|
super(AnimatedPopup, self).open() |
|
anim = Factory.Animation(opacity=1, d=self.anim_duration) |
|
anim.bind(on_complete=on_complete) |
|
anim.start(self) |
|
|
|
def dismiss(self): |
|
'''Do the initialization of incoming animation here. |
|
Override to set your custom animation. |
|
''' |
|
def on_complete(*l): |
|
super(AnimatedPopup, self).dismiss() |
|
self.dispatch('on_deactivate') |
|
|
|
anim = Factory.Animation(opacity=0, d=.25) |
|
anim.bind(on_complete=on_complete) |
|
anim.start(self) |
|
|
|
class EventsDialog(Factory.Popup): |
|
''' Abstract Popup that provides the following events |
|
.. events:: |
|
`on_release` |
|
`on_press` |
|
''' |
|
|
|
__events__ = ('on_release', 'on_press') |
|
|
|
def __init__(self, **kwargs): |
|
super(EventsDialog, self).__init__(**kwargs) |
|
|
|
def on_release(self, instance): |
|
pass |
|
|
|
def on_press(self, instance): |
|
pass |
|
|
|
def close(self): |
|
self.dismiss() |
|
|
|
|
|
class SelectionDialog(EventsDialog): |
|
|
|
def add_widget(self, widget, index=0): |
|
if self.content: |
|
self.content.add_widget(widget, index) |
|
return |
|
super(SelectionDialog, self).add_widget(widget) |
|
|
|
|
|
class InfoBubble(Factory.Bubble): |
|
'''Bubble to be used to display short Help Information''' |
|
|
|
message = StringProperty(_('Nothing set !')) |
|
'''Message to be displayed; defaults to "nothing set"''' |
|
|
|
icon = StringProperty('') |
|
''' Icon to be displayed along with the message defaults to '' |
|
|
|
:attr:`icon` is a `StringProperty` defaults to `''` |
|
''' |
|
|
|
fs = BooleanProperty(False) |
|
''' Show Bubble in half screen mode |
|
|
|
:attr:`fs` is a `BooleanProperty` defaults to `False` |
|
''' |
|
|
|
modal = BooleanProperty(False) |
|
''' Allow bubble to be hidden on touch. |
|
|
|
:attr:`modal` is a `BooleanProperty` defauult to `False`. |
|
''' |
|
|
|
exit = BooleanProperty(False) |
|
'''Indicates whether to exit app after bubble is closed. |
|
|
|
:attr:`exit` is a `BooleanProperty` defaults to False. |
|
''' |
|
|
|
dim_background = BooleanProperty(False) |
|
''' Indicates Whether to draw a background on the windows behind the bubble. |
|
|
|
:attr:`dim` is a `BooleanProperty` defaults to `False`. |
|
''' |
|
|
|
def on_touch_down(self, touch): |
|
if self.modal: |
|
return True |
|
self.hide() |
|
if self.collide_point(*touch.pos): |
|
return True |
|
|
|
def show(self, pos, duration, width=None, modal=False, exit=False): |
|
'''Animate the bubble into position''' |
|
self.modal, self.exit = modal, exit |
|
if width: |
|
self.width = width |
|
if self.modal: |
|
from kivy.uix.modalview import ModalView |
|
self._modal_view = m = ModalView(background_color=[.5, .5, .5, .2]) |
|
Window.add_widget(m) |
|
m.add_widget(self) |
|
else: |
|
Window.add_widget(self) |
|
|
|
# wait for the bubble to adjust its size according to text then animate |
|
Clock.schedule_once(lambda dt: self._show(pos, duration)) |
|
|
|
def _show(self, pos, duration): |
|
|
|
def on_stop(*l): |
|
if duration: |
|
Clock.schedule_once(self.hide, duration + .5) |
|
|
|
self.opacity = 0 |
|
arrow_pos = self.arrow_pos |
|
if arrow_pos[0] in ('l', 'r'): |
|
pos = pos[0], pos[1] - (self.height/2) |
|
else: |
|
pos = pos[0] - (self.width/2), pos[1] |
|
|
|
self.limit_to = Window |
|
|
|
anim = Factory.Animation(opacity=1, pos=pos, d=.32) |
|
anim.bind(on_complete=on_stop) |
|
anim.cancel_all(self) |
|
anim.start(self) |
|
|
|
|
|
def hide(self, now=False): |
|
''' Auto fade out the Bubble |
|
''' |
|
def on_stop(*l): |
|
if self.modal: |
|
m = self._modal_view |
|
m.remove_widget(self) |
|
Window.remove_widget(m) |
|
Window.remove_widget(self) |
|
if self.exit: |
|
App.get_running_app().stop() |
|
import sys |
|
sys.exit() |
|
else: |
|
App.get_running_app().is_exit = False |
|
|
|
if now: |
|
return on_stop() |
|
|
|
anim = Factory.Animation(opacity=0, d=.25) |
|
anim.bind(on_complete=on_stop) |
|
anim.cancel_all(self) |
|
anim.start(self) |
|
|
|
|
|
|
|
class OutputItem(Factory.BoxLayout): |
|
pass |
|
|
|
class OutputList(Factory.GridLayout): |
|
|
|
def __init__(self, **kwargs): |
|
super(Factory.GridLayout, self).__init__(**kwargs) |
|
self.app = App.get_running_app() |
|
|
|
def update(self, outputs): |
|
self.clear_widgets() |
|
for (type, address, amount) in outputs: |
|
self.add_output(address, amount) |
|
|
|
def add_output(self, address, amount): |
|
b = Factory.OutputItem() |
|
b.address = address |
|
b.value = self.app.format_amount_and_units(amount) |
|
self.add_widget(b) |
|
|
|
|