diff options
author | Sybren A. Stüvel <sybren@stuvel.eu> | 2018-01-17 14:21:05 +0300 |
---|---|---|
committer | Sybren A. Stüvel <sybren@stuvel.eu> | 2018-01-17 14:21:05 +0300 |
commit | 971a44fe088a6053c5f28f8617c45e956f383db9 (patch) | |
tree | b3e4c079cec95a7374670e90ea8e76d29d4225b5 /source/blender/editors/space_graph/graph_edit.c | |
parent | ca5987c8a5ad5def6354ca306bcdbc8626bf059c (diff) | |
parent | c38ebf93e356a97b3013b075e1d98268df891809 (diff) |
Merge branch 'master' into blender2.8
Diffstat (limited to 'source/blender/editors/space_graph/graph_edit.c')
-rw-r--r-- | source/blender/editors/space_graph/graph_edit.c | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/source/blender/editors/space_graph/graph_edit.c b/source/blender/editors/space_graph/graph_edit.c index 2876fccaa51..0a8e49fc671 100644 --- a/source/blender/editors/space_graph/graph_edit.c +++ b/source/blender/editors/space_graph/graph_edit.c @@ -2747,3 +2747,92 @@ void GRAPH_OT_driver_variables_paste(wmOperatorType *ot) } /* ************************************************************************** */ +typedef struct InvalidDriverInfo { + struct InvalidDriverInfo *next, *prev; + ID *id; + FCurve *fcu; +} InvalidDriverInfo; + +static int graph_driver_delete_invalid_exec(bContext *C, wmOperator *op) +{ + bAnimContext ac; + ListBase anim_data = {NULL, NULL}; + ListBase to_delete = {NULL, NULL}; + bAnimListElem *ale; + InvalidDriverInfo *idi; + int filter; + bool ok = false; + unsigned int deleted = 0; + + /* get editor data */ + if (ANIM_animdata_get_context(C, &ac) == 0) + return OPERATOR_CANCELLED; + + /* NOTE: we might need a scene update to evaluate the driver flags */ + + /* filter data */ + filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_CURVE_VISIBLE); + ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); + + /* find invalid drivers */ + for (ale = anim_data.first; ale; ale = ale->next) { + FCurve *fcu = (FCurve *)ale->data; + if (ELEM(NULL, fcu, fcu->driver)) { + continue; + } + if (!(fcu->driver->flag & DRIVER_FLAG_INVALID)) { + continue; + } + + /* remember in a separate list so we don't iterate over the same collection we modify */ + idi = MEM_callocN(sizeof(InvalidDriverInfo), "invalid driver info"); + BLI_assert(idi != NULL); + idi->id = ale->id; + idi->fcu = fcu; + BLI_addtail(&to_delete, idi); + } + + /* delete invalid drivers */ + for (idi = to_delete.first; idi; idi = idi->next) { + ok |= ANIM_remove_driver(op->reports, idi->id, idi->fcu->rna_path, idi->fcu->array_index, 0); + if (!ok) { + break; + } + deleted += 1; + } + + /* cleanup */ + BLI_freelistN(&to_delete); + ANIM_animdata_freelist(&anim_data); + + if (deleted > 0) { + /* notify the world of any changes */ + DEG_relations_tag_update(CTX_data_main(C)); + WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_REMOVED, NULL); + WM_reportf(RPT_INFO, "Deleted %u drivers", deleted); + } else { + WM_report(RPT_INFO, "No drivers deleted"); + } + + /* successful or not? */ + if (!ok) { + return OPERATOR_CANCELLED; + } + + return OPERATOR_FINISHED; +} + +void GRAPH_OT_driver_delete_invalid(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Delete Invalid Drivers"; + ot->idname = "GRAPH_OT_driver_delete_invalid"; + ot->description = "Deletes all visible drivers considered invalid"; + + /* api callbacks */ + ot->exec = graph_driver_delete_invalid_exec; + ot->poll = graphop_visible_keyframes_poll; + + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; +} |