From e2924ebda99403af171758fb8cf861a9c3fc8704 Mon Sep 17 00:00:00 2001 From: Pierre-Thomas Meisels Date: Fri, 22 Mar 2024 17:27:17 +0100 Subject: [PATCH] feat: Add color picker button in layer explorer and use this color for selection --- src/editor/inspector/layers_editor.cpp | 38 +++++++++++++++++++- src/editor/inspector/layers_editor.h | 19 ++++++++++ src/editor/positionable_selector_manager.cpp | 16 ++++++--- src/editor/positionable_selector_manager.h | 2 +- src/node/isometric_map.h | 1 + 5 files changed, 69 insertions(+), 7 deletions(-) diff --git a/src/editor/inspector/layers_editor.cpp b/src/editor/inspector/layers_editor.cpp index 21f2ff5..7541613 100644 --- a/src/editor/inspector/layers_editor.cpp +++ b/src/editor/inspector/layers_editor.cpp @@ -24,7 +24,7 @@ LayersEditor::LayersEditor() : layer_line_edit(nullptr), layer_controls_containe add_child(top_bar); ScrollContainer* scroll_container {memnew(ScrollContainer)}; layer_controls_container = memnew(GridContainer); - layer_controls_container->set_columns(4); + layer_controls_container->set_columns(5); layer_controls_container->set_h_size_flags(SizeFlags::SIZE_EXPAND_FILL); scroll_container->add_child(layer_controls_container); add_child(scroll_container); @@ -55,10 +55,13 @@ void LayersEditor::refresh() { is_visible_label->set_text("visible"); Label* layer_name_label {memnew(Label)}; layer_name_label->set_text("Layer name"); + Label* color_label {memnew(Label)}; + color_label->set_text("Color"); Label* remove_label {memnew(Label)}; remove_label->set_text("Remove"); layer_controls_container->add_child(is_current_layer_label); layer_controls_container->add_child(layer_name_label); + layer_controls_container->add_child(color_label); layer_controls_container->add_child(is_visible_label); layer_controls_container->add_child(remove_label); @@ -82,6 +85,15 @@ void LayersEditor::refresh() { Label* current_layer_name_label {memnew(Label)}; current_layer_name_label->set_text(layer_name); layer_controls_container->add_child(current_layer_name_label); + LayerColorPickerButton* color_picker_button {memnew(LayerColorPickerButton)}; + color_picker_button->set_layer_id(layer_id); + color_picker_button->set_pick_color( + current_map->get_meta( + vformat(node::IsometricMap::LAYER_COLOR_META_NAME_FORMAT, layer_id), + Color() + ) + ); + layer_controls_container->add_child(color_picker_button); LayerVisibleCheckBox* visible_check_box {memnew(LayerVisibleCheckBox)}; visible_check_box->set_layer_id(layer_id); layer_controls_container->add_child(visible_check_box); @@ -261,4 +273,28 @@ void CurrentLayerCheckBox::_bind_methods() { } +///////////////////////////////// LayerColorPickerButton //////////////////////////////////////////// + +void LayerColorPickerButton::set_layer_id(const uint32_t p_layer_id) { + layer_id = p_layer_id; +} + +void LayerColorPickerButton::on_color_changed(const Color& color) { // NOLINT(*-make-member-function-const) + if (node::IsometricMap* map{IsometricEditorPlugin::get_instance()->get_selected_map()}) { + map->set_meta(vformat(node::IsometricMap::LAYER_COLOR_META_NAME_FORMAT, layer_id), color); + } +} + +void LayerColorPickerButton::_notification(int notif) { + if (notif != NOTIFICATION_ENTER_TREE) { + return; + } + + connect(SNAME("color_changed"), callable_mp(this, &LayerColorPickerButton::on_color_changed)); +} + +LayerColorPickerButton::LayerColorPickerButton() : layer_id(node::IsometricMap::NO_LAYER_ID) {} + +void LayerColorPickerButton::_bind_methods() {} + #endif \ No newline at end of file diff --git a/src/editor/inspector/layers_editor.h b/src/editor/inspector/layers_editor.h index 18e7113..121776b 100644 --- a/src/editor/inspector/layers_editor.h +++ b/src/editor/inspector/layers_editor.h @@ -3,6 +3,8 @@ #ifdef TOOLS_ENABLED #include "node/isometric_map.h" +#include "scene/gui/color_picker.h" + #include #include #include @@ -85,6 +87,23 @@ namespace editor { void _notification(int notif); static void _bind_methods(); }; + + class LayerColorPickerButton : public ColorPickerButton { + GDCLASS(LayerColorPickerButton, ColorPickerButton) + + public: + void set_layer_id(uint32_t p_layer_id); + void on_color_changed(const Color& color); + + LayerColorPickerButton(); + + private: + uint32_t layer_id; + + protected: + void _notification(int notif); + static void _bind_methods(); + }; } } diff --git a/src/editor/positionable_selector_manager.cpp b/src/editor/positionable_selector_manager.cpp index 34ca8ed..6b02744 100644 --- a/src/editor/positionable_selector_manager.cpp +++ b/src/editor/positionable_selector_manager.cpp @@ -12,7 +12,7 @@ PositionableSelectorManager& PositionableSelectorManager::get_instance() { void PositionableSelectorManager::select_positionable_at(node::IsometricMap* map, node::IsometricPositionable* positionable) { if (!map_to_selected_positions.has(map)) { map_to_selected_positions[map] = Vector(); } - show_outline(positionable); + show_outline(map, positionable); map_to_selected_positions[map].push_back(positionable->get_local_position_3d()); } @@ -47,7 +47,7 @@ void PositionableSelectorManager::set_selected_for_map(node::IsometricMap* map, for (int i = 0; i < selected.size(); ++i) { node::IsometricPositionable* positionable {map->get_positionable_at(selected[i])}; if (!positionable) { continue; } - show_outline(positionable); + show_outline(map, positionable); } } @@ -59,14 +59,20 @@ void PositionableSelectorManager::refresh_outline_for_selected(node::IsometricMa const Vector& selected {map_to_selected_positions[map]}; for (int i = 0; i < selected.size(); ++i) { if (node::IsometricPositionable * positionable {map->get_positionable_at(selected[i])}) { - show_outline(positionable); + show_outline(map, positionable); } } } -void PositionableSelectorManager::show_outline(node::IsometricPositionable* positionable) { +void PositionableSelectorManager::show_outline(node::IsometricMap* map, node::IsometricPositionable* positionable) { OutlineData& outline_data {positionable->get_outline_data()}; - outline_data.color = {1, 0, 0, 1}; + outline_data.color = map->get_meta( + vformat( + node::IsometricMap::LAYER_COLOR_META_NAME_FORMAT, + map->get_layer_id_at(positionable->get_local_position_3d()) + ), + Color() + ); outline_data.line_size = 10; editor::OutlineDrawer::draw_outline(positionable); editor::OutlineDrawer::set_outline_visible(positionable, true); diff --git a/src/editor/positionable_selector_manager.h b/src/editor/positionable_selector_manager.h index ea96e3e..a597e2a 100644 --- a/src/editor/positionable_selector_manager.h +++ b/src/editor/positionable_selector_manager.h @@ -27,7 +27,7 @@ namespace editor { private: HashMap> map_to_selected_positions; - static void show_outline(node::IsometricPositionable* positionable); + static void show_outline(node::IsometricMap* map, node::IsometricPositionable* positionable); PositionableSelectorManager(); ~PositionableSelectorManager() = default; diff --git a/src/node/isometric_map.h b/src/node/isometric_map.h index 3df5680..6ee1bd4 100644 --- a/src/node/isometric_map.h +++ b/src/node/isometric_map.h @@ -16,6 +16,7 @@ namespace node { #ifdef TOOLS_ENABLED static constexpr const char* LAST_EDITED_LAYER_META_NAME = "_LAST_EDITED_LAYER"; + static constexpr const char* LAYER_COLOR_META_NAME_FORMAT = "_LAYER_%s_COLOR"; #endif private: