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-03-02 11:01:38 +0300
committerCampbell Barton <ideasman42@gmail.com>2018-03-02 11:01:38 +0300
commit8153f89518b4a16852f3e3039e46bc06e82d1d23 (patch)
tree15d12fe04a94f8b633a9c049c9de5b447c812ddd /source/blender/editors/screen/workspace_edit.c
parenteee3a4d3ab7eaa9305b1751c25e3be5c9b9b4546 (diff)
WorkSpace: object-sync when changing workspaces.
Diffstat (limited to 'source/blender/editors/screen/workspace_edit.c')
-rw-r--r--source/blender/editors/screen/workspace_edit.c48
1 files changed, 31 insertions, 17 deletions
diff --git a/source/blender/editors/screen/workspace_edit.c b/source/blender/editors/screen/workspace_edit.c
index ae183aeb72a..393e99010a7 100644
--- a/source/blender/editors/screen/workspace_edit.c
+++ b/source/blender/editors/screen/workspace_edit.c
@@ -169,18 +169,18 @@ bool ED_workspace_change(
BLI_assert(BKE_workspace_layout_screen_get(layout_new) == screen_new);
if (screen_new) {
- bool object_mode_set = false;
+ bool use_object_mode = false;
+
+ Scene *scene = WM_window_get_active_scene(win);
+ ViewLayer *view_layer_old = BKE_workspace_view_layer_get(workspace_old, scene);
+ ViewLayer *view_layer_new = BKE_workspace_view_layer_get(workspace_new, scene);
+ Object *obact_old = OBACT(view_layer_old);
+ Object *obact_new = OBACT(view_layer_new);
/* Handle object mode switching */
if ((workspace_old->object_mode != OB_MODE_OBJECT) ||
(workspace_new->object_mode != OB_MODE_OBJECT))
{
- Scene *scene = CTX_data_scene(C);
- ViewLayer *view_layer_old = BKE_workspace_view_layer_get(workspace_old, scene);
- ViewLayer *view_layer_new = BKE_workspace_view_layer_get(workspace_new, scene);
- Object *obact_old = OBACT(view_layer_old);
- Object *obact_new = OBACT(view_layer_new);
-
if ((workspace_old->object_mode == workspace_new->object_mode) &&
(obact_old == obact_new))
{
@@ -189,17 +189,21 @@ bool ED_workspace_change(
else {
if (workspace_old->object_mode & OB_MODE_ALL_MODE_DATA) {
if (obact_old) {
- eObjectMode object_mode = workspace_old->object_mode;
- EvaluationContext eval_ctx;
- CTX_data_eval_ctx(C, &eval_ctx);
- ED_object_mode_generic_exit(&eval_ctx, workspace_old, scene, obact_old);
- /* weak, set it back so it's used when activating again. */
- workspace_old->object_mode = object_mode;
+ bool obact_old_is_active =
+ ED_workspace_object_mode_in_other_window(bmain->wm.first, workspace_old, obact_old, NULL);
+ if (obact_old_is_active == false) {
+ eObjectMode object_mode = workspace_old->object_mode;
+ EvaluationContext eval_ctx;
+ CTX_data_eval_ctx(C, &eval_ctx);
+ ED_object_mode_generic_exit(&eval_ctx, workspace_old, scene, obact_old);
+ /* weak, set it back so it's used when activating again. */
+ workspace_old->object_mode = object_mode;
+ }
}
}
if (workspace_new->object_mode != OB_MODE_OBJECT) {
- object_mode_set = true;
+ use_object_mode = true;
}
}
}
@@ -217,10 +221,20 @@ bool ED_workspace_change(
WM_toolsystem_unlink(C, workspace_old);
WM_toolsystem_link(C, workspace_new);
- if (object_mode_set) {
- eObjectMode object_mode = workspace_new->object_mode;
+ if (obact_new == NULL) {
workspace_new->object_mode = OB_MODE_OBJECT;
- ED_object_mode_generic_enter(C, object_mode);
+ }
+ else if (use_object_mode) {
+ eObjectMode object_mode_set = workspace_new->object_mode;
+ if (ED_workspace_object_mode_in_other_window(
+ bmain->wm.first, workspace_new, obact_new, &object_mode_set))
+ {
+ workspace_new->object_mode = object_mode_set;
+ }
+ else {
+ workspace_new->object_mode = OB_MODE_OBJECT;
+ ED_object_mode_generic_enter(C, object_mode_set);
+ }
}
return true;