Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2018-02-28 08:27:55 +0300
committerCampbell Barton <ideasman42@gmail.com>2018-02-28 12:04:21 +0300
commit9e9cb9fce9c74d32b4f7fad9fdbcbbc59acc53b9 (patch)
tree2b31b3db0c7d89558cfe14b6a924ff2e0f1f5c1e /source/blender/editors/screen/workspace_edit.c
parentc0d6627dc5fd069ec31c116e98e1817a0fe20ebb (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.c37
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 */