Cleanup: move property auto-keyframing to a generic API function
authorCampbell Barton <ideasman42@gmail.com>
Tue, 14 Jan 2020 05:32:14 +0000 (16:32 +1100)
committerCampbell Barton <ideasman42@gmail.com>
Tue, 14 Jan 2020 06:05:59 +0000 (17:05 +1100)
Prepare to call this from gizmos.

source/blender/editors/animation/keyframing.c
source/blender/editors/include/ED_keyframing.h
source/blender/editors/interface/interface_anim.c

index 8203a9131fa8f1b45d8d0999de7f1f185a964e0f..14b1f6523d92a477dd9445fbd2cad2931040ece4 100644 (file)
@@ -2964,6 +2964,82 @@ bool ED_autokeyframe_pchan(
   }
 }
 
+/**
+ * Use for auto-keyframing from the UI.
+ */
+bool ED_autokeyframe_property(
+    bContext *C, Scene *scene, PointerRNA *ptr, PropertyRNA *prop, int rnaindex, float cfra)
+{
+  Main *bmain = CTX_data_main(C);
+  ID *id;
+  bAction *action;
+  FCurve *fcu;
+  bool driven;
+  bool special;
+  bool changed = false;
+
+  fcu = rna_get_fcurve_context_ui(C, ptr, prop, rnaindex, NULL, &action, &driven, &special);
+
+  if (fcu == NULL) {
+    return changed;
+  }
+
+  if (special) {
+    /* NLA Strip property */
+    if (IS_AUTOKEY_ON(scene)) {
+      ReportList *reports = CTX_wm_reports(C);
+      ToolSettings *ts = scene->toolsettings;
+
+      changed = insert_keyframe_direct(reports, *ptr, prop, fcu, cfra, ts->keyframe_type, NULL, 0);
+      WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL);
+    }
+  }
+  else if (driven) {
+    /* Driver - Try to insert keyframe using the driver's input as the frame,
+     * making it easier to set up corrective drivers
+     */
+    if (IS_AUTOKEY_ON(scene)) {
+      ReportList *reports = CTX_wm_reports(C);
+      ToolSettings *ts = scene->toolsettings;
+
+      changed = insert_keyframe_direct(
+          reports, *ptr, prop, fcu, cfra, ts->keyframe_type, NULL, INSERTKEY_DRIVER);
+      WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL);
+    }
+  }
+  else {
+    id = ptr->owner_id;
+
+    /* TODO: this should probably respect the keyingset only option for anim */
+    if (autokeyframe_cfra_can_key(scene, id)) {
+      ReportList *reports = CTX_wm_reports(C);
+      ToolSettings *ts = scene->toolsettings;
+      short flag = ANIM_get_keyframing_flags(scene, 1);
+
+      fcu->flag &= ~FCURVE_SELECTED;
+
+      /* Note: We use rnaindex instead of fcu->array_index,
+       *       because a button may control all items of an array at once.
+       *       E.g., color wheels (see T42567). */
+      BLI_assert((fcu->array_index == rnaindex) || (rnaindex == -1));
+      changed = insert_keyframe(bmain,
+                                reports,
+                                id,
+                                action,
+                                ((fcu->grp) ? (fcu->grp->name) : (NULL)),
+                                fcu->rna_path,
+                                rnaindex,
+                                cfra,
+                                ts->keyframe_type,
+                                NULL,
+                                flag) != 0;
+
+      WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL);
+    }
+  }
+  return changed;
+}
+
 /* -------------------------------------------------------------------- */
 /** \name Internal Utilities
  * \{ */
index 16b3c9c240a376047cd423f54249d1e348a3a7d4..ac3007afe5d9f51ca6729b8c710fec8a74e0e903 100644 (file)
@@ -492,6 +492,12 @@ bool ED_autokeyframe_pchan(struct bContext *C,
                            struct Object *ob,
                            struct bPoseChannel *pchan,
                            struct KeyingSet *ks);
+bool ED_autokeyframe_property(struct bContext *C,
+                              struct Scene *scene,
+                              PointerRNA *ptr,
+                              PropertyRNA *prop,
+                              int rnaindex,
+                              float cfra);
 
 /* Names for builtin keying sets so we don't confuse these with labels/text,
  * defined in python script: keyingsets_builtins.py */
index c8baa1a7c7b732dc66a13ceb2d3b72bd88b64151..15fc23bc53922f0b41437b12a582c62955ccc7e5 100644 (file)
@@ -270,79 +270,8 @@ bool ui_but_anim_expression_create(uiBut *but, const char *str)
 
 void ui_but_anim_autokey(bContext *C, uiBut *but, Scene *scene, float cfra)
 {
-  Main *bmain = CTX_data_main(C);
-  ID *id;
-  bAction *action;
-  FCurve *fcu;
-  bool driven;
-  bool special;
-
-  fcu = ui_but_get_fcurve(but, NULL, &action, &driven, &special);
-
-  if (fcu == NULL) {
-    return;
-  }
-
-  if (special) {
-    /* NLA Strip property */
-    if (IS_AUTOKEY_ON(scene)) {
-      ReportList *reports = CTX_wm_reports(C);
-      ToolSettings *ts = scene->toolsettings;
-
-      insert_keyframe_direct(
-          reports, but->rnapoin, but->rnaprop, fcu, cfra, ts->keyframe_type, NULL, 0);
-      WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL);
-    }
-  }
-  else if (driven) {
-    /* Driver - Try to insert keyframe using the driver's input as the frame,
-     * making it easier to set up corrective drivers
-     */
-    if (IS_AUTOKEY_ON(scene)) {
-      ReportList *reports = CTX_wm_reports(C);
-      ToolSettings *ts = scene->toolsettings;
-
-      insert_keyframe_direct(reports,
-                             but->rnapoin,
-                             but->rnaprop,
-                             fcu,
-                             cfra,
-                             ts->keyframe_type,
-                             NULL,
-                             INSERTKEY_DRIVER);
-      WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL);
-    }
-  }
-  else {
-    id = but->rnapoin.owner_id;
-
-    /* TODO: this should probably respect the keyingset only option for anim */
-    if (autokeyframe_cfra_can_key(scene, id)) {
-      ReportList *reports = CTX_wm_reports(C);
-      ToolSettings *ts = scene->toolsettings;
-      short flag = ANIM_get_keyframing_flags(scene, 1);
-
-      fcu->flag &= ~FCURVE_SELECTED;
-
-      /* Note: We use but->rnaindex instead of fcu->array_index,
-       *       because a button may control all items of an array at once.
-       *       E.g., color wheels (see T42567). */
-      BLI_assert((fcu->array_index == but->rnaindex) || (but->rnaindex == -1));
-      insert_keyframe(bmain,
-                      reports,
-                      id,
-                      action,
-                      ((fcu->grp) ? (fcu->grp->name) : (NULL)),
-                      fcu->rna_path,
-                      but->rnaindex,
-                      cfra,
-                      ts->keyframe_type,
-                      NULL,
-                      flag);
-
-      WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL);
-    }
-  }
+  const int rnaindex = (but->rnaindex == -1) ? 0 : but->rnaindex;
+  ED_autokeyframe_property(C, scene, &but->rnapoin, but->rnaprop, rnaindex, cfra);
 }
 
 void ui_but_anim_copy_driver(bContext *C)