You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.8 KiB
58 lines
1.8 KiB
from typing import Any, Callable, Optional |
|
|
|
from .. import globals # pylint: disable=redefined-builtin |
|
from ..events import ClickEventArguments, handle_event |
|
from .mixins.text_element import TextElement |
|
from .mixins.value_element import ValueElement |
|
|
|
|
|
class Menu(ValueElement): |
|
|
|
def __init__(self, *, value: bool = False) -> None: |
|
"""Menu |
|
|
|
Creates a menu. |
|
The menu should be placed inside the element where it should be shown. |
|
|
|
:param value: whether the menu is already opened (default: `False`) |
|
""" |
|
super().__init__(tag='q-menu', value=value, on_value_change=None) |
|
|
|
def open(self) -> None: |
|
"""Open the menu.""" |
|
self.value = True |
|
|
|
def close(self) -> None: |
|
"""Close the menu.""" |
|
self.value = False |
|
|
|
def toggle(self) -> None: |
|
"""Toggle the menu.""" |
|
self.value = not self.value |
|
|
|
|
|
class MenuItem(TextElement): |
|
|
|
def __init__(self, |
|
text: str = '', |
|
on_click: Optional[Callable[..., Any]] = None, *, |
|
auto_close: bool = True, |
|
) -> None: |
|
"""Menu Item |
|
|
|
A menu item to be added to a menu. |
|
|
|
:param text: label of the menu item |
|
:param on_click: callback to be executed when selecting the menu item |
|
:param auto_close: whether the menu should be closed after a click event (default: `True`) |
|
""" |
|
super().__init__(tag='q-item', text=text) |
|
self.menu = globals.get_slot().parent |
|
self._props['clickable'] = True |
|
|
|
def handle_click(_) -> None: |
|
handle_event(on_click, ClickEventArguments(sender=self, client=self.client)) |
|
if auto_close: |
|
assert isinstance(self.menu, Menu) |
|
self.menu.close() |
|
self.on('click', handle_click, [])
|
|
|