Commit: 8153f89518b4a16852f3e3039e46bc06e82d1d23
Author: Campbell Barton
Date:   Fri Mar 2 19:01:38 2018 +1100
Branches: blender2.8
https://developer.blender.org/rB8153f89518b4a16852f3e3039e46bc06e82d1d23

WorkSpace: object-sync when changing workspaces.

===================================================================

M       source/blender/editors/screen/workspace_edit.c

===================================================================

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;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to