[Bf-blender-cvs] [4a66507972] workspaces: Only ensure unique layout name within workspace

Julian Eisel noreply at git.blender.org
Tue Mar 14 16:55:17 CET 2017


Commit: 4a6650797263a6af2624556dc2f0b4f347c2025c
Author: Julian Eisel
Date:   Tue Mar 14 16:50:10 2017 +0100
Branches: workspaces
https://developer.blender.org/rB4a6650797263a6af2624556dc2f0b4f347c2025c

Only ensure unique layout name within workspace

For users it doesn't make sense to have screen-layout names unique in
the entire .blend, since they are just a sub-set of workspaces for them.

Uses RNA_def_struct_name_property to override the RNA name of bScreen
and makes sure template_ID gets the name from RNA, not from ID directly.

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

M	source/blender/blenkernel/BKE_workspace.h
M	source/blender/blenkernel/intern/workspace.c
M	source/blender/blenlib/BLI_string.h
M	source/blender/blenloader/intern/versioning_280.c
M	source/blender/editors/interface/interface_templates.c
M	source/blender/editors/interface/interface_utils.c
M	source/blender/editors/workspace/screen_ops.c
M	source/blender/editors/workspace/workspace_layout_edit.c
M	source/blender/makesdna/dna_workspace_types.h
M	source/blender/makesrna/intern/rna_screen.c

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

diff --git a/source/blender/blenkernel/BKE_workspace.h b/source/blender/blenkernel/BKE_workspace.h
index 8e5a406f7e..6751f60bfc 100644
--- a/source/blender/blenkernel/BKE_workspace.h
+++ b/source/blender/blenkernel/BKE_workspace.h
@@ -59,7 +59,7 @@ void BKE_workspace_remove(WorkSpace *workspace, struct Main *bmain);
 WorkSpaceInstanceHook *BKE_workspace_instance_hook_create(void);
 void BKE_workspace_instance_hook_free(WorkSpaceInstanceHook *hook);
 
-struct WorkSpaceLayout *BKE_workspace_layout_add(WorkSpace *workspace, struct bScreen *screen) ATTR_NONNULL();
+struct WorkSpaceLayout *BKE_workspace_layout_add(WorkSpace *workspace, struct bScreen *screen, const char *name) ATTR_NONNULL();
 void BKE_workspace_layout_remove(WorkSpace *workspace, WorkSpaceLayout *layout, struct Main *bmain) ATTR_NONNULL();
 
 
