[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