Source code for rubato.classes.components.button

"""A button component that can be used in UI or to detect mouse presses in an area."""
from typing import Callable

from . import Component
from ... import Input, Vector


[docs]class Button(Component): """ A Button component. Add this to game objects or UI elements to give them clickable areas. Args: offset: The offset of the button from the game object. Defaults to Vector(0, 0). rot_offset: The rotation offset of the button from the game object. Defaults to 0. width: The width of the button. Defaults to 10. height: The height of the button. Defaults to 10. onclick: The function to call when the button is clicked. Defaults to lambda: None. onrelease: The function to call when the button is released. Defaults to lambda: None. onhover: The function to call when the mouse enters the button. Defaults to lambda: None. onexit: The function to call when the mouse exits the button. Defaults to lambda: None. Attributes: pressed (bool): Whether the button is currently pressed. hover (bool): Whether the mouse is hovering over the button. dims (Vector): The dimensions of the button. onclick (Callable): The function to call when the button is clicked. onrelease (Callable): The function to call when the button is released. onhover (Callable): The function to call when the mouse enters the button. onexit (Callable): The function to call when the mouse exits the button. """ def __init__( self, offset: Vector = Vector(), rot_offset: float = 0, width: int = 10, height: int = 10, onclick: Callable = lambda: None, onrelease: Callable = lambda: None, onhover: Callable = lambda: None, onexit: Callable = lambda: None, ): super().__init__(offset=offset, rot_offset=rot_offset) self.dims: Vector = Vector(width, height) self.pressed: bool = False self.hover: bool = False self.onclick: Callable = onclick self.onrelease: Callable = onrelease self.onhover: Callable = onhover self.onexit: Callable = onexit
[docs] def update(self): """The update function for buttons.""" if not self.hover and Input.mouse_in(self.gameobj.pos + self.offset, self.dims, self.gameobj.rotation + self.rotation_offset): self.hover = True self.onhover() elif self.hover and not Input.mouse_in( self.gameobj.pos + self.offset, self.dims, self.gameobj.rotation + self.rotation_offset ): self.hover = False self.onexit() if (not self.pressed) and Input.mouse_state()[0] and self.hover: self.pressed = True self.onclick() elif self.pressed and (not Input.mouse_state()[0] or not self.hover): self.pressed = False self.onrelease()