[Bf-blender-cvs] [cd20acc] workspaces: Make changing layout within workspace work

Julian Eisel noreply at git.blender.org
Tue Dec 6 00:36:51 CET 2016


Commit: cd20acc5297057ff01b0952700fb34498553912e
Author: Julian Eisel
Date:   Tue Dec 6 00:36:09 2016 +0100
Branches: workspaces
https://developer.blender.org/rBcd20acc5297057ff01b0952700fb34498553912e

Make changing layout within workspace work

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

M	source/blender/blenkernel/BKE_workspace.h
M	source/blender/blenkernel/intern/workspace.c
M	source/blender/editors/include/ED_screen.h
M	source/blender/editors/interface/interface_utils.c
M	source/blender/editors/screen/screen_edit.c
M	source/blender/editors/screen/screen_ops.c
M	source/blender/editors/screen/workspace_edit.c
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm_event_system.c
M	source/blender/windowmanager/intern/wm_files.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 861fffd..96ef529 100644
--- a/source/blender/blenkernel/BKE_workspace.h
+++ b/source/blender/blenkernel/BKE_workspace.h
@@ -38,6 +38,8 @@ struct WorkSpace *BKE_workspace_add(Main *bmain, const char *name);
 struct WorkSpace *BKE_workspace_duplicate(Main *bmain, const struct WorkSpace *from, struct bScreen *act_screen);
 void BKE_workspace_free(struct WorkSpace *ws);
 
+struct WorkSpaceLayout *BKE_workspace_layout_add(struct WorkSpace *workspace, struct bScreen *screen) ATTR_NONNULL();
+
 
 /* -------------------------------------------------------------------- */
 /* General Utils */
