[Bf-blender-cvs] [8153f89518b] blender2.8: WorkSpace: object-sync when changing workspaces.

Campbell Barton noreply at git.blender.org
Fri Mar 2 08:56:48 CET 2018


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;



More information about the Bf-blender-cvs mailing list