Added "Delete Invalid Drivers" operator

This operator is available in the graph editor in the Drivers mode, and
allows quick cleanup of drivers marked as 'invalid'.
This commit is contained in:
Sybren A. Stüvel 2018-01-17 12:12:37 +01:00
parent 7935a394b7
commit c38ebf93e3
4 changed files with 93 additions and 0 deletions

View File

@ -201,6 +201,8 @@ class GRAPH_MT_channel(Menu):
layout.operator_context = 'INVOKE_REGION_CHANNELS'
layout.operator("anim.channels_delete")
if context.space_data.mode == 'DRIVERS':
layout.operator("graph.driver_delete_invalid")
layout.separator()
layout.operator("anim.channels_group")

View File

@ -2746,3 +2746,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 */
DAG_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;
}

View File

@ -152,6 +152,7 @@ void GRAPH_OT_fmodifier_paste(struct wmOperatorType *ot);
void GRAPH_OT_driver_variables_copy(struct wmOperatorType *ot);
void GRAPH_OT_driver_variables_paste(struct wmOperatorType *ot);
void GRAPH_OT_driver_delete_invalid(struct wmOperatorType *ot);
/* ----------- */

View File

@ -468,6 +468,7 @@ void graphedit_operatortypes(void)
/* Drivers */
WM_operatortype_append(GRAPH_OT_driver_variables_copy);
WM_operatortype_append(GRAPH_OT_driver_variables_paste);
WM_operatortype_append(GRAPH_OT_driver_delete_invalid);
}
void ED_operatormacros_graph(void)