浏览代码

update ui.menu and ui.menu_item

Falko Schindler 2 年之前
父节点
当前提交
2a8a759bbe
共有 6 个文件被更改,包括 51 次插入61 次删除
  1. 2 2
      api_docs_and_examples.py
  2. 46 0
      nicegui/elements/menu.py
  3. 0 25
      nicegui/elements/old/menu.py
  4. 0 33
      nicegui/elements/old/menu_item.py
  5. 1 1
      nicegui/elements/plot.py
  6. 2 0
      nicegui/ui.py

+ 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'):
         with ui.expansion('Expand!', icon='work').classes('w-full'):
             ui.label('inside the expansion')
             ui.label('inside the expansion')
 
 
-    # @example(ui.menu)
+    @example(ui.menu, skip=False)
     def menu_example():
     def menu_example():
         choice = ui.label('Try the menu.')
         choice = ui.label('Try the menu.')
         with ui.menu() as menu:
         with ui.menu() as menu:
             ui.menu_item('Menu item 1', lambda: choice.set_text('Selected item 1.'))
             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 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_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.menu_item('Close', on_click=menu.close)
 
 
         ui.button('Open menu', on_click=menu.open)
         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):
 class Plot(Element):
 
 
-    def __init__(self, *, close: bool = True, **kwargs):
+    def __init__(self, *, close: bool = True, **kwargs) -> None:
         """Plot Context
         """Plot Context
 
 
         Create a context to configure a `Matplotlib <https://matplotlib.org/>`_ plot.
         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 Link as link
 from .elements.link import LinkTarget as link_target
 from .elements.link import LinkTarget as link_target
 from .elements.markdown import Markdown as markdown
 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.number import Number as number
 from .elements.plot import Plot as plot
 from .elements.plot import Plot as plot
 from .elements.progress import CircularProgress as circular_progress
 from .elements.progress import CircularProgress as circular_progress