From 630641ceee228067616f715c809782f20af504f3 Mon Sep 17 00:00:00 2001 From: Sara Date: Mon, 15 Dec 2025 13:41:02 +0100 Subject: [PATCH] fix: undo/redo layer name changes updates tree ui --- modules/terrain_editor/primitive_layer_list.cpp | 13 +++++++++++++ modules/terrain_editor/primitive_layer_list.h | 2 ++ 2 files changed, 15 insertions(+) diff --git a/modules/terrain_editor/primitive_layer_list.cpp b/modules/terrain_editor/primitive_layer_list.cpp index 97ae5db7..6bf9e6f6 100644 --- a/modules/terrain_editor/primitive_layer_list.cpp +++ b/modules/terrain_editor/primitive_layer_list.cpp @@ -15,6 +15,10 @@ void PrimitiveLayerList::_bind_methods() { void PrimitiveLayerList::generate_subtree(size_t idx, Ref prim, TreeItem *parent) { TreeItem *base{ create_item(get_root()) }; + Callable connection{ callable_mp(this, &self_type::primitive_changed).bind(base, prim) }; + prim->connect_changed(connection); + this->primitive_changed_connections.push_back(connection); + base->set_icon(ICON_COLUMN, this->icons.has(prim->get_class()) ? this->icons.get(prim->get_class()) : Ref()); base->set_icon_max_width(ICON_COLUMN, 24); base->set_selectable(ICON_COLUMN, true); @@ -30,8 +34,12 @@ void PrimitiveLayerList::generate_subtree(size_t idx, Ref prim } void PrimitiveLayerList::regenerate_tree(Array array) { + for (size_t i{ 0 }; i < this->primitive_changed_connections.size(); i++) { + this->primitives[i]->disconnect_changed(this->primitive_changed_connections[i]); + } get_root()->clear_children(); this->primitives.clear(); + this->primitive_changed_connections.clear(); size_t i{ 0 }; for (Variant var : array) { Ref prim{ var }; @@ -67,6 +75,11 @@ void PrimitiveLayerList::layer_renamed(TreeItem *item) { EditHistory::get_singleton()->push_action(set_name_c.bind(item->get_text(NAME_COLUMN)), set_name_c.bind(old)); } +void PrimitiveLayerList::primitive_changed(TreeItem *item, Ref primitive) { + StringName const name{ primitive->get_name() }; + item->set_text(NAME_COLUMN, name.is_empty() ? primitive->get_class_name() : name); +} + void PrimitiveLayerList::item_edited() { TreeItem *edited{ get_edited() }; if (!edited) { diff --git a/modules/terrain_editor/primitive_layer_list.h b/modules/terrain_editor/primitive_layer_list.h index 7c0c756f..3d3e957b 100644 --- a/modules/terrain_editor/primitive_layer_list.h +++ b/modules/terrain_editor/primitive_layer_list.h @@ -18,6 +18,7 @@ class PrimitiveLayerList : public Tree { void regenerate_tree(Array array); void switch_index(size_t from, size_t to); void layer_renamed(TreeItem *item); + void primitive_changed(TreeItem *item, Ref primitive); void item_edited(); void item_selected(); @@ -34,5 +35,6 @@ private: HashMap> icons{}; TerrainMeshEditor *terrain{}; + Vector primitive_changed_connections{}; Vector> primitives{}; };