136 lines
2.7 KiB
C++
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);
|
||
|
}
|
||
|
}
|