mirror of
				https://github.com/liberatedsystems/openCom-Companion.git
				synced 2025-07-08 05:07:21 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			190 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			190 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """
 | |
| Behaviors/Magic
 | |
| ===============
 | |
| 
 | |
| .. rubric:: Magical effects for buttons.
 | |
| 
 | |
| .. warning:: Magic effects do not work correctly with `KivyMD` buttons!
 | |
| 
 | |
| To apply magic effects, you must create a new class that is inherited from the
 | |
| widget to which you apply the effect and from the :attr:`MagicBehavior` class.
 | |
| 
 | |
| In `KV file`:
 | |
| 
 | |
| .. code-block:: kv
 | |
| 
 | |
|     <MagicButton@MagicBehavior+MDRectangleFlatButton>
 | |
| 
 | |
| In `python file`:
 | |
| 
 | |
| .. code-block:: python
 | |
| 
 | |
|     class MagicButton(MagicBehavior, MDRectangleFlatButton):
 | |
|         pass
 | |
| 
 | |
| .. rubric:: The :attr:`MagicBehavior` class provides five effects:
 | |
| 
 | |
| - :attr:`MagicBehavior.wobble`
 | |
| - :attr:`MagicBehavior.grow`
 | |
| - :attr:`MagicBehavior.shake`
 | |
| - :attr:`MagicBehavior.twist`
 | |
| - :attr:`MagicBehavior.shrink`
 | |
| 
 | |
| Example:
 | |
| 
 | |
| .. code-block:: python
 | |
| 
 | |
|     from kivy.lang import Builder
 | |
| 
 | |
|     from kivymd.app import MDApp
 | |
| 
 | |
|     KV = '''
 | |
|     <MagicButton@MagicBehavior+MDRectangleFlatButton>
 | |
| 
 | |
| 
 | |
|     MDFloatLayout:
 | |
| 
 | |
|         MagicButton:
 | |
|             text: "WOBBLE EFFECT"
 | |
|             on_release: self.wobble()
 | |
|             pos_hint: {"center_x": .5, "center_y": .3}
 | |
| 
 | |
|         MagicButton:
 | |
|             text: "GROW EFFECT"
 | |
|             on_release: self.grow()
 | |
|             pos_hint: {"center_x": .5, "center_y": .4}
 | |
| 
 | |
|         MagicButton:
 | |
|             text: "SHAKE EFFECT"
 | |
|             on_release: self.shake()
 | |
|             pos_hint: {"center_x": .5, "center_y": .5}
 | |
| 
 | |
|         MagicButton:
 | |
|             text: "TWIST EFFECT"
 | |
|             on_release: self.twist()
 | |
|             pos_hint: {"center_x": .5, "center_y": .6}
 | |
| 
 | |
|         MagicButton:
 | |
|             text: "SHRINK EFFECT"
 | |
|             on_release: self.shrink()
 | |
|             pos_hint: {"center_x": .5, "center_y": .7}
 | |
|     '''
 | |
| 
 | |
| 
 | |
|     class Example(MDApp):
 | |
|         def build(self):
 | |
|             return Builder.load_string(KV)
 | |
| 
 | |
| 
 | |
|     Example().run()
 | |
| 
 | |
| 
 | |
| .. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/magic-button.gif
 | |
|    :width: 250 px
 | |
|    :align: center
 | |
| """
 | |
| 
 | |
| __all__ = ("MagicBehavior",)
 | |
| 
 | |
| from kivy.animation import Animation
 | |
| from kivy.lang import Builder
 | |
| from kivy.properties import NumericProperty
 | |
| 
 | |
| Builder.load_string(
 | |
|     """
 | |
| <MagicBehavior>
 | |
|     translate_x: 0
 | |
|     translate_y: 0
 | |
|     scale_x: 1
 | |
|     scale_y: 1
 | |
|     rotate: 0
 | |
| 
 | |
|     canvas.before:
 | |
|         PushMatrix
 | |
|         Translate:
 | |
|             x: self.translate_x or 0
 | |
|             y: self.translate_y or 0
 | |
|         Rotate:
 | |
|             origin: self.center
 | |
|             angle: self.rotate or 0
 | |
|         Scale:
 | |
|             origin: self.center
 | |
|             x: self.scale_x or 1
 | |
|             y: self.scale_y or 1
 | |
|     canvas.after:
 | |
|         PopMatrix
 | |
| """
 | |
| )
 | |
| 
 | |
| 
 | |
| class MagicBehavior:
 | |
|     magic_speed = NumericProperty(1)
 | |
|     """
 | |
|     Animation playback speed.
 | |
| 
 | |
|     :attr:`magic_speed` is a :class:`~kivy.properties.NumericProperty`
 | |
|     and defaults to `1`.
 | |
|     """
 | |
| 
 | |
|     def grow(self) -> None:
 | |
|         """Grow effect animation."""
 | |
| 
 | |
|         (
 | |
|             Animation(
 | |
|                 scale_x=1.2,
 | |
|                 scale_y=1.2,
 | |
|                 t="out_quad",
 | |
|                 d=0.03 / self.magic_speed,
 | |
|             )
 | |
|             + Animation(
 | |
|                 scale_x=1, scale_y=1, t="out_elastic", d=0.4 / self.magic_speed
 | |
|             )
 | |
|         ).start(self)
 | |
| 
 | |
|     def shake(self) -> None:
 | |
|         """Shake effect animation."""
 | |
| 
 | |
|         (
 | |
|             Animation(translate_x=50, t="out_quad", d=0.02 / self.magic_speed)
 | |
|             + Animation(
 | |
|                 translate_x=0, t="out_elastic", d=0.5 / self.magic_speed
 | |
|             )
 | |
|         ).start(self)
 | |
| 
 | |
|     def wobble(self) -> None:
 | |
|         """Wobble effect animation."""
 | |
| 
 | |
|         (
 | |
|             (
 | |
|                 Animation(scale_y=0.7, t="out_quad", d=0.03 / self.magic_speed)
 | |
|                 & Animation(
 | |
|                     scale_x=1.4, t="out_quad", d=0.03 / self.magic_speed
 | |
|                 )
 | |
|             )
 | |
|             + (
 | |
|                 Animation(scale_y=1, t="out_elastic", d=0.5 / self.magic_speed)
 | |
|                 & Animation(
 | |
|                     scale_x=1, t="out_elastic", d=0.4 / self.magic_speed
 | |
|                 )
 | |
|             )
 | |
|         ).start(self)
 | |
| 
 | |
|     def twist(self) -> None:
 | |
|         """Twist effect animation."""
 | |
| 
 | |
|         (
 | |
|             Animation(rotate=25, t="out_quad", d=0.05 / self.magic_speed)
 | |
|             + Animation(rotate=0, t="out_elastic", d=0.5 / self.magic_speed)
 | |
|         ).start(self)
 | |
| 
 | |
|     def shrink(self) -> None:
 | |
|         """Shrink effect animation."""
 | |
| 
 | |
|         Animation(
 | |
|             scale_x=0.95, scale_y=0.95, t="out_quad", d=0.1 / self.magic_speed
 | |
|         ).start(self)
 | |
| 
 | |
|     def on_touch_up(self, *args):
 | |
|         Animation.stop_all(self)
 | |
|         return super().on_touch_up(*args)
 |