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-22 10:15:34 +0300
committerCampbell Barton <ideasman42@gmail.com>2018-02-22 10:18:44 +0300
commit4ab002bca36ace4d2b4b21efce622a682b99b844 (patch)
tree8127eca822cc9a80bb6951127bfa06eab5791655 /source/blender/editors/screen/workspace_edit.c
parent5b857102fa6d3e1f92530343448b142c9666e8d8 (diff)
WorkSpace: object-mode switching support
When changing workspaces, existing object-mode data is freed the new workspaces mode is entered (if possible).
Diffstat (limited to 'source/blender/editors/screen/workspace_edit.c')
-rw-r--r--source/blender/editors/screen/workspace_edit.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/source/blender/editors/screen/workspace_edit.c b/source/blender/editors/screen/workspace_edit.c
index 1ec83ed7c08..465e30357dc 100644
--- a/source/blender/editors/screen/workspace_edit.c
+++ b/source/blender/editors/screen/workspace_edit.c
@@ -56,6 +56,8 @@
#include "RNA_access.h"
+#include "DEG_depsgraph.h"
+
#include "UI_interface.h"
#include "UI_resources.h"
@@ -166,6 +168,41 @@ bool ED_workspace_change(
BLI_assert(BKE_workspace_layout_screen_get(layout_new) == screen_new);
if (screen_new) {
+ bool object_mode_set = false;
+
+ /* 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))
+ {
+ /* pass */
+ }
+ 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;
+ }
+ }
+
+ if (workspace_new->object_mode != OB_MODE_OBJECT) {
+ object_mode_set = true;
+ }
+ }
+ }
+
WM_window_set_active_layout(win, workspace_new, layout_new);
WM_window_set_active_workspace(win, workspace_new);
@@ -179,6 +216,12 @@ 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;
+ workspace_new->object_mode = OB_MODE_OBJECT;
+ ED_object_mode_generic_enter(C, object_mode);
+ }
+
return true;
}