Browse Source

close menu after click on menu item (if `auto_close` is not true)

Falko Schindler 3 years ago
parent
commit
0cf578ea11
2 changed files with 11 additions and 1 deletions
  1. 1 0
      main.py
  2. 10 1
      nicegui/elements/menu_item.py

+ 1 - 0
main.py

@@ -271,6 +271,7 @@ with example(ui.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.menu_item('Close', on_click=menu.close)
 

+ 10 - 1
nicegui/elements/menu_item.py

@@ -10,6 +10,8 @@ class MenuItem(Element):
     def __init__(self,
                  text: str = '',
                  on_click: Optional[Union[Callable, Awaitable]] = None,
+                 *,
+                 auto_close: bool = True,
                  ):
         """Menu Item Element
 
@@ -17,9 +19,16 @@ class MenuItem(Element):
 
         :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)
 
-        view.on('click', lambda *_: handle_event(on_click, ClickEventArguments(sender=self), update=self.parent_view))
+        def handle_click(*_):
+            handle_event(on_click, ClickEventArguments(sender=self), update=self.parent_view)
+            if auto_close:
+                assert isinstance(self.parent_view, jp.QMenu)
+                self.parent_view.value = False
+
+        view.on('click', handle_click)
 
         super().__init__(view)