Commit: 63112dcc14e15e59f8627a48877bc406531058d1
Author: Julian Eisel
Date:   Mon Mar 6 15:19:15 2017 +0100
Branches: temp-workspace-multi-window
https://developer.blender.org/rB63112dcc14e15e59f8627a48877bc406531058d1

Make duplicating workspaces work

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

M       source/blender/blenkernel/BKE_screen.h
M       source/blender/blenkernel/BKE_workspace.h
M       source/blender/blenkernel/intern/screen.c
M       source/blender/blenkernel/intern/workspace.c
M       source/blender/editors/workspace/area.c
M       source/blender/editors/workspace/screen_edit.c
M       source/blender/editors/workspace/screen_intern.h
M       source/blender/editors/workspace/screen_ops.c
M       source/blender/editors/workspace/workspace_edit.c
M       source/blender/makesrna/intern/rna_workspace.c
M       source/blender/windowmanager/intern/wm_window.c

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

diff --git a/source/blender/blenkernel/BKE_screen.h 
b/source/blender/blenkernel/BKE_screen.h
index b33aa31b3f..65f2aa8462 100644
--- a/source/blender/blenkernel/BKE_screen.h
+++ b/source/blender/blenkernel/BKE_screen.h
@@ -288,6 +288,7 @@ void BKE_spacedata_id_unref(struct ScrArea *sa, struct 
SpaceLink *sl, struct ID
 /* area/regions */
 struct ARegion *BKE_area_region_copy(struct SpaceType *st, struct ARegion *ar);
 void            BKE_area_region_free(struct SpaceType *st, struct ARegion *ar);
+void            BKE_screen_area_data_copy(struct ScrArea *sa_dst, struct 
ScrArea *sa_src, const bool do_free);
 void            BKE_screen_area_free(struct ScrArea *sa);
 /* Manipulator-maps of a region need to be freed with the region. Uses 
callback to avoid low-level call. */
 void BKE_region_callback_free_manipulatormap_set(void (*callback)(struct 
wmManipulatorMap *));
@@ -319,7 +320,10 @@ float BKE_screen_view3d_zoom_to_fac(float camzoom);
 float BKE_screen_view3d_zoom_from_fac(float zoomfac);
 
 /* screen */
-void BKE_screen_free(struct bScreen *sc); 
+void BKE_screen_free(struct bScreen *sc);
+struct bScreen *BKE_screen_create_from_screen_data(
+        struct Main *bmain, const ListBase *vertbase, const ListBase 
*areabase, const char *name) ATTR_NONNULL();
+struct ScrVert *BKE_screen_add_vert(struct bScreen *sc, short x, short y);
 unsigned int BKE_screen_visible_layers(struct bScreen *screen, struct Scene 
*scene);
 
 #endif
diff --git a/source/blender/blenkernel/BKE_workspace.h 
b/source/blender/blenkernel/BKE_workspace.h
index 1ff1549c34..ac8bb9875c 100644
--- a/source/blender/blenkernel/BKE_workspace.h
+++ b/source/blender/blenkernel/BKE_workspace.h
@@ -74,12 +74,12 @@ void BKE_workspace_hook_delete(struct Main *bmain, 
WorkSpaceHook *hook) ATTR_NON
                _workspace##_next = BKE_workspace_next_get(_workspace); /* 
support removing workspace from list */
 #define BKE_workspace_iter_end } (void)0
 
-void BKE_workspace_change_prepare(struct Main *bmain, WorkSpaceHook 
*workspace_hook) ATTR_NONNULL();
+void BKE_workspace_change_prepare(struct Main *bmain, WorkSpaceHook 
*workspace_hook, WorkSpace *workspace_new) ATTR_NONNULL();
 
 void BKE_workspaces_transform_orientation_remove(const struct ListBase 
*workspaces,
                                                  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(const WorkSpaceHook *hook, 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) { \
@@ -114,7 +114,7 @@ const char *BKE_workspace_name_get(const WorkSpace 
*workspace) GETTER_ATTRS;
 WorkSpaceLayout *BKE_workspace_active_layout_get(const struct WorkSpace *ws) 
GETTER_ATTRS;
 void             BKE_workspace_active_layout_set(WorkSpace *ws, 
WorkSpaceLayout *layout) SETTER_ATTRS;
 struct bScreen *BKE_workspace_active_screen_get(const WorkSpace *ws) 
GETTER_ATTRS;
-void            BKE_workspace_active_screen_set(WorkSpace *ws, struct bScreen 
*screen) SETTER_ATTRS;
+void            BKE_workspace_active_screen_set(const WorkSpaceHook *hook, 
struct bScreen *screen) SETTER_ATTRS;
 enum ObjectMode BKE_workspace_object_mode_get(const WorkSpace *workspace) 
GETTER_ATTRS;
 #ifdef USE_WORKSPACE_MODE
 void            BKE_workspace_object_mode_set(WorkSpace *workspace, const enum 
ObjectMode mode) SETTER_ATTRS;
diff --git a/source/blender/blenkernel/intern/screen.c 
b/source/blender/blenkernel/intern/screen.c
index 2082975dcd..145bc334bd 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -52,6 +52,7 @@
 
 #include "BKE_icons.h"
 #include "BKE_idprop.h"
+#include "BKE_library.h"
 #include "BKE_screen.h"
 
 /* ************ Spacetype/regiontype handling ************** */
@@ -275,6 +276,45 @@ void BKE_spacedata_draw_locks(int set)
        }
 }
 
+/**
+ * we swap spaces for fullscreen to keep all allocated data area vertices were 
set
+ */
+void BKE_screen_area_data_copy(ScrArea *sa_dst, ScrArea *sa_src, const bool 
do_free)
+{
+       SpaceType *st;
+       ARegion *ar;
+       const char spacetype = sa_dst->spacetype;
+       const short flag_copy = HEADER_NO_PULLDOWN;
+
+       sa_dst->headertype = sa_src->headertype;
+       sa_dst->spacetype = sa_src->spacetype;
+       sa_dst->type = sa_src->type;
+       sa_dst->butspacetype = sa_src->butspacetype;
+
+       sa_dst->flag = (sa_dst->flag & ~flag_copy) | (sa_src->flag & flag_copy);
+
+       /* area */
+       if (do_free) {
+               BKE_spacedata_freelist(&sa_dst->spacedata);
+       }
+       BKE_spacedata_copylist(&sa_dst->spacedata, &sa_src->spacedata);
+
+       /* Note; SPACE_EMPTY is possible on new screens */
+
+       /* regions */
+       if (do_free) {
+               st = BKE_spacetype_from_id(spacetype);
+               for (ar = sa_dst->regionbase.first; ar; ar = ar->next)
+                       BKE_area_region_free(st, ar);
+               BLI_freelistN(&sa_dst->regionbase);
+       }
+       st = BKE_spacetype_from_id(sa_src->spacetype);
+       for (ar = sa_src->regionbase.first; ar; ar = ar->next) {
+               ARegion *newar = BKE_area_region_copy(st, ar);
+               BLI_addtail(&sa_dst->regionbase, newar);
+       }
+}
+
 static void (*spacedata_id_remap_cb)(struct ScrArea *sa, struct SpaceLink *sl, 
ID *old_id, ID *new_id) = NULL;
 
 void BKE_spacedata_callback_id_remap_set(void (*func)(ScrArea *sa, SpaceLink 
*sl, ID *, ID *))
@@ -399,6 +439,42 @@ void BKE_screen_free(bScreen *sc)
        BKE_previewimg_free(&sc->preview);
 }
 
