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 */

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

Reply via email to