GPv3: Move dopesheet channels
This will allow to move selected channels to Top/Bottom/Up/Down in the list. Co-authored by: Pratik Borhade <pratikborhade302@gmail.com> Pull Request: https://projects.blender.org/blender/blender/pulls/111009
This commit is contained in:
@@ -486,6 +486,17 @@ class LayerGroup : public ::GreasePencilLayerTreeGroup {
|
||||
Layer &add_layer_after(Layer *layer, TreeNode *link);
|
||||
Layer &add_layer_after(StringRefNull name, TreeNode *link);
|
||||
|
||||
/**
|
||||
* Move child \a node up/down by \a step.
|
||||
*/
|
||||
void move_node_up(TreeNode *node, int step = 1);
|
||||
void move_node_down(TreeNode *node, int step = 1);
|
||||
/**
|
||||
* Move child \a node to the top/bottom.
|
||||
*/
|
||||
void move_node_top(TreeNode *node);
|
||||
void move_node_bottom(TreeNode *node);
|
||||
|
||||
/**
|
||||
* Returns the number of direct nodes in this group.
|
||||
*/
|
||||
|
||||
@@ -876,6 +876,29 @@ Layer &LayerGroup::add_layer_after(StringRefNull name, TreeNode *link)
|
||||
return this->add_layer_after(new_layer, link);
|
||||
}
|
||||
|
||||
void LayerGroup::move_node_up(TreeNode *node, const int step)
|
||||
{
|
||||
BLI_listbase_link_move(&this->children, node, step);
|
||||
this->tag_nodes_cache_dirty();
|
||||
}
|
||||
void LayerGroup::move_node_down(TreeNode *node, const int step)
|
||||
{
|
||||
BLI_listbase_link_move(&this->children, node, -step);
|
||||
this->tag_nodes_cache_dirty();
|
||||
}
|
||||
void LayerGroup::move_node_top(TreeNode *node)
|
||||
{
|
||||
BLI_remlink(&this->children, node);
|
||||
BLI_insertlinkafter(&this->children, this->children.last, node);
|
||||
this->tag_nodes_cache_dirty();
|
||||
}
|
||||
void LayerGroup::move_node_bottom(TreeNode *node)
|
||||
{
|
||||
BLI_remlink(&this->children, node);
|
||||
BLI_insertlinkbefore(&this->children, this->children.first, node);
|
||||
this->tag_nodes_cache_dirty();
|
||||
}
|
||||
|
||||
int64_t LayerGroup::num_direct_nodes() const
|
||||
{
|
||||
return BLI_listbase_count(&this->children);
|
||||
@@ -1847,6 +1870,24 @@ blender::bke::greasepencil::Layer &GreasePencil::add_layer_after(
|
||||
return group.add_layer_after(unique_name, link);
|
||||
}
|
||||
|
||||
void GreasePencil::move_layer_up(blender::bke::greasepencil::Layer *layer,
|
||||
blender::bke::greasepencil::Layer *move_along_layer)
|
||||
{
|
||||
layer->parent_group().unlink_node(&layer->as_node());
|
||||
move_along_layer->parent_group().add_layer_after(layer, &move_along_layer->as_node());
|
||||
}
|
||||
|
||||
void GreasePencil::move_layer_down(blender::Span<blender::bke::greasepencil::Layer *> layers,
|
||||
blender::bke::greasepencil::Layer *move_along_layer)
|
||||
{
|
||||
for (int i = layers.size() - 1; i >= 0; i--) {
|
||||
using namespace blender::bke::greasepencil;
|
||||
Layer *layer = layers[i];
|
||||
layer->parent_group().unlink_node(&layer->as_node());
|
||||
move_along_layer->parent_group().add_layer_before(layer, &move_along_layer->as_node());
|
||||
}
|
||||
}
|
||||
|
||||
blender::bke::greasepencil::Layer &GreasePencil::add_layer(const blender::StringRefNull name)
|
||||
{
|
||||
return this->add_layer(this->root_group(), name);
|
||||
|
||||
@@ -1650,6 +1650,50 @@ static void rearrange_nla_control_channels(bAnimContext *ac,
|
||||
|
||||
/* ------------------- */
|
||||
|
||||
static void rearrange_grease_pencil_channels(bAnimContext *ac, eRearrangeAnimChan_Mode mode)
|
||||
{
|
||||
using namespace blender::bke::greasepencil;
|
||||
ListBase anim_data = {nullptr, nullptr};
|
||||
blender::Vector<Layer *> layer_list;
|
||||
int filter = ANIMFILTER_DATA_VISIBLE;
|
||||
|
||||
ANIM_animdata_filter(
|
||||
ac, &anim_data, eAnimFilter_Flags(filter), ac->data, eAnimCont_Types(ac->datatype));
|
||||
|
||||
LISTBASE_FOREACH (bAnimListElem *, ale, &anim_data) {
|
||||
Layer *layer = static_cast<Layer *>(ale->data);
|
||||
|
||||
switch (mode) {
|
||||
case REARRANGE_ANIMCHAN_TOP: {
|
||||
if (layer->is_selected()) {
|
||||
layer->parent_group().move_node_top(&layer->as_node());
|
||||
}
|
||||
break;
|
||||
}
|
||||
case REARRANGE_ANIMCHAN_UP: {
|
||||
if (layer->is_selected()) {
|
||||
layer->parent_group().move_node_up(&layer->as_node());
|
||||
}
|
||||
break;
|
||||
}
|
||||
case REARRANGE_ANIMCHAN_DOWN: {
|
||||
if (layer->is_selected()) {
|
||||
layer->parent_group().move_node_down(&layer->as_node());
|
||||
}
|
||||
break;
|
||||
}
|
||||
case REARRANGE_ANIMCHAN_BOTTOM: {
|
||||
if (layer->is_selected()) {
|
||||
layer->parent_group().move_node_bottom(&layer->as_node());
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BLI_freelistN(&anim_data);
|
||||
}
|
||||
|
||||
static void rearrange_gpencil_channels(bAnimContext *ac, eRearrangeAnimChan_Mode mode)
|
||||
{
|
||||
ListBase anim_data = {nullptr, nullptr};
|
||||
@@ -1720,7 +1764,12 @@ static int animchannels_rearrange_exec(bContext *C, wmOperator *op)
|
||||
/* method to move channels depends on the editor */
|
||||
if (ac.datatype == ANIMCONT_GPENCIL) {
|
||||
/* Grease Pencil channels */
|
||||
rearrange_gpencil_channels(&ac, mode);
|
||||
if (U.experimental.use_grease_pencil_version3) {
|
||||
rearrange_grease_pencil_channels(&ac, mode);
|
||||
}
|
||||
else {
|
||||
rearrange_gpencil_channels(&ac, mode);
|
||||
}
|
||||
}
|
||||
else if (ac.datatype == ANIMCONT_MASK) {
|
||||
/* Grease Pencil channels */
|
||||
|
||||
@@ -457,6 +457,12 @@ typedef struct GreasePencil {
|
||||
blender::bke::greasepencil::TreeNode *link,
|
||||
blender::StringRefNull name);
|
||||
|
||||
void move_layer_up(blender::bke::greasepencil::Layer *layer,
|
||||
blender::bke::greasepencil::Layer *move_along_layer);
|
||||
|
||||
void move_layer_down(blender::Span<blender::bke::greasepencil::Layer *> layers,
|
||||
blender::bke::greasepencil::Layer *move_along_layer);
|
||||
|
||||
blender::bke::greasepencil::LayerGroup &add_layer_group(
|
||||
blender::bke::greasepencil::LayerGroup &group, blender::StringRefNull name);
|
||||
blender::bke::greasepencil::LayerGroup &add_layer_group(blender::StringRefNull name);
|
||||
|
||||
Reference in New Issue
Block a user