#include "DNA_view3d_types.h"
#include "DNA_workspace_types.h"
+#include "DNA_object_enums.h"
+
#include "BLI_compiler_attrs.h"
struct Depsgraph;
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);
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.
}
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) {
{
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 */