diff options
author | Joshua Leung <aligorith@gmail.com> | 2012-12-16 10:30:17 +0400 |
---|---|---|
committer | Joshua Leung <aligorith@gmail.com> | 2012-12-16 10:30:17 +0400 |
commit | db4d342223e699407ad71f917a58d5d86a167073 (patch) | |
tree | b5d284fbccd2e66c19f073c2122c04f169eabd83 /source/blender/editors/animation/anim_channels_edit.c | |
parent | 5310961523faa34a6ef2fe08ff2984a3cab97f67 (diff) |
Bugfix #33541 - Deleting all keyframes leaves dangling action groups
When deleting all keyframes in F-Curves, the corresponding F-Curves are deleted.
If all the F-Curves in an action group were deleted in such a way, the group
wouldn't be removed. This meant that these groups would never be shown (until
F-Curves for these groups were created again), but would still exist, causing
problems when trying to rearrange groups in the animation editors (i.e. groups
would appear to not move). Now these groups get deleted when they get empty.
Diffstat (limited to 'source/blender/editors/animation/anim_channels_edit.c')
-rw-r--r-- | source/blender/editors/animation/anim_channels_edit.c | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/source/blender/editors/animation/anim_channels_edit.c b/source/blender/editors/animation/anim_channels_edit.c index fe836204c27..1e4431bd0d6 100644 --- a/source/blender/editors/animation/anim_channels_edit.c +++ b/source/blender/editors/animation/anim_channels_edit.c @@ -538,12 +538,26 @@ void ANIM_fcurve_delete_from_animdata(bAnimContext *ac, AnimData *adt, FCurve *f BLI_remlink(&adt->drivers, fcu); } else if (adt->action) { + bAction *act = adt->action; + /* remove from group or action, whichever one "owns" the F-Curve */ - if (fcu->grp) - action_groups_remove_channel(adt->action, fcu); - else - BLI_remlink(&adt->action->curves, fcu); + if (fcu->grp) { + bActionGroup *agrp = fcu->grp; + + /* remove F-Curve from group+action */ + action_groups_remove_channel(act, fcu); + /* if group has no more channels, remove it too, + * otherwise can have many dangling groups [#33541] + */ + if (agrp->channels.first == NULL) { + BLI_freelinkN(&act->groups, agrp); + } + } + else { + BLI_remlink(&act->curves, fcu); + } + /* if action has no more F-Curves as a result of this, unlink it from * AnimData if it did not come from a NLA Strip being tweaked. * @@ -551,12 +565,8 @@ void ANIM_fcurve_delete_from_animdata(bAnimContext *ac, AnimData *adt, FCurve *f * channel list that are empty, and linger around long after the data they * are for has disappeared (and probably won't come back). */ - // XXX: does everybody always want this? - /* XXX: there's a problem where many actions could build up in the file if multiple - * full add/delete cycles are performed on the same objects, but assume that this is rare - */ - if ((adt->action->curves.first == NULL) && (adt->flag & ADT_NLA_EDIT_ON) == 0) { - id_us_min(&adt->action->id); + if ((act->curves.first == NULL) && (adt->flag & ADT_NLA_EDIT_ON) == 0) { + id_us_min(&act->id); adt->action = NULL; } } |