[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