Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Eisel <julian@blender.org>2020-05-11 17:55:33 +0300
committerJulian Eisel <julian@blender.org>2020-05-11 18:13:04 +0300
commit249ccab111ac05158064d20ba0fbd1f618f9aa92 (patch)
treeaeb985b3d5e4b841ac56abb6cecad798f954f752 /source/blender/editors/interface/interface_utils.c
parent27e3361eb5399dc1a700d7f05d5b7b329bc4eafd (diff)
Fix T76621: UILayout.prop_search() broken for data-block names
If the search menu was used for a string property, and a data-block was selected from the search, the value set would be an invalid name. The property would get the modified UI string, not the proper data name set. Mistake in rBd6cefef98f87. This is more of a temporary fix to make the menu behave like before above's commit. So the library hints this added will not be shown for string properties anymore. This would need further changes in the UI code (see https://developer.blender.org/P1380) but is too unsafe for 2.83 at this point. Even if this is done, the note below still applies. NOTE: Data-blocks should not be referenced by name only, as it's possible to have duplicate data-block names with linking and especially with library overriding. Instead, pointer properties should be used, `UILayout.prop_search()` can then properly deal with linked and overridden data-blocks.
Diffstat (limited to 'source/blender/editors/interface/interface_utils.c')
-rw-r--r--source/blender/editors/interface/interface_utils.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/source/blender/editors/interface/interface_utils.c b/source/blender/editors/interface/interface_utils.c
index 79a90d27373..781c8f73b0a 100644
--- a/source/blender/editors/interface/interface_utils.c
+++ b/source/blender/editors/interface/interface_utils.c
@@ -399,6 +399,11 @@ void ui_rna_collection_search_cb(const struct bContext *C,
int i = 0, iconid = 0, flag = RNA_property_flag(data->target_prop);
ListBase *items_list = MEM_callocN(sizeof(ListBase), "items_list");
CollItemSearch *cis;
+ const bool is_ptr_target = (RNA_property_type(data->target_prop) == PROP_POINTER);
+ /* For non-pointer properties, UI code acts entirely based on the item's name. So the name has to
+ * match the RNA name exactly. So only for pointer properties, the name can be modified to add
+ * further UI hints. */
+ const bool requires_exact_data_name = !is_ptr_target;
const bool skip_filter = data->search_but && !data->search_but->changed;
char name_buf[UI_MAX_DRAW_STR];
char *name;
@@ -413,7 +418,7 @@ void ui_rna_collection_search_cb(const struct bContext *C,
}
/* use filter */
- if (RNA_property_type(data->target_prop) == PROP_POINTER) {
+ if (is_ptr_target) {
if (RNA_property_pointer_poll(&data->target_ptr, data->target_prop, &itemptr) == 0) {
continue;
}
@@ -423,10 +428,15 @@ void ui_rna_collection_search_cb(const struct bContext *C,
if (itemptr.type && RNA_struct_is_ID(itemptr.type)) {
iconid = ui_id_icon_get(C, itemptr.data, false);
- BKE_id_full_name_ui_prefix_get(name_buf, itemptr.data);
- BLI_STATIC_ASSERT(sizeof(name_buf) >= MAX_ID_FULL_NAME_UI,
- "Name string buffer should be big enough to hold full UI ID name");
- name = name_buf;
+ if (requires_exact_data_name) {
+ name = RNA_struct_name_get_alloc(&itemptr, name_buf, sizeof(name_buf), NULL);
+ }
+ else {
+ BKE_id_full_name_ui_prefix_get(name_buf, itemptr.data);
+ BLI_STATIC_ASSERT(sizeof(name_buf) >= MAX_ID_FULL_NAME_UI,
+ "Name string buffer should be big enough to hold full UI ID name");
+ name = name_buf;
+ }
}
else {
name = RNA_struct_name_get_alloc(&itemptr, name_buf, sizeof(name_buf), NULL);