[Bf-blender-cvs] [2301dd18a36] temp-workspace-multi-window: Get duplicating area into new window to work

Julian Eisel noreply at git.blender.org
Thu Mar 9 00:33:06 CET 2017


Commit: 2301dd18a36d5fe29e66d1038be6e150c8e333ce
Author: Julian Eisel
Date:   Thu Mar 9 00:30:54 2017 +0100
Branches: temp-workspace-multi-window
https://developer.blender.org/rB2301dd18a36d5fe29e66d1038be6e150c8e333ce

Get duplicating area into new window to work

We don't duplicate the workspace or the layout-type anymore. We just open a
new window with the same workspace and same layout-type.

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

M	source/blender/blenkernel/BKE_workspace.h
M	source/blender/editors/include/ED_screen.h
M	source/blender/editors/workspace/screen_edit.c
M	source/blender/editors/workspace/screen_ops.c
M	source/blender/windowmanager/intern/wm_window.c

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

diff --git a/source/blender/blenkernel/BKE_workspace.h b/source/blender/blenkernel/BKE_workspace.h
index 0b58b587d65..7dd3e7ac2f6 100644
--- a/source/blender/blenkernel/BKE_workspace.h
+++ b/source/blender/blenkernel/BKE_workspace.h
@@ -112,7 +112,6 @@ struct ID *BKE_workspace_id_get(WorkSpace *workspace) GETTER_ATTRS;
 const char *BKE_workspace_name_get(const WorkSpace *workspace) GETTER_ATTRS;
 WorkSpaceLayout *BKE_workspace_hook_active_layout_get(const WorkSpaceHook *hook) GETTER_ATTRS;
 void             BKE_workspace_hook_active_layout_set(WorkSpaceHook *hook, WorkSpaceLayout *layout) SETTER_ATTRS;
