mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-09-24 15:54:12 +00:00
160 lines
3.8 KiB
C++
160 lines
3.8 KiB
C++
|
#include "main.h"
|
||
|
#include "./menu.h"
|
||
|
#include "./ratingMenu.h"
|
||
|
#include "./ifc_skinhelper.h"
|
||
|
#include "./ifc_skinnedmenu.h"
|
||
|
#include "./ifc_menucustomizer.h"
|
||
|
#include "./resource.h"
|
||
|
#include "../nu/menuHelpers.h"
|
||
|
|
||
|
#define SUBMENU_RATING 0
|
||
|
#define SUBMENU_TOOLBAR 1
|
||
|
#define SUBMENU_ADDRESSBAR 2
|
||
|
|
||
|
static HRESULT Menu_GetSkinnedMenu(ifc_skinnedmenu **skinnedMenu)
|
||
|
{
|
||
|
if (NULL == skinnedMenu) return E_POINTER;
|
||
|
|
||
|
ifc_skinhelper *skinHelper = NULL;
|
||
|
HRESULT hr = Plugin_GetSkinHelper(&skinHelper);
|
||
|
if (SUCCEEDED(hr) && skinHelper != NULL)
|
||
|
{
|
||
|
hr = skinHelper->QueryInterface(IFC_SkinnedMenu, (void**)skinnedMenu);
|
||
|
skinHelper->Release();
|
||
|
}
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
static HMENU Menu_CreateRatingMenu(HMENU baseMenu, INT ratingValue)
|
||
|
{
|
||
|
HMENU menu = GetSubMenu(baseMenu, SUBMENU_RATING);
|
||
|
if (NULL == menu) return NULL;
|
||
|
|
||
|
menu = MenuHelper_DuplcateMenu(menu);
|
||
|
if (NULL == menu) return NULL;
|
||
|
|
||
|
if (FALSE == RatingMenu_InitializeMenu(menu, ratingValue))
|
||
|
{
|
||
|
DestroyMenu(menu);
|
||
|
menu = NULL;
|
||
|
}
|
||
|
|
||
|
return menu;
|
||
|
}
|
||
|
|
||
|
static HMENU Menu_GetToolbarContext(HMENU baseMenu, UINT flags)
|
||
|
{
|
||
|
HMENU hMenu = GetSubMenu(baseMenu, SUBMENU_TOOLBAR);
|
||
|
return hMenu;
|
||
|
}
|
||
|
|
||
|
static HMENU Menu_GetAddressbarContext(HMENU baseMenu, UINT flags)
|
||
|
{
|
||
|
HMENU hMenu = GetSubMenu(baseMenu, SUBMENU_ADDRESSBAR);
|
||
|
return hMenu;
|
||
|
}
|
||
|
|
||
|
void Menu_ConvertRatingMenuStar(HMENU menu, UINT menu_id)
|
||
|
{
|
||
|
MENUITEMINFOW mi = {sizeof(mi), MIIM_DATA | MIIM_TYPE, MFT_STRING};
|
||
|
wchar_t rateBuf[32] = {0}, *rateStr = rateBuf;
|
||
|
mi.dwTypeData = rateBuf;
|
||
|
mi.cch = 32;
|
||
|
if(GetMenuItemInfoW(menu, menu_id, FALSE, &mi))
|
||
|
{
|
||
|
while(rateStr && *rateStr)
|
||
|
{
|
||
|
if(*rateStr == L'*') *rateStr = L'\u2605';
|
||
|
rateStr=CharNextW(rateStr);
|
||
|
}
|
||
|
SetMenuItemInfoW(menu, menu_id, FALSE, &mi);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
HMENU Menu_GetMenu(INT menuKind, UINT flags)
|
||
|
{
|
||
|
HMENU baseMenu = Plugin_LoadMenu(MAKEINTRESOURCE(IDR_CONTEXTMENU));
|
||
|
if (NULL == baseMenu)
|
||
|
return NULL;
|
||
|
|
||
|
HMENU rate_hmenu = GetSubMenu(baseMenu,0);
|
||
|
Menu_ConvertRatingMenuStar(rate_hmenu, ID_RATING_VALUE_5);
|
||
|
Menu_ConvertRatingMenuStar(rate_hmenu, ID_RATING_VALUE_4);
|
||
|
Menu_ConvertRatingMenuStar(rate_hmenu, ID_RATING_VALUE_3);
|
||
|
Menu_ConvertRatingMenuStar(rate_hmenu, ID_RATING_VALUE_2);
|
||
|
Menu_ConvertRatingMenuStar(rate_hmenu, ID_RATING_VALUE_1);
|
||
|
|
||
|
switch(menuKind)
|
||
|
{
|
||
|
case MENU_RATING:
|
||
|
return Menu_CreateRatingMenu(baseMenu, RATINGFROMMCF(flags));
|
||
|
case MENU_TOOLBAR:
|
||
|
return Menu_GetToolbarContext(baseMenu, flags);
|
||
|
case MENU_ADDRESSBAR:
|
||
|
return Menu_GetAddressbarContext(baseMenu, flags);
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
void Menu_ReleaseMenu(HMENU hMenu, INT menuKind)
|
||
|
{
|
||
|
if (NULL == hMenu)
|
||
|
return;
|
||
|
|
||
|
switch(menuKind)
|
||
|
{
|
||
|
case MENU_RATING:
|
||
|
DestroyMenu(hMenu);
|
||
|
break;
|
||
|
case MENU_TOOLBAR:
|
||
|
break;
|
||
|
case MENU_ADDRESSBAR:
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
BOOL Menu_TrackPopup(HMENU hMenu, UINT fuFlags, INT x, INT y, HWND hwnd, LPTPMPARAMS lptpm)
|
||
|
{
|
||
|
BOOL result = FALSE;
|
||
|
|
||
|
ifc_skinnedmenu *skinnedMenu = NULL;
|
||
|
if (SUCCEEDED(Menu_GetSkinnedMenu(&skinnedMenu)) && skinnedMenu != NULL)
|
||
|
{
|
||
|
ifc_menucustomizer *customizer = NULL;
|
||
|
if (FAILED(RatingMenu_GetCustomizer(hMenu, &customizer)))
|
||
|
customizer = NULL;
|
||
|
|
||
|
result = skinnedMenu->TrackPopup(hMenu, fuFlags, x, y, hwnd, lptpm, customizer);
|
||
|
|
||
|
if (NULL != customizer)
|
||
|
customizer->Release();
|
||
|
|
||
|
skinnedMenu->Release();
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
HANDLE Menu_InitializeHook(HWND hwnd, ifc_menucustomizer *customizer)
|
||
|
{
|
||
|
ifc_skinnedmenu *skinnedMenu = NULL;
|
||
|
HANDLE hook = NULL;
|
||
|
if (SUCCEEDED(Menu_GetSkinnedMenu(&skinnedMenu)) && skinnedMenu != NULL)
|
||
|
{
|
||
|
hook = skinnedMenu->InitPopupHook(hwnd, customizer);
|
||
|
skinnedMenu->Release();
|
||
|
}
|
||
|
return hook;
|
||
|
}
|
||
|
|
||
|
HRESULT Menu_RemoveHook(HANDLE menuHook)
|
||
|
{
|
||
|
ifc_skinnedmenu *skinnedMenu = NULL;
|
||
|
HRESULT hr = Menu_GetSkinnedMenu(&skinnedMenu);
|
||
|
if (SUCCEEDED(hr) && skinnedMenu != NULL)
|
||
|
{
|
||
|
hr = skinnedMenu->RemovePopupHook(menuHook);
|
||
|
skinnedMenu->Release();
|
||
|
}
|
||
|
return hr;
|
||
|
}
|