From 6e8b5aff666a5a0e6b7a26b93bd9460f77c486b0 Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Sun, 24 Nov 2019 11:51:53 +0100 Subject: [PATCH] Add visual feedback when hovering layer checkboxes in the Inspector This also changes how checkboxes are selected, which makes it possible to click in the small area between two checkboxes and still toggle a value successfully (which is arguably less frustrating). (cherry picked from commit bbc435624f6569660eb12203b7c32c87b4027ecf) --- editor/editor_properties.cpp | 98 ++++++++++++++++++++++-------------- 1 file changed, 61 insertions(+), 37 deletions(-) diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp index c134786b893..c3ccaf22a4c 100644 --- a/editor/editor_properties.cpp +++ b/editor/editor_properties.cpp @@ -610,6 +610,7 @@ public: Vector flag_rects; Vector names; Vector tooltips; + int hovered_index; virtual Size2 get_minimum_size() const { Ref font = get_font("font", "Label"); @@ -625,57 +626,79 @@ public: return String(); } void _gui_input(const Ref &p_ev) { - Ref mb = p_ev; - if (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT && mb->is_pressed()) { + const Ref mm = p_ev; + + if (mm.is_valid()) { for (int i = 0; i < flag_rects.size(); i++) { - if (flag_rects[i].has_point(mb->get_position())) { - //toggle - if (value & (1 << i)) { - value &= ~(1 << i); - } else { - value |= (1 << i); - } - emit_signal("flag_changed", value); + if (flag_rects[i].has_point(mm->get_position())) { + // Used to highlight the hovered flag in the layers grid. + hovered_index = i; update(); + break; } } } + + const Ref mb = p_ev; + + if (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT && mb->is_pressed()) { + // Toggle the flag. + // We base our choice on the hovered flag, so that it always matches the hovered flag. + if (value & (1 << hovered_index)) { + value &= ~(1 << hovered_index); + } else { + value |= (1 << hovered_index); + } + + emit_signal("flag_changed", value); + update(); + } } void _notification(int p_what) { - if (p_what == NOTIFICATION_DRAW) { + switch (p_what) { + case NOTIFICATION_DRAW: { + Rect2 rect; + rect.size = get_size(); + flag_rects.clear(); - Rect2 rect; - rect.size = get_size(); - flag_rects.clear(); + const int bsize = (rect.size.height * 80 / 100) / 2; + const int h = bsize * 2 + 1; + const int vofs = (rect.size.height - h) / 2; - int bsize = (rect.size.height * 80 / 100) / 2; + Color color = get_color("highlight_color", "Editor"); + for (int i = 0; i < 2; i++) { + Point2 ofs(4, vofs); + if (i == 1) + ofs.y += bsize + 1; - int h = bsize * 2 + 1; - int vofs = (rect.size.height - h) / 2; + ofs += rect.position; + for (int j = 0; j < 10; j++) { + Point2 o = ofs + Point2(j * (bsize + 1), 0); + if (j >= 5) + o.x += 1; - Color color = get_color("highlight_color", "Editor"); - for (int i = 0; i < 2; i++) { + const int idx = i * 10 + j; + const bool on = value & (1 << idx); + Rect2 rect2 = Rect2(o, Size2(bsize, bsize)); - Point2 ofs(4, vofs); - if (i == 1) - ofs.y += bsize + 1; + color.a = on ? 0.6 : 0.2; + if (idx == hovered_index) { + // Add visual feedback when hovering a flag. + color.a += 0.15; + } - ofs += rect.position; - for (int j = 0; j < 10; j++) { - - Point2 o = ofs + Point2(j * (bsize + 1), 0); - if (j >= 5) - o.x += 1; - - uint32_t idx = i * 10 + j; - bool on = value & (1 << idx); - Rect2 rect2 = Rect2(o, Size2(bsize, bsize)); - color.a = on ? 0.6 : 0.2; - draw_rect(rect2, color); - flag_rects.push_back(rect2); + draw_rect(rect2, color); + flag_rects.push_back(rect2); + } } - } + } break; + case NOTIFICATION_MOUSE_EXIT: { + hovered_index = -1; + update(); + } break; + default: + break; } } @@ -692,6 +715,7 @@ public: EditorPropertyLayersGrid() { value = 0; + hovered_index = -1; // Nothing is hovered. } }; void EditorPropertyLayers::_grid_changed(uint32_t p_grid) { @@ -792,7 +816,7 @@ EditorPropertyLayers::EditorPropertyLayers() { hb->add_child(grid); button = memnew(Button); button->set_toggle_mode(true); - button->set_text(".."); + button->set_text("..."); button->connect("pressed", this, "_button_pressed"); hb->add_child(button); set_bottom_editor(hb);