GPv3: Add rename function for layer groups

This adds core functions to rename layer groups while preserving
name uniqueness.
This commit is contained in:
Falk David
2023-06-27 14:06:05 +02:00
parent fee9801955
commit bf4e9ffbd9
4 changed files with 61 additions and 14 deletions

View File

@@ -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<const TreeNode *>(this);
}
inline TreeNode &Layer::as_node()
{
return *reinterpret_cast<TreeNode *>(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<const TreeNode *>(this);
}
inline TreeNode &Layer::as_node()
{
return *reinterpret_cast<TreeNode *>(this);
return this->base.name;
}
namespace convert {

View File

@@ -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<StringRefNull> 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;

View File

@@ -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<LayerViewItem>(this->grease_pencil_, node.as_layer_for_write());
}
else if (node.is_group()) {
add_tree_item<LayerGroupViewItem>(/*this->grease_pencil_, */ node.as_group_for_write());
LayerGroupViewItem &group_item = parent.add_tree_item<LayerGroupViewItem>(
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());
}

View File

@@ -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);