forked from bartvdbraak/blender
Fix for [#20216] Search List is unordered
This sorts RNA collection (bones, vgroups, etc) search lists alphabetically like ID data search lists are already.
This commit is contained in:
parent
ef8706c4ea
commit
653593b574
@ -1057,38 +1057,72 @@ void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname)
|
||||
|
||||
/* Pointer RNA button with search */
|
||||
|
||||
typedef struct CollItemSearch {
|
||||
struct CollItemSearch *next, *prev;
|
||||
char *name;
|
||||
int index;
|
||||
int iconid;
|
||||
} CollItemSearch;
|
||||
|
||||
int sort_search_items_list(void *a, void *b)
|
||||
{
|
||||
CollItemSearch *cis1 = (CollItemSearch *)a;
|
||||
CollItemSearch *cis2 = (CollItemSearch *)b;
|
||||
|
||||
if (BLI_strcasecmp(cis1->name, cis2->name)>0)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void rna_search_cb(const struct bContext *C, void *arg_but, char *str, uiSearchItems *items)
|
||||
{
|
||||
uiBut *but= arg_but;
|
||||
char *name;
|
||||
int i, iconid, flag= RNA_property_flag(but->rnaprop);
|
||||
int i=0, iconid=0, flag= RNA_property_flag(but->rnaprop);
|
||||
ListBase *items_list= MEM_callocN(sizeof(ListBase), "items_list");
|
||||
CollItemSearch *cis;
|
||||
|
||||
i = 0;
|
||||
/* build a temporary list of relevant items first */
|
||||
RNA_PROP_BEGIN(&but->rnasearchpoin, itemptr, but->rnasearchprop) {
|
||||
if(flag & PROP_ID_SELF_CHECK)
|
||||
if(itemptr.data == but->rnapoin.id.data)
|
||||
continue;
|
||||
|
||||
iconid= 0;
|
||||
|
||||
if(RNA_struct_is_ID(itemptr.type))
|
||||
iconid= ui_id_icon_get((bContext*)C, itemptr.data);
|
||||
|
||||
|
||||
name= RNA_struct_name_get_alloc(&itemptr, NULL, 0);
|
||||
|
||||
|
||||
if(name) {
|
||||
if(BLI_strcasestr(name, str)) {
|
||||
if(!uiSearchItemAdd(items, name, SET_INT_IN_POINTER(i), iconid)) {
|
||||
MEM_freeN(name);
|
||||
break;
|
||||
}
|
||||
cis = MEM_callocN(sizeof(CollItemSearch), "CollectionItemSearch");
|
||||
cis->name = MEM_dupallocN(name);
|
||||
cis->index = i;
|
||||
cis->iconid = iconid;
|
||||
BLI_addtail(items_list, cis);
|
||||
}
|
||||
|
||||
MEM_freeN(name);
|
||||
}
|
||||
|
||||
MEM_freeN(name);
|
||||
|
||||
i++;
|
||||
}
|
||||
RNA_PROP_END;
|
||||
|
||||
BLI_sortlist(items_list, sort_search_items_list);
|
||||
|
||||
/* add search items from temporary list */
|
||||
for (cis=items_list->first; cis; cis=cis->next) {
|
||||
if (!uiSearchItemAdd(items, cis->name, SET_INT_IN_POINTER(cis->index), cis->iconid)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (cis=items_list->first; cis; cis=cis->next) {
|
||||
MEM_freeN(cis->name);
|
||||
}
|
||||
BLI_freelistN(items_list);
|
||||
MEM_freeN(items_list);
|
||||
}
|
||||
|
||||
static void search_id_collection(StructRNA *ptype, PointerRNA *ptr, PropertyRNA **prop)
|
||||
|
Loading…
Reference in New Issue
Block a user