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:
Falk David
2023-09-11 13:07:38 +02:00
parent 3bcfd4e9dd
commit b66c0676b4
4 changed files with 108 additions and 1 deletions

View File

@@ -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.
*/

View File

@@ -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);

View File

@@ -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 */

View File

@@ -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);