diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-02-28 08:27:55 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-02-28 12:04:21 +0300 |
commit | 9e9cb9fce9c74d32b4f7fad9fdbcbbc59acc53b9 (patch) | |
tree | 2b31b3db0c7d89558cfe14b6a924ff2e0f1f5c1e /source/blender/editors/screen/workspace_edit.c | |
parent | c0d6627dc5fd069ec31c116e98e1817a0fe20ebb (diff) |
Workspace: sync object-modes to other workspaces
When changing the mode of an object, apply this to all other
workspaces that share the same active object.
Also use copy the object-mode when duplicating workspaces.
Diffstat (limited to 'source/blender/editors/screen/workspace_edit.c')
-rw-r--r-- | source/blender/editors/screen/workspace_edit.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/source/blender/editors/screen/workspace_edit.c b/source/blender/editors/screen/workspace_edit.c index 465e30357dc..94527b82ce8 100644 --- a/source/blender/editors/screen/workspace_edit.c +++ b/source/blender/editors/screen/workspace_edit.c @@ -36,6 +36,7 @@ #include "BKE_context.h" #include "BKE_idcode.h" #include "BKE_main.h" +#include "BKE_layer.h" #include "BKE_library.h" #include "BKE_report.h" #include "BKE_scene.h" @@ -248,6 +249,7 @@ WorkSpace *ED_workspace_duplicate( BLI_duplicatelist(transform_orientations_new, transform_orientations_old); workspace_new->tool = workspace_old->tool; + workspace_new->object_mode = workspace_old->object_mode; for (WorkSpaceLayout *layout_old = layouts_old->first; layout_old; layout_old = layout_old->next) { WorkSpaceLayout *layout_new = ED_workspace_layout_duplicate(workspace_new, layout_old, win); @@ -304,6 +306,41 @@ void ED_workspace_view_layer_unset( } } +/** + * When a work-space mode has changed, + * flush it to all other visible work-spaces using the same object + * since we don't support one object being in two different modes at once. + * \note We could support this but it's more trouble than it's worth. + */ + +void ED_workspace_object_mode_sync_from_object(wmWindowManager *wm, WorkSpace *workspace, Object *obact) +{ + if (obact == NULL) { + return; + } + 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 = BKE_view_layer_from_workspace_get(scene_iter, workspace_iter); + if (obact == OBACT(view_layer)) { + workspace_iter->object_mode = workspace->object_mode; + /* TODO(campbell), use msgbus */ + WM_main_add_notifier(NC_SCENE | ND_MODE | NS_MODE_OBJECT, scene_iter); + } + } + } +} + +void ED_workspace_object_mode_sync_from_scene(wmWindowManager *wm, WorkSpace *workspace, Scene *scene) +{ + ViewLayer *view_layer = BKE_workspace_view_layer_get(workspace, scene); + if (view_layer) { + Object *obact = obact = OBACT(view_layer); + ED_workspace_object_mode_sync_from_object(wm, workspace, obact); + } +} + /** \} Workspace API */ |