diff options
Diffstat (limited to 'source/blender/editors/undo')
-rw-r--r-- | source/blender/editors/undo/ed_undo.c | 45 | ||||
-rw-r--r-- | source/blender/editors/undo/memfile_undo.c | 3 |
2 files changed, 36 insertions, 12 deletions
diff --git a/source/blender/editors/undo/ed_undo.c b/source/blender/editors/undo/ed_undo.c index b4268dac863..7bbb2479a52 100644 --- a/source/blender/editors/undo/ed_undo.c +++ b/source/blender/editors/undo/ed_undo.c @@ -36,6 +36,7 @@ #include "CLG_log.h" #include "DNA_scene_types.h" +#include "DNA_object_types.h" #include "BLI_utildefines.h" #include "BLI_callbacks.h" @@ -48,6 +49,7 @@ #include "BKE_global.h" #include "BKE_main.h" #include "BKE_screen.h" +#include "BKE_layer.h" #include "BKE_undo_system.h" #include "ED_gpencil.h" @@ -57,6 +59,7 @@ #include "WM_api.h" #include "WM_types.h" +#include "WM_toolsystem.h" #include "RNA_access.h" #include "RNA_define.h" @@ -106,7 +109,6 @@ static int ed_undo_step(bContext *C, int step, const char *undoname) CLOG_INFO(&LOG, 1, "name='%s', step=%d", undoname, step); wmWindowManager *wm = CTX_wm_manager(C); wmWindow *win = CTX_wm_window(C); - // Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); /* undo during jobs are running can easily lead to freeing data using by jobs, @@ -168,6 +170,9 @@ static int ed_undo_step(bContext *C, int step, const char *undoname) WM_event_add_notifier(C, NC_WINDOW, NULL); WM_event_add_notifier(C, NC_WM | ND_UNDO, NULL); + Main *bmain = CTX_data_main(C); + WM_toolsystem_refresh_screen_all(bmain); + if (win) { win->addmousemove = true; } @@ -337,7 +342,7 @@ void ED_OT_undo_redo(wmOperatorType *ot) * \{ */ /* ui callbacks should call this rather than calling WM_operator_repeat() themselves */ -int ED_undo_operator_repeat(bContext *C, struct wmOperator *op) +int ED_undo_operator_repeat(bContext *C, wmOperator *op) { int ret = 0; @@ -347,11 +352,12 @@ int ED_undo_operator_repeat(bContext *C, struct wmOperator *op) struct Scene *scene = CTX_data_scene(C); /* keep in sync with logic in view3d_panel_operator_redo() */ - ARegion *ar = CTX_wm_region(C); - ARegion *ar1 = BKE_area_find_region_active_win(CTX_wm_area(C)); + ARegion *ar_orig = CTX_wm_region(C); + ARegion *ar_win = BKE_area_find_region_active_win(CTX_wm_area(C)); - if (ar1) - CTX_wm_region_set(C, ar1); + if (ar_win) { + CTX_wm_region_set(C, ar_win); + } if ((WM_operator_repeat_check(C, op)) && (WM_operator_poll(C, op->type)) && @@ -364,8 +370,6 @@ int ED_undo_operator_repeat(bContext *C, struct wmOperator *op) { int retval; - ED_viewport_render_kill_jobs(wm, CTX_data_main(C), true); - if (G.debug & G_DEBUG) printf("redo_cb: operator redo %s\n", op->type->name); @@ -400,7 +404,7 @@ int ED_undo_operator_repeat(bContext *C, struct wmOperator *op) } /* set region back */ - CTX_wm_region_set(C, ar); + CTX_wm_region_set(C, ar_orig); } else { CLOG_WARN(&LOG, "called with NULL 'op'"); @@ -442,7 +446,7 @@ static const EnumPropertyItem *rna_undo_itemf(bContext *C, int *totitem) item_tmp.identifier = us->name; item_tmp.name = IFACE_(us->name); if (us == wm->undo_stack->step_active) { - item_tmp.icon = ICON_RESTRICT_VIEW_OFF; + item_tmp.icon = ICON_HIDE_OFF; } else { item_tmp.icon = ICON_NONE; @@ -525,3 +529,24 @@ void ED_OT_undo_history(wmOperatorType *ot) } /** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Undo Helper Functions + * \{ */ + +void ED_undo_object_set_active_or_warn(ViewLayer *view_layer, Object *ob, const char *info, CLG_LogRef *log) +{ + Object *ob_prev = OBACT(view_layer); + if (ob_prev != ob) { + Base *base = BKE_view_layer_base_find(view_layer, ob); + if (base != NULL) { + view_layer->basact = base; + } + else { + /* Should never fail, may not crash but can give odd behavior. */ + CLOG_WARN(log, "'%s' failed to restore active object: '%s'", info, ob->id.name + 2); + } + } +} + +/** \} */ diff --git a/source/blender/editors/undo/memfile_undo.c b/source/blender/editors/undo/memfile_undo.c index bb81da74f88..d45470ab0a1 100644 --- a/source/blender/editors/undo/memfile_undo.c +++ b/source/blender/editors/undo/memfile_undo.c @@ -76,6 +76,7 @@ static bool memfile_undosys_step_encode(struct bContext *C, UndoStep *us_p) MemFileUndoStep *us_prev = (MemFileUndoStep *)BKE_undosys_step_find_by_type(ustack, BKE_UNDOSYS_TYPE_MEMFILE); us->data = BKE_memfile_undo_encode(bmain, us_prev ? us_prev->data : NULL); us->step.data_size = us->data->undo_size; + return true; } @@ -84,8 +85,6 @@ static void memfile_undosys_step_decode(struct bContext *C, UndoStep *us_p, int /* Loading the content will correctly switch into compatible non-object modes. */ ED_object_mode_set(C, OB_MODE_OBJECT); - /* This is needed so undoing/redoing doesn't crash with threaded previews going */ - ED_viewport_render_kill_jobs(CTX_wm_manager(C), CTX_data_main(C), true); MemFileUndoStep *us = (MemFileUndoStep *)us_p; BKE_memfile_undo_decode(us->data, C); |