winamp/Src/Plugins/Library/ml_devices/listWidgetGroup.cpp
2024-09-24 14:54:57 +02:00

136 lines
2.7 KiB
C++

#include "main.h"
#include "./listWidgetInternal.h"
#include <algorithm>
ListWidgetGroup *
ListWidget_CreateGroup(const char *name)
{
ifc_devicetype *deviceType;
wchar_t buffer[1024] = {0};
if (NULL == name)
return NULL;
if (NULL != WASABI_API_DEVICES &&
S_OK == WASABI_API_DEVICES->TypeFind(name, &deviceType))
{
if (FAILED(deviceType->GetDisplayName(buffer, ARRAYSIZE(buffer))))
buffer[0] = L'\0';
deviceType->Release();
}
else
buffer[0] = L'\0';
return ListWidget_CreateGroupEx(name, buffer);
}
ListWidgetGroup *
ListWidget_CreateGroupEx(const char *name, const wchar_t *title)
{
ListWidgetGroup *group;
if (NULL == name)
return NULL;
group = new ListWidgetGroup();
if (NULL == group)
return NULL;
group->name = AnsiString_Duplicate(name);
group->title = String_Duplicate(title);
return group;
}
void
ListWidget_DestroyGroup(ListWidgetGroup *group)
{
size_t index;
if (NULL == group)
return;
index = group->items.size();
while(index--)
{
ListWidget_DestroyItem(group->items[index]);
}
AnsiString_Free(group->name);
String_Free(group->title);
delete group;
}
BOOL
ListWidget_AddGroup( ListWidgetCategory *category, ListWidgetGroup *group)
{
if (NULL == category || NULL == group)
return FALSE;
category->groups.push_back(group);
return TRUE;
}
ListWidgetGroup *
ListWidget_FindGroupEx(ListWidgetCategory *category, const char *name, size_t max)
{
size_t index, count;
if (NULL == category || NULL == name)
return NULL;
count = category->groups.size();
if (max < count)
count = max;
for(index = 0; index < count; index++)
{
ListWidgetGroup *group = category->groups[index];
if (CSTR_EQUAL == CompareStringA(CSTR_INVARIANT, 0, name, -1, group->name, -1))
return group;
}
return NULL;
}
ListWidgetGroup *
ListWidget_FindGroup(ListWidgetCategory *category, const char *name)
{
return ListWidget_FindGroupEx(category, name, -1);
}
static int
ListWidget_ItemSortCb(const void *element1, const void *element2)
{
ListWidgetItem *item1;
ListWidgetItem *item2;
int result;
item1 = (ListWidgetItem*)element1;
item2 = (ListWidgetItem*)element2;
result = CompareString(LOCALE_USER_DEFAULT, 0, item1->title, -1, item2->title, -1);
if (CSTR_EQUAL == result || 0 == result)
result = CompareStringA(CSTR_INVARIANT, 0, item1->name, -1, item2->name, -1);
return (result - 2);
}
static bool
ListWidget_ItemSortCb_V2(const void* element1, const void* element2)
{
return ListWidget_ItemSortCb(element1, element2) < 0;
}
void
ListWidget_SortGroup(ListWidgetGroup *group)
{
if (group->items.size())
{
//qsort(group->items.first(), group->items.size(), sizeof(ListWidgetItem**), ListWidget_ItemSortCb);
std::sort(group->items.begin(), group->items.end(), ListWidget_ItemSortCb_V2);
}
}