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);
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user