[Bf-blender-cvs] [2b89851715] temp-workspace-multi-window: Fix broken screen-setups after creating workspaces or layouts

Julian Eisel noreply at git.blender.org
Mon Mar 6 20:05:39 CET 2017


Commit: 2b898517158f105aedfd26aac0516c64a080014a
Author: Julian Eisel
Date:   Mon Mar 6 19:29:13 2017 +0100
Branches: temp-workspace-multi-window
https://developer.blender.org/rB2b898517158f105aedfd26aac0516c64a080014a

Fix broken screen-setups after creating workspaces or layouts

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

M	source/blender/blenkernel/BKE_screen.h
M	source/blender/blenkernel/intern/screen.c
M	source/blender/blenkernel/intern/workspace.c
M	source/blender/blenloader/intern/versioning_280.c
M	source/blender/editors/workspace/screen_edit.c
M	source/blender/editors/workspace/screen_ops.c
M	source/blender/editors/workspace/workspace_layout_edit.c
M	source/blender/makesdna/DNA_screen_types.h

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

diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h
index 3857a495d5..91098bdeef 100644
--- a/source/blender/blenkernel/BKE_screen.h
+++ b/source/blender/blenkernel/BKE_screen.h
@@ -41,7 +41,6 @@ struct Menu;
 struct Panel;
 struct Scene;
 struct ScrArea;
-struct ScreenLayoutData;
 struct SpaceType;
 struct TransformOrientation;
 struct View3D;
@@ -313,6 +312,7 @@ void BKE_screen_view3d_scene_sync(struct bScreen *sc, struct Scene *scene);
 void BKE_screen_transform_orientation_remove(const struct bScreen *screen,
                                              const struct TransformOrientation *orientation) ATTR_NONNULL();
 void BKE_screen_gpu_fx_validate(struct GPUFXSettings *fx_settings);
+struct ScreenLayoutData BKE_screen_layout_data_get(const struct bScreen *screen);
 bool BKE_screen_is_fullscreen_area(const struct bScreen *screen) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
 bool BKE_screen_is_used(const struct bScreen *screen) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
 
@@ -322,9 +322,12 @@ float BKE_screen_view3d_zoom_from_fac(float zoomfac);
 
 /* screen */
 void BKE_screen_free(struct bScreen *sc);
+void BKE_screen_init_from_layout_data(struct bScreen *screen, const struct ScreenLayoutData *layout_data) ATTR_NONNULL();
 struct bScreen *BKE_screen_create_from_layout_data(
         struct Main *bmain, const struct ScreenLayoutData *layout_data, const char *name) ATTR_NONNULL();
 struct ScrVert *BKE_screen_add_vert(struct bScreen *sc, short x, short y);
+struct ScrEdge *BKE_screen_add_edge(struct bScreen *sc, struct ScrVert *v1, struct ScrVert *v2);
+void            BKE_screen_vert_sort(struct ScrVert **v1, struct ScrVert **v2);
 unsigned int BKE_screen_visible_layers(struct bScreen *screen, struct Scene *scene);
 
 #endif
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index 070479df5b..454c398246 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -439,28 +439,50 @@ void BKE_screen_free(bScreen *sc)
 	BKE_previewimg_free(&sc->preview);
 }
 
