diff --git a/scene/gui/color_picker.cpp b/scene/gui/color_picker.cpp index dbc799e23d7..1e9671374ad 100644 --- a/scene/gui/color_picker.cpp +++ b/scene/gui/color_picker.cpp @@ -2349,6 +2349,14 @@ void ColorPickerButton::_modal_closed() { void ColorPickerButton::pressed() { _update_picker(); + // Checking if the popup was open before, so we can keep it closed instead of reopening it. + // Popups get closed when it's clicked outside of them. + if (popup_was_open) { + // Reset popup_was_open value. + popup_was_open = popup->is_visible(); + return; + } + Size2 minsize = popup->get_contents_minimum_size(); float viewport_height = get_viewport_rect().size.y; @@ -2374,6 +2382,19 @@ void ColorPickerButton::pressed() { } } +void ColorPickerButton::gui_input(const Ref &p_event) { + ERR_FAIL_COND(p_event.is_null()); + + Ref mouse_button = p_event; + bool ui_accept = p_event->is_action("ui_accept", true) && !p_event->is_echo(); + bool mouse_left_pressed = mouse_button.is_valid() && mouse_button->get_button_index() == MouseButton::LEFT && mouse_button->is_pressed(); + if (mouse_left_pressed || ui_accept) { + popup_was_open = popup && popup->is_visible(); + } + + BaseButton::gui_input(p_event); +} + void ColorPickerButton::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ACCESSIBILITY_UPDATE: { diff --git a/scene/gui/color_picker.h b/scene/gui/color_picker.h index dc64308f13e..a37f12ee4f4 100644 --- a/scene/gui/color_picker.h +++ b/scene/gui/color_picker.h @@ -514,6 +514,7 @@ class ColorPickerButton : public Button { Color color; bool edit_alpha = true; bool edit_intensity = true; + bool popup_was_open = false; struct ThemeCache { Ref normal_style; @@ -533,6 +534,7 @@ class ColorPickerButton : public Button { protected: void _notification(int); static void _bind_methods(); + virtual void gui_input(const Ref &p_event) override; public: void set_pick_color(const Color &p_color);