[Bf-blender-cvs] [0a66436fe5f] master: Fix T76597: Support Keyframe: Copy To Selected

Wayde Moss noreply at git.blender.org
Thu Oct 15 20:56:24 CEST 2020


Commit: 0a66436fe5f26f8d7b6fb49396f21313fded8654
Author: Wayde Moss
Date:   Thu Oct 15 14:53:26 2020 -0400
Branches: master
https://developer.blender.org/rB0a66436fe5f26f8d7b6fb49396f21313fded8654

Fix T76597: Support Keyframe: Copy To Selected

Reviewed By: Sybren, Luciano Muñoz Sessarego

Differential Revision: https://developer.blender.org/D7783

===================================================================

M	source/blender/editors/interface/interface_ops.c
M	source/blender/editors/screen/screen_context.c

===================================================================

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



More information about the Bf-blender-cvs mailing list