[Bf-blender-cvs] [398c6541d0] workspaces: Fix layout duplicating when changing/adding workspaces
Julian Eisel
noreply at git.blender.org
Wed Mar 15 15:18:23 CET 2017
Commit: 398c6541d09b5ee4ac69ffe5c028f19ab61caa35
Author: Julian Eisel
Date: Wed Mar 15 15:13:17 2017 +0100
Branches: workspaces
https://developer.blender.org/rB398c6541d09b5ee4ac69ffe5c028f19ab61caa35
Fix layout duplicating when changing/adding workspaces
Also fixes glitch with name clash handling when duplicating layout.
===================================================================
M source/blender/blenkernel/BKE_workspace.h
M source/blender/blenkernel/intern/workspace.c
M source/blender/editors/workspace/screen_edit.c
M source/blender/editors/workspace/screen_intern.h
M source/blender/editors/workspace/workspace_edit.c
M source/blender/editors/workspace/workspace_layout_edit.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_workspace.h b/source/blender/blenkernel/BKE_workspace.h
index 6751f60bfc..6b59b4a31e 100644
--- a/source/blender/blenkernel/BKE_workspace.h
+++ b/source/blender/blenkernel/BKE_workspace.h
@@ -116,8 +116,8 @@ void BKE_workspace_temp_layout_store_set(WorkSpaceInstanceHook *hook
WorkSpace *BKE_workspace_next_get(const WorkSpace *workspace) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
WorkSpace *BKE_workspace_prev_get(const WorkSpace *workspace) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
-char *BKE_workspace_layout_name_get(WorkSpaceLayout *layout) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
-void BKE_workspace_layout_name_set(WorkSpace *workspace, WorkSpaceLayout *layout, const char *new_name) ATTR_NONNULL();
+const char *BKE_workspace_layout_name_get(const WorkSpaceLayout *layout) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
+void BKE_workspace_layout_name_set(WorkSpace *workspace, WorkSpaceLayout *layout, const char *new_name) ATTR_NONNULL();
struct bScreen *BKE_workspace_layout_screen_get(const WorkSpaceLayout *layout) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
void BKE_workspace_layout_screen_set(WorkSpaceLayout *layout, struct bScreen *screen) ATTR_NONNULL(1);
WorkSpaceLayout *BKE_workspace_layout_next_get(const WorkSpaceLayout *layout) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
diff --git a/source/blender/blenkernel/intern/workspace.c b/source/blender/blenkernel/intern/workspace.c
index cdecfca4fa..bb4dabc876 100644
--- a/source/blender/blenkernel/intern/workspace.c
+++ b/source/blender/blenkernel/intern/workspace.c
@@ -306,7 +306,7 @@ WorkSpace *BKE_workspace_prev_get(const WorkSpace *workspace)
}
-char *BKE_workspace_layout_name_get(WorkSpaceLayout *layout)
+const char *BKE_workspace_layout_name_get(const WorkSpaceLayout *layout)
{
return layout->name;
}
diff --git a/source/blender/editors/workspace/screen_edit.c b/source/blender/editors/workspace/screen_edit.c
index 2abd275a8b..04ece3e20d 100644
--- a/source/blender/editors/workspace/screen_edit.c
+++ b/source/blender/editors/workspace/screen_edit.c
@@ -459,7 +459,7 @@ ScrArea *area_split(bScreen *sc, ScrArea *sa, char dir, float fac, int merge)
/**
* Empty screen, with 1 dummy area without spacedata. Uses window size.
*/
-bScreen *screen_add(wmWindow *win, const char *name, const int winsize_x, const int winsize_y)
+bScreen *screen_add(const char *name, const int winsize_x, const int winsize_y)
{
bScreen *sc;
ScrVert *sv1, *sv2, *sv3, *sv4;
@@ -467,7 +467,6 @@ bScreen *screen_add(wmWindow *win, const char *name, const int winsize_x, const
sc = BKE_libblock_alloc(G.main, ID_SCR, name);
sc->do_refresh = true;
sc->redraws_flag = TIME_ALL_3D_WIN | TIME_ALL_ANIM_WIN;
- sc->winid = win->winid;
sv1 = screen_addvert(sc, 0, 0);
sv2 = screen_addvert(sc, 0, winsize_y - 1);
diff --git a/source/blender/editors/workspace/screen_intern.h b/source/blender/editors/workspace/screen_intern.h
index 3745aa9218..3193420000 100644
--- a/source/blender/editors/workspace/screen_intern.h
+++ b/source/blender/editors/workspace/screen_intern.h
@@ -46,7 +46,7 @@ void ED_area_data_swap(ScrArea *sa1, ScrArea *sa2);
void region_toggle_hidden(struct bContext *C, ARegion *ar, const bool do_fade);
/* screen_edit.c */
-bScreen *screen_add(wmWindow *win, const char *name, const int winsize_x, const int winsize_y);
+bScreen *screen_add(const char *name, const int winsize_x, const int winsize_y);
void screen_data_copy(bScreen *to, bScreen *from);
void screen_new_activate_prepare(const wmWindow *win, bScreen *screen_new);
void screen_changed_update(struct bContext *C, wmWindow *win, bScreen *sc);
diff --git a/source/blender/editors/workspace/workspace_edit.c b/source/blender/editors/workspace/workspace_edit.c
index 23f7120be0..d881424532 100644
--- a/source/blender/editors/workspace/workspace_edit.c
+++ b/source/blender/editors/workspace/workspace_edit.c
@@ -113,9 +113,12 @@ bool ED_workspace_change(bContext *C, wmWindowManager *wm, wmWindow *win, WorkSp
Scene *scene = CTX_data_scene(C);
WorkSpace *workspace_old = WM_window_get_active_workspace(win);
bScreen *screen_old = BKE_workspace_active_screen_get(win->workspace_hook);
+ /* ED_workspace_duplicate may have stored a layout to activate once the workspace gets activated. */
+ WorkSpaceLayout *layout_temp_store = BKE_workspace_temp_layout_store_get(win->workspace_hook);
/* XXX just using first layout when activating workspace - could be smarter
* (store last activated layout per workspace-window combination?) */
- WorkSpaceLayout *layout_new = BKE_workspace_layouts_get(workspace_new)->first;
+ WorkSpaceLayout *layout_new = layout_temp_store ?
+ layout_temp_store : BKE_workspace_layouts_get(workspace_new)->first;
bScreen *screen_new = BKE_workspace_layout_screen_get(layout_new);
if (workspace_old == workspace_new) {
@@ -123,6 +126,8 @@ bool ED_workspace_change(bContext *C, wmWindowManager *wm, wmWindow *win, WorkSp
return false;
}
+ BKE_workspace_temp_layout_store_set(win->workspace_hook, NULL);
+
if (screen_new->winid) {
/* screen is already used */
layout_new = ED_workspace_layout_duplicate(workspace_new, layout_new, win);
@@ -148,7 +153,8 @@ bool ED_workspace_change(bContext *C, wmWindowManager *wm, wmWindow *win, WorkSp
}
/**
- * Duplicate a workspace including its layouts.
+ * Duplicate a workspace including its layouts. Does not activate the workspace, but
+ * it stores the screen-layout to be activated (BKE_workspace_temp_layout_store)
*/
WorkSpace *ED_workspace_duplicate(WorkSpace *workspace_old, Main *bmain, wmWindow *win)
{
@@ -157,7 +163,6 @@ WorkSpace *ED_workspace_duplicate(WorkSpace *workspace_old, Main *bmain, wmWindo
WorkSpace *workspace_new = ED_workspace_add(bmain, BKE_workspace_name_get(workspace_old),
BKE_workspace_render_layer_get(workspace_old));
- BKE_workspace_active_set(win->workspace_hook, workspace_new);
BKE_workspace_object_mode_set(workspace_new, BKE_workspace_object_mode_get(workspace_old));
BKE_workspace_layout_iter_begin(layout_old, layouts_old->first)
@@ -165,10 +170,7 @@ WorkSpace *ED_workspace_duplicate(WorkSpace *workspace_old, Main *bmain, wmWindo
WorkSpaceLayout *layout_new = ED_workspace_layout_duplicate(workspace_new, layout_old, win);
if (layout_active_old == layout_old) {
- bScreen *screen_new = BKE_workspace_layout_screen_get(layout_new);
-
- screen_new_activate_prepare(win, screen_new);
- BKE_workspace_active_layout_set(win->workspace_hook, layout_new);
+ BKE_workspace_temp_layout_store_set(win->workspace_hook, layout_new);
}
}
BKE_workspace_layout_iter_end;
diff --git a/source/blender/editors/workspace/workspace_layout_edit.c b/source/blender/editors/workspace/workspace_layout_edit.c
index 157a6bb687..f59efe1c49 100644
--- a/source/blender/editors/workspace/workspace_layout_edit.c
+++ b/source/blender/editors/workspace/workspace_layout_edit.c
@@ -50,7 +50,7 @@ WorkSpaceLayout *ED_workspace_layout_add(WorkSpace *workspace, wmWindow *win, co
const int winsize_x = WM_window_pixels_x(win);
const int winsize_y = WM_window_pixels_y(win);
- bScreen *screen = screen_add(win, name, winsize_x, winsize_y);
+ bScreen *screen = screen_add(name, winsize_x, winsize_y);
WorkSpaceLayout *layout = BKE_workspace_layout_add(workspace, screen, name);
return layout;
@@ -59,6 +59,7 @@ WorkSpaceLayout *ED_workspace_layout_add(WorkSpace *workspace, wmWindow *win, co
WorkSpaceLayout *ED_workspace_layout_duplicate(WorkSpace *workspace, const WorkSpaceLayout *layout_old, wmWindow *win)
{
bScreen *screen_old = BKE_workspace_layout_screen_get(layout_old);
+ const char *name = BKE_workspace_layout_name_get(layout_old);
bScreen *screen_new;
WorkSpaceLayout *layout_new;
@@ -66,7 +67,7 @@ WorkSpaceLayout *ED_workspace_layout_duplicate(WorkSpace *workspace, const WorkS
return NULL; /* XXX handle this case! */
}
- layout_new = ED_workspace_layout_add(workspace, win, screen_old->id.name + 2);
+ layout_new = ED_workspace_layout_add(workspace, win, name);
screen_new = BKE_workspace_layout_screen_get(layout_new);
screen_data_copy(screen_new, screen_old);
More information about the Bf-blender-cvs
mailing list