mirror of
https://github.com/WinampDesktop/winamp.git
synced 2025-06-10 11:59:58 -05:00
Initial community commit
This commit is contained in:
392
Src/Plugins/Library/ml_devices/listWidgetCommand.cpp
Normal file
392
Src/Plugins/Library/ml_devices/listWidgetCommand.cpp
Normal file
@ -0,0 +1,392 @@
|
||||
#include "main.h"
|
||||
#include "./listWidgetInternal.h"
|
||||
|
||||
#define REQUEST_STRING ((wchar_t*)1)
|
||||
#define REQUEST_IMAGE ((DeviceImage*)1)
|
||||
|
||||
typedef struct ListWidgetCommand
|
||||
{
|
||||
char *name;
|
||||
ListWidgetCommandState state;
|
||||
wchar_t *title;
|
||||
wchar_t *description;
|
||||
DeviceImage *imageLarge;
|
||||
DeviceImage *imageSmall;
|
||||
RECT rect;
|
||||
} ListWidgetCommand;
|
||||
|
||||
ListWidgetCommand *
|
||||
ListWidget_CreateCommand(const char *name, BOOL primary, BOOL disabled)
|
||||
{
|
||||
ListWidgetCommand *self;
|
||||
|
||||
if (NULL == name)
|
||||
return NULL;
|
||||
|
||||
self = (ListWidgetCommand*)malloc(sizeof(ListWidgetCommand));
|
||||
if (NULL == self)
|
||||
return NULL;
|
||||
|
||||
ZeroMemory(self, sizeof(ListWidgetCommand));
|
||||
|
||||
self->name = AnsiString_Duplicate(name);
|
||||
self->state = ListWidgetCommandState_Normal;
|
||||
|
||||
if (NULL != self->name)
|
||||
{
|
||||
if (FALSE != primary)
|
||||
self->state |= ListWidgetCommandState_Primary;
|
||||
|
||||
if (FALSE != disabled)
|
||||
self->state |= ListWidgetCommandState_Disabled;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
ListWidget_DestroyCommand(self);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
self->title = REQUEST_STRING;
|
||||
self->description = REQUEST_STRING;
|
||||
self->imageLarge = REQUEST_IMAGE;
|
||||
self->imageSmall = REQUEST_IMAGE;
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
void
|
||||
ListWidget_DestroyCommand(ListWidgetCommand *command)
|
||||
{
|
||||
if (NULL == command)
|
||||
return;
|
||||
|
||||
AnsiString_Free(command->name);
|
||||
|
||||
if (NULL != command->imageLarge && REQUEST_IMAGE != command->imageLarge)
|
||||
DeviceImage_Release(command->imageLarge);
|
||||
|
||||
if (NULL != command->imageSmall && REQUEST_IMAGE != command->imageSmall)
|
||||
DeviceImage_Release(command->imageSmall);
|
||||
|
||||
if (REQUEST_STRING != command->title)
|
||||
String_Free(command->title);
|
||||
|
||||
if (REQUEST_STRING != command->description)
|
||||
String_Free(command->description);
|
||||
|
||||
free(command);
|
||||
}
|
||||
|
||||
size_t
|
||||
ListWigdet_GetDeviceCommands(ListWidgetCommand **buffer, size_t bufferMax, ifc_device *device)
|
||||
{
|
||||
size_t count;
|
||||
ifc_devicesupportedcommandenum *enumerator;
|
||||
ifc_devicesupportedcommand *command;
|
||||
DeviceCommandFlags flags;
|
||||
ListWidgetCommand *widgetCommand;
|
||||
BOOL primaryFound;
|
||||
|
||||
if (NULL == buffer || bufferMax < 1 || NULL == device)
|
||||
return 0;
|
||||
|
||||
if (FAILED(device->EnumerateCommands(&enumerator, DeviceCommandContext_View)))
|
||||
return 0;
|
||||
|
||||
count = 0;
|
||||
primaryFound = FALSE;
|
||||
|
||||
while(S_OK == enumerator->Next(&command, 1, NULL))
|
||||
{
|
||||
if(FAILED(command->GetFlags(&flags)))
|
||||
flags = DeviceCommandFlag_None;
|
||||
|
||||
if (0 == (DeviceCommandFlag_Hidden & flags))
|
||||
{
|
||||
widgetCommand = ListWidget_CreateCommand(command->GetName(),
|
||||
(0 != (DeviceCommandFlag_Primary & flags)),
|
||||
(0 != (DeviceCommandFlag_Disabled & flags)));
|
||||
if (NULL != widgetCommand)
|
||||
{
|
||||
if (0 != (DeviceCommandFlag_Primary & flags))
|
||||
{
|
||||
if (count == bufferMax)
|
||||
{
|
||||
ListWidget_DestroyCommand(buffer[count-1]);
|
||||
count--;
|
||||
}
|
||||
|
||||
if (count > 0)
|
||||
MoveMemory(&buffer[1], buffer, sizeof(ListWidgetCommand*) * count);
|
||||
|
||||
buffer[0] = widgetCommand;
|
||||
primaryFound = TRUE;
|
||||
count++;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (count < bufferMax)
|
||||
{
|
||||
buffer[count] = widgetCommand;
|
||||
count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
command->Release();
|
||||
|
||||
if (count == bufferMax && FALSE != primaryFound)
|
||||
break;
|
||||
}
|
||||
|
||||
enumerator->Release();
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
void
|
||||
ListWidget_DestroyAllCommands(ListWidgetCommand **buffer, size_t bufferMax)
|
||||
{
|
||||
if (NULL == buffer)
|
||||
return;
|
||||
|
||||
while(bufferMax--)
|
||||
ListWidget_DestroyCommand(buffer[bufferMax]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
const char *
|
||||
ListWidget_GetCommandName(ListWidgetCommand *command)
|
||||
{
|
||||
return (NULL != command) ? command->name : NULL;
|
||||
}
|
||||
|
||||
const wchar_t *
|
||||
ListWidget_GetCommandTitle(ListWidgetCommand *command)
|
||||
{
|
||||
if (NULL == command || NULL == command->title)
|
||||
return NULL;
|
||||
|
||||
if (REQUEST_STRING == command->title)
|
||||
{
|
||||
ifc_devicecommand *info;
|
||||
|
||||
command->title = NULL;
|
||||
|
||||
if (NULL != WASABI_API_DEVICES &&
|
||||
S_OK == WASABI_API_DEVICES->CommandFind(command->name, &info))
|
||||
{
|
||||
wchar_t buffer[512] = {0};
|
||||
|
||||
if (SUCCEEDED(info->GetDisplayName(buffer, ARRAYSIZE(buffer))))
|
||||
command->title = String_Duplicate(buffer);
|
||||
|
||||
info->Release();
|
||||
}
|
||||
}
|
||||
|
||||
return command->title;
|
||||
}
|
||||
|
||||
const wchar_t *
|
||||
ListWidget_GetCommandDescription(ListWidgetCommand *command)
|
||||
{
|
||||
if (NULL == command || NULL == command->description)
|
||||
return NULL;
|
||||
|
||||
if (REQUEST_STRING == command->description)
|
||||
{
|
||||
ifc_devicecommand *info;
|
||||
|
||||
command->description = NULL;
|
||||
|
||||
if (NULL != WASABI_API_DEVICES &&
|
||||
S_OK == WASABI_API_DEVICES->CommandFind(command->name, &info))
|
||||
{
|
||||
wchar_t buffer[1024] = {0};
|
||||
|
||||
if (SUCCEEDED(info->GetDescription(buffer, ARRAYSIZE(buffer))))
|
||||
command->description = String_Duplicate(buffer);
|
||||
|
||||
info->Release();
|
||||
}
|
||||
}
|
||||
return command->description;
|
||||
}
|
||||
|
||||
HBITMAP
|
||||
ListWidget_GetCommandLargeBitmap(WidgetStyle *style, ListWidgetCommand *command, int width, int height)
|
||||
{
|
||||
if (NULL == style || NULL == command || NULL == command->imageLarge)
|
||||
return NULL;
|
||||
|
||||
if (REQUEST_IMAGE == command->imageLarge)
|
||||
{
|
||||
ifc_devicecommand *info;
|
||||
|
||||
command->imageLarge = NULL;
|
||||
|
||||
if (NULL != WASABI_API_DEVICES &&
|
||||
S_OK == WASABI_API_DEVICES->CommandFind(command->name, &info))
|
||||
{
|
||||
wchar_t buffer[MAX_PATH * 2] = {0};
|
||||
|
||||
if (FAILED(info->GetIcon(buffer, ARRAYSIZE(buffer), width, height)))
|
||||
buffer[0] = L'\0';
|
||||
|
||||
info->Release();
|
||||
|
||||
if (L'\0' != buffer[0])
|
||||
{
|
||||
command->imageLarge = DeviceImageCache_GetImage(Plugin_GetImageCache(), buffer,
|
||||
width, height, NULL, NULL);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return DeviceImage_GetBitmap(command->imageLarge, DeviceImage_Normal);
|
||||
}
|
||||
|
||||
HBITMAP
|
||||
ListWidget_GetCommandSmallBitmap(WidgetStyle *style, ListWidgetCommand *command, int width, int height)
|
||||
{
|
||||
if (NULL == style || NULL == command || NULL == command->imageSmall)
|
||||
return NULL;
|
||||
|
||||
if (REQUEST_IMAGE == command->imageSmall)
|
||||
{
|
||||
ifc_devicecommand *info;
|
||||
|
||||
command->imageSmall = NULL;
|
||||
|
||||
if (NULL != WASABI_API_DEVICES &&
|
||||
S_OK == WASABI_API_DEVICES->CommandFind(command->name, &info))
|
||||
{
|
||||
wchar_t buffer[MAX_PATH * 2] = {0};
|
||||
|
||||
if (FAILED(info->GetIcon(buffer, ARRAYSIZE(buffer), width, height)))
|
||||
buffer[0] = L'\0';
|
||||
|
||||
info->Release();
|
||||
|
||||
if (L'\0' != buffer[0])
|
||||
{
|
||||
command->imageSmall = DeviceImageCache_GetImage(Plugin_GetImageCache(), buffer,
|
||||
width, height, NULL, NULL);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return DeviceImage_GetBitmap(command->imageSmall, DeviceImage_Normal);
|
||||
}
|
||||
|
||||
BOOL
|
||||
ListWidget_ResetCommandImages(ListWidgetCommand *command)
|
||||
{
|
||||
if (NULL == command)
|
||||
return FALSE;
|
||||
|
||||
if (REQUEST_IMAGE != command->imageLarge)
|
||||
{
|
||||
if (NULL != command->imageLarge)
|
||||
DeviceImage_Release(command->imageLarge);
|
||||
command->imageLarge = REQUEST_IMAGE;
|
||||
}
|
||||
|
||||
if (REQUEST_IMAGE != command->imageSmall)
|
||||
{
|
||||
if (NULL != command->imageSmall)
|
||||
DeviceImage_Release(command->imageSmall);
|
||||
command->imageSmall = REQUEST_IMAGE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL
|
||||
ListWidget_GetCommandRect(ListWidgetCommand *command, RECT *rect)
|
||||
{
|
||||
if (NULL == command || NULL == rect)
|
||||
return FALSE;
|
||||
|
||||
return CopyRect(rect, &command->rect);
|
||||
}
|
||||
|
||||
BOOL
|
||||
ListWidget_SetCommandRect(ListWidgetCommand *command, const RECT *rect)
|
||||
{
|
||||
if (NULL == command || NULL == rect)
|
||||
return FALSE;
|
||||
|
||||
return CopyRect(&command->rect, rect);
|
||||
}
|
||||
|
||||
BOOL
|
||||
ListWidget_GetCommandRectEqual(ListWidgetCommand *command, const RECT *rect)
|
||||
{
|
||||
if (NULL == command || NULL == rect)
|
||||
return FALSE;
|
||||
|
||||
return EqualRect(&command->rect, rect);
|
||||
}
|
||||
|
||||
BOOL
|
||||
ListWidget_GetCommandPrimary(ListWidgetCommand *command)
|
||||
{
|
||||
return (NULL == command ||
|
||||
(0 != (ListWidgetCommandState_Primary & command->state)));
|
||||
}
|
||||
|
||||
|
||||
BOOL
|
||||
ListWidget_GetCommandDisabled(ListWidgetCommand *command)
|
||||
{
|
||||
return (NULL == command ||
|
||||
(0 != (ListWidgetCommandState_Disabled & command->state)));
|
||||
}
|
||||
|
||||
|
||||
BOOL
|
||||
ListWidget_GetCommandPressed(ListWidgetCommand *command)
|
||||
{
|
||||
return (NULL == command ||
|
||||
(0 != (ListWidgetCommandState_Pressed & command->state)));
|
||||
}
|
||||
|
||||
BOOL
|
||||
ListWidget_EnableCommand(ListWidgetCommand *command, BOOL enable)
|
||||
{
|
||||
if (NULL == command)
|
||||
return FALSE;
|
||||
|
||||
if ((FALSE == enable) == (0 != (ListWidgetCommandState_Disabled & command->state)))
|
||||
return FALSE;
|
||||
|
||||
if (FALSE == enable)
|
||||
command->state |= ListWidgetCommandState_Disabled;
|
||||
else
|
||||
command->state &= ~ListWidgetCommandState_Disabled;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL
|
||||
ListWidget_SetCommandPressed(ListWidgetCommand *command, BOOL pressed)
|
||||
{
|
||||
if (NULL == command)
|
||||
return FALSE;
|
||||
|
||||
if ((FALSE == pressed) == (0 == (ListWidgetCommandState_Pressed & command->state)))
|
||||
return FALSE;
|
||||
|
||||
if (FALSE == pressed)
|
||||
command->state &= ~ListWidgetCommandState_Pressed;
|
||||
else
|
||||
command->state |= ListWidgetCommandState_Pressed;
|
||||
|
||||
return TRUE;
|
||||
}
|
Reference in New Issue
Block a user