|
@@ -1,12 +1,11 @@
|
|
|
-from typing import Any, Callable, Optional
|
|
|
+from typing import Any, Callable, Optional, Union
|
|
|
|
|
|
from typing_extensions import Self
|
|
|
|
|
|
-from .. import context
|
|
|
-from ..events import ClickEventArguments, handle_event
|
|
|
+from ..element import Element
|
|
|
from ..logging import log
|
|
|
from .context_menu import ContextMenu
|
|
|
-from .mixins.text_element import TextElement
|
|
|
+from .item import Item
|
|
|
from .mixins.value_element import ValueElement
|
|
|
|
|
|
|
|
@@ -21,6 +20,7 @@ class Menu(ValueElement):
|
|
|
:param value: whether the menu is already opened (default: `False`)
|
|
|
"""
|
|
|
super().__init__(tag='q-menu', value=value, on_value_change=None)
|
|
|
+ self._props['auto-close'] = True
|
|
|
|
|
|
def open(self) -> None:
|
|
|
"""Open the menu."""
|
|
@@ -44,7 +44,7 @@ class Menu(ValueElement):
|
|
|
return self
|
|
|
|
|
|
|
|
|
-class MenuItem(TextElement):
|
|
|
+class MenuItem(Item):
|
|
|
|
|
|
def __init__(self,
|
|
|
text: str = '',
|
|
@@ -60,20 +60,21 @@ class MenuItem(TextElement):
|
|
|
: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 = context.get_slot().parent
|
|
|
+ super().__init__(text=text, on_click=on_click)
|
|
|
+
|
|
|
self._props['clickable'] = True
|
|
|
- self._click_handlers = [on_click] if on_click else []
|
|
|
|
|
|
- def handle_click(_) -> None:
|
|
|
- for handler in self._click_handlers:
|
|
|
- handle_event(handler, ClickEventArguments(sender=self, client=self.client))
|
|
|
+ self.menu = self._find_menu()
|
|
|
+ if self.menu:
|
|
|
if auto_close:
|
|
|
- assert isinstance(self.menu, (Menu, ContextMenu))
|
|
|
- self.menu.close()
|
|
|
- self.on('click', handle_click, [])
|
|
|
-
|
|
|
- def on_click(self, callback: Callable[..., Any]) -> Self:
|
|
|
- """Add a callback to be invoked when the menu item is clicked."""
|
|
|
- self._click_handlers.append(callback)
|
|
|
- return self
|
|
|
+ self.on_click(self.menu.close)
|
|
|
+ else:
|
|
|
+ self.menu.props(remove='auto-close')
|
|
|
+
|
|
|
+ def _find_menu(self) -> Optional[Union[Menu, ContextMenu]]:
|
|
|
+ element: Element = self
|
|
|
+ while element.parent_slot:
|
|
|
+ element = element.parent_slot.parent
|
|
|
+ if isinstance(element, (Menu, ContextMenu)):
|
|
|
+ return element
|
|
|
+ return None
|