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 15:09:33 +0300
committerCampbell Barton <ideasman42@gmail.com>2018-02-28 15:09:33 +0300
commit1aeb9294f4aad7f7cdc6aa1b946d0f92e413710f (patch)
tree80a76762321862eb871912b5c35ff6fcff9fd769
parent9e9cb9fce9c74d32b4f7fad9fdbcbbc59acc53b9 (diff)
WorkSpace: use existing objects mode on select
When selecting an object which is already visible in another window use the mode from that workspace without performing any mode switching.
-rw-r--r--source/blender/editors/include/ED_screen.h6
-rw-r--r--source/blender/editors/object/object_select.c41
-rw-r--r--source/blender/editors/screen/workspace_edit.c22
3 files changed, 52 insertions, 17 deletions
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index a98f8287162..86b9b82e4f7 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -37,6 +37,8 @@
#include "DNA_view3d_types.h"
#include "DNA_workspace_types.h"
+#include "DNA_object_enums.h"
+
#include "BLI_compiler_attrs.h"
struct Depsgraph;
@@ -192,6 +194,10 @@ void ED_workspace_object_mode_sync_from_object(
void ED_workspace_object_mode_sync_from_scene(
struct wmWindowManager *wm, WorkSpace *workspace, struct Scene *scene);
+bool ED_workspace_object_mode_in_other_window(
+ struct wmWindowManager *wm, WorkSpace *workspace, struct Object *obact,
+ eObjectMode *r_object_mode);
+
/* anim */
void ED_update_for_newframe(struct Main *bmain, struct Scene *scene, struct ViewLayer *view_layer, struct Depsgraph *depsgraph);
diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c
index 620ee015724..5eab16cd727 100644
--- a/source/blender/editors/object/object_select.c
+++ b/source/blender/editors/object/object_select.c
@@ -126,20 +126,29 @@ void ED_object_base_activate(bContext *C, Base *base)
WorkSpace *workspace = CTX_wm_workspace(C);
- bool reset = true;
- if (base) {
- Object *ob_prev = OBACT(view_layer);
- Object *ob_curr = base->object;
- if (ob_prev != NULL) {
- if (ob_prev->type == ob_curr->type) {
- reset = false;
- }
- }
- }
-
eObjectMode object_mode = workspace->object_mode;
+ eObjectMode object_mode_set = OB_MODE_OBJECT;
+ if (base && ED_workspace_object_mode_in_other_window(
+ CTX_wm_manager(C), workspace, base->object,
+ &object_mode_set))
{
+ /* Sync existing object mode with workspace. */
+ workspace->object_mode = object_mode_set;
+ }
+ else {
+ /* Apply the workspaces more to the object (when possible). */
+ bool reset = true;
+ if (base) {
+ Object *ob_prev = OBACT(view_layer);
+ Object *ob_curr = base->object;
+ if (ob_prev != NULL) {
+ if (ob_prev->type == ob_curr->type) {
+ reset = false;
+ }
+ }
+ }
+
Scene *scene = CTX_data_scene(C);
Object *obact = base ? base->object : NULL;
/* We don't know the previous active object in update.
@@ -156,14 +165,14 @@ void ED_object_base_activate(bContext *C, Base *base)
}
FOREACH_OBJECT_END;
}
- }
- workspace->object_mode = OB_MODE_OBJECT;
+ workspace->object_mode = OB_MODE_OBJECT;
- view_layer->basact = base;
+ view_layer->basact = base;
- if (reset == false) {
- ED_object_mode_generic_enter(C, object_mode);
+ if (reset == false) {
+ ED_object_mode_generic_enter(C, object_mode);
+ }
}
if (base) {
diff --git a/source/blender/editors/screen/workspace_edit.c b/source/blender/editors/screen/workspace_edit.c
index 94527b82ce8..839b7468d4b 100644
--- a/source/blender/editors/screen/workspace_edit.c
+++ b/source/blender/editors/screen/workspace_edit.c
@@ -336,11 +336,31 @@ void ED_workspace_object_mode_sync_from_scene(wmWindowManager *wm, WorkSpace *wo
{
ViewLayer *view_layer = BKE_workspace_view_layer_get(workspace, scene);
if (view_layer) {
- Object *obact = obact = OBACT(view_layer);
+ Object *obact = OBACT(view_layer);
ED_workspace_object_mode_sync_from_object(wm, workspace, obact);
}
}
+bool ED_workspace_object_mode_in_other_window(
+ struct wmWindowManager *wm, WorkSpace *workspace, Object *obact,
+ eObjectMode *r_object_mode)
+{
+ 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_iter = BKE_view_layer_from_workspace_get(scene_iter, workspace_iter);
+ Object *obact_iter = OBACT(view_layer_iter);
+ if (obact == obact_iter) {
+ *r_object_mode = workspace_iter->object_mode;
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
/** \} Workspace API */