diff options
Diffstat (limited to 'Src/omBrowser/ratingMenu.cpp')
-rw-r--r-- | Src/omBrowser/ratingMenu.cpp | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/Src/omBrowser/ratingMenu.cpp b/Src/omBrowser/ratingMenu.cpp new file mode 100644 index 00000000..f8f37c8d --- /dev/null +++ b/Src/omBrowser/ratingMenu.cpp @@ -0,0 +1,148 @@ +#include "main.h" +#include "./ratingMenu.h" +#include "./resource.h" +#include "../nu/menuHelpers.h" +#include "./ifc_skinhelper.h" +#include "./ifc_skinnedrating.h" +#include "./ifc_menucustomizer.h" + +#define RATING_MARKER MAKELONG(MAKEWORD('R','A'),MAKEWORD('T','E')) + +static BOOL RatingMenu_IsStar(HMENU hMenu, INT itemId, INT *valueOut) +{ + WCHAR szBuffer[8] = {0}; + INT cchBuffer = GetMenuStringW(hMenu, itemId, szBuffer, ARRAYSIZE(szBuffer), MF_BYCOMMAND); + if (cchBuffer < 1 || cchBuffer > 5) + return FALSE; + + for (INT i = 1; i < cchBuffer; i++) + { + if (szBuffer[i -1] != szBuffer[i]) + return FALSE; + } + + if (NULL != valueOut) + *valueOut = cchBuffer; + + return TRUE; +} + +static HMENU RatingMenu_FindMenuRecur(HMENU hMenu, MENUINFO *pmi, MENUITEMINFO *pmii) +{ + if (GetMenuInfo(hMenu, pmi) && RATING_MARKER == pmi->dwMenuData) + return hMenu; + + INT count = GetMenuItemCount(hMenu); + for(INT i = 0; i < count; i++) + { + if (GetMenuItemInfo(hMenu, i, TRUE, pmii) && NULL != pmii->hSubMenu) + { + HMENU hRating = RatingMenu_FindMenuRecur(pmii->hSubMenu, pmi, pmii); + if (NULL != hRating) + return hRating; + } + } + return NULL; +} + +HMENU RatingMenu_FindMenu(HMENU hMenu) +{ + if (NULL == hMenu) + return NULL; + + MENUITEMINFO mii = {0}; + mii.cbSize = sizeof(MENUITEMINFO); + mii.fMask = MIIM_SUBMENU; + + MENUINFO mi = {0}; + mi.cbSize = sizeof(MENUINFO); + mi.fMask = MIM_MENUDATA; + + return RatingMenu_FindMenuRecur(hMenu, &mi, &mii); +} + +BOOL RatingMenu_InitializeMenu(HMENU ratingMenu, INT ratingValue) +{ + if (NULL == ratingMenu) return FALSE; + MENUINFO mi = {0}; + mi.cbSize = sizeof(MENUINFO); + mi.fMask = MIM_MENUDATA; + mi.dwMenuData = RATING_MARKER; + if (FALSE == SetMenuInfo(ratingMenu, &mi)) + return FALSE; + + return RatingMenu_SetValue(ratingMenu, ratingValue); +} + +BOOL RatingMenu_SetValue(HMENU ratingMenu, INT ratingValue) +{ + if (NULL == ratingMenu) return FALSE; + + INT ratingList[] = { ID_RATING_VALUE_1, ID_RATING_VALUE_2, ID_RATING_VALUE_3, + ID_RATING_VALUE_4, ID_RATING_VALUE_5}; + ratingValue--; + + MENUITEMINFO mii = {0}; + mii.cbSize = sizeof(MENUITEMINFO); + + UINT type = 0, state = 0; + for (INT i = 0; i < ARRAYSIZE(ratingList); i++) + { + mii.fMask = MIIM_STATE | MIIM_FTYPE; + if (GetMenuItemInfo(ratingMenu, ratingList[i], FALSE, &mii)) + { + if (ratingValue == i) + { + type = mii.fType | MFT_RADIOCHECK; + state = mii.fState | MFS_CHECKED; + } + else + { + type = mii.fType & ~MFT_RADIOCHECK; + state = mii.fState & ~MFS_CHECKED; + } + + mii.fMask = 0; + if (type != mii.fType) + { + mii.fType = type; + mii.fMask |= MIIM_FTYPE; + } + + if (state != mii.fState) + { + mii.fState = state; + mii.fMask |= MIIM_STATE; + } + + if (0 != mii.fMask) + SetMenuItemInfo(ratingMenu, ratingList[i], FALSE, &mii); + } + } + return TRUE; +} + +HRESULT RatingMenu_GetCustomizer(HMENU hMenu, ifc_menucustomizer **customizer) +{ + if (NULL == customizer) return E_POINTER; + *customizer = NULL; + + HMENU ratingMenu = RatingMenu_FindMenu(hMenu); + if (NULL == ratingMenu) + return S_OK; + + ifc_skinhelper *skinHelper = NULL; + HRESULT hr = Plugin_GetSkinHelper(&skinHelper); + if (FAILED(hr) || skinHelper == NULL) return hr; + + ifc_skinnedrating *skinnedRating = NULL; + hr = skinHelper->QueryInterface(IFC_SkinnedRating, (void**)&skinnedRating); + if (SUCCEEDED(hr) && skinnedRating != NULL) + { + hr = skinnedRating->CreateMenuCustomizer(ratingMenu, customizer); + skinnedRating->Release(); + } + + skinHelper->Release(); + return hr; +}
\ No newline at end of file |