122 lines
3.4 KiB
Python
122 lines
3.4 KiB
Python
"""
|
|
Behaviors/Focus
|
|
===============
|
|
|
|
.. rubric:: Changing the background color when the mouse is on the widget.
|
|
|
|
To apply focus behavior, you must create a new class that is inherited from the
|
|
widget to which you apply the behavior and from the :class:`FocusBehavior` class.
|
|
|
|
Usage
|
|
-----
|
|
|
|
.. code-block:: python
|
|
|
|
from kivy.lang import Builder
|
|
|
|
from kivymd.app import MDApp
|
|
from kivymd.uix.behaviors import RectangularElevationBehavior, FocusBehavior
|
|
from kivymd.uix.boxlayout import MDBoxLayout
|
|
|
|
KV = '''
|
|
MDScreen:
|
|
md_bg_color: 1, 1, 1, 1
|
|
|
|
FocusWidget:
|
|
size_hint: .5, .3
|
|
pos_hint: {"center_x": .5, "center_y": .5}
|
|
md_bg_color: app.theme_cls.bg_light
|
|
|
|
MDLabel:
|
|
text: "Label"
|
|
theme_text_color: "Primary"
|
|
pos_hint: {"center_y": .5}
|
|
halign: "center"
|
|
'''
|
|
|
|
|
|
class FocusWidget(MDBoxLayout, RectangularElevationBehavior, FocusBehavior):
|
|
pass
|
|
|
|
|
|
class Test(MDApp):
|
|
def build(self):
|
|
self.theme_cls.theme_style = "Dark"
|
|
return Builder.load_string(KV)
|
|
|
|
|
|
Test().run()
|
|
|
|
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/focus-widget.gif
|
|
:align: center
|
|
|
|
Color change at focus/defocus
|
|
|
|
.. code-block:: kv
|
|
|
|
FocusWidget:
|
|
focus_color: 1, 0, 1, 1
|
|
unfocus_color: 0, 0, 1, 1
|
|
|
|
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/focus-defocus-color.gif
|
|
:align: center
|
|
"""
|
|
|
|
__all__ = ("FocusBehavior",)
|
|
|
|
from kivy.app import App
|
|
from kivy.properties import BooleanProperty, ListProperty
|
|
from kivy.uix.behaviors import ButtonBehavior
|
|
|
|
from kivymd.uix.behaviors import HoverBehavior
|
|
|
|
|
|
class FocusBehavior(HoverBehavior, ButtonBehavior):
|
|
|
|
focus_behavior = BooleanProperty(True)
|
|
"""
|
|
Using focus when hovering over a widget.
|
|
|
|
:attr:`focus_behavior` is a :class:`~kivy.properties.BooleanProperty`
|
|
and defaults to `False`.
|
|
"""
|
|
|
|
focus_color = ListProperty()
|
|
"""
|
|
The color of the widget when the mouse enters the bbox of the widget.
|
|
|
|
:attr:`focus_color` is a :class:`~kivy.properties.ListProperty`
|
|
and defaults to `[]`.
|
|
"""
|
|
|
|
unfocus_color = ListProperty()
|
|
"""
|
|
The color of the widget when the mouse exits the bbox widget.
|
|
|
|
:attr:`unfocus_color` is a :class:`~kivy.properties.ListProperty`
|
|
and defaults to `[]`.
|
|
"""
|
|
|
|
def on_enter(self):
|
|
"""Called when mouse enter the bbox of the widget."""
|
|
|
|
if hasattr(self, "md_bg_color") and self.focus_behavior:
|
|
if hasattr(self, "theme_cls") and not self.focus_color:
|
|
self.md_bg_color = self.theme_cls.bg_normal
|
|
else:
|
|
if not self.focus_color:
|
|
self.md_bg_color = App.get_running_app().theme_cls.bg_normal
|
|
else:
|
|
self.md_bg_color = self.focus_color
|
|
|
|
def on_leave(self):
|
|
"""Called when the mouse exit the widget."""
|
|
|
|
if hasattr(self, "md_bg_color") and self.focus_behavior:
|
|
if hasattr(self, "theme_cls") and not self.unfocus_color:
|
|
self.md_bg_color = self.theme_cls.bg_light
|
|
else:
|
|
if not self.unfocus_color:
|
|
self.md_bg_color = App.get_running_app().theme_cls.bg_light
|
|
else:
|
|
self.md_bg_color = self.unfocus_color
|