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 15:04:19 +0300
committerCampbell Barton <ideasman42@gmail.com>2018-03-02 15:04:19 +0300
commit35bd1bb957b3c7491875d58d0092eab39c3b4e0e (patch)
treeb4e29938a9f1988413ec311506ebb2f0805865c3 /source/blender
parent437801bec1f4140b255927e6e6c957fa5b453014 (diff)
WorkSpace: move edit mode w/ sync into own func
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/editors/include/ED_object.h3
-rw-r--r--source/blender/editors/object/object_modes.c40
-rw-r--r--source/blender/editors/scene/scene_edit.c14
-rw-r--r--source/blender/editors/screen/workspace_edit.c15
4 files changed, 48 insertions, 24 deletions
diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h
index 33a8ee133ea..80f230fd868 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -219,6 +219,9 @@ bool ED_object_mode_generic_has_data(
const struct EvaluationContext *eval_ctx,
struct Object *ob);
+bool ED_object_mode_generic_enter_or_other_window(
+ struct bContext *C, 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 8cdec2968b3..47cbf782e07 100644
--- a/source/blender/editors/object/object_modes.c
+++ b/source/blender/editors/object/object_modes.c
@@ -45,6 +45,8 @@
#include "DEG_depsgraph.h"
+#include "ED_screen.h"
+
#include "ED_object.h" /* own include */
/* -------------------------------------------------------------------- */
@@ -242,3 +244,41 @@ bool ED_object_mode_generic_has_data(
}
/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Mode Syncing Utils
+ *
+ * \{ */
+
+/**
+ * A version of #ED_object_mode_generic_enter that checks if the object
+ * 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)
+{
+ WorkSpace *workspace = CTX_wm_workspace(C);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ Base *basact = view_layer->basact;
+ if (basact == NULL) {
+ workspace->object_mode = OB_MODE_OBJECT;
+ return (workspace->object_mode == object_mode);
+ }
+
+ 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;
+
+ if (use_object_mode) {
+ workspace->object_mode = object_mode_set;
+ return (workspace->object_mode == object_mode);
+ }
+ else {
+ workspace->object_mode = OB_MODE_OBJECT;
+ return ED_object_mode_generic_enter(C, object_mode);
+ }
+}
+
+/** \} */
diff --git a/source/blender/editors/scene/scene_edit.c b/source/blender/editors/scene/scene_edit.c
index cee73c28767..462820c93c0 100644
--- a/source/blender/editors/scene/scene_edit.c
+++ b/source/blender/editors/scene/scene_edit.c
@@ -156,20 +156,8 @@ void ED_scene_change_update(
if (obact_new == obact_old) {
/* pass */
}
- else if (obact_new == NULL) {
- workspace->object_mode = OB_MODE_OBJECT;
- }
else {
- eObjectMode object_mode_set = OB_MODE_OBJECT;
- if (ED_workspace_object_mode_in_other_window(
- bmain->wm.first, win, obact_new, &object_mode_set))
- {
- workspace->object_mode = object_mode_set;
- }
- else {
- workspace->object_mode = OB_MODE_OBJECT;
- ED_object_mode_generic_enter(C, object_mode_old);
- }
+ ED_object_mode_generic_enter_or_other_window(C, object_mode_old);
}
diff --git a/source/blender/editors/screen/workspace_edit.c b/source/blender/editors/screen/workspace_edit.c
index 7635a2644f5..23715f667fe 100644
--- a/source/blender/editors/screen/workspace_edit.c
+++ b/source/blender/editors/screen/workspace_edit.c
@@ -221,19 +221,12 @@ bool ED_workspace_change(
WM_toolsystem_unlink(C, workspace_old);
WM_toolsystem_link(C, workspace_new);
- if (obact_new == NULL) {
- workspace_new->object_mode = OB_MODE_OBJECT;
+ if (use_object_mode) {
+ ED_object_mode_generic_enter_or_other_window(C, workspace_new->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, win, obact_new, &object_mode_set))
- {
- workspace_new->object_mode = object_mode_set;
- }
- else {
+ else {
+ if (obact_new == NULL) {
workspace_new->object_mode = OB_MODE_OBJECT;
- ED_object_mode_generic_enter(C, object_mode_set);
}
}