diff --git a/source/blender/blenkernel/BKE_grease_pencil.hh b/source/blender/blenkernel/BKE_grease_pencil.hh index 24db4a29911..621b3f5c153 100644 --- a/source/blender/blenkernel/BKE_grease_pencil.hh +++ b/source/blender/blenkernel/BKE_grease_pencil.hh @@ -286,10 +286,8 @@ class LayerGroup : public ::GreasePencilLayerTreeGroup { ~LayerGroup(); public: - StringRefNull name() const - { - return this->base.name; - } + StringRefNull name() const; + void set_name(StringRefNull new_name); bool is_visible() const; bool is_locked() const; @@ -374,6 +372,15 @@ class LayerGroup : public ::GreasePencilLayerTreeGroup { void tag_nodes_cache_dirty() const; }; +inline const TreeNode &Layer::as_node() const +{ + return *reinterpret_cast(this); +} +inline TreeNode &Layer::as_node() +{ + return *reinterpret_cast(this); +} + inline StringRefNull Layer::name() const { return this->base.name; @@ -384,13 +391,9 @@ inline LayerGroup &Layer::parent_group() const return this->base.parent->wrap(); } -inline const TreeNode &Layer::as_node() const +inline StringRefNull LayerGroup::name() const { - return *reinterpret_cast(this); -} -inline TreeNode &Layer::as_node() -{ - return *reinterpret_cast(this); + return this->base.name; } namespace convert { diff --git a/source/blender/blenkernel/intern/grease_pencil.cc b/source/blender/blenkernel/intern/grease_pencil.cc index 082479f8257..e85eacfd368 100644 --- a/source/blender/blenkernel/intern/grease_pencil.cc +++ b/source/blender/blenkernel/intern/grease_pencil.cc @@ -616,6 +616,11 @@ LayerGroup::~LayerGroup() this->runtime = nullptr; } +void LayerGroup::set_name(StringRefNull new_name) +{ + this->base.name = BLI_strdup(new_name.c_str()); +} + bool LayerGroup::is_visible() const { if (this->base.parent) { @@ -1406,6 +1411,19 @@ void GreasePencil::rename_layer(blender::bke::greasepencil::Layer &layer, layer.set_name(unique_name); } +void GreasePencil::rename_group(blender::bke::greasepencil::LayerGroup &group, + blender::StringRefNull new_name) +{ + using namespace blender; + if (group.name() == new_name) { + return; + } + VectorSet names = get_node_names(*this); + std::string unique_name(new_name.c_str()); + unique_layer_group_name(names, unique_name.data()); + group.set_name(unique_name); +} + void GreasePencil::remove_layer(blender::bke::greasepencil::Layer &layer) { using namespace blender::bke::greasepencil; diff --git a/source/blender/editors/interface/interface_template_grease_pencil_layer_tree.cc b/source/blender/editors/interface/interface_template_grease_pencil_layer_tree.cc index 1e8875d3bf2..129d43afa43 100644 --- a/source/blender/editors/interface/interface_template_grease_pencil_layer_tree.cc +++ b/source/blender/editors/interface/interface_template_grease_pencil_layer_tree.cc @@ -99,9 +99,10 @@ class LayerViewItem : public AbstractTreeViewItem { class LayerGroupViewItem : public AbstractTreeViewItem { public: - LayerGroupViewItem(/*GreasePencil &grease_pencil, */ LayerGroup &group) - : /*grease_pencil_(grease_pencil),*/ group_(group) + LayerGroupViewItem(GreasePencil &grease_pencil, LayerGroup &group) + : grease_pencil_(grease_pencil), group_(group) { + this->disable_activatable(); this->label_ = group_.name(); } @@ -111,8 +112,29 @@ class LayerGroupViewItem : public AbstractTreeViewItem { uiItemL(sub, IFACE_(group_.name().c_str()), ICON_FILE_FOLDER); } + bool supports_collapsing() const override + { + return true; + } + + bool supports_renaming() const override + { + return true; + } + + bool rename(StringRefNull new_name) override + { + grease_pencil_.rename_group(group_, new_name); + return true; + } + + StringRef get_rename_string() const override + { + return group_.name(); + } + private: - /* GreasePencil &grease_pencil_; */ + GreasePencil &grease_pencil_; LayerGroup &group_; }; @@ -134,7 +156,9 @@ void LayerTreeView::build_tree_node_recursive(TreeNode &node) add_tree_item(this->grease_pencil_, node.as_layer_for_write()); } else if (node.is_group()) { - add_tree_item(/*this->grease_pencil_, */ node.as_group_for_write()); + LayerGroupViewItem &group_item = parent.add_tree_item( + this->grease_pencil_, node.as_group_for_write()); + group_item.set_collapsed(false); LISTBASE_FOREACH_BACKWARD (GreasePencilLayerTreeNode *, node_, &node.as_group().children) { build_tree_node_recursive(node_->wrap()); } diff --git a/source/blender/makesdna/DNA_grease_pencil_types.h b/source/blender/makesdna/DNA_grease_pencil_types.h index 1a742881cdb..682799e135c 100644 --- a/source/blender/makesdna/DNA_grease_pencil_types.h +++ b/source/blender/makesdna/DNA_grease_pencil_types.h @@ -465,6 +465,8 @@ typedef struct GreasePencil { blender::bke::greasepencil::Layer *find_layer_by_name(blender::StringRefNull name); void rename_layer(blender::bke::greasepencil::Layer &layer, blender::StringRefNull new_name); + void rename_group(blender::bke::greasepencil::LayerGroup &group, + blender::StringRefNull new_name); void remove_layer(blender::bke::greasepencil::Layer &layer);