diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-03-02 15:04:19 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-03-02 15:04:19 +0300 |
commit | 35bd1bb957b3c7491875d58d0092eab39c3b4e0e (patch) | |
tree | b4e29938a9f1988413ec311506ebb2f0805865c3 /source | |
parent | 437801bec1f4140b255927e6e6c957fa5b453014 (diff) |
WorkSpace: move edit mode w/ sync into own func
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/editors/include/ED_object.h | 3 | ||||
-rw-r--r-- | source/blender/editors/object/object_modes.c | 40 | ||||
-rw-r--r-- | source/blender/editors/scene/scene_edit.c | 14 | ||||
-rw-r--r-- | source/blender/editors/screen/workspace_edit.c | 15 |
4 files changed, 48 insertions, 24 deletions
diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h index 33a8ee133ea..80f230fd868 100644 --- a/source/blender/editors/include/ED_object.h +++ b/source/blender/editors/include/ED_object.h @@ -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, diff --git a/source/blender/editors/object/object_modes.c b/source/blender/editors/object/object_modes.c index 8cdec2968b3..47cbf782e07 100644 --- a/source/blender/editors/object/object_modes.c +++ b/source/blender/editors/object/object_modes.c @@ -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); + } +} + +/** \} */ diff --git a/source/blender/editors/scene/scene_edit.c b/source/blender/editors/scene/scene_edit.c index cee73c28767..462820c93c0 100644 --- a/source/blender/editors/scene/scene_edit.c +++ b/source/blender/editors/scene/scene_edit.c @@ -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); } diff --git a/source/blender/editors/screen/workspace_edit.c b/source/blender/editors/screen/workspace_edit.c index 7635a2644f5..23715f667fe 100644 --- a/source/blender/editors/screen/workspace_edit.c +++ b/source/blender/editors/screen/workspace_edit.c @@ -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); } } |