-struct bScreen *BKE_workspace_active_screen_get(const WorkSpace *ws) GETTER_ATTRS;
 void            BKE_workspace_hook_active_screen_set(WorkSpaceHook *hook, struct bScreen *screen) SETTER_ATTRS;
 struct bScreen *BKE_workspace_hook_active_screen_get(const WorkSpaceHook *hook) GETTER_ATTRS;
 enum ObjectMode BKE_workspace_object_mode_get(const WorkSpace *workspace) GETTER_ATTRS;
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index b2a42bd4165..c074bdcfda2 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -122,7 +122,7 @@ void    ED_screens_header_tools_menu_create(struct bContext *C, struct uiLayout
 bool    ED_screen_stereo3d_required(const struct bScreen *screen, const struct Scene *scene);
 Scene   *ED_screen_scene_find(const struct bScreen *screen, const struct wmWindowManager *wm);
 void    ED_screen_preview_render(const struct bScreen *screen, int size_x, int size_y, unsigned int *r_rect) ATTR_NONNULL();
-void    ED_screen_empty_data_create(int size_x, int size_y, ListBase *r_vertbase, ListBase *r_areabase);
+void    ED_screen_empty_data_create(int size_x, int size_y, ScreenLayoutData *layout_data) ATTR_NONNULL();
 
 /* workspaces */
 struct WorkSpace *ED_workspace_add(struct Main *bmain, const char *name, SceneLayer *act_render_layer) ATTR_NONNULL();
diff --git a/source/blender/editors/workspace/screen_edit.c b/source/blender/editors/workspace/screen_edit.c
index 0c3de901eed..4cecaad74ce 100644
--- a/source/blender/editors/workspace/screen_edit.c
+++ b/source/blender/editors/workspace/screen_edit.c
@@ -434,28 +434,46 @@ ScrArea *area_split(bScreen *sc, ScrArea *sa, char dir, float fac, int merge)
 /**
  * Empty screen, with 1 dummy area without spacedata. Uses window size.
  */
-void ED_screen_empty_data_create(int size_x, int size_y, ListBase *r_vertbase, ListBase *r_areabase)
+void ED_screen_empty_data_create(int size_x, int size_y, ScreenLayoutData *layout_data)
 {
 	ScrVert *sv1, *sv2, *sv3, *sv4;
+	ScrEdge *se1, *se2, *se3, *se4;
 
 	sv1 = MEM_callocN(sizeof(ScrVert), "addscrvert1");
 	sv1->vec.x = 0;
 	sv1->vec.y = 0;
-	BLI_addtail(r_vertbase, sv1);
+	BLI_addtail(&layout_data->vertbase, sv1);
 	sv2 = MEM_callocN(sizeof(ScrVert), "addscrvert2");
 	sv2->vec.x = 0;
 	sv2->vec.y = size_y - 1;
-	BLI_addtail(r_vertbase, sv2);
+	BLI_addtail(&layout_data->vertbase, sv2);
 	sv3 = MEM_callocN(sizeof(ScrVert), "addscrvert3");
 	sv3->vec.x = size_x - 1;
 	sv3->vec.y = size_y - 1;
-	BLI_addtail(r_vertbase, sv3);
+	BLI_addtail(&layout_data->vertbase, sv3);
 	sv4 = MEM_callocN(sizeof(ScrVert), "addscrvert4");
 	sv4->vec.x = size_x - 1;
 	sv4->vec.y = 0;
-	BLI_addtail(r_vertbase, sv4);
-
-	areabase_add_area(r_areabase, sv1, sv2, sv3, sv4, HEADERDOWN, SPACE_EMPTY);
+	BLI_addtail(&layout_data->vertbase, sv4);
+
+	se1 = MEM_callocN(sizeof(ScrEdge), "addscredge1");
+	se1->v1 = sv1;
+	se1->v2 = sv2;
+	BLI_addtail(&layout_data->edgebase, se1);
+	se2 = MEM_callocN(sizeof(ScrEdge), "addscredge2");
+	se2->v1 = sv2;
+	se2->v2 = sv3;
+	BLI_addtail(&layout_data->edgebase, se2);
+	se3 = MEM_callocN(sizeof(ScrEdge), "addscredge3");
+	se3->v1 = sv3;
+	se3->v2 = sv4;
+	BLI_addtail(&layout_data->edgebase, se3);
+	se4 = MEM_callocN(sizeof(ScrEdge), "addscredge4");
+	se4->v1 = sv4;
+	se4->v2 = sv1;
+	BLI_addtail(&layout_data->edgebase, se4);
+
+	areabase_add_area(&layout_data->areabase, sv1, sv2, sv3, sv4, HEADERDOWN, SPACE_EMPTY);
 }
 
 /**
@@ -463,27 +481,15 @@ void ED_screen_empty_data_create(int size_x, int size_y, ListBase *r_vertbase, L
  */
 bScreen *screen_add_from_layout_type(WorkSpaceLayoutType *layout_type, short winid)
 {
-	bScreen *sc;
-	ScrVert *sv1, *sv2, *sv3, *sv4;
-	ListBase *vertbase = BKE_workspace_layout_type_vertbase_get(layout_type);
+	ScreenLayoutData layout_data = BKE_workspace_layout_type_blueprint_get(layout_type);
+	const char *name = BKE_workspace_layout_type_name_get(layout_type);
+	bScreen *sc = BKE_screen_create_from_layout_data(G.main, &layout_data, name);
 
-	sc = BKE_libblock_alloc(G.main, ID_SCR, BKE_workspace_layout_type_name_get(layout_type));
 	sc->do_refresh = true;
 	sc->redraws_flag = TIME_ALL_3D_WIN | TIME_ALL_ANIM_WIN;
 	sc->winid = winid;
 
-	sv1 = vertbase->first;
-	sv2 = sv1->next;
-	sv3 = sv2->next;
-	sv4 = sv3->next;
-
-	BKE_screen_add_edge(sc, sv1, sv2);
-	BKE_screen_add_edge(sc, sv2, sv3);
-	BKE_screen_add_edge(sc, sv3, sv4);
-	BKE_screen_add_edge(sc, sv4, sv1);
-
-	/* dummy type, no spacedata */
-	screen_addarea(sc, sv1, sv2, sv3, sv4, HEADERDOWN, SPACE_EMPTY);
+	BLI_assert(!BLI_listbase_is_empty(&layout_data.areabase));
 
 	return sc;
 }
diff --git a/source/blender/editors/workspace/screen_ops.c b/source/blender/editors/workspace/screen_ops.c
index eedacacd172..9048ba9584d 100644
--- a/source/blender/editors/workspace/screen_ops.c
+++ b/source/blender/editors/workspace/screen_ops.c
@@ -981,20 +981,12 @@ static int area_dupli_invoke(bContext *C, wmOperator *op, const wmEvent *event)
 {
 	wmWindowManager *wm = CTX_wm_manager(C);
 	wmWindow *newwin, *win = CTX_wm_window(C);
-	Scene *scene;
-	WorkSpace *workspace_old = WM_window_get_active_workspace(win);
-	WorkSpace *workspace_new;
-	WorkSpaceLayout *layout_new;
+	Scene *scene = CTX_data_scene(C);
+	WorkSpace *workspace = WM_window_get_active_workspace(win);
 	ScreenLayoutData layout_data;
-	bScreen *newsc, *sc;
-	ScrArea *sa;
+	bScreen *newsc;
+	ScrArea *sa = CTX_wm_area(C);
 	rcti rect;
-	
-	win = CTX_wm_window(C);
-	scene = CTX_data_scene(C);
-	sc = CTX_wm_screen(C);
-	sa = CTX_wm_area(C);
-	layout_data = BKE_screen_layout_data_get(sc);
 
 	/* XXX hrmf! */
 	if (event->type == EVT_ACTIONZONE_AREA) {
@@ -1022,18 +1014,21 @@ static int area_dupli_invoke(bContext *C, wmOperator *op, const wmEvent *event)
 
 	newwin->scene = scene;
 
-	workspace_new = ED_workspace_add(CTX_data_main(C), BKE_workspace_name_get(workspace_old),
-	                                 BKE_workspace_render_layer_get(workspace_old));
-	WM_window_set_active_workspace(newwin, workspace_new);
+	WM_window_set_active_workspace(newwin, workspace);
+	/* a new screen for newwin has been created when activating the workspace */
+	newsc = BKE_workspace_hook_active_screen_get(newwin->workspace_hook);
 
-	/* allocs new screen and adds to newly created window, using window size */
-	ED_workspace_layout_add(workspace_new, &wm->windows, sc->id.name + 2, layout_data);
-	layout_new = BKE_workspace_hook_active_layout_get(newwin->workspace_hook);
-	newsc = BKE_workspace_layout_screen_get(layout_new);
-	WM_window_set_active_layout(newwin, layout_new);
+	/* remove all data from screen, and add a new empty area */
+	BKE_screen_free(newsc);
+	ED_screen_empty_data_create(BLI_rcti_size_x(&rect), BLI_rcti_size_y(&rect), &layout_data);
+	newsc->areabase = layout_data.areabase;
+	newsc->vertbase = layout_data.vertbase;
+	newsc->edgebase = layout_data.edgebase;
+	BLI_assert(BLI_listbase_count(&newsc->areabase) == 1);
 
 	/* copy area to new screen */
-	BKE_screen_area_data_copy((ScrArea *)newsc->areabase.first, sa, true);
+	BKE_screen_area_data_copy((ScrArea *)newsc->areabase.first, sa, false);
+	ED_screen_refresh(wm, win);
 
 	ED_area_tag_redraw((ScrArea *)newsc->areabase.first);
 
diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c
index 4c15282b95e..0c2d6ee424d 100644
--- a/source/blender/windowmanager/intern/wm_window.c
+++ b/source/blender/windowmanager/intern/wm_window.c
@@ -669,11 +669,10 @@ wmWindow *WM_window_open_temp(bContext *C, const rcti *rect_init, int type)
 	if (screen == NULL) {
 		/* add new screen layout */
 		WorkSpace *workspace = WM_window_get_active_workspace(win);
-		ListBase vertbase = {}, areabase = {};
+		ScreenLayoutData layout_data = {};
 
-		ED_screen_empty_data_create(win->sizex, win->sizey, &vertbase, &areabase);
-		ED_workspace_layout_add(workspace, &wm->windows, "temp", (ScreenLayoutData) {
-		                            .vertbase = vertbase, .areabase = areabase});
+		ED_screen_empty_data_create(win->sizex, win->sizey, &layout_data);
+		ED_workspace_layout_add(workspace, &wm->windows, "temp", layout_data);
 		screen = WM_window_get_active_screen(win);
 	}




More information about the Bf-blender-cvs mailing list