Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Eisel <eiseljulian@gmail.com>2018-04-08 13:51:13 +0300
committerJulian Eisel <eiseljulian@gmail.com>2018-04-08 13:51:13 +0300
commit3a2d7ef54150e19ce3e7b3d8126c46b8e9005d3e (patch)
treeb48e3b13bf6761fd164dcc4a88362c4e9089bba2 /source/blender/editors/screen/workspace_edit.c
parentaee5a80a83e48afc3b0b978b5087f8c05af6f54e (diff)
parent0b5ebb3265b155658d441135e152f32ba11c001d (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.c129
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 */