[Bf-blender-cvs] [c394624b9f] temp-workspace-multi-window: Initial steps to remove layout entities from workspace level

Julian Eisel noreply at git.blender.org
Fri Feb 24 00:33:44 CET 2017


Commit: c394624b9fb84683bb0726a0c25209031205d054
Author: Julian Eisel
Date:   Sun Feb 19 13:45:49 2017 +0100
Branches: temp-workspace-multi-window
https://developer.blender.org/rBc394624b9fb84683bb0726a0c25209031205d054

Initial steps to remove layout entities from workspace level

===================================================================

M	source/blender/blenkernel/BKE_workspace.h
M	source/blender/blenkernel/intern/library_query.c
M	source/blender/blenkernel/intern/workspace.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/writefile.c
M	source/blender/editors/workspace/workspace_edit.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_workspace.h b/source/blender/blenkernel/BKE_workspace.h
index 2555a74d1f..547c55bc85 100644
--- a/source/blender/blenkernel/BKE_workspace.h
+++ b/source/blender/blenkernel/BKE_workspace.h
@@ -74,7 +74,6 @@ void BKE_workspaces_transform_orientation_remove(const struct ListBase *workspac
                                                  const struct TransformOrientation *orientation) ATTR_NONNULL();
 
 WorkSpaceLayout *BKE_workspace_layout_find(const WorkSpace *ws, const struct bScreen *screen) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
