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:
-rw-r--r--source/blender/editors/include/ED_object.h11
-rw-r--r--source/blender/editors/object/object_modes.c29
-rw-r--r--source/blender/editors/scene/scene_edit.c9
-rw-r--r--source/blender/editors/screen/workspace_edit.c10
4 files changed, 45 insertions, 14 deletions
diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h
index 296b69ca20b..2a3d5d144ac 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -57,6 +57,7 @@ struct PropertyRNA;
struct EnumPropertyItem;
struct EvaluationContext;
struct WorkSpace;
+struct wmWindow;
struct wmWindowManager;
#include "DNA_object_enums.h"
@@ -211,7 +212,8 @@ bool ED_object_mode_compat_set(struct bContext *C, struct WorkSpace *workspace,
void ED_object_mode_toggle(struct bContext *C, eObjectMode mode);
bool ED_object_mode_generic_enter(
- struct bContext *C, eObjectMode object_mode);
+ struct bContext *C,
+ eObjectMode object_mode);
void ED_object_mode_generic_exit(
const struct EvaluationContext *eval_ctx,
struct WorkSpace *workspace, struct Scene *scene, struct Object *ob);
@@ -220,11 +222,16 @@ bool ED_object_mode_generic_has_data(
struct Object *ob);
bool ED_object_mode_generic_enter_or_other_window(
- struct bContext *C, eObjectMode object_mode);
+ struct bContext *C, const struct wmWindow *win_compare,
+ eObjectMode object_mode);
void ED_object_mode_generic_exit_or_other_window(
const struct EvaluationContext *eval_ctx, struct wmWindowManager *wm,
struct WorkSpace *workspace, struct Scene *scene, struct Object *ob);
+bool ED_object_mode_generic_exists(
+ struct wmWindowManager *wm, struct Object *ob,
+ eObjectMode object_mode);
+
/* object_modifier.c */
enum {
MODIFIER_APPLY_DATA = 1,
diff --git a/source/blender/editors/object/object_modes.c b/source/blender/editors/object/object_modes.c
index 33867a9f33e..33b9ea49ec0 100644
--- a/source/blender/editors/object/object_modes.c
+++ b/source/blender/editors/object/object_modes.c
@@ -255,7 +255,7 @@ bool ED_object_mode_generic_has_data(
* has an active mode mode in another window we need to use another window first.
*/
bool ED_object_mode_generic_enter_or_other_window(
- struct bContext *C, eObjectMode object_mode)
+ struct bContext *C, const wmWindow *win_compare, eObjectMode object_mode)
{
WorkSpace *workspace = CTX_wm_workspace(C);
ViewLayer *view_layer = CTX_data_view_layer(C);
@@ -267,9 +267,7 @@ bool ED_object_mode_generic_enter_or_other_window(
wmWindowManager *wm = CTX_wm_manager(C);
eObjectMode object_mode_set = OB_MODE_OBJECT;
- view_layer->basact = NULL;
- bool use_object_mode = ED_workspace_object_mode_in_other_window(wm, NULL, basact->object, &object_mode_set);
- view_layer->basact = basact;
+ bool use_object_mode = ED_workspace_object_mode_in_other_window(wm, win_compare, basact->object, &object_mode_set);
if (use_object_mode) {
workspace->object_mode = object_mode_set;
@@ -294,4 +292,27 @@ void ED_object_mode_generic_exit_or_other_window(
}
}
+/**
+ * Use to find if we need to create the mode-data.
+ *
+ * When the mode 'exists' it means we have a windowing showing an object with this mode.
+ * So it's data is already created.
+ * Used to check if we need to perform mode switching.
+ */
+bool ED_object_mode_generic_exists(
+ wmWindowManager *wm, struct Object *ob,
+ eObjectMode object_mode)
+{
+ if (ob == NULL) {
+ return false;
+ }
+ eObjectMode object_mode_test;
+ if (ED_workspace_object_mode_in_other_window(wm, NULL, ob, &object_mode_test)) {
+ if (object_mode == object_mode_test) {
+ return true;
+ }
+ }
+ return false;
+}
+
/** \} */
diff --git a/source/blender/editors/scene/scene_edit.c b/source/blender/editors/scene/scene_edit.c
index ba7ad1505c3..da720272f67 100644
--- a/source/blender/editors/scene/scene_edit.c
+++ b/source/blender/editors/scene/scene_edit.c
@@ -135,6 +135,8 @@ void ED_scene_change_update(
eObjectMode object_mode_old = workspace->object_mode;
ViewLayer *layer_old = BKE_view_layer_from_workspace_get(scene_old, workspace);
Object *obact_old = OBACT(layer_old);
+ bool obact_new_mode_exists = ED_object_mode_generic_exists(bmain->wm.first, obact_new, workspace->object_mode);
+
win->scene = scene_new;
CTX_data_scene_set(C, scene_new);
@@ -148,7 +150,12 @@ void ED_scene_change_update(
}
else {
ED_object_mode_generic_exit_or_other_window(&eval_ctx_old, bmain->wm.first, workspace, scene_old, obact_old);
- ED_object_mode_generic_enter_or_other_window(C, object_mode_old);
+ if (obact_new_mode_exists) {
+ workspace->object_mode = object_mode_old;
+ }
+ else {
+ ED_object_mode_generic_enter_or_other_window(C, win, object_mode_old);
+ }
}
ED_screen_update_after_scene_change(screen, scene_new, layer_new);
diff --git a/source/blender/editors/screen/workspace_edit.c b/source/blender/editors/screen/workspace_edit.c
index 8a6c8e8628e..2b28f61f901 100644
--- a/source/blender/editors/screen/workspace_edit.c
+++ b/source/blender/editors/screen/workspace_edit.c
@@ -212,14 +212,10 @@ bool ED_workspace_change(
if (use_object_mode) {
/* weak, set it back so it's used when activating again. */
eObjectMode object_mode = workspace_old->object_mode;
- if (obact_old == obact_new) {
- ED_object_mode_generic_exit(&eval_ctx_old, workspace_old, scene, obact_old);
- }
- else {
- ED_object_mode_generic_exit_or_other_window(&eval_ctx_old, bmain->wm.first, workspace_old, scene, obact_old);
- }
+ ED_object_mode_generic_exit_or_other_window(&eval_ctx_old, bmain->wm.first, workspace_old, scene, obact_old);
workspace_old->object_mode = object_mode;
- ED_object_mode_generic_enter_or_other_window(C, workspace_new->object_mode);
+ ED_workspace_object_mode_sync_from_object(bmain->wm.first, workspace_old, obact_old);
+ ED_object_mode_generic_enter_or_other_window(C, NULL, workspace_new->object_mode);
}
else {
if (obact_new == NULL) {