GPv3: Getter and setter for active node

This adds the functions `get_active_node` and `set_active_node`.
It also changes the the parameter of the `set_active_layer` to be
non-const.

Requested in !121970.

Pull Request: https://projects.blender.org/blender/blender/pulls/122006
This commit is contained in:
Pratik Borhade 2024-05-22 15:25:00 +02:00 committed by Falk David
parent 918d34a9ed
commit dada0c41ee
6 changed files with 60 additions and 33 deletions

@ -87,7 +87,7 @@ static void grease_pencil_init_data(ID *id)
MEMCPY_STRUCT_AFTER(grease_pencil, DNA_struct_default_get(GreasePencil), id); MEMCPY_STRUCT_AFTER(grease_pencil, DNA_struct_default_get(GreasePencil), id);
grease_pencil->root_group_ptr = MEM_new<greasepencil::LayerGroup>(__func__); grease_pencil->root_group_ptr = MEM_new<greasepencil::LayerGroup>(__func__);
grease_pencil->active_node = nullptr; grease_pencil->set_active_node(nullptr);
CustomData_reset(&grease_pencil->layers_data); CustomData_reset(&grease_pencil->layers_data);
@ -116,11 +116,11 @@ static void grease_pencil_copy_data(Main * /*bmain*/,
__func__, grease_pencil_src->root_group()); __func__, grease_pencil_src->root_group());
/* Set active node. */ /* Set active node. */
if (grease_pencil_src->active_node) { if (grease_pencil_src->get_active_node()) {
bke::greasepencil::TreeNode *active_node = grease_pencil_dst->find_node_by_name( bke::greasepencil::TreeNode *active_node = grease_pencil_dst->find_node_by_name(
grease_pencil_src->active_node->wrap().name()); grease_pencil_src->get_active_node()->name());
BLI_assert(active_node); BLI_assert(active_node);
grease_pencil_dst->active_node = active_node; grease_pencil_dst->set_active_node(active_node);
} }
CustomData_copy(&grease_pencil_src->layers_data, CustomData_copy(&grease_pencil_src->layers_data,
@ -2625,12 +2625,11 @@ const blender::bke::greasepencil::Layer *GreasePencil::get_active_layer() const
if (this->active_node == nullptr) { if (this->active_node == nullptr) {
return nullptr; return nullptr;
} }
const blender::bke::greasepencil::TreeNode &active_node = *this->get_active_node();
if (!this->active_node->wrap().is_layer()) { if (!active_node.is_layer()) {
return nullptr; return nullptr;
} }
return &active_node.as_layer();
return &this->active_node->wrap().as_layer();
} }
blender::bke::greasepencil::Layer *GreasePencil::get_active_layer() blender::bke::greasepencil::Layer *GreasePencil::get_active_layer()
@ -2638,17 +2637,16 @@ blender::bke::greasepencil::Layer *GreasePencil::get_active_layer()
if (this->active_node == nullptr) { if (this->active_node == nullptr) {
return nullptr; return nullptr;
} }
blender::bke::greasepencil::TreeNode &active_node = *this->get_active_node();
if (!this->active_node->wrap().is_layer()) { if (!active_node.is_layer()) {
return nullptr; return nullptr;
} }
return &active_node.as_layer();
return &this->active_node->wrap().as_layer();
} }
void GreasePencil::set_active_layer(const blender::bke::greasepencil::Layer *layer) void GreasePencil::set_active_layer(blender::bke::greasepencil::Layer *layer)
{ {
this->active_node = const_cast<GreasePencilLayerTreeNode *>(&layer->base); this->active_node = reinterpret_cast<GreasePencilLayerTreeNode *>(&layer->as_node());
if (this->flag & GREASE_PENCIL_AUTOLOCK_LAYERS) { if (this->flag & GREASE_PENCIL_AUTOLOCK_LAYERS) {
this->autolock_inactive_layers(); this->autolock_inactive_layers();
@ -2681,12 +2679,11 @@ const blender::bke::greasepencil::LayerGroup *GreasePencil::get_active_group() c
if (this->active_node == nullptr) { if (this->active_node == nullptr) {
return nullptr; return nullptr;
} }
const blender::bke::greasepencil::TreeNode &active_node = *this->get_active_node();
if (!this->active_node->wrap().is_group()) { if (!active_node.is_group()) {
return nullptr; return nullptr;
} }
return &active_node.as_group();
return &this->active_node->wrap().as_group();
} }
blender::bke::greasepencil::LayerGroup *GreasePencil::get_active_group() blender::bke::greasepencil::LayerGroup *GreasePencil::get_active_group()
@ -2694,12 +2691,36 @@ blender::bke::greasepencil::LayerGroup *GreasePencil::get_active_group()
if (this->active_node == nullptr) { if (this->active_node == nullptr) {
return nullptr; return nullptr;
} }
blender::bke::greasepencil::TreeNode &active_node = *this->get_active_node();
if (!this->active_node->wrap().is_group()) { if (!active_node.is_group()) {
return nullptr; return nullptr;
} }
return &active_node.as_group();
}
return &this->active_node->wrap().as_group(); const blender::bke::greasepencil::TreeNode *GreasePencil::get_active_node() const
{
if (this->active_node == nullptr) {
return nullptr;
}
return &this->active_node->wrap();
}
blender::bke::greasepencil::TreeNode *GreasePencil::get_active_node()
{
if (this->active_node == nullptr) {
return nullptr;
}
return &this->active_node->wrap();
}
void GreasePencil::set_active_node(blender::bke::greasepencil::TreeNode *node)
{
this->active_node = reinterpret_cast<GreasePencilLayerTreeNode *>(node);
if (this->flag & GREASE_PENCIL_AUTOLOCK_LAYERS) {
this->autolock_inactive_layers();
}
} }
static blender::VectorSet<blender::StringRefNull> get_node_names(const GreasePencil &grease_pencil) static blender::VectorSet<blender::StringRefNull> get_node_names(const GreasePencil &grease_pencil)
@ -3016,10 +3037,10 @@ static void update_active_node(GreasePencil &grease_pencil,
const blender::bke::greasepencil::TreeNode &node) const blender::bke::greasepencil::TreeNode &node)
{ {
using namespace blender::bke::greasepencil; using namespace blender::bke::greasepencil;
if (grease_pencil.active_node == nullptr) { if (grease_pencil.get_active_node() == nullptr) {
return; return;
} }
const TreeNode &active_node = grease_pencil.active_node->wrap(); TreeNode &active_node = *grease_pencil.get_active_node();
if (&active_node != &node) { if (&active_node != &node) {
return; return;
} }
@ -3029,7 +3050,7 @@ static void update_active_node(GreasePencil &grease_pencil,
return; return;
} }
Span<const Layer *> layers = grease_pencil.layers(); Span<Layer *> layers = grease_pencil.layers_for_write();
/* If there is no other layer available, unset the active layer. */ /* If there is no other layer available, unset the active layer. */
if (layers.size() == 1) { if (layers.size() == 1) {
grease_pencil.set_active_layer(nullptr); grease_pencil.set_active_layer(nullptr);
@ -3253,7 +3274,7 @@ static void read_layer_tree(GreasePencil &grease_pencil, BlendDataReader *reader
* and create an empty root group to avoid crashes. */ * and create an empty root group to avoid crashes. */
if (grease_pencil.root_group_ptr == nullptr) { if (grease_pencil.root_group_ptr == nullptr) {
grease_pencil.root_group_ptr = MEM_new<blender::bke::greasepencil::LayerGroup>(__func__); grease_pencil.root_group_ptr = MEM_new<blender::bke::greasepencil::LayerGroup>(__func__);
grease_pencil.active_node = nullptr; grease_pencil.set_active_node(nullptr);
return; return;
} }
/* Read active layer. */ /* Read active layer. */

@ -212,7 +212,7 @@ static int grease_pencil_layer_active_exec(bContext *C, wmOperator *op)
GreasePencil &grease_pencil = *static_cast<GreasePencil *>(object->data); GreasePencil &grease_pencil = *static_cast<GreasePencil *>(object->data);
int layer_index = RNA_int_get(op->ptr, "layer"); int layer_index = RNA_int_get(op->ptr, "layer");
const Layer &layer = *grease_pencil.layer(layer_index); Layer &layer = *grease_pencil.layer(layer_index);
if (grease_pencil.is_layer_active(&layer)) { if (grease_pencil.is_layer_active(&layer)) {
return OPERATOR_CANCELLED; return OPERATOR_CANCELLED;
} }

@ -280,8 +280,8 @@ class StepObject {
BLI_assert(layers_num_ == grease_pencil.layers().size()); BLI_assert(layers_num_ == grease_pencil.layers().size());
if (!active_layer_name_.empty()) { if (!active_layer_name_.empty()) {
const bke::greasepencil::TreeNode *active_node = bke::greasepencil::TreeNode *active_node = grease_pencil.root_group().find_node_by_name(
grease_pencil.root_group().find_node_by_name(active_layer_name_); active_layer_name_);
if (active_node && active_node->is_layer()) { if (active_node && active_node->is_layer()) {
grease_pencil.set_active_layer(&active_node->as_layer()); grease_pencil.set_active_layer(&active_node->as_layer());
} }

@ -170,7 +170,7 @@ class LayerViewItemDragController : public AbstractViewItemDragController {
void on_drag_start() override void on_drag_start() override
{ {
grease_pencil_.active_node = &dragged_node_; grease_pencil_.set_active_node(&dragged_node_);
} }
}; };

@ -508,7 +508,7 @@ typedef struct GreasePencil {
bool has_active_layer() const; bool has_active_layer() const;
const blender::bke::greasepencil::Layer *get_active_layer() const; const blender::bke::greasepencil::Layer *get_active_layer() const;
blender::bke::greasepencil::Layer *get_active_layer(); blender::bke::greasepencil::Layer *get_active_layer();
void set_active_layer(const blender::bke::greasepencil::Layer *layer); void set_active_layer(blender::bke::greasepencil::Layer *layer);
bool is_layer_active(const blender::bke::greasepencil::Layer *layer) const; bool is_layer_active(const blender::bke::greasepencil::Layer *layer) const;
void autolock_inactive_layers(); void autolock_inactive_layers();
@ -517,6 +517,11 @@ typedef struct GreasePencil {
const blender::bke::greasepencil::LayerGroup *get_active_group() const; const blender::bke::greasepencil::LayerGroup *get_active_group() const;
blender::bke::greasepencil::LayerGroup *get_active_group(); blender::bke::greasepencil::LayerGroup *get_active_group();
/* Active node functions. */
const blender::bke::greasepencil::TreeNode *get_active_node() const;
blender::bke::greasepencil::TreeNode *get_active_node();
void set_active_node(blender::bke::greasepencil::TreeNode *node);
/* Adding layers and layer groups. */ /* Adding layers and layer groups. */
/** Adds a new layer with the given name to the top of root group. */ /** Adds a new layer with the given name to the top of root group. */
blender::bke::greasepencil::Layer &add_layer(blender::StringRefNull name); blender::bke::greasepencil::Layer &add_layer(blender::StringRefNull name);

@ -251,10 +251,11 @@ static void rna_GreasePencil_active_group_set(PointerRNA *ptr,
PointerRNA value, PointerRNA value,
ReportList * /*reports*/) ReportList * /*reports*/)
{ {
using namespace blender::bke::greasepencil;
GreasePencil *grease_pencil = rna_grease_pencil(ptr); GreasePencil *grease_pencil = rna_grease_pencil(ptr);
GreasePencilLayerTreeNode *node = static_cast<GreasePencilLayerTreeNode *>(value.data); TreeNode *node = static_cast<TreeNode *>(value.data);
if (node->wrap().is_group()) { if (node->is_group()) {
grease_pencil->active_node = node; grease_pencil->set_active_node(node);
WM_main_add_notifier(NC_GPENCIL | NA_EDITED, nullptr); WM_main_add_notifier(NC_GPENCIL | NA_EDITED, nullptr);
} }
} }