+bScreen *BKE_screen_create_from_screen_data(
+        struct Main *bmain, const ListBase *vertbase, const ListBase 
*areabase, const char *name)
+{
+       bScreen *screen = BKE_libblock_alloc(bmain, ID_SCR, name);
+
+       for (ScrVert *sv = 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 (ScrArea *sa = 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);
+
+               BKE_screen_area_data_copy(sa_new, sa, false);
+               BLI_addtail(&screen->areabase, sa_new);
+       }
+
+       return screen;
+}
+
+ScrVert *BKE_screen_add_vert(bScreen *sc, short x, short y)
+{
+       ScrVert *sv = MEM_callocN(sizeof(ScrVert), __func__);
+
+       sv->vec.x = x;
+       sv->vec.y = y;
+       BLI_addtail(&sc->vertbase, sv);
+
+       return sv;
+}
+
 /* for depsgraph */
 unsigned int BKE_screen_visible_layers(bScreen *screen, Scene *scene)
 {
diff --git a/source/blender/blenkernel/intern/workspace.c 
b/source/blender/blenkernel/intern/workspace.c
index 5a07e7c09c..b5c81caa93 100644
--- a/source/blender/blenkernel/intern/workspace.c
+++ b/source/blender/blenkernel/intern/workspace.c
@@ -105,7 +105,7 @@ WorkSpaceLayout 
*BKE_workspace_layout_add_from_type(WorkSpace *workspace, WorkSp
 {
        WorkSpaceLayout *layout = MEM_mallocN(sizeof(*layout), __func__);
 
-       BLI_assert(!workspaces_is_screen_used(G.main, screen));
+//     BLI_assert(!workspaces_is_screen_used(G.main, screen));
 
        layout->type = type;
        layout->screen = screen;
@@ -154,27 +154,20 @@ void BKE_workspace_hook_delete(Main *bmain, WorkSpaceHook 
*hook)
 /* -------------------------------------------------------------------- */
 /* General Utils */
 
-void BKE_workspace_change_prepare(Main *bmain, WorkSpaceHook *workspace_hook)
+void BKE_workspace_change_prepare(Main *bmain, WorkSpaceHook *workspace_hook, 
WorkSpace *workspace_new)
 {
-       WorkSpace *workspace = workspace_hook->act_workspace;
        BLI_freelistN(&workspace_hook->layouts);
 
-       for (WorkSpaceLayoutType *type = workspace->layout_types.first; type; 
type = type->next) {
-               bScreen *screen = BKE_libblock_alloc(bmain, ID_SCR, type->name);
-               WorkSpaceLayout *layout;
+       for (WorkSpaceLayoutType *type = workspace_new->layout_types.first; 
type; type = type->next) {
+               bScreen *screen = BKE_screen_create_from_screen_data(bmain, 
type->vertbase, type->areabase, type->name);
+               WorkSpaceLayout *layout = 
BKE_workspace_layout_add_from_type(workspace_new, type, screen);
 
-               for (ScrVert *sv = type->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 (ScrArea *sa = type->areabase->first; sa; sa = sa->next) {
-                       ScrArea *sa_new = MEM_callocN(sizeof(ScrArea), 
"workspace_change_add_screenarea");
-                       *sa_new = *sa;
-                       BLI_addtail(&screen->areabase, sa_new);
-               }
-               layout = BKE_workspace_layout_add_from_type(workspace, type, 
screen);
                BLI_addtail(&workspace_hook->layouts, layout);
+
+               /* XXX Just setting the active layout matching the active type 
stored in workspace */
+               if (type == workspace_new->act_layout_type) {
+                       workspace_new->act_layout = layout;
+               }
        }
 }
 
@@ -196,9 +189,9 @@ void BKE_workspaces_transform_orientation_remove(const 
ListBase *workspaces, con
  * a layout within \a workspace that wraps \a screen. Usually - especially 
outside
  * of BKE_workspace - #BKE_workspace_layout_find should be used!
  */
-static WorkSpaceLayout *workspace_layout_find(const WorkSpace *ws, const 
bScreen *screen)
+static WorkSpaceLayout *workspace_layout_find(const WorkSpaceHook *hook, const 
bScreen *screen)
 {
-       for (WorkSpaceLayout *layout = ws->layouts.first; layout; layout = 
layout->next) {
+       for (WorkSpaceLayout *layout = hook->layouts.first; layout; layout = 
layout->next) {
                if (layout->screen == screen) {
                        return layout;
                }
@@ -207,6 +200,7 @@ static WorkSpaceLayout *workspace_layout_find(const 
WorkSpace *ws, const bScreen
        return NULL;
 }
 
+#if 0
 /**
  * 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.
@@ -222,10

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