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.
This commit is contained in:
2018-02-28 23:09:33 +11:00
parent 9e9cb9fce9
commit 1aeb9294f4
3 changed files with 52 additions and 17 deletions

View File

@@ -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);

View File

@@ -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;
}
}
}
}
eObjectMode object_mode = workspace->object_mode;
{
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) {

View File

@@ -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 */