From 91b4f3055cfa161120f17548f41cb3a5dae8a0b3 Mon Sep 17 00:00:00 2001 From: bruvzg <7645683+bruvzg@users.noreply.github.com> Date: Tue, 22 Oct 2024 11:16:35 +0300 Subject: [PATCH] [Legacy color picker] Use zoomed preview at the mouse position instead of Label. --- scene/gui/color_picker.cpp | 33 ++++++++++++++++++++++++--------- scene/gui/color_picker.h | 4 +++- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/scene/gui/color_picker.cpp b/scene/gui/color_picker.cpp index e92f979c32f..0fa63ee87af 100644 --- a/scene/gui/color_picker.cpp +++ b/scene/gui/color_picker.cpp @@ -1553,23 +1553,34 @@ void ColorPicker::_pick_button_pressed_legacy() { picker_texture_rect = memnew(TextureRect); picker_texture_rect->set_anchors_preset(Control::PRESET_FULL_RECT); + picker_texture_rect->set_default_cursor_shape(Control::CURSOR_CROSS); picker_window->add_child(picker_texture_rect); - picker_texture_rect->set_default_cursor_shape(CURSOR_POINTING_HAND); picker_texture_rect->connect(SceneStringName(gui_input), callable_mp(this, &ColorPicker::_picker_texture_input)); picker_preview = memnew(Panel); - picker_preview->set_anchors_preset(Control::PRESET_CENTER_TOP); picker_preview->set_mouse_filter(MOUSE_FILTER_IGNORE); + picker_preview->set_size(Vector2i(55, 72)); picker_window->add_child(picker_preview); - picker_preview_label = memnew(Label); - picker_preview->set_anchors_preset(Control::PRESET_CENTER_TOP); - picker_preview_label->set_text(ETR("Color Picking active")); - picker_preview->add_child(picker_preview_label); + picker_preview_color = memnew(Panel); + picker_preview_color->set_mouse_filter(MOUSE_FILTER_IGNORE); + picker_preview_color->set_size(Vector2i(51, 15)); + picker_preview_color->set_position(Vector2i(2, 55)); + picker_preview->add_child(picker_preview_color); + + picker_texture_zoom = memnew(TextureRect); + picker_texture_zoom->set_mouse_filter(MOUSE_FILTER_IGNORE); + picker_texture_zoom->set_size(Vector2i(51, 51)); + picker_texture_zoom->set_position(Vector2i(2, 2)); + picker_preview->add_child(picker_texture_zoom); picker_preview_style_box = (Ref)memnew(StyleBoxFlat); picker_preview_style_box->set_bg_color(Color(1.0, 1.0, 1.0)); picker_preview->add_theme_style_override(SceneStringName(panel), picker_preview_style_box); + + picker_preview_style_box_color = (Ref)memnew(StyleBoxFlat); + picker_preview_style_box_color->set_bg_color(Color(1.0, 1.0, 1.0)); + picker_preview_color->add_theme_style_override(SceneStringName(panel), picker_preview_style_box_color); } Rect2i screen_rect; @@ -1611,7 +1622,6 @@ void ColorPicker::_pick_button_pressed_legacy() { } picker_window->set_size(screen_rect.size); - picker_preview->set_size(screen_rect.size / 10.0); // 10% of size in each axis. picker_window->popup(); } @@ -1633,8 +1643,13 @@ void ColorPicker::_picker_texture_input(const Ref &p_event) { if (img.is_valid() && !img->is_empty()) { Vector2 ofs = mev->get_position(); picker_color = img->get_pixel(ofs.x, ofs.y); - picker_preview_style_box->set_bg_color(picker_color); - picker_preview_label->set_self_modulate(picker_color.get_luminance() < 0.5 ? Color(1.0f, 1.0f, 1.0f) : Color(0.0f, 0.0f, 0.0f)); + picker_preview_style_box_color->set_bg_color(picker_color); + picker_preview_style_box->set_bg_color(picker_color.get_luminance() < 0.5 ? Color(1.0f, 1.0f, 1.0f) : Color(0.0f, 0.0f, 0.0f)); + + Ref zoom_previw_img = img->get_region(Rect2i(ofs.x - 8, ofs.y - 8, 17, 17)); + zoom_previw_img->resize(51, 51, Image::INTERPOLATE_NEAREST); + picker_texture_zoom->set_texture(ImageTexture::create_from_image(zoom_previw_img)); + picker_preview->set_position(ofs - Vector2(27, 27)); } } } diff --git a/scene/gui/color_picker.h b/scene/gui/color_picker.h index ad028584b11..10b9ae14504 100644 --- a/scene/gui/color_picker.h +++ b/scene/gui/color_picker.h @@ -130,9 +130,11 @@ private: Popup *picker_window = nullptr; // Legacy color picking. TextureRect *picker_texture_rect = nullptr; + TextureRect *picker_texture_zoom = nullptr; Panel *picker_preview = nullptr; - Label *picker_preview_label = nullptr; + Panel *picker_preview_color = nullptr; Ref picker_preview_style_box; + Ref picker_preview_style_box_color; Color picker_color; MarginContainer *internal_margin = nullptr;