Remove workspace object mode, reverts changes w/ 2.8

This caused too many problems syncing object modes
with multiple objects/windows/workspaces, see: D3130 for details.
This commit is contained in:
2018-04-05 18:20:27 +02:00
parent 57329304b0
commit 1c24c04e60
176 changed files with 1373 additions and 2279 deletions

View File

@@ -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,20 +190,11 @@ bool ED_workspace_change(
BLI_assert(BKE_workspace_layout_screen_get(layout_new) == screen_new);
if (screen_new) {
Scene *scene = WM_window_get_active_scene(win);
bool use_object_mode = false;
/* Store old context for exiting edit-mode. */
EvaluationContext eval_ctx_old;
CTX_data_eval_ctx(C, &eval_ctx_old);
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);
@@ -190,40 +202,6 @@ bool ED_workspace_change(
WM_toolsystem_unlink(C, workspace_old);
WM_toolsystem_link(C, workspace_new);
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;
}
}
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;
}
@@ -250,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);
@@ -278,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);
@@ -307,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 */