SomberNight
6 years ago
8 changed files with 18 additions and 103 deletions
@ -1,95 +0,0 @@ |
|||
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 ..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) |
Loading…
Reference in new issue