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);
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);
@ -116,11 +116,11 @@ static void grease_pencil_copy_data(Main * /*bmain*/,
__func__, grease_pencil_src->root_group());
/* 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(
grease_pencil_src->active_node->wrap().name());
grease_pencil_src->get_active_node()->name());
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,
@ -2625,12 +2625,11 @@ const blender::bke::greasepencil::Layer *GreasePencil::get_active_layer() const
if (this->active_node == nullptr) {
return nullptr;
}
if (!this->active_node->wrap().is_layer()) {
const blender::bke::greasepencil::TreeNode &active_node = *this->get_active_node();
if (!active_node.is_layer()) {
return nullptr;
}
return &this->active_node->wrap().as_layer();
return &active_node.as_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) {
return nullptr;
}
if (!this->active_node->wrap().is_layer()) {
blender::bke::greasepencil::TreeNode &active_node = *this->get_active_node();
if (!active_node.is_layer()) {
return nullptr;
}
return &this->active_node->wrap().as_layer();
return &active_node.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) {
this->autolock_inactive_layers();
@ -2681,12 +2679,11 @@ const blender::bke::greasepencil::LayerGroup *GreasePencil::get_active_group() c
if (this->active_node == nullptr) {
return nullptr;
}
if (!this->active_node->wrap().is_group()) {
const blender::bke::greasepencil::TreeNode &active_node = *this->get_active_node();
if (!active_node.is_group()) {
return nullptr;
}
return &this->active_node->wrap().as_group();
return &active_node.as_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) {
return nullptr;
}
if (!this->active_node->wrap().is_group()) {
blender::bke::greasepencil::TreeNode &active_node = *this->get_active_node();
if (!active_node.is_group()) {
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)
@ -3016,10 +3037,10 @@ static void update_active_node(GreasePencil &grease_pencil,
const blender::bke::greasepencil::TreeNode &node)
{
using namespace blender::bke::greasepencil;
if (grease_pencil.active_node == nullptr) {
if (grease_pencil.get_active_node() == nullptr) {
return;
}
const TreeNode &active_node = grease_pencil.active_node->wrap();
TreeNode &active_node = *grease_pencil.get_active_node();
if (&active_node != &node) {
return;
}
@ -3029,7 +3050,7 @@ static void update_active_node(GreasePencil &grease_pencil,
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 (layers.size() == 1) {
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. */
if (grease_pencil.root_group_ptr == nullptr) {
grease_pencil.root_group_ptr = MEM_new<blender::bke::greasepencil::LayerGroup>(__func__);
grease_pencil.active_node = nullptr;
grease_pencil.set_active_node(nullptr);
return;
}
/* 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);
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)) {
return OPERATOR_CANCELLED;
}

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

@ -170,7 +170,7 @@ class LayerViewItemDragController : public AbstractViewItemDragController {
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;
const blender::bke::greasepencil::Layer *get_active_layer() const;
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;
void autolock_inactive_layers();
@ -517,6 +517,11 @@ typedef struct GreasePencil {
const blender::bke::greasepencil::LayerGroup *get_active_group() const;
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. */
/** Adds a new layer with the given name to the top of root group. */
blender::bke::greasepencil::Layer &add_layer(blender::StringRefNull name);

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