WorkSpace: ED_workspace_object_mode_in_other_window check other windows

The same workspace can have different active objects depending on the
window. So check other windows.
This commit is contained in:
2018-03-02 20:01:49 +11:00
parent 8153f89518
commit e1f1567b56
4 changed files with 14 additions and 13 deletions

View File

@@ -195,7 +195,7 @@ 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,
struct wmWindowManager *wm, const struct wmWindow *win_compare, struct Object *obact,
eObjectMode *r_object_mode);
/* anim */

View File

@@ -124,13 +124,15 @@ void ED_object_base_activate(bContext *C, Base *base)
{
ViewLayer *view_layer = CTX_data_view_layer(C);
wmWindowManager *wm = CTX_wm_manager(C);
wmWindow *win = CTX_wm_window(C);
WorkSpace *workspace = CTX_wm_workspace(C);
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,
wm, win, base->object,
&object_mode_set))
{
/* Sync existing object mode with workspace. */
@@ -146,13 +148,12 @@ void ED_object_base_activate(bContext *C, Base *base)
* Not correct because it's possible other work-spaces use these.
* although that's a corner case. */
if (workspace->object_mode & OB_MODE_ALL_MODE_DATA) {
wmWindowManager *wm = CTX_wm_manager(C);
EvaluationContext eval_ctx;
CTX_data_eval_ctx(C, &eval_ctx);
FOREACH_OBJECT_BEGIN(view_layer, ob) {
if (ob != obact) {
if (ED_object_mode_generic_has_data(&eval_ctx, ob) &&
ED_workspace_object_mode_in_other_window(wm, workspace, ob, NULL) == false)
ED_workspace_object_mode_in_other_window(wm, win, ob, NULL) == false)
{
ED_object_mode_generic_exit(&eval_ctx, workspace, scene, ob);
}

View File

@@ -135,7 +135,7 @@ void ED_scene_change_update(
Object *obact_old = OBACT(layer_old);
if (obact_old && (obact_new != obact_old)) {
bool obact_old_is_active =
ED_workspace_object_mode_in_other_window(bmain->wm.first, workspace, obact_old, NULL);
ED_workspace_object_mode_in_other_window(bmain->wm.first, win, obact_old, NULL);
if (obact_old && (obact_old_is_active == false)) {
EvaluationContext eval_ctx;
CTX_data_eval_ctx(C, &eval_ctx);
@@ -162,7 +162,7 @@ void ED_scene_change_update(
else {
eObjectMode object_mode_set = OB_MODE_OBJECT;
if (ED_workspace_object_mode_in_other_window(
bmain->wm.first, workspace, obact_new, &object_mode_set))
bmain->wm.first, win, obact_new, &object_mode_set))
{
workspace->object_mode = object_mode_set;
}

View File

@@ -190,7 +190,7 @@ bool ED_workspace_change(
if (workspace_old->object_mode & OB_MODE_ALL_MODE_DATA) {
if (obact_old) {
bool obact_old_is_active =
ED_workspace_object_mode_in_other_window(bmain->wm.first, workspace_old, obact_old, NULL);
ED_workspace_object_mode_in_other_window(bmain->wm.first, win, obact_old, NULL);
if (obact_old_is_active == false) {
eObjectMode object_mode = workspace_old->object_mode;
EvaluationContext eval_ctx;
@@ -227,7 +227,7 @@ bool ED_workspace_change(
else if (use_object_mode) {
eObjectMode object_mode_set = workspace_new->object_mode;
if (ED_workspace_object_mode_in_other_window(
bmain->wm.first, workspace_new, obact_new, &object_mode_set))
bmain->wm.first, win, obact_new, &object_mode_set))
{
workspace_new->object_mode = object_mode_set;
}
@@ -356,13 +356,13 @@ void ED_workspace_object_mode_sync_from_scene(wmWindowManager *wm, WorkSpace *wo
}
bool ED_workspace_object_mode_in_other_window(
struct wmWindowManager *wm, WorkSpace *workspace, Object *obact,
struct wmWindowManager *wm, const wmWindow *win_compare, 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);
for (wmWindow *win_iter = wm->windows.first; win_iter; win_iter = win_iter->next) {
if (win_compare != win_iter) {
WorkSpace *workspace_iter = BKE_workspace_active_get(win_iter->workspace_hook);
Scene *scene_iter = WM_window_get_active_scene(win_iter);
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) {