diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-02-22 10:15:34 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-02-22 10:18:44 +0300 |
commit | 4ab002bca36ace4d2b4b21efce622a682b99b844 (patch) | |
tree | 8127eca822cc9a80bb6951127bfa06eab5791655 /source/blender/editors/screen/workspace_edit.c | |
parent | 5b857102fa6d3e1f92530343448b142c9666e8d8 (diff) |
WorkSpace: object-mode switching support
When changing workspaces, existing object-mode data is freed
the new workspaces mode is entered (if possible).
Diffstat (limited to 'source/blender/editors/screen/workspace_edit.c')
-rw-r--r-- | source/blender/editors/screen/workspace_edit.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/source/blender/editors/screen/workspace_edit.c b/source/blender/editors/screen/workspace_edit.c index 1ec83ed7c08..465e30357dc 100644 --- a/source/blender/editors/screen/workspace_edit.c +++ b/source/blender/editors/screen/workspace_edit.c @@ -56,6 +56,8 @@ #include "RNA_access.h" +#include "DEG_depsgraph.h" + #include "UI_interface.h" #include "UI_resources.h" @@ -166,6 +168,41 @@ bool ED_workspace_change( BLI_assert(BKE_workspace_layout_screen_get(layout_new) == screen_new); if (screen_new) { + bool object_mode_set = false; + + /* Handle object mode switching */ + if ((workspace_old->object_mode != OB_MODE_OBJECT) || + (workspace_new->object_mode != OB_MODE_OBJECT)) + { + Scene *scene = CTX_data_scene(C); + ViewLayer *view_layer_old = BKE_workspace_view_layer_get(workspace_old, scene); + ViewLayer *view_layer_new = BKE_workspace_view_layer_get(workspace_new, scene); + Object *obact_old = OBACT(view_layer_old); + Object *obact_new = OBACT(view_layer_new); + + if ((workspace_old->object_mode == workspace_new->object_mode) && + (obact_old == obact_new)) + { + /* pass */ + } + else { + if (workspace_old->object_mode & OB_MODE_ALL_MODE_DATA) { + if (obact_old) { + eObjectMode object_mode = workspace_old->object_mode; + EvaluationContext eval_ctx; + CTX_data_eval_ctx(C, &eval_ctx); + ED_object_mode_generic_exit(&eval_ctx, workspace_old, scene, obact_old); + /* weak, set it back so it's used when activating again. */ + workspace_old->object_mode = object_mode; + } + } + + if (workspace_new->object_mode != OB_MODE_OBJECT) { + object_mode_set = true; + } + } + } + WM_window_set_active_layout(win, workspace_new, layout_new); WM_window_set_active_workspace(win, workspace_new); @@ -179,6 +216,12 @@ bool ED_workspace_change( WM_toolsystem_unlink(C, workspace_old); WM_toolsystem_link(C, workspace_new); + if (object_mode_set) { + eObjectMode object_mode = workspace_new->object_mode; + workspace_new->object_mode = OB_MODE_OBJECT; + ED_object_mode_generic_enter(C, object_mode); + } + return true; } |