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:
@@ -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 */
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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) {
|
||||
|
Reference in New Issue
Block a user