Source code for carbonkivy.behaviors.hover_behavior
from __future__ import annotations
__all__ = ("HoverBehavior",)
from kivy.core.window import Window
from kivy.properties import BooleanProperty, ColorProperty, ListProperty
from kivy.uix.relativelayout import RelativeLayout
from carbonkivy.utils import DEVICE_TYPE
from .background_color_behavior import BackgroundColorBehavior
[docs]
class HoverBehavior:
[docs]
hover = BooleanProperty(False)
[docs]
hover_enabled = BooleanProperty(True)
[docs]
hover_color = ColorProperty([1, 1, 1, 0])
def __init__(self, **kwargs) -> None:
self.on_hover_enabled()
super(HoverBehavior, self).__init__(**kwargs)
[docs]
def element_hover(self, instance: object, pos: list, *args) -> None:
if not self.is_visible():
self.hover = False
if (
(
(hasattr(self, "cstate") and self.cstate != "disabled")
or (not self.disabled)
)
and self.hover_enabled
and self.is_visible()
):
for widget in self.children:
if hasattr(widget, "hover") and widget.hover:
self.hover = False
return
self.hover = self.collide_point(
*(
self.to_widget(*pos)
if not isinstance(self, RelativeLayout)
else self.to_parent(*self.to_widget(*pos))
)
)
[docs]
def is_visible(self, *args) -> bool:
if not self.get_root_window() or self.disabled or self.opacity == 0:
return False
else:
return True
[docs]
def on_hover_enabled(self, *args) -> None:
if DEVICE_TYPE != "mobile":
if self.hover_enabled:
Window.bind(mouse_pos=self.element_hover)
else:
Window.unbind(mouse_pos=self.element_hover)
[docs]
def on_hover(self, *args) -> None:
if isinstance(self, BackgroundColorBehavior):
if self.hover:
self._bg_color = self.hover_color
else:
self._bg_color = self.bg_color