-WorkSpaceLayout *BKE_workspace_layout_find_exec(const WorkSpace *ws, const struct bScreen *screen) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
 
 #define BKE_workspace_layout_iter_begin(_layout, _start_layout) \
 	for (WorkSpaceLayout *_layout = _start_layout, *_layout##_next; _layout; _layout = _layout##_next) { \
diff --git a/source/blender/blenkernel/intern/library_query.c b/source/blender/blenkernel/intern/library_query.c
index 52cf29fe92..18b6079919 100644
--- a/source/blender/blenkernel/intern/library_query.c
+++ b/source/blender/blenkernel/intern/library_query.c
@@ -918,6 +918,16 @@ void BKE_library_foreach_ID_link(Main *bmain, ID *id, LibraryIDLinkCallback call
 
 					CALLBACK_INVOKE(win->scene, IDWALK_CB_USER_ONE);
 
+					BKE_workspace_layout_iter_begin(layout, win->workspace_layouts.first)
+					{
+						bScreen *screen = BKE_workspace_layout_screen_get(layout);
+
+						CALLBACK_INVOKE(screen, IDWALK_CB_NOP);
+						/* allow callback to set a different screen */
+						BKE_workspace_layout_screen_set(layout, screen);
+					}
+					BKE_workspace_layout_iter_end;
+
 					CALLBACK_INVOKE_ID(workspace, IDWALK_CB_NOP);
 					/* allow callback to set a different workspace */
 					win->workspace = (WorkSpace *)workspace;
diff --git a/source/blender/blenkernel/intern/workspace.c b/source/blender/blenkernel/intern/workspace.c
index 7de053d76f..c16b3bc3b6 100644
--- a/source/blender/blenkernel/intern/workspace.c
+++ b/source/blender/blenkernel/intern/workspace.c
@@ -46,6 +46,22 @@
 bool workspaces_is_screen_used(const Main *bmain, bScreen *screen);
 
 
+static void workspace_layout_type_remove(WorkSpace *workspace, WorkSpaceLayoutType *layout_type)
+{
+	BLI_assert(BLI_findindex(&workspace->layout_types, layout_type) >= 0);
+	BLI_freelinkN(&workspace->layout_types, layout_type);
+}
+
+static void workspace_layout_remove(WorkSpace *workspace, WorkSpaceLayout *layout, Main *bmain)
+{
+	bScreen *screen = BKE_workspace_layout_screen_get(layout);
+
+	BLI_assert(BLI_findindex(&workspace->layouts, layout) >= 0);
+	BKE_libblock_free(bmain, screen);
+	BLI_freelinkN(&workspace->layouts, layout);
+}
+
+
 /* -------------------------------------------------------------------- */
 /* Create, delete, init */
 
@@ -73,9 +89,14 @@ void BKE_workspace_remove(WorkSpace *workspace, Main *bmain)
 {
 	BKE_workspace_layout_iter_begin(layout, workspace->layouts.first)
 	{
-		BKE_workspace_layout_remove(workspace, layout, bmain);
+		workspace_layout_remove(workspace, layout, bmain);
 	}
 	BKE_workspace_layout_iter_end;
+	BKE_workspace_layout_type_iter_begin(layout_type, workspace->layout_types.first)
+	{
+		workspace_layout_type_remove(workspace, layout_type);
+	}
+	BKE_workspace_layout_type_iter_end;
 
 	BKE_libblock_free(bmain, workspace);
 }
@@ -116,13 +137,8 @@ WorkSpaceLayout *BKE_workspace_layout_add(WorkSpace *workspace, bScreen *screen)
 void BKE_workspace_layout_remove(WorkSpace *workspace, WorkSpaceLayout *layout, Main *bmain)
 {
 	WorkSpaceLayoutType *layout_type = layout->type;
-	bScreen *screen = BKE_workspace_layout_screen_get(layout);
-
-	BLI_assert(BLI_findindex(&workspace->layouts, layout) >= 0);
-	BLI_assert(BLI_findindex(&workspace->layout_types, layout_type) >= 0);
-	BKE_libblock_free(bmain, screen);
-	BLI_freelinkN(&workspace->layouts, layout);
-	BLI_freelinkN(&workspace->layout_types, layout_type);
+	workspace_layout_remove(workspace, layout, bmain);
+	workspace_layout_type_remove(workspace, layout_type);
 }
 
 
@@ -143,40 +159,40 @@ void BKE_workspaces_transform_orientation_remove(const ListBase *workspaces, con
 }
 
 /**
- * Checks if \a screen is already used within any workspace. A screen should never be assigned to multiple
- * WorkSpaceLayouts, but that should be ensured outside of the BKE_workspace module and without such checks.
- * Hence, this should only be used as assert check before assigining a screen to a workflow.
+ * This should only be used directly when it is to be expected that there isn't
+ * a layout within \a workspace that wraps \a screen. Usually - especially outside
+ * of BKE_workspace - #BKE_workspace_layout_find should be used!
  */
-bool workspaces_is_screen_used(const Main *bmain, bScreen *screen)
+static WorkSpaceLayout *workspace_layout_find(const WorkSpace *ws, const bScreen *screen)
 {
-	for (WorkSpace *workspace = bmain->workspaces.first; workspace; workspace = workspace->id.next) {
-		if (BKE_workspace_layout_find_exec(workspace, screen)) {
-			return true;
+	for (WorkSpaceLayout *layout = ws->layouts.first; layout; layout = layout->next) {
+		if (layout->screen == screen) {
+			return layout;
 		}
 	}
 
-	return false;
+	return NULL;
 }
 
 /**
- * This should only be used directly when it is to be expected that there isn't
- * a layout within \a workspace that wraps \a screen. Usually - especially outside
- * of BKE_workspace - #BKE_workspace_layout_find should be used!
+ * Checks if \a screen is already used within any workspace. A screen should never be assigned to multiple
+ * WorkSpaceLayouts, but that should be ensured outside of the BKE_workspace module and without such checks.
+ * Hence, this should only be used as assert check before assigining a screen to a workflow.
  */
-WorkSpaceLayout *BKE_workspace_layout_find_exec(const WorkSpace *ws, const bScreen *screen)
+bool workspaces_is_screen_used(const Main *bmain, bScreen *screen)
 {
-	for (WorkSpaceLayout *layout = ws->layouts.first; layout; layout = layout->next) {
-		if (layout->screen == screen) {
-			return layout;
+	for (WorkSpace *workspace = bmain->workspaces.first; workspace; workspace = workspace->id.next) {
+		if (workspace_layout_find(workspace, screen)) {
+			return true;
 		}
 	}
 
-	return NULL;
+	return false;
 }
 
 WorkSpaceLayout *BKE_workspace_layout_find(const WorkSpace *ws, const bScreen *screen)
 {
-	WorkSpaceLayout *layout = BKE_workspace_layout_find_exec(ws, screen);
+	WorkSpaceLayout *layout = workspace_layout_find(ws, screen);
 	if (layout) {
 		return layout;
 	}
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index eb3f55492b..d813ad0f96 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -2772,6 +2772,18 @@ static void lib_link_workspaces(FileData *fd, Main *bmain)
 	BKE_workspace_iter_end;
 }
 
+static void lib_link_workspace_layouts(FileData *fd, const void *lib, ListBase *layouts)
+{
+	BKE_workspace_layout_iter_begin(layout, layouts->first)
+	{
+		bScreen *screen = newlibadr(fd, lib, BKE_workspace_layout_screen_get(layout));
+		if (screen) {
+			BKE_workspace_layout_screen_set(layout, screen);
+		}
+	}
+	BKE_workspace_layout_iter_end;
+}
+
 static void direct_link_workspace(FileData *fd, WorkSpace *ws)
 {
 	WorkSpaceLayout *act_layout = BKE_workspace_active_layout_get(ws);
@@ -6348,6 +6360,7 @@ static void direct_link_windowmanager(FileData *fd, wmWindowManager *wm)
 		if (win->stereo3d_format) {
 			win->stereo3d_format->display_mode = S3D_DISPLAY_ANAGLYPH;
 		}
+		link_list(fd, &win->workspace_layouts);
 	}
 	
 	BLI_listbase_clear(&wm->timers);
@@ -6381,6 +6394,7 @@ static void lib_link_windowmanager(FileData *fd, Main *main)
 			for (win = wm->windows.first; win; win = win->next) {
 				win->scene = newlibadr(fd, wm->id.lib, win->scene);
 				win->workspace = newlibadr(fd, wm->id.lib, win->workspace);
+				lib_link_workspace_layouts(fd, wm->id.lib, &win->workspace_layouts);
 				/* deprecated, but needed for versioning (will be NULL'ed then) */
 				win->screen = newlibadr(fd, NULL, win->screen);
 			}
@@ -7028,21 +7042,15 @@ void blo_lib_link_restore(Main *newmain, wmWindowManager *curwm, Scene *curscene
 {
 	struct IDNameLib_Map *id_map = BKE_main_idmap_create(newmain);
 
-	BKE_workspace_iter_begin(workspace, newmain->workspaces.first)
-	{
-		ListBase *layouts = BKE_workspace_layouts_get(workspace);
+	for (wmWindow *win = curwm->windows.first; win; win = win->next) {
+		Scene *oldscene = win->scene;
+		WorkSpace *workspace = restore_pointer_by_name(id_map, (ID *)win->workspace, USER_REAL);
 
-		BKE_workspace_layout_iter_begin(layout, layouts->first)
+		BKE_workspace_layout_iter_begin(layout, win->workspace_layouts.first)
 		{
 			lib_link_workspace_layout_restore(id_map, newmain, layout);
 		}
 		BKE_workspace_layout_iter_end;
-	}
-	BKE_workspace_iter_end;
-
-	for (wmWindow *win = curwm->windows.first; win; win = win->next) {
-		Scene *oldscene = win->scene;
-		WorkSpace *workspace = restore_pointer_by_name(id_map, (ID *)win->workspace, USER_REAL);
 
 		win->scene = restore_pointer_by_name(id_map, (ID *)win->scene, USER_REAL);
 		if (win->scene == NULL) {
@@ -9877,6 +9885,17 @@ static void expand_gpencil(FileData *fd, Main *mainvar, bGPdata *gpd)
 		expand_animdata(fd, mainvar, gpd->adt);
 }
 
+static void expand_windowmanager(FileData *fd, Main *mainvar, wmWindowManager *wm)
+{
+	for (wmWindow *win = wm->windows.first; win; win = win->next) {
+		BKE_workspace_layout_iter_begin(layout, win->workspace_layouts.first)
+		{
+			expand_doit(fd, mainvar, BKE_workspace_layout_screen_get(layout));
+		}
+		BKE_workspace_layout_iter_end;
+	}
+}
+
 static void expand_workspace(FileData *fd, Main *mainvar, WorkSpace *workspace)
 {
 	ListBase *layouts = BKE_workspace_layouts_get(workspace);
@@ -10000,6 +10019,9 @@ void BLO_expand_main(void *fdhandle, Main *mainvar)
 					case ID_CF:
 						expand_cachefile(fd, mainvar, (CacheFile *)id);
 						break;
+					case ID_WM:
+						expand_windowmanager(fd, mainvar, (wmWindowManager *)id);
+						break;
 					case ID_WS:
 						expand_workspace(fd, mainvar, (WorkSpace *)id);
 						break;
diff --git a/sourc

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list