[Bf-blender-cvs] [1aeb9294f4a] blender2.8: WorkSpace: use existing objects mode on select

Campbell Barton noreply at git.blender.org
Wed Feb 28 13:05:58 CET 2018


Commit: 1aeb9294f4aad7f7cdc6aa1b946d0f92e413710f
Author: Campbell Barton
Date:   Wed Feb 28 23:09:33 2018 +1100
Branches: blender2.8
https://developer.blender.org/rB1aeb9294f4aad7f7cdc6aa1b946d0f92e413710f

WorkSpace: use existing objects mode on select

When selecting an object which is already visible in another window
use the mode from that workspace without performing any mode switching.

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

M	source/blender/editors/include/ED_screen.h
M	source/blender/editors/object/object_select.c
M	source/blender/editors/screen/workspace_edit.c

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

diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index a98f8287162..86b9b82e4f7 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -37,6 +37,8 @@
 #include "DNA_view3d_types.h"
 #include "DNA_workspace_types.h"
 
+#include "DNA_object_enums.h"
+
 #include "BLI_compiler_attrs.h"
 
 struct Depsgraph;
@@ -192,6 +194,10 @@ void ED_workspace_object_mode_sync_from_object(
 void ED_workspace_object_mode_sync_from_scene(
         struct wmWindowManager *wm, WorkSpace *workspace, struct Scene *scene);
 
+bool ED_workspace_object_mode_in_other_window(
+        struct wmWindowManager *wm, WorkSpace *workspace, struct Object *obact,
+        eObjectMode *r_object_mode);
+
 /* anim */
 void    ED_update_for_newframe(struct Main *bmain, struct Scene *scene, struct ViewLayer *view_layer, struct Depsgraph *depsgraph);
 
diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c
index 620ee015724..5eab16cd727 100644
--- a/source/blender/editors/object/object_select.c
+++ b/source/blender/editors/object/object_select.c
@@ -126,20 +126,29 @@ void ED_object_base_activate(bContext *C, Base *base)
 
 	WorkSpace *workspace = CTX_wm_workspace(C);
 
-	bool reset = true;
-	if (base) {
-		Object *ob_prev = OBACT(view_layer);
-		Object *ob_curr = base->object;
-		if (ob_prev != NULL) {
-			if (ob_prev->type == ob_curr->type) {
-				reset = false;
-			}
-		}
-	}
-
 	eObjectMode object_mode = workspace->object_mode;
+	eObjectMode object_mode_set = OB_MODE_OBJECT;
 
+	if (base && ED_workspace_object_mode_in_other_window(
+	            CTX_wm_manager(C), workspace, base->object,
+	            &object_mode_set))
 	{
+		/* Sync existing object mode with workspace. */
+		workspace->object_mode = object_mode_set;
+	}
+	else {
+		/* Apply the workspaces more to the object (when possible). */
+		bool reset = true;
+		if (base) {
+			Object *ob_prev = OBACT(view_layer);
+			Object *ob_curr = base->object;
+			if (ob_prev != NULL) {
+				if (ob_prev->type == ob_curr->type) {
+					reset = false;
+				}
+			}
+		}
+
 		Scene *scene = CTX_data_scene(C);
 		Object *obact = base ? base->object : NULL;
 		/* We don't know the previous active object in update.
@@ -156,14 +165,14 @@ void ED_object_base_activate(bContext *C, Base *base)
 			}
 			FOREACH_OBJECT_END;
 		}
-	}
 
-	workspace->object_mode = OB_MODE_OBJECT;
+		workspace->object_mode = OB_MODE_OBJECT;
 
-	view_layer->basact = base;
+		view_layer->basact = base;
 
-	if (reset == false) {
-		ED_object_mode_generic_enter(C, object_mode);
+		if (reset == false) {
+			ED_object_mode_generic_enter(C, object_mode);
+		}
 	}
 
 	if (base) {
diff --git a/source/blender/editors/screen/workspace_edit.c b/source/blender/editors/screen/workspace_edit.c
index 94527b82ce8..839b7468d4b 100644
--- a/source/blender/editors/screen/workspace_edit.c
+++ b/source/blender/editors/screen/workspace_edit.c
@@ -336,11 +336,31 @@ void ED_workspace_object_mode_sync_from_scene(wmWindowManager *wm, WorkSpace *wo
 {
 	ViewLayer *view_layer = BKE_workspace_view_layer_get(workspace, scene);
 	if (view_layer) {
-		Object *obact = obact = OBACT(view_layer);
+		Object *obact = OBACT(view_layer);
 		ED_workspace_object_mode_sync_from_object(wm, workspace, obact);
 	}
 }
 
+bool ED_workspace_object_mode_in_other_window(
+        struct wmWindowManager *wm, WorkSpace *workspace, Object *obact,
+        eObjectMode *r_object_mode)
+{
+	for (wmWindow *win = wm->windows.first; win; win = win->next) {
+		WorkSpace *workspace_iter = BKE_workspace_active_get(win->workspace_hook);
+		if (workspace != workspace_iter) {
+			Scene *scene_iter = WM_window_get_active_scene(win);
+			ViewLayer *view_layer_iter = BKE_view_layer_from_workspace_get(scene_iter, workspace_iter);
+			Object *obact_iter = OBACT(view_layer_iter);
+			if (obact == obact_iter) {
+				*r_object_mode = workspace_iter->object_mode;
+				return true;
+			}
+		}
+	}
+
+	return false;
+}
+
 /** \} Workspace API */



More information about the Bf-blender-cvs mailing list