Przeglądaj źródła

update ui.menu and ui.menu_item

Falko Schindler 2 lat temu
rodzic
commit
2a8a759bbe

+ 2 - 2
api_docs_and_examples.py

@@ -437,14 +437,14 @@ Alternatively, you can remove individual elements with `remove(element)`, where
         with ui.expansion('Expand!', icon='work').classes('w-full'):
             ui.label('inside the expansion')
 
-    # @example(ui.menu)
+    @example(ui.menu, skip=False)
     def menu_example():
         choice = ui.label('Try the menu.')
         with ui.menu() as menu:
             ui.menu_item('Menu item 1', lambda: choice.set_text('Selected item 1.'))
             ui.menu_item('Menu item 2', lambda: choice.set_text('Selected item 2.'))
             ui.menu_item('Menu item 3 (keep open)', lambda: choice.set_text('Selected item 3.'), auto_close=False)
-            ui.menu_separator()
+            ui.separator()
             ui.menu_item('Close', on_click=menu.close)
 
         ui.button('Open menu', on_click=menu.open)

+ 46 - 0
nicegui/elements/menu.py

@@ -0,0 +1,46 @@
+from typing import Callable, Optional
+
+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.
+
+        :param value: whether the menu is already opened (default: `False`)
+        """
+        super().__init__(tag='q-menu', value=value, on_value_change=None)
+        self._props['no-parent-event'] = True
+
+    def open(self) -> None:
+        self.value = True
+
+    def close(self) -> None:
+        self.value = False
+
+
+class MenuItem(TextElement):
+
+    def __init__(self, text: str = '', on_click: Optional[Callable] = None, *, auto_close: bool = True):
+        """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: Menu = self.client.slot_stack[-1].parent
+        self._props['clickable'] = True
+
+        def handle_click(_) -> None:
+            handle_event(on_click, ClickEventArguments(sender=self, client=self.client))
+            if auto_close:
+                self.menu.close()
+        self.on('click', handle_click)

+ 0 - 25
nicegui/elements/old/menu.py

@@ -1,25 +0,0 @@
-import justpy as jp
-
-from .group import Group
-
-
-class Menu(Group):
-
-    def __init__(self, *, value: bool = False):
-        """Menu
-
-        Creates a menu.
-
-        :param value: whether the menu is already opened (default: `False`)
-        """
-        view = jp.QMenu(value=value, temp=False, no_parent_event=True)
-
-        super().__init__(view)
-
-    def open(self):
-        self.view.value = True
-        self.update()
-
-    def close(self):
-        self.view.value = False
-        self.update()

+ 0 - 33
nicegui/elements/old/menu_item.py

@@ -1,33 +0,0 @@
-from typing import Callable, Optional
-
-import justpy as jp
-
-from ..events import ClickEventArguments, handle_event
-from ..task_logger import create_task
-from .element import Element
-
-
-class MenuItem(Element):
-
-    def __init__(self, text: str = '', on_click: Optional[Callable] = None, *, auto_close: bool = True):
-        """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`)
-        """
-        view = jp.QItem(text=text, clickable=True, temp=False)
-
-        def handle_click(view, event) -> Optional[bool]:
-            result = handle_event(on_click, ClickEventArguments(sender=self, socket=event.get('websocket')))
-            if auto_close:
-                assert isinstance(self.parent_view, jp.QMenu)
-                self.parent_view.value = False
-                create_task(self.parent_view.update())
-            return result
-
-        view.on('click', handle_click)
-
-        super().__init__(view)

+ 1 - 1
nicegui/elements/plot.py

@@ -7,7 +7,7 @@ from ..element import Element
 
 class Plot(Element):
 
-    def __init__(self, *, close: bool = True, **kwargs):
+    def __init__(self, *, close: bool = True, **kwargs) -> None:
         """Plot Context
 
         Create a context to configure a `Matplotlib <https://matplotlib.org/>`_ plot.

+ 2 - 0
nicegui/ui.py

@@ -16,6 +16,8 @@ from .elements.label import Label as label
 from .elements.link import Link as link
 from .elements.link import LinkTarget as link_target
 from .elements.markdown import Markdown as markdown
+from .elements.menu import Menu as menu
+from .elements.menu import MenuItem as menu_item
 from .elements.number import Number as number
 from .elements.plot import Plot as plot
 from .elements.progress import CircularProgress as circular_progress