diff options
author | Julian Eisel <eiseljulian@gmail.com> | 2018-04-08 13:51:13 +0300 |
---|---|---|
committer | Julian Eisel <eiseljulian@gmail.com> | 2018-04-08 13:51:13 +0300 |
commit | 3a2d7ef54150e19ce3e7b3d8126c46b8e9005d3e (patch) | |
tree | b48e3b13bf6761fd164dcc4a88362c4e9089bba2 /source/blender/editors/screen/workspace_edit.c | |
parent | aee5a80a83e48afc3b0b978b5087f8c05af6f54e (diff) | |
parent | 0b5ebb3265b155658d441135e152f32ba11c001d (diff) |
Merge branch 'blender2.8' into topbar
Diffstat (limited to 'source/blender/editors/screen/workspace_edit.c')
-rw-r--r-- | source/blender/editors/screen/workspace_edit.c | 129 |
1 files changed, 25 insertions, 104 deletions
diff --git a/source/blender/editors/screen/workspace_edit.c b/source/blender/editors/screen/workspace_edit.c index e1bcec01a8a..48453103c90 100644 --- a/source/blender/editors/screen/workspace_edit.c +++ b/source/blender/editors/screen/workspace_edit.c @@ -85,6 +85,26 @@ WorkSpace *ED_workspace_add( return workspace; } +/** + * Changes the object mode (if needed) to the one set in \a workspace_new. + * Object mode is still stored on object level. In future it should all be workspace level instead. + */ +static void workspace_change_update_mode( + const WorkSpace *workspace_old, const WorkSpace *workspace_new, + bContext *C, Object *ob_act, ReportList *reports) +{ + UNUSED_VARS(workspace_old, workspace_new, C, ob_act, reports); +#if 0 + eObjectMode mode_old = workspace_old->object_mode; + eObjectMode mode_new = workspace_new->object_mode; + + if (mode_old != mode_new) { + ED_object_mode_compat_set(C, ob_act, mode_new, reports); + ED_object_mode_toggle(C, mode_new); + } +#endif +} + static void workspace_change_update_view_layer( WorkSpace *workspace_new, const WorkSpace *workspace_old, Scene *scene) @@ -96,10 +116,11 @@ static void workspace_change_update_view_layer( static void workspace_change_update( WorkSpace *workspace_new, const WorkSpace *workspace_old, - bContext *C) + bContext *C, wmWindowManager *wm) { /* needs to be done before changing mode! (to ensure right context) */ workspace_change_update_view_layer(workspace_new, workspace_old, CTX_data_scene(C)); + workspace_change_update_mode(workspace_old, workspace_new, C, CTX_data_active_object(C), &wm->reports); } static bool workspace_change_find_new_layout_cb(const WorkSpaceLayout *layout, void *UNUSED(arg)) @@ -151,7 +172,7 @@ static WorkSpaceLayout *workspace_change_get_new_layout( * \returns if workspace changing was successful. */ bool ED_workspace_change( - WorkSpace *workspace_new, bContext *C, wmWindow *win) + WorkSpace *workspace_new, bContext *C, wmWindowManager *wm, wmWindow *win) { Main *bmain = CTX_data_main(C); WorkSpace *workspace_old = WM_window_get_active_workspace(win); @@ -169,39 +190,11 @@ bool ED_workspace_change( BLI_assert(BKE_workspace_layout_screen_get(layout_new) == screen_new); if (screen_new) { - bool use_object_mode = false; - - /* Store old context for exiting edit-mode. */ - EvaluationContext eval_ctx_old; - CTX_data_eval_ctx(C, &eval_ctx_old); - Scene *scene = WM_window_get_active_scene(win); - ViewLayer *view_layer_old = BKE_workspace_view_layer_get(workspace_old, scene); - Object *obact_old = OBACT(view_layer_old); - - ViewLayer *view_layer_new = BKE_workspace_view_layer_get(workspace_new, scene); - Object *obact_new = OBACT(view_layer_new); - - /* Handle object mode switching */ - if ((workspace_old->object_mode != OB_MODE_OBJECT) || - (workspace_new->object_mode != OB_MODE_OBJECT)) - { - if ((workspace_old->object_mode == workspace_new->object_mode) && - (obact_old == obact_new)) - { - /* pass */ - } - else { - use_object_mode = true; - } - } - - WM_window_set_active_layout(win, workspace_new, layout_new); WM_window_set_active_workspace(win, workspace_new); /* update screen *after* changing workspace - which also causes the actual screen change */ - screen_change_update(C, win, screen_new); - workspace_change_update(workspace_new, workspace_old, C); + workspace_change_update(workspace_new, workspace_old, C, wm); BLI_assert(BKE_workspace_view_layer_get(workspace_new, CTX_data_scene(C)) != NULL); BLI_assert(CTX_wm_workspace(C) == workspace_new); @@ -209,20 +202,6 @@ bool ED_workspace_change( WM_toolsystem_unlink(C, workspace_old); WM_toolsystem_link(C, workspace_new); - if (use_object_mode) { - /* weak, set it back so it's used when activating again. */ - eObjectMode object_mode = workspace_old->object_mode; - ED_object_mode_generic_exit_or_other_window(&eval_ctx_old, bmain->wm.first, workspace_old, scene, obact_old); - workspace_old->object_mode = object_mode; - ED_workspace_object_mode_sync_from_object(bmain->wm.first, workspace_old, obact_old); - ED_object_mode_generic_enter_or_other_window(C, NULL, workspace_new->object_mode); - } - else { - if (obact_new == NULL) { - workspace_new->object_mode = OB_MODE_OBJECT; - } - } - return true; } @@ -249,7 +228,6 @@ WorkSpace *ED_workspace_duplicate( BLI_duplicatelist(transform_orientations_new, transform_orientations_old); workspace_new->tool = workspace_old->tool; - workspace_new->object_mode = workspace_old->object_mode; for (WorkSpaceLayout *layout_old = layouts_old->first; layout_old; layout_old = layout_old->next) { WorkSpaceLayout *layout_new = ED_workspace_layout_duplicate(workspace_new, layout_old, win); @@ -277,7 +255,7 @@ bool ED_workspace_delete( WorkSpace *prev = workspace_id->prev; WorkSpace *next = workspace_id->next; - ED_workspace_change((prev != NULL) ? prev : next, C, win); + ED_workspace_change((prev != NULL) ? prev : next, C, wm, win); } BKE_libblock_free(bmain, workspace_id); @@ -306,63 +284,6 @@ void ED_workspace_view_layer_unset( } } -/** - * When a work-space mode has changed, - * flush it to all other visible work-spaces using the same object - * since we don't support one object being in two different modes at once. - * \note We could support this but it's more trouble than it's worth. - */ - -void ED_workspace_object_mode_sync_from_object(wmWindowManager *wm, WorkSpace *workspace, Object *obact) -{ - if (obact == NULL) { - return; - } - for (wmWindow *win = wm->windows.first; win; win = win->next) { - WorkSpace *workspace_iter = BKE_workspace_active_get(win->workspace_hook); - if ((workspace != workspace_iter) && (workspace->object_mode != workspace_iter->object_mode)) { - Scene *scene_iter = WM_window_get_active_scene(win); - ViewLayer *view_layer = BKE_view_layer_from_workspace_get(scene_iter, workspace_iter); - if (obact == OBACT(view_layer)) { - workspace_iter->object_mode = workspace->object_mode; - /* TODO(campbell), use msgbus */ - WM_main_add_notifier(NC_SCENE | ND_MODE | NS_MODE_OBJECT, scene_iter); - } - } - } -} - -void ED_workspace_object_mode_sync_from_scene(wmWindowManager *wm, WorkSpace *workspace, Scene *scene) -{ - ViewLayer *view_layer = BKE_workspace_view_layer_get(workspace, scene); - if (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, const wmWindow *win_compare, Object *obact, - eObjectMode *r_object_mode) -{ - 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) { - if (r_object_mode) { - *r_object_mode = workspace_iter->object_mode; - } - return true; - } - } - } - - return false; -} - /** \} Workspace API */ |