Sideband/sbapp/kivymd/uix/behaviors/touch_behavior.py

101 lines
2.4 KiB
Python
Raw Normal View History

2022-07-07 16:16:10 -04:00
"""
Behaviors/Touch
===============
.. rubric:: Provides easy access to events.
The following events are available:
- on_long_touch
- on_double_tap
- on_triple_tap
Usage
-----
.. code-block:: python
from kivy.lang import Builder
from kivymd.app import MDApp
from kivymd.uix.behaviors import TouchBehavior
from kivymd.uix.button import MDRaisedButton
KV = '''
2023-07-09 20:49:58 -04:00
MDScreen:
2022-07-07 16:16:10 -04:00
MyButton:
text: "PRESS ME"
pos_hint: {"center_x": .5, "center_y": .5}
'''
class MyButton(MDRaisedButton, TouchBehavior):
def on_long_touch(self, *args):
print("<on_long_touch> event")
def on_double_tap(self, *args):
print("<on_double_tap> event")
def on_triple_tap(self, *args):
print("<on_triple_tap> event")
class MainApp(MDApp):
def build(self):
return Builder.load_string(KV)
MainApp().run()
"""
__all__ = ("TouchBehavior",)
from functools import partial
from kivy.clock import Clock
from kivy.properties import NumericProperty
class TouchBehavior:
duration_long_touch = NumericProperty(0.4)
"""
Time for a long touch.
:attr:`duration_long_touch` is an :class:`~kivy.properties.NumericProperty`
and defaults to `0.4`.
"""
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.bind(
on_touch_down=self.create_clock, on_touch_up=self.delete_clock
)
def create_clock(self, widget, touch, *args):
if self.collide_point(touch.x, touch.y):
2023-07-09 20:49:58 -04:00
if "event" not in touch.ud:
callback = partial(self.on_long_touch, touch)
Clock.schedule_once(callback, self.duration_long_touch)
touch.ud["event"] = callback
2022-07-07 16:16:10 -04:00
if touch.is_double_tap:
self.on_double_tap(touch, *args)
if touch.is_triple_tap:
self.on_triple_tap(touch, *args)
def delete_clock(self, widget, touch, *args):
if self.collide_point(touch.x, touch.y):
2023-07-09 20:49:58 -04:00
if "event" in touch.ud:
2022-07-07 16:16:10 -04:00
Clock.unschedule(touch.ud["event"])
2023-07-09 20:49:58 -04:00
del touch.ud["event"]
2022-07-07 16:16:10 -04:00
def on_long_touch(self, touch, *args):
"""Called when the widget is pressed for a long time."""
def on_double_tap(self, touch, *args):
"""Called by double clicking on the widget."""
def on_triple_tap(self, touch, *args):
"""Called by triple clicking on the widget."""