WorkSpace: move edit mode w/ sync into own func
This commit is contained in:
@@ -219,6 +219,9 @@ bool ED_object_mode_generic_has_data(
|
||||
const struct EvaluationContext *eval_ctx,
|
||||
struct Object *ob);
|
||||
|
||||
bool ED_object_mode_generic_enter_or_other_window(
|
||||
struct bContext *C, eObjectMode object_mode);
|
||||
|
||||
/* object_modifier.c */
|
||||
enum {
|
||||
MODIFIER_APPLY_DATA = 1,
|
||||
|
||||
@@ -45,6 +45,8 @@
|
||||
|
||||
#include "DEG_depsgraph.h"
|
||||
|
||||
#include "ED_screen.h"
|
||||
|
||||
#include "ED_object.h" /* own include */
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
@@ -242,3 +244,41 @@ bool ED_object_mode_generic_has_data(
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/** \name Mode Syncing Utils
|
||||
*
|
||||
* \{ */
|
||||
|
||||
/**
|
||||
* A version of #ED_object_mode_generic_enter that checks if the object
|
||||
* has an active mode mode in another window we need to use another window first.
|
||||
*/
|
||||
bool ED_object_mode_generic_enter_or_other_window(
|
||||
struct bContext *C, eObjectMode object_mode)
|
||||
{
|
||||
WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
Base *basact = view_layer->basact;
|
||||
if (basact == NULL) {
|
||||
workspace->object_mode = OB_MODE_OBJECT;
|
||||
return (workspace->object_mode == object_mode);
|
||||
}
|
||||
|
||||
wmWindowManager *wm = CTX_wm_manager(C);
|
||||
eObjectMode object_mode_set = OB_MODE_OBJECT;
|
||||
view_layer->basact = NULL;
|
||||
bool use_object_mode = ED_workspace_object_mode_in_other_window(wm, NULL, basact->object, &object_mode_set);
|
||||
view_layer->basact = basact;
|
||||
|
||||
if (use_object_mode) {
|
||||
workspace->object_mode = object_mode_set;
|
||||
return (workspace->object_mode == object_mode);
|
||||
}
|
||||
else {
|
||||
workspace->object_mode = OB_MODE_OBJECT;
|
||||
return ED_object_mode_generic_enter(C, object_mode);
|
||||
}
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
||||
@@ -156,20 +156,8 @@ void ED_scene_change_update(
|
||||
if (obact_new == obact_old) {
|
||||
/* pass */
|
||||
}
|
||||
else if (obact_new == NULL) {
|
||||
workspace->object_mode = OB_MODE_OBJECT;
|
||||
}
|
||||
else {
|
||||
eObjectMode object_mode_set = OB_MODE_OBJECT;
|
||||
if (ED_workspace_object_mode_in_other_window(
|
||||
bmain->wm.first, win, obact_new, &object_mode_set))
|
||||
{
|
||||
workspace->object_mode = object_mode_set;
|
||||
}
|
||||
else {
|
||||
workspace->object_mode = OB_MODE_OBJECT;
|
||||
ED_object_mode_generic_enter(C, object_mode_old);
|
||||
}
|
||||
ED_object_mode_generic_enter_or_other_window(C, object_mode_old);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -221,19 +221,12 @@ bool ED_workspace_change(
|
||||
WM_toolsystem_unlink(C, workspace_old);
|
||||
WM_toolsystem_link(C, workspace_new);
|
||||
|
||||
if (obact_new == NULL) {
|
||||
workspace_new->object_mode = OB_MODE_OBJECT;
|
||||
if (use_object_mode) {
|
||||
ED_object_mode_generic_enter_or_other_window(C, workspace_new->object_mode);
|
||||
}
|
||||
else if (use_object_mode) {
|
||||
eObjectMode object_mode_set = workspace_new->object_mode;
|
||||
if (ED_workspace_object_mode_in_other_window(
|
||||
bmain->wm.first, win, obact_new, &object_mode_set))
|
||||
{
|
||||
workspace_new->object_mode = object_mode_set;
|
||||
}
|
||||
else {
|
||||
else {
|
||||
if (obact_new == NULL) {
|
||||
workspace_new->object_mode = OB_MODE_OBJECT;
|
||||
ED_object_mode_generic_enter(C, object_mode_set);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user