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:
Matt Ebb 2009-12-10 01:29:43 +00:00
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)