diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-03-02 11:01:38 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-03-02 11:01:38 +0300 |
commit | 8153f89518b4a16852f3e3039e46bc06e82d1d23 (patch) | |
tree | 15d12fe04a94f8b633a9c049c9de5b447c812ddd /source/blender/editors/screen/workspace_edit.c | |
parent | eee3a4d3ab7eaa9305b1751c25e3be5c9b9b4546 (diff) |
WorkSpace: object-sync when changing workspaces.
Diffstat (limited to 'source/blender/editors/screen/workspace_edit.c')
-rw-r--r-- | source/blender/editors/screen/workspace_edit.c | 48 |
1 files changed, 31 insertions, 17 deletions
diff --git a/source/blender/editors/screen/workspace_edit.c b/source/blender/editors/screen/workspace_edit.c index ae183aeb72a..393e99010a7 100644 --- a/source/blender/editors/screen/workspace_edit.c +++ b/source/blender/editors/screen/workspace_edit.c @@ -169,18 +169,18 @@ bool ED_workspace_change( BLI_assert(BKE_workspace_layout_screen_get(layout_new) == screen_new); if (screen_new) { - bool object_mode_set = false; + bool use_object_mode = false; + + Scene *scene = WM_window_get_active_scene(win); + 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); /* 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)) { @@ -189,17 +189,21 @@ bool ED_workspace_change( 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; + bool obact_old_is_active = + ED_workspace_object_mode_in_other_window(bmain->wm.first, workspace_old, obact_old, NULL); + if (obact_old_is_active == false) { + 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; + use_object_mode = true; } } } @@ -217,10 +221,20 @@ 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; + if (obact_new == NULL) { workspace_new->object_mode = OB_MODE_OBJECT; - ED_object_mode_generic_enter(C, object_mode); + } + else if (use_object_mode) { + eObjectMode object_mode_set = workspace_new->object_mode; + if (ED_workspace_object_mode_in_other_window( + bmain->wm.first, workspace_new, obact_new, &object_mode_set)) + { + workspace_new->object_mode = object_mode_set; + } + else { + workspace_new->object_mode = OB_MODE_OBJECT; + ED_object_mode_generic_enter(C, object_mode_set); + } } return true; |