@@ -51,6 +53,8 @@ struct WorkSpaceLayout *BKE_workspace_layout_find_exec(
 /* -------------------------------------------------------------------- */
 /* Getters/Setters */
 
+struct WorkSpaceLayout *BKE_workspace_active_layout_get(const struct WorkSpace *ws) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
+void                    BKE_workspace_active_layout_set(struct WorkSpace *ws, struct WorkSpaceLayout *layout) ATTR_NONNULL(1);
 struct bScreen *BKE_workspace_active_screen_get(const struct WorkSpace *ws) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
 void            BKE_workspace_active_screen_set(struct WorkSpace *ws, struct bScreen *screen) ATTR_NONNULL(1);
 struct Scene   *BKE_workspace_active_scene_get(const struct WorkSpace *ws) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
diff --git a/source/blender/blenkernel/intern/workspace.c b/source/blender/blenkernel/intern/workspace.c
index e592223..176e2da 100644
--- a/source/blender/blenkernel/intern/workspace.c
+++ b/source/blender/blenkernel/intern/workspace.c
@@ -24,6 +24,7 @@
 
 #include "BLI_utildefines.h"
 
+#include "BKE_global.h"
 #include "BKE_library.h"
 #include "BLI_listbase.h"
 #include "BKE_main.h"
@@ -54,20 +55,31 @@ WorkSpace *BKE_workspace_add(Main *bmain, const char *name)
 WorkSpace *BKE_workspace_duplicate(Main *bmain, const WorkSpace *from, bScreen *act_screen)
 {
 	WorkSpace *new_ws = BKE_libblock_alloc(bmain, ID_WS, from->id.name + 2);
-	WorkSpaceLayout *layout = MEM_mallocN(sizeof(*layout), __func__);
-
-	BLI_assert(!workspaces_is_screen_used(bmain, act_screen));
+	WorkSpaceLayout *new_layout = BKE_workspace_layout_add(new_ws, act_screen);
 
-	new_ws->act_layout = layout;
-	new_ws->act_layout->screen = act_screen;
-	BLI_addhead(&new_ws->layouts, layout);
+	new_ws->act_layout = new_layout;
 
 	return new_ws;
 }
 
 void BKE_workspace_free(WorkSpace *ws)
 {
-	MEM_freeN(ws->act_layout);
+	BLI_freelistN(&ws->layouts);
+}
+
+
+/**
+ * Add a new layout to \a workspace for \a screen.
+ */
+WorkSpaceLayout *BKE_workspace_layout_add(WorkSpace *workspace, bScreen *screen)
+{
+	WorkSpaceLayout *layout = MEM_mallocN(sizeof(*layout), __func__);
+
+	BLI_assert(!workspaces_is_screen_used(G.main, screen));
+	layout->screen = screen;
+	BLI_addhead(&workspace->layouts, layout);
+
+	return layout;
 }
 
 
@@ -121,6 +133,15 @@ WorkSpaceLayout *BKE_workspace_layout_find(const WorkSpace *ws, const bScreen *s
 /* -------------------------------------------------------------------- */
 /* Getters/Setters */
 
+WorkSpaceLayout *BKE_workspace_active_layout_get(const WorkSpace *ws)
+{
+	return ws->act_layout;
+}
+void BKE_workspace_active_layout_set(WorkSpace *ws, WorkSpaceLayout *layout)
+{
+	ws->act_layout = layout;
+}
+
 bScreen *BKE_workspace_active_screen_get(const WorkSpace *ws)
 {
 	return ws->act_layout->screen;
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index 42b2399..3144e85 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -104,7 +104,7 @@ void    ED_screens_initialize(struct wmWindowManager *wm);
 void    ED_screen_draw(struct wmWindow *win);
 void    ED_screen_refresh(struct wmWindowManager *wm, struct wmWindow *win);
 void    ED_screen_do_listen(struct bContext *C, struct wmNotifier *note);
-bScreen *ED_screen_duplicate(struct wmWindow *win, struct bScreen *sc);
+bScreen *ED_screen_duplicate(struct wmWindow *win, struct bScreen *sc, WorkSpaceLayout **r_layout);
 bScreen *ED_screen_add(struct wmWindow *win, struct Scene *scene, const char *name);
 bool    ED_screen_set(struct bContext *C, struct bScreen *sc);
 bool    ED_screen_delete(struct bContext *C, struct bScreen *sc);
diff --git a/source/blender/editors/interface/interface_utils.c b/source/blender/editors/interface/interface_utils.c
index 11e0478..8be49d8 100644
--- a/source/blender/editors/interface/interface_utils.c
+++ b/source/blender/editors/interface/interface_utils.c
@@ -223,6 +223,7 @@ int uiDefAutoButsRNA(
 
 typedef struct CollItemSearch {
 	struct CollItemSearch *next, *prev;
+	ID *id;
 	char *name;
 	int index;
 	int iconid;
@@ -251,6 +252,8 @@ void ui_rna_collection_search_cb(const struct bContext *C, void *arg, const char
 	/* build a temporary list of relevant items first */
 	RNA_PROP_BEGIN (&data->search_ptr, itemptr, data->search_prop)
 	{
+		ID *id = NULL;
+
 		if (flag & PROP_ID_SELF_CHECK)
 			if (itemptr.data == data->target_ptr.id.data)
 				continue;
@@ -262,9 +265,10 @@ void ui_rna_collection_search_cb(const struct bContext *C, void *arg, const char
 		}
 
 		if (itemptr.type && RNA_struct_is_ID(itemptr.type)) {
-			ID *id = itemptr.data;
 			char name_ui[MAX_ID_NAME];
 
+			id = itemptr.data;
+
 #if 0       /* this name is used for a string comparison and can't be modified, TODO */
 			/* if ever enabled, make name_ui be MAX_ID_NAME+1 */
 			BKE_id_ui_prefix(name_ui, id);
@@ -282,6 +286,7 @@ void ui_rna_collection_search_cb(const struct bContext *C, void *arg, const char
 		if (name) {
 			if (skip_filter || BLI_strcasestr(name, str)) {
 				cis = MEM_callocN(sizeof(CollItemSearch), "CollectionItemSearch");
+				cis->id = id;
 				cis->name = MEM_dupallocN(name);
 				cis->index = i;
 				cis->iconid = iconid;
@@ -298,7 +303,8 @@ void ui_rna_collection_search_cb(const struct bContext *C, void *arg, const char
 
 	/* add search items from temporary list */
 	for (cis = items_list->first; cis; cis = cis->next) {
-		if (false == UI_search_item_add(items, cis->name, SET_INT_IN_POINTER(cis->index), cis->iconid)) {
+		void *poin = cis->id ? cis->id : SET_INT_IN_POINTER(cis->index);
+		if (UI_search_item_add(items, cis->name, poin, cis->iconid) == false) {
 			break;
 		}
 	}
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index ecc09da..8b8642b 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -51,6 +51,7 @@
 #include "BKE_node.h"
 #include "BKE_screen.h"
 #include "BKE_scene.h"
+#include "BKE_workspace.h"
 
 #include "BIF_gl.h"
 #include "BIF_glutil.h"
@@ -1051,17 +1052,24 @@ static void drawscredge_area(ScrArea *sa, int sizex, int sizey)
 
 /* ****************** EXPORTED API TO OTHER MODULES *************************** */
 
-bScreen *ED_screen_duplicate(wmWindow *win, bScreen *sc)
+/**
+ * \param r_layout: The layout wrapper created for \a sc. Can be NULL to skip layout creation.
+ */
+bScreen *ED_screen_duplicate(wmWindow *win, bScreen *sc, WorkSpaceLayout **r_layout)
 {
 	bScreen *newsc;
-	
+
 	if (sc->state != SCREENNORMAL) return NULL;  /* XXX handle this case! */
-	
+
 	/* make new empty screen: */
 	newsc = ED_screen_add(win, sc->scene, sc->id.name + 2);
 	/* copy all data */
 	screen_copy(newsc, sc);
 
+	if (r_layout) {
+		*r_layout = BKE_workspace_layout_add(win->workspace, newsc);
+	}
+
 	return newsc;
 }
 
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index 3985cb5..bc5df4f 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -3924,11 +3924,12 @@ static void SCREEN_OT_userpref_show(struct wmOperatorType *ot)
 static int screen_new_exec(bContext *C, wmOperator *UNUSED(op))
 {
 	wmWindow *win = CTX_wm_window(C);
+	WorkSpaceLayout *layout;
 	bScreen *sc = CTX_wm_screen(C);
-	
-	sc = ED_screen_duplicate(win, sc);
-	WM_event_add_notifier(C, NC_SCREEN | ND_SCREENBROWSE, BKE_workspace_layout_find(win->workspace, sc));
-	
+
+	sc = ED_screen_duplicate(win, sc, &layout);
+	WM_event_add_notifier(C, NC_SCREEN | ND_SCREENBROWSE, layout);
+
 	return OPERATOR_FINISHED;
 }
 
diff --git a/source/blender/editors/screen/workspace_edit.c b/source/blender/editors/screen/workspace_edit.c
index 30fb5ea..dba1c40 100644
--- a/source/blender/editors/screen/workspace_edit.c
+++ b/source/blender/editors/screen/workspace_edit.c
@@ -81,7 +81,7 @@ bool ED_workspace_change(bContext *C, wmWindow *win, WorkSpace *ws_new)
 WorkSpace *ED_workspace_duplicate(Main *bmain, wmWindow *win)
 {
 	bScreen *old_screen = WM_window_get_active_screen(win);
-	bScreen *new_screen = ED_screen_duplicate(win, old_screen);
+	bScreen *new_screen = ED_screen_duplicate(win, old_screen, NULL);
 	WorkSpace *old_ws = win->workspace;
 
 	new_screen->winid = win->winid;
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 92f782a..a82eae7 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -101,7 +101,9 @@ int			WM_window_pixels_x		(struct wmWindow *win);
 int			WM_window_pixels_y		(struct wmWindow *win);
 bool		WM_window_is_fullscreen	(struct wmWindow *win);
 
-struct Scene   *WM_window_get_active_scene(const struct wmWindow *win) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
+struct Scene *WM_window_get_active_scene(const struct wmWindow *win) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
+struct WorkSpaceLayout *WM_window_get_active_layout(const struct wmWindow *win) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
+void                    WM_window_set_active_layout(struct wmWindow *win, struct WorkSpaceLayout *layout) ATTR_NONNULL(1);
 struct bScreen *WM_window_get_active_screen(const struct wmWindow *win) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
 void            WM_window_set_active_screen(struct wmWindow *win, struct bScreen *screen) ATTR_NONNULL(1);
 bool WM_window_is_temp_screen(const struct wmWindow *win) ATTR_WARN_UNUSED_RESULT;
diff --git a/source/blender/windowmanager/intern/wm_ev

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list