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:
parent
918d34a9ed
commit
dada0c41ee
@ -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);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user