-bScreen *BKE_screen_create_from_layout_data(
-        struct Main *bmain, const ScreenLayoutData *layout_data, const char *name)
+void BKE_screen_init_from_layout_data(bScreen *screen, const ScreenLayoutData *layout_data)
 {
-	bScreen *screen = BKE_libblock_alloc(bmain, ID_SCR, name);
+	BLI_duplicatelist(&screen->vertbase, &layout_data->vertbase);
+	BLI_duplicatelist(&screen->edgebase, &layout_data->edgebase);
+	BLI_duplicatelist(&screen->areabase, &layout_data->areabase);
 
-	for (ScrVert *sv = layout_data->vertbase.first; sv; sv = sv->next) {
-		ScrVert *sv_new = MEM_callocN(sizeof(ScrVert), "workspace_change_add_screenvert");
-		*sv_new = *sv;
-		BLI_addtail(&screen->vertbase, sv_new);
+	for (ScrVert *sv1 = layout_data->vertbase.first, *se2 = screen->vertbase.first;
+	     sv1 != NULL;
+	     sv1 = sv1->next, se2 = se2->next)
+	{
+		sv1->newv = se2;
+	}
+
+	for (ScrEdge *se = screen->edgebase.first; se; se = se->next) {
+		se->v1 = se->v1->newv;
+		se->v2 = se->v2->newv;
+		BKE_screen_vert_sort(&(se->v1), &(se->v2));
 	}
-	for (ScrArea *sa = layout_data->areabase.first; sa; sa = sa->next) {
-		ScrArea *sa_new = MEM_callocN(sizeof(ScrArea), "workspace_change_add_screenarea");
 
-		sa_new->v1 = BKE_screen_add_vert(screen, sa->v1->vec.x, sa->v1->vec.y);
-		sa_new->v2 = BKE_screen_add_vert(screen, sa->v2->vec.x, sa->v2->vec.y);
-		sa_new->v3 = BKE_screen_add_vert(screen, sa->v3->vec.x, sa->v3->vec.y);
-		sa_new->v4 = BKE_screen_add_vert(screen, sa->v4->vec.x, sa->v4->vec.y);
+	for (ScrArea *sa = screen->areabase.first, *saf = layout_data->areabase.first; sa; sa = sa->next, saf = saf->next) {
+		sa->v1 = sa->v1->newv;
+		sa->v2 = sa->v2->newv;
+		sa->v3 = sa->v3->newv;
+		sa->v4 = sa->v4->newv;
+
+		BLI_listbase_clear(&sa->spacedata);
+		BLI_listbase_clear(&sa->regionbase);
+		BLI_listbase_clear(&sa->actionzones);
+		BLI_listbase_clear(&sa->handlers);
 
-		BKE_screen_area_data_copy(sa_new, sa, false);
-		BLI_addtail(&screen->areabase, sa_new);
+		BKE_screen_area_data_copy(sa, saf, true);
 	}
 
+	/* put at zero (needed?) */
+	for (ScrVert *sv = layout_data->vertbase.first; sv; sv = sv->next) {
+		sv->newv = NULL;
+	}
+}
+
+bScreen *BKE_screen_create_from_layout_data(
+        struct Main *bmain, const ScreenLayoutData *layout_data, const char *name)
+{
+	bScreen *screen = BKE_libblock_alloc(bmain, ID_SCR, name);
+	BKE_screen_init_from_layout_data(screen, layout_data);
 	return screen;
 }
 
@@ -475,6 +497,29 @@ ScrVert *BKE_screen_add_vert(bScreen *sc, short x, short y)
 	return sv;
 }
 
+ScrEdge *BKE_screen_add_edge(bScreen *sc, ScrVert *v1, ScrVert *v2)
+{
+	ScrEdge *se = MEM_callocN(sizeof(ScrEdge), "addscredge");
+
+	BKE_screen_vert_sort(&v1, &v2);
+	se->v1 = v1;
+	se->v2 = v2;
+	BLI_addtail(&sc->edgebase, se);
+
+	return se;
+}
+
+void BKE_screen_vert_sort(ScrVert **v1, ScrVert **v2)
+{
+	ScrVert *tmp;
+
+	if (*v1 > *v2) {
+		tmp = *v1;
+		*v1 = *v2;
+		*v2 = tmp;
+	}
+}
+
 /* for depsgraph */
 unsigned int BKE_screen_visible_layers(bScreen *screen, Scene *scene)
 {
@@ -745,6 +790,17 @@ void BKE_screen_gpu_fx_validate(GPUFXSettings *fx_settings)
 	}
 }
 
