electrum-bitcoinprivate/gui/kivy/uix/dialogs/__init__.py

216 lines
5.8 KiB
Python
Raw Normal View History

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
2019-12-24 03:21:35 -08:00
from electrum_bitcoinprivate_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)
2015-12-12 07:54:32 -08:00
# 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()
2016-06-08 23:00:25 -07:00
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)
2016-02-17 02:40:05 -08:00
2016-02-17 22:26:31 -08:00
2016-02-17 22:47:09 -08:00
class OutputItem(Factory.BoxLayout):
pass
2016-02-17 02:40:05 -08:00
class OutputList(Factory.GridLayout):
def __init__(self, **kwargs):
super(Factory.GridLayout, self).__init__(**kwargs)
self.app = App.get_running_app()
2016-02-17 06:19:09 -08:00
def update(self, outputs):
self.clear_widgets()
for (type, address, amount) in outputs:
self.add_output(address, amount)
2016-02-17 02:40:05 -08:00
def add_output(self, address, amount):
2016-02-17 22:47:09 -08:00
b = Factory.OutputItem()
b.address = address
b.value = self.app.format_amount_and_units(amount)
2016-02-17 22:26:31 -08:00
self.add_widget(b)
2016-02-17 02:40:05 -08:00