mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-09-24 15:54:12 +00:00
237 lines
5 KiB
C++
237 lines
5 KiB
C++
|
#include "IconStore.h"
|
||
|
#include "resource1.h"
|
||
|
#include "..\..\General\gen_ml/ml.h"
|
||
|
|
||
|
extern winampMediaLibraryPlugin plugin;
|
||
|
IconStore icon_store;
|
||
|
|
||
|
static int IconStore_RegisterBitmap(HMLIMGLST imageList, int index, HINSTANCE module, const wchar_t *iconName)
|
||
|
{
|
||
|
MLIMAGESOURCE imageSource;
|
||
|
MLIMAGELISTITEM listItem;
|
||
|
|
||
|
imageSource.cbSize = sizeof(imageSource);
|
||
|
imageSource.hInst = module;
|
||
|
imageSource.lpszName = iconName;
|
||
|
imageSource.type = SRC_TYPE_PNG;
|
||
|
imageSource.bpp = 32;
|
||
|
imageSource.flags = ISF_FORCE_BPP;
|
||
|
|
||
|
if (NULL == module && FALSE == IS_INTRESOURCE(iconName))
|
||
|
imageSource.flags |= ISF_LOADFROMFILE;
|
||
|
|
||
|
listItem.cbSize = sizeof(listItem);
|
||
|
listItem.hmlil = imageList;
|
||
|
listItem.filterUID = MLIF_FILTER3_UID;
|
||
|
listItem.pmlImgSource = &imageSource;
|
||
|
listItem.mlilIndex = index;
|
||
|
|
||
|
if (listItem.mlilIndex >= 0)
|
||
|
{
|
||
|
if (FALSE == MLImageList_Replace(plugin.hwndLibraryParent, &listItem))
|
||
|
return -1;
|
||
|
return listItem.mlilIndex;
|
||
|
}
|
||
|
|
||
|
return MLImageList_Add(plugin.hwndLibraryParent, &listItem);
|
||
|
}
|
||
|
|
||
|
static BOOL IconStore_IsResourceNameEqual(const wchar_t *name1, const wchar_t *name2)
|
||
|
{
|
||
|
if (FALSE != IS_INTRESOURCE(name1) || FALSE != IS_INTRESOURCE(name2))
|
||
|
{
|
||
|
return (name1 == name2);
|
||
|
}
|
||
|
|
||
|
return (CSTR_EQUAL == CompareString(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT),
|
||
|
NORM_IGNORECASE, name1, -1, name2, -1));
|
||
|
}
|
||
|
|
||
|
static void IconStore_FreeResourceName(wchar_t *name)
|
||
|
{
|
||
|
if (FALSE == IS_INTRESOURCE(name))
|
||
|
free(name);
|
||
|
}
|
||
|
|
||
|
IconStore::IconStore()
|
||
|
{
|
||
|
playlist_icon_index = -1;
|
||
|
video_icon_index = -1;
|
||
|
device_icon_index = -1;
|
||
|
for (int i = 0; i < 4; i++)
|
||
|
{
|
||
|
active_queue_icon[i] = queue_icon_index[i] = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
IconStore::~IconStore()
|
||
|
{
|
||
|
size_t index;
|
||
|
|
||
|
index = iconList.size();
|
||
|
while(index--)
|
||
|
{
|
||
|
IconStore_FreeResourceName(iconList[index].name);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int IconStore::GetPlaylistIcon()
|
||
|
{
|
||
|
if (-1 == playlist_icon_index)
|
||
|
{
|
||
|
playlist_icon_index = IconStore_RegisterBitmap(MLNavCtrl_GetImageList(plugin.hwndLibraryParent), -1,
|
||
|
plugin.hDllInstance, MAKEINTRESOURCE(IDR_PLAYLIST_ICON));
|
||
|
}
|
||
|
|
||
|
return playlist_icon_index;
|
||
|
}
|
||
|
|
||
|
int IconStore::GetVideoIcon()
|
||
|
{
|
||
|
if (-1 == video_icon_index)
|
||
|
{
|
||
|
MLIMAGELISTTAG imageTag;
|
||
|
|
||
|
imageTag.hmlil = MLNavCtrl_GetImageList(plugin.hwndLibraryParent);
|
||
|
imageTag.nTag = 102; // video node image tag registered by ml_local
|
||
|
|
||
|
if (FALSE != MLImageList_GetIndexFromTag(plugin.hwndLibraryParent, &imageTag))
|
||
|
video_icon_index = imageTag.mlilIndex;
|
||
|
else
|
||
|
video_icon_index = IconStore_RegisterBitmap(imageTag.hmlil, -1,
|
||
|
plugin.hDllInstance, MAKEINTRESOURCE(IDR_VIDEO_ICON));
|
||
|
}
|
||
|
|
||
|
return video_icon_index;
|
||
|
}
|
||
|
|
||
|
int IconStore::GetDeviceIcon()
|
||
|
{
|
||
|
if (-1 == device_icon_index)
|
||
|
{
|
||
|
HMLIMGLST imageList;
|
||
|
|
||
|
imageList = MLNavCtrl_GetImageList(plugin.hwndLibraryParent);
|
||
|
if (NULL != imageList)
|
||
|
{
|
||
|
device_icon_index = IconStore_RegisterBitmap(imageList, -1,
|
||
|
plugin.hDllInstance, MAKEINTRESOURCE(IDR_DEVICE_ICON));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return device_icon_index;
|
||
|
}
|
||
|
|
||
|
int IconStore::GetQueueIcon(int iconIndex)
|
||
|
{
|
||
|
if (!queue_icon_index[iconIndex])
|
||
|
{
|
||
|
HMLIMGLST imageList;
|
||
|
|
||
|
imageList = MLNavCtrl_GetImageList(plugin.hwndLibraryParent);
|
||
|
if (NULL != imageList)
|
||
|
{
|
||
|
queue_icon_index[iconIndex] = IconStore_RegisterBitmap(imageList, -1,
|
||
|
plugin.hDllInstance, MAKEINTRESOURCE(IDB_XFER_QUEUE_16 + iconIndex));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return queue_icon_index[iconIndex];
|
||
|
}
|
||
|
|
||
|
void IconStore::ReleaseResourceIcon(int iconIndex)
|
||
|
{
|
||
|
if (-1 == iconIndex)
|
||
|
return;
|
||
|
|
||
|
size_t index = iconList.size();
|
||
|
while(index--)
|
||
|
{
|
||
|
ResourceIcon *icon = &iconList[index];
|
||
|
if (icon->index == iconIndex)
|
||
|
{
|
||
|
if (0 != icon->ref)
|
||
|
{
|
||
|
icon->ref--;
|
||
|
if (0 == icon->ref)
|
||
|
{
|
||
|
IconStore_FreeResourceName(icon->name);
|
||
|
icon->name = NULL;
|
||
|
icon->module = NULL;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int IconStore::GetResourceIcon(HINSTANCE module, const wchar_t *name)
|
||
|
{
|
||
|
ResourceIcon *icon;
|
||
|
size_t index;
|
||
|
|
||
|
if (module == plugin.hDllInstance &&
|
||
|
FALSE != IS_INTRESOURCE(name) &&
|
||
|
name == MAKEINTRESOURCE(IDR_DEVICE_ICON))
|
||
|
{
|
||
|
return GetDeviceIcon();
|
||
|
}
|
||
|
|
||
|
index = iconList.size();
|
||
|
while(index--)
|
||
|
{
|
||
|
icon = &iconList[index];
|
||
|
if (icon->module == module &&
|
||
|
FALSE != IconStore_IsResourceNameEqual(icon->name, name))
|
||
|
{
|
||
|
icon->ref++;
|
||
|
return icon->index;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return RegisterResourceIcon(module, name);
|
||
|
}
|
||
|
|
||
|
int IconStore::RegisterResourceIcon(HINSTANCE module, const wchar_t *name)
|
||
|
{
|
||
|
ResourceIcon *icon, iconData;
|
||
|
HMLIMGLST imageList;
|
||
|
size_t index;
|
||
|
|
||
|
imageList = MLNavCtrl_GetImageList(plugin.hwndLibraryParent);
|
||
|
if (NULL == imageList)
|
||
|
return -1;
|
||
|
|
||
|
index = iconList.size();
|
||
|
while(index--)
|
||
|
{
|
||
|
icon = &iconList[index];
|
||
|
if (0 == icon->ref)
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
if ((size_t)-1 == index)
|
||
|
{
|
||
|
icon = &iconData;
|
||
|
icon->index = -1;
|
||
|
}
|
||
|
|
||
|
if (FALSE != IS_INTRESOURCE(name))
|
||
|
icon->name = (wchar_t*)name;
|
||
|
else
|
||
|
{
|
||
|
icon->name = _wcsdup(name);
|
||
|
if (NULL == icon->name)
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
icon->ref = 1;
|
||
|
icon->module = module;
|
||
|
icon->index = IconStore_RegisterBitmap(imageList, icon->index, icon->module, icon->name);
|
||
|
|
||
|
if (-1 != icon->index && &iconData == icon)
|
||
|
iconList.push_back(iconData);
|
||
|
|
||
|
return icon->index;
|
||
|
}
|