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);
|
struct wmWindowManager *wm, WorkSpace *workspace, struct Scene *scene);
|
||||||
|
|
||||||
bool ED_workspace_object_mode_in_other_window(
|
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);
|
eObjectMode *r_object_mode);
|
||||||
|
|
||||||
/* anim */
|
/* anim */
|
||||||
|
@@ -124,13 +124,15 @@ void ED_object_base_activate(bContext *C, Base *base)
|
|||||||
{
|
{
|
||||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
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);
|
WorkSpace *workspace = CTX_wm_workspace(C);
|
||||||
|
|
||||||
eObjectMode object_mode = workspace->object_mode;
|
eObjectMode object_mode = workspace->object_mode;
|
||||||
eObjectMode object_mode_set = OB_MODE_OBJECT;
|
eObjectMode object_mode_set = OB_MODE_OBJECT;
|
||||||
|
|
||||||
if (base && ED_workspace_object_mode_in_other_window(
|
if (base && ED_workspace_object_mode_in_other_window(
|
||||||
CTX_wm_manager(C), workspace, base->object,
|
wm, win, base->object,
|
||||||
&object_mode_set))
|
&object_mode_set))
|
||||||
{
|
{
|
||||||
/* Sync existing object mode with workspace. */
|
/* 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.
|
* Not correct because it's possible other work-spaces use these.
|
||||||
* although that's a corner case. */
|
* although that's a corner case. */
|
||||||
if (workspace->object_mode & OB_MODE_ALL_MODE_DATA) {
|
if (workspace->object_mode & OB_MODE_ALL_MODE_DATA) {
|
||||||
wmWindowManager *wm = CTX_wm_manager(C);
|
|
||||||
EvaluationContext eval_ctx;
|
EvaluationContext eval_ctx;
|
||||||
CTX_data_eval_ctx(C, &eval_ctx);
|
CTX_data_eval_ctx(C, &eval_ctx);
|
||||||
FOREACH_OBJECT_BEGIN(view_layer, ob) {
|
FOREACH_OBJECT_BEGIN(view_layer, ob) {
|
||||||
if (ob != obact) {
|
if (ob != obact) {
|
||||||
if (ED_object_mode_generic_has_data(&eval_ctx, ob) &&
|
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);
|
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);
|
Object *obact_old = OBACT(layer_old);
|
||||||
if (obact_old && (obact_new != obact_old)) {
|
if (obact_old && (obact_new != obact_old)) {
|
||||||
bool obact_old_is_active =
|
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)) {
|
if (obact_old && (obact_old_is_active == false)) {
|
||||||
EvaluationContext eval_ctx;
|
EvaluationContext eval_ctx;
|
||||||
CTX_data_eval_ctx(C, &eval_ctx);
|
CTX_data_eval_ctx(C, &eval_ctx);
|
||||||
@@ -162,7 +162,7 @@ void ED_scene_change_update(
|
|||||||
else {
|
else {
|
||||||
eObjectMode object_mode_set = OB_MODE_OBJECT;
|
eObjectMode object_mode_set = OB_MODE_OBJECT;
|
||||||
if (ED_workspace_object_mode_in_other_window(
|
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;
|
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 (workspace_old->object_mode & OB_MODE_ALL_MODE_DATA) {
|
||||||
if (obact_old) {
|
if (obact_old) {
|
||||||
bool obact_old_is_active =
|
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) {
|
if (obact_old_is_active == false) {
|
||||||
eObjectMode object_mode = workspace_old->object_mode;
|
eObjectMode object_mode = workspace_old->object_mode;
|
||||||
EvaluationContext eval_ctx;
|
EvaluationContext eval_ctx;
|
||||||
@@ -227,7 +227,7 @@ bool ED_workspace_change(
|
|||||||
else if (use_object_mode) {
|
else if (use_object_mode) {
|
||||||
eObjectMode object_mode_set = workspace_new->object_mode;
|
eObjectMode object_mode_set = workspace_new->object_mode;
|
||||||
if (ED_workspace_object_mode_in_other_window(
|
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;
|
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(
|
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)
|
eObjectMode *r_object_mode)
|
||||||
{
|
{
|
||||||
for (wmWindow *win = wm->windows.first; win; win = win->next) {
|
for (wmWindow *win_iter = wm->windows.first; win_iter; win_iter = win_iter->next) {
|
||||||
WorkSpace *workspace_iter = BKE_workspace_active_get(win->workspace_hook);
|
if (win_compare != win_iter) {
|
||||||
if (workspace != workspace_iter) {
|
WorkSpace *workspace_iter = BKE_workspace_active_get(win_iter->workspace_hook);
|
||||||
Scene *scene_iter = WM_window_get_active_scene(win);
|
Scene *scene_iter = WM_window_get_active_scene(win_iter);
|
||||||
ViewLayer *view_layer_iter = BKE_view_layer_from_workspace_get(scene_iter, workspace_iter);
|
ViewLayer *view_layer_iter = BKE_view_layer_from_workspace_get(scene_iter, workspace_iter);
|
||||||
Object *obact_iter = OBACT(view_layer_iter);
|
Object *obact_iter = OBACT(view_layer_iter);
|
||||||
if (obact == obact_iter) {
|
if (obact == obact_iter) {
|
||||||
|
Reference in New Issue
Block a user