diff options
author | Julian Eisel <julian@blender.org> | 2020-04-10 21:07:11 +0300 |
---|---|---|
committer | Julian Eisel <julian@blender.org> | 2020-04-10 21:25:17 +0300 |
commit | d6cefef98f87ae8554050052d0fa4f965a2ce809 (patch) | |
tree | 02947c220502c516e1e93f8d8a04d0bd885fd9c0 /source/blender/editors/interface/interface_utils.c | |
parent | d216a0b505735da432448c438982b5cac1cba9ee (diff) |
UI: Better support for linked data-blocks in search buttons
In RNA pointer search buttons (i.e. the ones with an eyedropper),
data-blocks were handled badly. It was not possible to select a linked
data-block that had the same name as a local one, which is especially
common with library overrides. Neither was there a hint to tell appart
linked data-blocks and which .blend file they come from.
These issues are addressed now, we show an "L" prefix and the .blend
file name in the search box (like in ID-templates).
Changes here are quite simple, since the heavy lifting was already done
through c20c203b8226.
Addresses T73156.
Diffstat (limited to 'source/blender/editors/interface/interface_utils.c')
-rw-r--r-- | source/blender/editors/interface/interface_utils.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/source/blender/editors/interface/interface_utils.c b/source/blender/editors/interface/interface_utils.c index 2d687781b61..79a90d27373 100644 --- a/source/blender/editors/interface/interface_utils.c +++ b/source/blender/editors/interface/interface_utils.c @@ -36,6 +36,7 @@ #include "BLT_translation.h" +#include "BKE_lib_id.h" #include "BKE_report.h" #include "MEM_guardedalloc.h" @@ -395,11 +396,12 @@ void ui_rna_collection_search_cb(const struct bContext *C, uiSearchItems *items) { uiRNACollectionSearch *data = arg; - char *name; 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 skip_filter = data->search_but && !data->search_but->changed; + char name_buf[UI_MAX_DRAW_STR]; + char *name; /* build a temporary list of relevant items first */ RNA_PROP_BEGIN (&data->search_ptr, itemptr, data->search_prop) { @@ -417,24 +419,31 @@ void ui_rna_collection_search_cb(const struct bContext *C, } } - /* Could use the string length here. */ - name = RNA_struct_name_get_alloc(&itemptr, NULL, 0, NULL); - iconid = 0; 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; + } + else { + name = RNA_struct_name_get_alloc(&itemptr, name_buf, sizeof(name_buf), NULL); } if (name) { if (skip_filter || BLI_strcasestr(name, str)) { cis = MEM_callocN(sizeof(CollItemSearch), "CollectionItemSearch"); cis->data = itemptr.data; - cis->name = MEM_dupallocN(name); + cis->name = BLI_strdup(name); cis->index = i; cis->iconid = iconid; BLI_addtail(items_list, cis); } - MEM_freeN(name); + if (name != name_buf) { + MEM_freeN(name); + } } i++; |