diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-07-12 15:43:35 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-07-12 15:43:35 +0300 |
commit | 753a600e354f21618e24e9071ef5d88f1913fcd8 (patch) | |
tree | 1e05ca245590ff9a6cf7523a6f3fba46de25327c /source/blender/editors/undo | |
parent | 9a5fb0209e6e94112be4d390316933ab84e8e2df (diff) |
PyAPI: add undo redo handlers
Useful so Python can clean up before/after undo steps.
Diffstat (limited to 'source/blender/editors/undo')
-rw-r--r-- | source/blender/editors/undo/ed_undo.c | 39 |
1 files changed, 37 insertions, 2 deletions
diff --git a/source/blender/editors/undo/ed_undo.c b/source/blender/editors/undo/ed_undo.c index 5f5b7b330f9..b4268dac863 100644 --- a/source/blender/editors/undo/ed_undo.c +++ b/source/blender/editors/undo/ed_undo.c @@ -38,6 +38,8 @@ #include "DNA_scene_types.h" #include "BLI_utildefines.h" +#include "BLI_callbacks.h" +#include "BLI_listbase.h" #include "BLT_translation.h" @@ -119,17 +121,50 @@ static int ed_undo_step(bContext *C, int step, const char *undoname) return ED_undo_gpencil_step(C, step, undoname); } + UndoStep *step_data_from_name = NULL; + int step_for_callback = step; + if (undoname != NULL) { + step_data_from_name = BKE_undosys_step_find_by_name(wm->undo_stack, undoname); + if (step_data_from_name == NULL) { + return OPERATOR_CANCELLED; + } + + /* TODO(campbell), could use simple optimization. */ + BLI_assert(step_data_from_name != wm->undo_stack->step_active); + step_for_callback = ( + BLI_findindex(&wm->undo_stack->steps, step_data_from_name) < + BLI_findindex(&wm->undo_stack->steps, wm->undo_stack->step_active)) ? 1 : -1; + } + + /* App-Handlers (pre). */ + { + /* Note: ignore grease pencil for now. */ + Main *bmain = CTX_data_main(C); + wm->op_undo_depth++; + BLI_callback_exec(bmain, &scene->id, (step_for_callback > 0) ? BLI_CB_EVT_UNDO_PRE : BLI_CB_EVT_REDO_PRE); + wm->op_undo_depth--; + } + + /* Undo System */ { if (undoname) { - UndoStep *step_data = BKE_undosys_step_find_by_name(wm->undo_stack, undoname); - BKE_undosys_step_undo_with_data(wm->undo_stack, C, step_data); + BKE_undosys_step_undo_with_data(wm->undo_stack, C, step_data_from_name); } else { BKE_undosys_step_undo_compat_only(wm->undo_stack, C, step); } } + /* App-Handlers (post). */ + { + Main *bmain = CTX_data_main(C); + scene = CTX_data_scene(C); + wm->op_undo_depth++; + BLI_callback_exec(bmain, &scene->id, step_for_callback > 0 ? BLI_CB_EVT_UNDO_PRE : BLI_CB_EVT_REDO_PRE); + wm->op_undo_depth--; + } + WM_event_add_notifier(C, NC_WINDOW, NULL); WM_event_add_notifier(C, NC_WM | ND_UNDO, NULL); |