@@ -116,9 +116,10 @@ void             BKE_workspace_temp_layout_store_set(WorkSpaceInstanceHook *hook
 WorkSpace *BKE_workspace_next_get(const WorkSpace *workspace) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
 WorkSpace *BKE_workspace_prev_get(const WorkSpace *workspace) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
 
+char *BKE_workspace_layout_name_get(WorkSpaceLayout *layout) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
+void  BKE_workspace_layout_name_set(WorkSpace *workspace, WorkSpaceLayout *layout, const char *new_name) ATTR_NONNULL();
 struct bScreen *BKE_workspace_layout_screen_get(const WorkSpaceLayout *layout) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
 void            BKE_workspace_layout_screen_set(WorkSpaceLayout *layout, struct bScreen *screen) ATTR_NONNULL(1);
-
 WorkSpaceLayout *BKE_workspace_layout_next_get(const WorkSpaceLayout *layout) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
 WorkSpaceLayout *BKE_workspace_layout_prev_get(const WorkSpaceLayout *layout) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
 
diff --git a/source/blender/blenkernel/intern/workspace.c b/source/blender/blenkernel/intern/workspace.c
index e51f361953..cdecfca4fa 100644
--- a/source/blender/blenkernel/intern/workspace.c
+++ b/source/blender/blenkernel/intern/workspace.c
@@ -26,6 +26,8 @@
 
 #include <stdlib.h>
 
+#include "BLI_string.h"
+#include "BLI_string_utils.h"
 #include "BLI_utildefines.h"
 #include "BLI_listbase.h"
 
@@ -45,6 +47,15 @@
 
 bool workspaces_is_screen_used(const Main *bmain, bScreen *screen);
 
+/* -------------------------------------------------------------------- */
+/* Internal utils */
+
+static void workspace_name_set(WorkSpace *workspace, WorkSpaceLayout *layout, const char *new_name)
+{
+	BLI_strncpy(layout->name, new_name, sizeof(layout->name));
+	BLI_uniquename(&workspace->layouts, layout, "Layout", '.', offsetof(WorkSpaceLayout, name), sizeof(layout->name));
+}
+
 
 /* -------------------------------------------------------------------- */
 /* Create, delete, init */
@@ -91,12 +102,13 @@ void BKE_workspace_instance_hook_free(WorkSpaceInstanceHook *hook)
 /**
  * Add a new layout to \a workspace for \a screen.
  */
-WorkSpaceLayout *BKE_workspace_layout_add(WorkSpace *workspace, bScreen *screen)
+WorkSpaceLayout *BKE_workspace_layout_add(WorkSpace *workspace, bScreen *screen, const char *name)
 {
 	WorkSpaceLayout *layout = MEM_mallocN(sizeof(*layout), __func__);
 
 	BLI_assert(!workspaces_is_screen_used(G.main, screen));
 	layout->screen = screen;
+	workspace_name_set(workspace, layout, name);
 	BLI_addhead(&workspace->layouts, layout);
 
 	return layout;
@@ -294,6 +306,15 @@ WorkSpace *BKE_workspace_prev_get(const WorkSpace *workspace)
 }
 
 
+char *BKE_workspace_layout_name_get(WorkSpaceLayout *layout)
+{
+	return layout->name;
+}
+void BKE_workspace_layout_name_set(WorkSpace *workspace, WorkSpaceLayout *layout, const char *new_name)
+{
+	workspace_name_set(workspace, layout, new_name);
+}
+
 bScreen *BKE_workspace_layout_screen_get(const WorkSpaceLayout *layout)
 {
 	return layout->screen;
diff --git a/source/blender/blenlib/BLI_string.h b/source/blender/blenlib/BLI_string.h
index d137806c57..d7430648a5 100644
--- a/source/blender/blenlib/BLI_string.h
+++ b/source/blender/blenlib/BLI_string.h
@@ -38,6 +38,7 @@
 extern "C" {
 #endif
 
+#include "BLI_utildefines.h"
 #include "BLI_compiler_attrs.h"
 
 char *BLI_strdupn(const char *str, const size_t len) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index 52e7fe7288..23a8ec6327 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -63,7 +63,7 @@ static void do_version_workspaces_before_lib_link(Main *main)
 
 	for (bScreen *screen = main->screen.first; screen; screen = screen->id.next) {
 		WorkSpace *ws = BKE_workspace_add(main, screen->id.name + 2);
-		BKE_workspace_layout_add(ws, screen);
+		BKE_workspace_layout_add(ws, screen, screen->id.name + 2);
 
 		/* For compatibility, the workspace should be activated that represents the active
 		 * screen of the old file. This is done in blo_do_versions_after_linking_270. */
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index 8ebfb64aba..dbb9882bad 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -151,12 +151,15 @@ static void id_search_listbase_cb(const bContext *C, void *arg_template, const c
 
 	/* ID listbase */
 	for (id = lb->first; id; id = id->next) {
+		PointerRNA ptr;
+
+		RNA_id_pointer_create(id, &ptr);
+
 		if (!((flag & PROP_ID_SELF_CHECK) && id == id_from)) {
+			char *name;
 
 			/* use filter */
 			if (RNA_property_type(template->prop) == PROP_POINTER) {
-				PointerRNA ptr;
-				RNA_id_pointer_create(id, &ptr);
 				if (RNA_property_pointer_poll(&template->ptr, template->prop, &ptr) == 0)
 					continue;
 			}
@@ -166,18 +169,25 @@ static void id_search_listbase_cb(const bContext *C, void *arg_template, const c
 				if ((id->name[2] == '.') && (str[0] != '.'))
 					continue;
 
-			if (*str == '\0' || BLI_strcasestr(id->name + 2, str)) {
+			name = RNA_struct_name_get_alloc(&ptr, NULL, 0, NULL);
+			if (*str == '\0' || BLI_strcasestr(name, str)) {
 				/* +1 is needed because BKE_id_ui_prefix used 3 letter prefix
 				 * followed by ID_NAME-2 characters from id->name
 				 */
 				char name_ui[MAX_ID_NAME + 1];
+
 				BKE_id_ui_prefix(name_ui, id);
+				/* override id name with the one we got from RNA (usually the same), but keep prefix */
+				BLI_strncpy(name_ui + 3, name, sizeof(name_ui) - 3);
 
 				iconid = ui_id_icon_get(C, id, template->preview);
 
-				if (false == UI_search_item_add(items, name_ui, id, iconid))
+				if (!UI_search_item_add(items, name_ui, id, iconid)) {
+					MEM_freeN(name);
 					break;
+				}
 			}
+			MEM_freeN(name);
 		}
 	}
 }
@@ -492,13 +502,14 @@ static void template_ID(
 
 	/* text button with name */
 	if (id) {
+		PropertyRNA *prop = RNA_struct_name_property(type);
 		char name[UI_MAX_NAME_STR];
 		const bool user_alert = (id->us <= 0);
 
 		//text_idbutton(id, name);
 		name[0] = '\0';
-		but = uiDefButR(block, UI_BTYPE_TEXT, 0, name, 0, 0, UI_UNIT_X * 6, UI_UNIT_Y,
-		                &idptr, "name", -1, 0, 0, -1, -1, RNA_struct_ui_description(type));
+		but = uiDefButR_prop(block, UI_BTYPE_TEXT, 0, name, 0, 0, UI_UNIT_X * 6, UI_UNIT_Y,
+		                     &idptr, prop, -1, 0, 0, -1, -1, RNA_struct_ui_description(type));
 		UI_but_funcN_set(but, template_id_cb, MEM_dupallocN(template), SET_INT_IN_POINTER(UI_ID_RENAME));
 		if (user_alert) UI_but_flag_enable(but, UI_BUT_REDALERT);
 
diff --git a/source/blender/editors/interface/interface_utils.c b/source/blender/editors/interface/interface_utils.c
index d4ec2eb923..1d3eacaff9 100644
--- a/source/blender/editors/interface/interface_utils.c
+++ b/source/blender/editors/interface/interface_utils.c
@@ -262,24 +262,12 @@ void ui_rna_collection_search_cb(const struct bContext *C, void *arg, const char
 				continue;
 		}
 
+		name = RNA_struct_name_get_alloc(&itemptr, NULL, 0, NULL); /* could use the string length here */
+		iconid = 0;
 		if (itemptr.type && RNA_struct_is_ID(itemptr.type)) {
-			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);
-#else
-			BLI_strncpy(name_ui, id->name + 2, sizeof(name_ui));
-#endif
-			name = BLI_strdup(name_ui);
 			iconid = ui_id_icon_get(C, id, false);
 		}
-		else {
-			name = RNA_struct_name_get_alloc(&itemptr, NULL, 0, NULL); /* could use the string length here */
-			iconid = 0;
-		}
 
 		if (name) {
 			if (skip_filter || BLI_strcasestr(name, str)) {
diff --git a/source/blender/editors/workspace/screen_ops.c b/source/blender/editors/workspace/screen_ops.c
index 3b72c5df2d..16955d14f2 100644
--- a/source/blender/editors/workspace/screen_ops.c
+++ b/source/blender/editors/workspace/screen_ops.c
@@ -982,14 +982,14 @@ static int area_dupli_invoke(bContext *C, wmOperator *op, const wmEvent *event)
 	wmWindow *newwin, *win = CTX_wm_window(C);
 	Scene *scene;
 	WorkSpace *workspace = WM_window_get_active_workspace(win);
+	WorkSpaceLayout *layout_old = WM_window_get_active_layout(win);
 	WorkSpaceLayout *layout_new;
-	bScreen *newsc, *sc;
+	bScreen *newsc;
 	ScrArea *sa;
 	rcti rect;
 	
 	win = CTX_wm_window(C);
 	scene = CTX_data_scene(C);
-	sc = CTX_wm_screen(C);
 	sa = CTX_wm_area(C);
 	
 	/* XXX hrmf! */
@@ -1020,7 +1020,7 @@ static int area_dupli_invoke(bContext *C, wmOperator *op, const wmEvent *event)
 
 	WM_window_set_active_workspace(newwin, workspace);
 	/* allocs new screen and adds to newly created window, using window size */
-	layout_new = ED_workspace_layout_add(workspace, newwin, sc->id.name + 2);
+	layout_new = ED_workspace_layout_add(workspace, newwin, BKE_workspace_layout_name_get(layout_old));
 	newsc = BKE_workspace_layout_screen_get(layout_new);
 	WM_window_set_active_layout(newwin, layout_new);
 
diff --git a/source/blender/editors/workspace/workspace_layout_edit.c b/source/blender/editors/workspace/workspace_layout_edit.c
index 0a3c9d03ff..157a6bb687 100644
--- a/s

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list