Browse Source

avoid opening popups via parent event

Falko Schindler 2 năm trước cách đây
mục cha
commit
c1dfa55cf1

+ 17 - 8
nicegui/elements/color_input.py

@@ -26,17 +26,26 @@ class ColorInput(StringElement):
             temp=False,
         )
 
-        icon_button = jp.parse_html('''
+        self._icon_button = jp.parse_html('''
             <q-icon name="colorize" class="cursor-pointer">
-                <q-popup-proxy transition-show="scale" transition-hide="scale" name="popup">
+                <q-popup-proxy transition-show="scale" transition-hide="scale" name="popup" no-parent-event>
                     <q-color name="color_input"/>
                 </q-popup-proxy>
             </q-icon>''')
-        view.add_scoped_slot('append', icon_button)
-        icon_button.name_dict['color_input'].on('change', self.handle_change)
-        icon_button.name_dict['color_input'].disable_input_event = True
-        icon_button.name_dict['popup'].on('input', lambda *_: create_task(view.update()) or False)
-        icon_button.name_dict['popup'].on('show', lambda *_: create_task(view.update()) or False)
-        icon_button.name_dict['popup'].on('hide', lambda *_: create_task(view.update()) or False)
+        view.add_scoped_slot('append', self._icon_button)
+        self._icon_button.on('click', lambda *_: self.open() or False)
+        self._icon_button.name_dict['color_input'].on('change', self.handle_change)
+        self._icon_button.name_dict['color_input'].disable_input_event = True
+        self._icon_button.name_dict['popup'].on('input', lambda *_: create_task(view.update()) or False)
+        self._icon_button.name_dict['popup'].on('show', lambda *_: create_task(view.update()) or False)
+        self._icon_button.name_dict['popup'].on('hide', lambda *_: create_task(view.update()) or False)
 
         super().__init__(view, value=value, on_change=on_change)
+
+    def open(self):
+        self._icon_button.name_dict['popup'].value = True
+        create_task(self.view.update())
+
+    def close(self):
+        self.view.name_dict['popup'].value = False
+        create_task(self.view.update())

+ 4 - 3
nicegui/elements/color_picker.py

@@ -16,10 +16,9 @@ class ColorPicker(Element):
         :param value: whether the menu is already opened (default: `False`)
         """
         view = jp.parse_html('''
-            <q-popup-proxy transition-show="scale" transition-hide="scale" name="popup">
+            <q-popup-proxy transition-show="scale" transition-hide="scale" name="popup" no-parent-event>
                 <q-color name="color_input"/>
-            </q-popup-proxy>
-            ''')
+            </q-popup-proxy>''')
 
         def handle_pick(sender, msg: Dict):
             return handle_event(on_pick, ColorPickEventArguments(sender=self, color=msg.value))
@@ -34,6 +33,8 @@ class ColorPicker(Element):
 
     def open(self):
         self.view.name_dict['popup'].value = True
+        create_task(self.view.update())
 
     def close(self):
         self.view.name_dict['popup'].value = False
+        create_task(self.view.update())

+ 3 - 2
nicegui/elements/menu.py

@@ -13,13 +13,14 @@ class Menu(Group):
 
         :param value: whether the menu is already opened (default: `False`)
         """
-        view = jp.QMenu(value=value, temp=False)
-        view.on('input', lambda *_: create_task(view.update()) or False)
+        view = jp.QMenu(value=value, temp=False, no_parent_event=True)
 
         super().__init__(view)
 
     def open(self):
         self.view.value = True
+        create_task(self.view.update())
 
     def close(self):
         self.view.value = False
+        create_task(self.view.update())