[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