Fix T63431: crash adding driver to a keyframed property with Ctrl+D
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Sun, 21 Apr 2019 00:34:26 +0000 (02:34 +0200)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Sun, 21 Apr 2019 00:35:50 +0000 (02:35 +0200)
source/blender/editors/animation/drivers.c
source/blender/editors/space_graph/graph_buttons.c

index d6564be..92c292f 100644 (file)
@@ -899,10 +899,21 @@ static bool add_driver_button_poll(bContext *C)
   PointerRNA ptr = {{NULL}};
   PropertyRNA *prop = NULL;
   int index;
+  bool driven, special;
 
   /* this operator can only run if there's a property button active, and it can be animated */
   UI_context_active_but_prop_get(C, &ptr, &prop, &index);
-  return (ptr.id.data && ptr.data && prop && RNA_property_animateable(&ptr, prop));
+
+  if (!(ptr.id.data && ptr.data && prop)) {
+    return false;
+  }
+  if (!RNA_property_animateable(&ptr, prop)) {
+    return false;
+  }
+
+  /* Don't do anything if there is an fcurve for animation without a driver. */
+  FCurve *fcu = rna_get_fcurve_context_ui(C, &ptr, prop, index, NULL, NULL, &driven, &special);
+  return (fcu == NULL || fcu->driver);
 }
 
 /* Wrapper for creating a driver without knowing what the targets will be yet (i.e. "manual/add later") */
index 8742f5d..20ddf43 100644 (file)
@@ -1255,7 +1255,7 @@ static void graph_panel_drivers_popover(const bContext *C, Panel *pa)
     uiLayoutSetContextFromBut(layout, but);
 
     /* Populate Panel - With a combination of the contents of the Driven and Driver panels */
-    if (fcu) {
+    if (fcu && fcu->driver) {
       ID *id = ptr.id.data;
 
       /* Driven Property Settings */