From 6b29011ae5d04aae5b822b4b5b3cd65ee4b70874 Mon Sep 17 00:00:00 2001 From: Pablo Andres Fuente Date: Tue, 22 Oct 2024 13:55:13 -0300 Subject: [PATCH] Fix `ColorPickerButton` close popup on mouse click Fixes #91813 --- scene/gui/color_picker.cpp | 21 +++++++++++++++++++++ scene/gui/color_picker.h | 2 ++ 2 files changed, 23 insertions(+) diff --git a/scene/gui/color_picker.cpp b/scene/gui/color_picker.cpp index aab7c37bbb5e..757449b67314 100644 --- a/scene/gui/color_picker.cpp +++ b/scene/gui/color_picker.cpp @@ -2466,6 +2466,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; @@ -2489,6 +2497,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_DRAW: { diff --git a/scene/gui/color_picker.h b/scene/gui/color_picker.h index cc2793b413e8..9efb03c054f2 100644 --- a/scene/gui/color_picker.h +++ b/scene/gui/color_picker.h @@ -425,6 +425,7 @@ class ColorPickerButton : public Button { ColorPicker *picker = nullptr; Color color; bool edit_alpha = true; + bool popup_was_open = false; struct ThemeCache { Ref normal_style; @@ -444,6 +445,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);