[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