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.
95 lines
2.7 KiB
95 lines
2.7 KiB
from functools import partial
|
|
|
|
from kivy.animation import Animation
|
|
from kivy.core.window import Window
|
|
from kivy.clock import Clock
|
|
from kivy.uix.bubble import Bubble, BubbleButton
|
|
from kivy.properties import ListProperty
|
|
from kivy.uix.widget import Widget
|
|
|
|
from electrum_gui.i18n import _
|
|
|
|
class ContextMenuItem(Widget):
|
|
'''abstract class
|
|
'''
|
|
|
|
class ContextButton(ContextMenuItem, BubbleButton):
|
|
pass
|
|
|
|
class ContextMenu(Bubble):
|
|
|
|
buttons = ListProperty([_('ok'), _('cancel')])
|
|
'''List of Buttons to be displayed at the bottom'''
|
|
|
|
__events__ = ('on_press', 'on_release')
|
|
|
|
def __init__(self, **kwargs):
|
|
self._old_buttons = self.buttons
|
|
super(ContextMenu, self).__init__(**kwargs)
|
|
self.on_buttons(self, self.buttons)
|
|
|
|
def on_touch_down(self, touch):
|
|
if not self.collide_point(*touch.pos):
|
|
self.hide()
|
|
return
|
|
return super(ContextMenu, self).on_touch_down(touch)
|
|
|
|
def on_buttons(self, _menu, value):
|
|
if 'menu_content' not in self.ids.keys():
|
|
return
|
|
if value == self._old_buttons:
|
|
return
|
|
blayout = self.ids.menu_content
|
|
blayout.clear_widgets()
|
|
for btn in value:
|
|
ib = ContextButton(text=btn)
|
|
ib.bind(on_press=partial(self.dispatch, 'on_press'))
|
|
ib.bind(on_release=partial(self.dispatch, 'on_release'))
|
|
blayout.add_widget(ib)
|
|
self._old_buttons = value
|
|
|
|
def on_press(self, instance):
|
|
pass
|
|
|
|
def on_release(self, instance):
|
|
pass
|
|
|
|
def show(self, pos, duration=0):
|
|
Window.add_widget(self)
|
|
# wait for the bubble to adjust it's 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 = Animation(opacity=1, pos=pos, d=.32)
|
|
anim.bind(on_complete=on_stop)
|
|
anim.cancel_all(self)
|
|
anim.start(self)
|
|
|
|
|
|
def hide(self, *dt):
|
|
|
|
def on_stop(*l):
|
|
Window.remove_widget(self)
|
|
anim = Animation(opacity=0, d=.25)
|
|
anim.bind(on_complete=on_stop)
|
|
anim.cancel_all(self)
|
|
anim.start(self)
|
|
|
|
def add_widget(self, widget, index=0):
|
|
if not isinstance(widget, ContextMenuItem):
|
|
super(ContextMenu, self).add_widget(widget, index)
|
|
return
|
|
menu_content.add_widget(widget, index)
|
|
|