Support Copy To Selected and Alt-Click for F-Curves in the curve editor.
authorAlexander Gavrilov <angavrilov@gmail.com>
Sat, 19 Aug 2017 16:58:39 +0000 (19:58 +0300)
committerAlexander Gavrilov <alexander.gavrilov@jetbrains.com>
Tue, 29 Aug 2017 11:30:44 +0000 (14:30 +0300)
This affects the curve display color setting, but is really intended
for future per-curve options.

The id_data reference in the created rna pointers refers to the object
even if the curve is actually owned by its action, which is somewhat
inconsistent, but the same problem can be found in existing code.
Fixing it requires changes in animdata filter API.

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

index fb95cdf389bc621e009b8faacad2e628576726e7..580ad02508695b36d72a70b65209c73b98b663bb 100644 (file)
@@ -360,6 +360,9 @@ bool UI_context_copy_to_selected_list(
        else if (RNA_struct_is_a(ptr->type, &RNA_Sequence)) {
                *r_lb = CTX_data_collection_get(C, "selected_editable_sequences");
        }
+       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_Node) ||
                 RNA_struct_is_a(ptr->type, &RNA_NodeSocket))
        {
index c165bbfd3015f879cba230a4953100cca2938b47..293e507c2b307d24dfc218950c86fcb327fa5969 100644 (file)
@@ -54,6 +54,7 @@
 
 #include "ED_armature.h"
 #include "ED_gpencil.h"
+#include "ED_anim_api.h"
 
 #include "WM_api.h"
 #include "UI_interface.h"
@@ -87,7 +88,7 @@ const char *screen_context_dir[] = {
        "visible_gpencil_layers", "editable_gpencil_layers", "editable_gpencil_strokes",
        "active_gpencil_layer", "active_gpencil_frame", "active_gpencil_palette", 
        "active_gpencil_palettecolor", "active_gpencil_brush",
-       "active_operator",
+       "active_operator", "selected_editable_fcurves",
        NULL};
 
 int ed_screen_context(const bContext *C, const char *member, bContextDataResult *result)
@@ -608,6 +609,30 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
                        return 1;
                }
        }
+       else if (CTX_data_equals(member, "selected_editable_fcurves"))
+       {
+               bAnimContext ac;
+
+               if (ANIM_animdata_get_context(C, &ac) && ELEM(ac.spacetype, SPACE_ACTION, SPACE_IPO)) {
+                       bAnimListElem *ale;
+                       ListBase anim_data = {NULL, NULL};
+
+                       int filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_NODUPLIS | ANIMFILTER_SEL) |
+                                    (ac.spacetype == SPACE_IPO ? ANIMFILTER_CURVE_VISIBLE : ANIMFILTER_LIST_VISIBLE);
+
+                       ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+                       for (ale = anim_data.first; ale; ale = ale->next) {
+                               if (ale->type == ANIMTYPE_FCURVE)
+                                       CTX_data_list_add(result, ale->id, &RNA_FCurve, ale->data);
+                       }
+
+                       ANIM_animdata_freelist(&anim_data);
+
+                       CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
+                       return 1;
+               }
+       }
        else {
                return 0; /* not found */
        }