diff options
-rw-r--r-- | source/blender/editors/include/ED_screen.h | 6 | ||||
-rw-r--r-- | source/blender/editors/object/object_select.c | 41 | ||||
-rw-r--r-- | source/blender/editors/screen/workspace_edit.c | 22 |
3 files changed, 52 insertions, 17 deletions
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 */ |