diff options
author | Wayde Moss <wbmoss_dev@yahoo.com> | 2020-10-15 21:53:26 +0300 |
---|---|---|
committer | Wayde Moss <wbmoss_dev@yahoo.com> | 2020-10-15 21:55:09 +0300 |
commit | 0a66436fe5f26f8d7b6fb49396f21313fded8654 (patch) | |
tree | 09f9fedc668bc575a0d28da362539b8de946dfac /source | |
parent | a88076e948a93c087e1b20bb3d3c424db0f39fbe (diff) |
Fix T76597: Support Keyframe: Copy To Selected
Reviewed By: Sybren, Luciano Muñoz Sessarego
Differential Revision: https://developer.blender.org/D7783
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/editors/interface/interface_ops.c | 3 | ||||
-rw-r--r-- | source/blender/editors/screen/screen_context.c | 42 |
2 files changed, 45 insertions, 0 deletions
diff --git a/source/blender/editors/interface/interface_ops.c b/source/blender/editors/interface/interface_ops.c index 4cb8a47690e..2b91d1b273d 100644 --- a/source/blender/editors/interface/interface_ops.c +++ b/source/blender/editors/interface/interface_ops.c @@ -816,6 +816,9 @@ bool UI_context_copy_to_selected_list(bContext *C, else if (RNA_struct_is_a(ptr->type, &RNA_FCurve)) { *r_lb = CTX_data_collection_get(C, "selected_editable_fcurves"); } + else if (RNA_struct_is_a(ptr->type, &RNA_Keyframe)) { + *r_lb = CTX_data_collection_get(C, "selected_editable_keyframes"); + } else if (RNA_struct_is_a(ptr->type, &RNA_NlaStrip)) { *r_lb = CTX_data_collection_get(C, "selected_nla_strips"); } diff --git a/source/blender/editors/screen/screen_context.c b/source/blender/editors/screen/screen_context.c index 74621b917c6..0fa19f76fed 100644 --- a/source/blender/editors/screen/screen_context.c +++ b/source/blender/editors/screen/screen_context.c @@ -109,6 +109,7 @@ const char *screen_context_dir[] = { "selected_visible_fcurves", "selected_editable_fcurves", "active_editable_fcurve", + "selected_editable_keyframes", NULL, }; @@ -984,6 +985,46 @@ static eContextResult screen_ctx_active_editable_fcurve(const bContext *C, } return CTX_RESULT_NO_DATA; } +static eContextResult screen_ctx_selected_editable_keyframes(const bContext *C, + bContextDataResult *result) +{ + bAnimContext ac; + if (ANIM_animdata_get_context(C, &ac) && ELEM(ac.spacetype, SPACE_ACTION, SPACE_GRAPH)) { + ListBase anim_data = {NULL, NULL}; + + /* Use keyframes from editable selected FCurves. */ + int filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_NODUPLIS | ANIMFILTER_FOREDIT | + ANIMFILTER_SEL) | + (ac.spacetype == SPACE_GRAPH ? ANIMFILTER_CURVE_VISIBLE : + ANIMFILTER_LIST_VISIBLE); + + ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); + + int i; + FCurve *fcurve; + BezTriple *bezt; + LISTBASE_FOREACH (bAnimListElem *, ale, &anim_data) { + if (!ELEM(ale->type, ANIMTYPE_FCURVE, ANIMTYPE_NLACURVE)) { + continue; + } + + fcurve = (FCurve *)ale->data; + for (i = 0, bezt = fcurve->bezt; i < fcurve->totvert; i++, bezt++) { + if ((bezt->f2 & SELECT) == 0) { + continue; + } + + CTX_data_list_add(result, ale->fcurve_owner_id, &RNA_Keyframe, bezt); + } + } + + ANIM_animdata_freelist(&anim_data); + + CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); + return CTX_RESULT_OK; + } + return CTX_RESULT_NO_DATA; +} /* Registry of context callback functions. */ @@ -1058,6 +1099,7 @@ static void ensure_ed_screen_context_functions(void) register_context_function("selected_editable_fcurves", screen_ctx_selected_editable_fcurves); register_context_function("selected_visible_fcurves", screen_ctx_selected_visible_fcurves); register_context_function("active_editable_fcurve", screen_ctx_active_editable_fcurve); + register_context_function("selected_editable_keyframes", screen_ctx_selected_editable_keyframes); } /* Entry point for the screen context. */ |