From 09822ea1a933bbf425509295c0b11a3e3a7a053f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pa=CC=84vels=20Nadtoc=CC=8Cajevs?= <7645683+bruvzg@users.noreply.github.com> Date: Sat, 1 Feb 2025 21:23:51 +0200 Subject: [PATCH] Forward color picker preview mouse button events to the window underneath. --- scene/gui/color_picker.cpp | 33 ++++++++++++++++++++++++++++++--- scene/gui/color_picker.h | 1 + 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/scene/gui/color_picker.cpp b/scene/gui/color_picker.cpp index ebefa7ef476..f9e55e6409b 100644 --- a/scene/gui/color_picker.cpp +++ b/scene/gui/color_picker.cpp @@ -1695,6 +1695,7 @@ void ColorPicker::_add_preset_pressed() { void ColorPicker::_pick_button_pressed() { is_picking_color = true; + pre_picking_color = color; if (!picker_window) { picker_window = memnew(Popup); @@ -1748,9 +1749,34 @@ void ColorPicker::_pick_button_pressed() { void ColorPicker::_target_gui_input(const Ref &p_event) { const Ref mouse_event = p_event; - if (mouse_event.is_valid() && mouse_event->is_pressed()) { + if (mouse_event.is_null()) { + return; + } + if (mouse_event->get_button_index() == MouseButton::LEFT) { + if (mouse_event->is_pressed()) { + picker_window->hide(); + _pick_finished(); + } + } else if (mouse_event->get_button_index() == MouseButton::RIGHT) { + set_pick_color(pre_picking_color); // Cancel. + is_picking_color = false; + set_process_internal(false); picker_window->hide(); - _pick_finished(); + } else { + Window *w = picker_window->get_parent_visible_window(); + while (w) { + Point2i win_mpos = w->get_mouse_position(); // Mouse position local to the window. + Size2i win_size = w->get_size(); + if (win_mpos.x >= 0 && win_mpos.y >= 0 && win_mpos.x <= win_size.x && win_mpos.y <= win_size.y) { + // Mouse event inside window bounds, forward this event to the window. + Ref new_ev = p_event->duplicate(); + new_ev->set_position(win_mpos); + new_ev->set_global_position(win_mpos); + w->push_input(new_ev, true); + return; + } + w = w->get_parent_visible_window(); + } } } @@ -1760,7 +1786,7 @@ void ColorPicker::_pick_finished() { } if (Input::get_singleton()->is_action_just_pressed(SNAME("ui_cancel"))) { - set_pick_color(old_color); + set_pick_color(pre_picking_color); } else { emit_signal(SNAME("color_changed"), color); } @@ -1856,6 +1882,7 @@ void ColorPicker::_pick_button_pressed_legacy() { if (!is_inside_tree()) { return; } + pre_picking_color = color; if (!picker_window) { picker_window = memnew(Popup); diff --git a/scene/gui/color_picker.h b/scene/gui/color_picker.h index 9266a280eb4..cc2793b413e 100644 --- a/scene/gui/color_picker.h +++ b/scene/gui/color_picker.h @@ -211,6 +211,7 @@ private: Color color; Color old_color; + Color pre_picking_color; bool is_picking_color = false; bool display_old_color = false;