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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to