+ScreenLayoutData BKE_screen_layout_data_get(const bScreen *screen)
+{
+	ScreenLayoutData layout_data = {
+	    .vertbase = screen->vertbase,
+	    .edgebase = screen->edgebase,
+	    .areabase = screen->areabase,
+	};
+
+	return layout_data;
+}
+
 bool BKE_screen_is_fullscreen_area(const bScreen *screen)
 {
 	return ELEM(screen->state, SCREENMAXIMIZED, SCREENFULL);
diff --git a/source/blender/blenkernel/intern/workspace.c b/source/blender/blenkernel/intern/workspace.c
index d0f4d21975..cb75240e20 100644
--- a/source/blender/blenkernel/intern/workspace.c
+++ b/source/blender/blenkernel/intern/workspace.c
@@ -156,10 +156,7 @@ void BKE_workspace_hook_delete(Main *bmain, WorkSpaceHook *hook)
 void BKE_workspace_change_prepare(Main *bmain, WorkSpaceHook *workspace_hook, WorkSpace *workspace_new)
 {
 	for (WorkSpaceLayoutType *type = workspace_new->layout_types.first; type; type = type->next) {
-		bScreen *screen = BKE_screen_create_from_layout_data(bmain, &(const ScreenLayoutData) {
-		                                                         .vertbase = type->layout_blueprint.vertbase,
-		                                                         .areabase = type->layout_blueprint.areabase},
-		                                                     type->name);
+		bScreen *screen = BKE_screen_create_from_layout_data(bmain, &type->layout_blueprint, type->name);
 		WorkSpaceLayout *layout = BKE_workspace_layout_add_from_type(workspace_new, type, screen);
 
 		BLI_addtail(&workspace_hook->layouts, layout);
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index 6138473c52..ec4d872663 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -39,6 +39,7 @@
 #include "BKE_layer.h"
 #include "BKE_main.h"
 #include "BKE_scene.h"
+#include "BKE_screen.h"
 #include "BKE_workspace.h"
 
 #include "BLI_listbase.h"
@@ -64,9 +65,8 @@ static void do_version_workspaces_before_lib_link(Main *main)
 
 	for (bScreen *screen = main->screen.first; screen; screen = screen->id.next) {
 		WorkSpace *ws = BKE_workspace_add(main, screen->id.name + 2);
-		WorkSpaceLayoutType *layout_type = BKE_workspace_layout_type_add(ws, screen->id.name + 2, (ScreenLayoutData) {
-		                                                                     .vertbase = screen->vertbase,
-		                                                                     .areabase = screen->areabase});
+		ScreenLayoutData layout_data = BKE_screen_layout_data_get(screen);
+		WorkSpaceLayoutType *layout_type = BKE_workspace_layout_type_add(ws, screen->id.name + 2, layout_data);
 
 		BKE_workspace_active_layout_type_set(ws, layout_type);
 
diff --git a/source/blender/editors/workspace/screen_edit.c b/source/blender/editors/workspace/screen_edit.c
index 7647901767..b0f945a31a 100644
--- a/source/blender/editors/workspace/screen_edit.c
+++ b/source/blender/editors/workspace/screen_edit.c
@@ -73,35 +73,12 @@
 
 /* ******************* screen vert, edge, area managing *********************** */
 
-static void sortscrvert(ScrVert **v1, ScrVert **v2)
-{
-	ScrVert *tmp;
-	
-	if (*v1 > *v2) {
-		tmp = *v1;
-		*v1 = *v2;
-		*v2 = tmp;
-	}
-}
-
-static ScrEdge *screen_addedge(bScreen *sc, ScrVert *v1, ScrVert *v2)
-{
-	ScrEdge *se = MEM_callocN(sizeof(ScrEdge), "addscredge");
-	
-	sortscrvert(&v1, &v2);
-	se->v1 = v1;
-	se->v2 = v2;
-	
-	BLI_addtail(&sc->edgebase, se);
-	return se;
-}
-
 
 ScrEdge *screen_findedge(bScreen *sc, ScrVert *v1, ScrVert *v2)
 {
 	ScrEdge *se;
 	
-	sortscrvert(&v1, &v2);
+	BKE_screen_vert_sort(&v1, &v2);
 	for (se = sc->edgebase.first; se; se = se->next)
 		if (se->v1 == v1 && se->v2 == v2)
 			return se;
@@ -138,7 +115,7 @@ void removedouble_scrverts(bScreen *sc)
 		if (se->v1->newv) se->v1 = se->v1->newv;
 		if (se->v2->newv) se->v2 = se->v2->newv;
 		/* edges changed: so.... */
-		sortscrvert(&(se->v1), &(se->v2));
+		BKE_screen_vert_sort(&(se->v1), &(se->v2));
 		se = se->next;
 	}
 	sa = sc->areabase.first;
@@ -387,11 +364,11 @@ ScrArea *area_split(bScreen *sc, ScrArea *sa, char dir, float fac, int merge)
 		sv2 = BKE_screen_add_vert(sc, sa->v4->vec.x, split);
 		
 		/* new edges */
-		screen_addedge(sc, sa->v1, sv1);
-		screen_addedge(sc, sv1, sa->v2);
-		screen_addedge(sc, sa->v3, sv2);
-		screen_addedge(sc, sv2, sa->v4);
-		screen_addedge(sc, sv1, sv2);
+		BKE_screen_add_edge(sc, sa->v1, sv1);
+		BKE_screen_add_edge(sc, sv1, sa->v2);
+		BKE_screen_add_edge(sc, sa->v3, sv2);
+		BKE_screen_add_edge(sc, sv2, sa->v4);
+		BKE_screen_add_edge(sc, sv1, sv2);
 		
 		if (fac > 0.5f) {
 			/* new areas: top */
@@ -419,11 +396,11 @@ ScrArea *area_split(bScreen *sc, ScrArea *sa, char dir, float fac, int merge)
 		sv2 = BKE_screen_add_vert(sc, split, sa->v2->vec.y);
 		
 		/* new edges */
-		screen_addedge(sc, sa->v1, sv1);
-		screen_addedge(sc, sv1, sa->v4);
-		screen_addedge(sc, sa->v2, sv2);
-		screen_addedge(sc, sv2, sa->v3);
-		screen_addedge(

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list