[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