diff options
Diffstat (limited to 'Src/Plugins/General/gen_ff/menuactions.cpp')
-rw-r--r-- | Src/Plugins/General/gen_ff/menuactions.cpp | 787 |
1 files changed, 787 insertions, 0 deletions
diff --git a/Src/Plugins/General/gen_ff/menuactions.cpp b/Src/Plugins/General/gen_ff/menuactions.cpp new file mode 100644 index 00000000..266dd74a --- /dev/null +++ b/Src/Plugins/General/gen_ff/menuactions.cpp @@ -0,0 +1,787 @@ +#include "precomp__gen_ff.h" +#include "menuactions.h" +#include "wa2frontend.h" +#include <api/skin/skinparse.h> +#include "wa2cfgitems.h" +#include "main.h" +#include "resource.h" +#include <api/locales/xlatstr.h> +#include "../gen_ml/ml_ipc.h" +#include "../winamp/gen.h" +#include "../Agave/Language/api_language.h" +#include "../gen_ml/menufucker.h" +#include "../Winamp/strutil.h" + +extern librarySendToMenuStruct mainSendTo; +#define WINAMP_OPTIONS_DSIZE 40165 +extern void addWindowOptionsToContextMenu(ifc_window *w); +extern void removeWindowOptionsFromContextMenu(); +extern ifc_window *g_controlMenuTarget; +extern HMENU controlmenu; +int lowest_itempos = 0; +int highest_itempos = -1; +int lowest_witempos = 0; +int lowest_witempos2 = 0; +int highest_witempos = -1; +int highest_witempos2 = -1; +int optionsmenu_wa = 1; +TList<HMENU> menulist; +TList<HMENU> wmenulist; +int in_menu = 0; + + +//----------------------------------------------------------------------------------------------- +MenuActions::MenuActions() +{ + registerAction(L"menu", _ACTION_MENU); + registerAction(L"sysmenu", _ACTION_SYSMENU); + registerAction(L"controlmenu", _ACTION_CONTROLMENU); + registerAction(L"MENU:WA5:File", ACTION_WA5FILEMENU); + registerAction(L"MENU:WA5:Play", ACTION_WA5PLAYMENU); + registerAction(L"MENU:WA5:Options", ACTION_WA5OPTIONSMENU); + registerAction(L"MENU:WA5:Windows", ACTION_WA5WINDOWSMENU); + registerAction(L"MENU:WA5:Help", ACTION_WA5HELPMENU); + registerAction(L"MENU:WA5:PE_File", ACTION_WA5PEFILEMENU); + registerAction(L"MENU:WA5:PE_Playlist", ACTION_WA5PEPLAYLISTMENU); + registerAction(L"MENU:WA5:PE_Sort", ACTION_WA5PESORTMENU); + registerAction(L"MENU:WA5:PE_Help", ACTION_WA5PEHELPMENU); + registerAction(L"MENU:WA5:ML_File", ACTION_WA5MLFILEMENU); + registerAction(L"MENU:WA5:ML_View", ACTION_WA5MLVIEWMENU); + registerAction(L"MENU:WA5:ML_Help", ACTION_WA5MLHELPMENU); + registerAction(L"PE_Add", ACTION_PEADD); + registerAction(L"PE_Rem", ACTION_PEREM); + registerAction(L"PE_Sel", ACTION_PESEL); + registerAction(L"PE_Misc", ACTION_PEMISC); + registerAction(L"PE_List", ACTION_PELIST); + registerAction(L"PE_ListOfLists", ACTION_PELISTOFLISTS); + registerAction(L"VID_FS", ACTION_VIDFS); + registerAction(L"VID_1X", ACTION_VID1X); + registerAction(L"VID_2X", ACTION_VID2X); + registerAction(L"VID_TV", ACTION_VIDTV); + registerAction(L"VID_Misc", ACTION_VIDMISC); + registerAction(L"VIS_Next", ACTION_VISNEXT); + registerAction(L"VIS_Prev", ACTION_VISPREV); + registerAction(L"VIS_FS", ACTION_VISFS); + registerAction(L"VIS_CFG", ACTION_VISCFG); + registerAction(L"VIS_Menu", ACTION_VISMENU); + registerAction(L"trackinfo", ACTION_TRACKINFO); + registerAction(L"trackmenu", ACTION_TRACKMENU); + registerAction(L"ML_SendTo", ACTION_SENDTO); +} + +//----------------------------------------------------------------------------------------------- +MenuActions::~MenuActions() +{} + +static LRESULT sendMlIpc(int msg, WPARAM param) { + static HWND mlwnd = NULL; + if(!IsWindow(mlwnd)) { + int IPC_GETMLWINDOW = (INT)SendMessageW(plugin.hwndParent, WM_WA_IPC, (WPARAM)&"LibraryGetWnd", IPC_REGISTER_WINAMP_IPCMESSAGE); + if(IPC_GETMLWINDOW > 65536) mlwnd = (HWND)SendMessageW(plugin.hwndParent,WM_WA_IPC,0,IPC_GETMLWINDOW); + } + if(!IsWindow(mlwnd)) return 0; + return SendMessageW(mlwnd,WM_ML_IPC,param,msg); +} + +//----------------------------------------------------------------------------------------------- +int MenuActions::onActionId(int pvtid, const wchar_t *action, const wchar_t *param /* =NULL */, int p1 /* =0 */, int p2 /* =0 */, void *data /* =NULL */, int datalen /* =0 */, ifc_window *source /* =NULL */) +{ + SetCursor(LoadCursor(NULL, IDC_ARROW)); + RECT r = {0, 0, 0, 0}; + if (source) source->getWindowRect(&r); + int height = r.bottom - r.top; + int width = r.right - r.left; + in_menu = 1; + switch (pvtid) + { + case _ACTION_MENU: + { + if (!_wcsicmp(param, L"presets")) + { + wa2.triggerEQPresetMenu(p1, p2); + } + } + break; + case _ACTION_SYSMENU: + { + addWindowOptionsToContextMenu(source); + wa2.triggerPopupMenu(p1, p2); + break; + } + case _ACTION_CONTROLMENU: + { + if (g_controlMenuTarget != NULL) + removeWindowOptionsFromContextMenu(); + addWindowOptionsToContextMenu(g_controlMenuTarget); + g_controlMenuTarget = source; + + HMENU ctrlmenu = GetSubMenu(controlmenu, 0); + DoTrackPopup(ctrlmenu, TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON, p1, p2, wa2.getMainWindow()); + break; + } + case ACTION_WA5FILEMENU: + { + wa2.triggerFileMenu(p1, p2, width, height); + break; + } + case ACTION_WA5PLAYMENU: + { + wa2.triggerPlayMenu(p1, p2, width, height); + break; + } + case ACTION_WA5OPTIONSMENU: + { + wa2.triggerOptionsMenu(p1, p2, width, height); + break; + } + case ACTION_WA5WINDOWSMENU: + { + wa2.triggerWindowsMenu(p1, p2, width, height); + break; + } + case ACTION_WA5HELPMENU: + { + wa2.triggerHelpMenu(p1, p2, width, height); + break; + } + case ACTION_WA5PEFILEMENU: + { + wa2.triggerPEFileMenu(p1, p2, width, height); + break; + } + case ACTION_WA5PEPLAYLISTMENU: + { + wa2.triggerPEPlaylistMenu(p1, p2, width, height); + break; + } + case ACTION_WA5PESORTMENU: + { + wa2.triggerPESortMenu(p1, p2, width, height); + break; + } + case ACTION_WA5PEHELPMENU: + { + wa2.triggerPEHelpMenu(p1, p2, width, height); + break; + } + case ACTION_WA5MLFILEMENU: + { + wa2.triggerMLFileMenu(p1, p2, width, height); + break; + } + case ACTION_WA5MLVIEWMENU: + { + wa2.triggerMLViewMenu(p1, p2, width, height); + break; + } + case ACTION_WA5MLHELPMENU: + { + wa2.triggerMLHelpMenu(p1, p2, width, height); + break; + } + case ACTION_PEADD: + { + wa2.sendPlCmd(Winamp2FrontEnd::WA2_PLEDITPOPUP_ADD, r.left, r.top, TPM_BOTTOMALIGN | TPM_LEFTALIGN); + break; + } + case ACTION_PEREM: + { + wa2.sendPlCmd(Winamp2FrontEnd::WA2_PLEDITPOPUP_REM, r.left, r.top, TPM_BOTTOMALIGN | TPM_LEFTALIGN); + break; + } + case ACTION_PESEL: + { + wa2.sendPlCmd(Winamp2FrontEnd::WA2_PLEDITPOPUP_SEL, r.left, r.top, TPM_BOTTOMALIGN | TPM_LEFTALIGN); + break; + } + case ACTION_PEMISC: + { + wa2.sendPlCmd(Winamp2FrontEnd::WA2_PLEDITPOPUP_MISC, r.left, r.top, TPM_BOTTOMALIGN | TPM_LEFTALIGN); + break; + } + case ACTION_PELIST: + { + wa2.sendPlCmd(Winamp2FrontEnd::WA2_PLEDITPOPUP_LIST, r.right, r.top, TPM_BOTTOMALIGN | TPM_RIGHTALIGN); + break; + } + case ACTION_PELISTOFLISTS: + { + wa2.triggerPEListOfListsMenu(r.left, r.top); + break; + } + case ACTION_VIDFS: + { + wa2.sendVidCmd(Winamp2FrontEnd::WA2_VIDCMD_FULLSCREEN); + break; + } + case ACTION_VID1X: + { + wa2.sendVidCmd(Winamp2FrontEnd::WA2_VIDCMD_1X); + break; + } + case ACTION_VID2X: + { + wa2.sendVidCmd(Winamp2FrontEnd::WA2_VIDCMD_2X); + break; + } + case ACTION_VIDTV: + { + wa2.sendVidCmd(Winamp2FrontEnd::WA2_VIDCMD_LIB); + break; + } + case ACTION_VIDMISC: + { + wa2.sendVidCmd(Winamp2FrontEnd::WA2_VIDPOPUP_MISC, r.right, r.top, TPM_BOTTOMALIGN | TPM_RIGHTALIGN); + break; + } + case ACTION_VISNEXT: + { + wa2.visNext(); + break; + } + case ACTION_VISPREV: + { + wa2.visPrev(); + break; + } + case ACTION_VISFS: + { + wa2.visFullscreen(); + break; + } + case ACTION_VISCFG: + { + wa2.visConfig(); + break; + } + case ACTION_VISMENU: + { + wa2.visMenu(); + break; + } + case ACTION_TRACKMENU: + { + extern const wchar_t *GetMenuItemString(HMENU menu, int id, int bypos); +#define WINAMP_TOGGLE_AUTOSCROLL 40189 +#define ID_RATING5 40396 +#define ID_RATING4 40397 +#define ID_RATING3 40398 +#define ID_RATING2 40399 +#define ID_RATING1 40400 +#define ID_RATING0 40401 + HMENU top_menu = wa2.getTopMenu(); + HMENU contextmenus = GetSubMenu(top_menu, 3); + HMENU songinfomenu = GetSubMenu(contextmenus, 0); + HMENU ratingmenu = GetSubMenu(songinfomenu, 5); + int rating = wa2.getCurTrackRating(); + CheckMenuItem(ratingmenu, ID_RATING5, (rating == 5) ? MF_CHECKED : MF_UNCHECKED); + CheckMenuItem(ratingmenu, ID_RATING4, (rating == 4) ? MF_CHECKED : MF_UNCHECKED); + CheckMenuItem(ratingmenu, ID_RATING3, (rating == 3) ? MF_CHECKED : MF_UNCHECKED); + CheckMenuItem(ratingmenu, ID_RATING2, (rating == 2) ? MF_CHECKED : MF_UNCHECKED); + CheckMenuItem(ratingmenu, ID_RATING1, (rating == 1) ? MF_CHECKED : MF_UNCHECKED); + CheckMenuItem(ratingmenu, ID_RATING0, (rating == 0) ? MF_CHECKED : MF_UNCHECKED); + StringW olditemstr = GetMenuItemString(songinfomenu, 3, TRUE); + RemoveMenu(songinfomenu, 3, MF_BYPOSITION); + + LRESULT IPC_LIBRARY_SENDTOMENU = SendMessageW(plugin.hwndParent, WM_WA_IPC, (WPARAM)&"LibrarySendToMenu", IPC_REGISTER_WINAMP_IPCMESSAGE); + HMENU menu = 0; + memset(&mainSendTo, 0, sizeof(mainSendTo)); + if (IPC_LIBRARY_SENDTOMENU > 65536 && SendMessageW(plugin.hwndParent, WM_WA_IPC, (WPARAM)0, IPC_LIBRARY_SENDTOMENU) == 0xffffffff) + { + char stStr[32] = {0}; + MENUITEMINFOA mii = {sizeof(mii), MIIM_SUBMENU | MIIM_TYPE, MFT_STRING, }; + mii.hSubMenu = menu = CreatePopupMenu(); + mii.dwTypeData = WASABI_API_LNGSTRING_BUF(IDS_SEND_TO,stStr,32); + mii.cch = strlen((char*)mii.dwTypeData); + + InsertMenuItemA(songinfomenu, 3, TRUE, &mii); + + mainSendTo.mode = 1; + mainSendTo.hwnd = plugin.hwndParent; // TODO??? + mainSendTo.data_type = ML_TYPE_FILENAMESW; + mainSendTo.build_hMenu = menu; + } + + menufucker_t mf = {sizeof(mf),MENU_SONGTICKER,songinfomenu,0x3000,0x4000,0}; + pluginMessage message_build = {SendMessageW(plugin.hwndParent, WM_WA_IPC, (WPARAM)&"menufucker_build", IPC_REGISTER_WINAMP_IPCMESSAGE),(intptr_t)&mf,0}; + sendMlIpc(ML_IPC_SEND_PLUGIN_MESSAGE,(WPARAM)&message_build); + + int ret = DoTrackPopup(songinfomenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON|TPM_RETURNCMD, p1, p2, wa2.getMainWindow()); + + pluginMessage message_result = {SendMessageW(plugin.hwndParent, WM_WA_IPC, (WPARAM)&"menufucker_result", IPC_REGISTER_WINAMP_IPCMESSAGE),(intptr_t)&mf,ret,0}; + sendMlIpc(ML_IPC_SEND_PLUGIN_MESSAGE,(WPARAM)&message_result); + + if (menu) + { + if (mainSendTo.mode == 2) + { + mainSendTo.menu_id = ret; + if (SendMessageW(plugin.hwndParent, WM_WA_IPC, (WPARAM)&mainSendTo, IPC_LIBRARY_SENDTOMENU) == 0xffffffff) + { + wchar_t buf[FILENAME_SIZE + 1] = {0}; + wchar_t *end=buf; + size_t endSize = 0; + const wchar_t *entry = wa2.getFileW(wa2.getCurPlaylistEntry()); + if (entry && *entry) + { + StringCchCopyExW(buf, FILENAME_SIZE, entry, &end, &endSize, 0); + + mainSendTo.mode = 3; + mainSendTo.data = buf; + mainSendTo.data_type = ML_TYPE_FILENAMESW; + SendMessageW(plugin.hwndParent, WM_WA_IPC, (WPARAM)&mainSendTo, IPC_LIBRARY_SENDTOMENU); + } + } + } + // remove sendto + DeleteMenu(songinfomenu, 3, MF_BYPOSITION); + } + if (mainSendTo.mode) + { + mainSendTo.mode = 4; + SendMessageW(plugin.hwndParent, WM_WA_IPC, (WPARAM)&mainSendTo, IPC_LIBRARY_SENDTOMENU); // cleanup + memset(&mainSendTo, 0, sizeof(mainSendTo)); + } + InsertMenuW(songinfomenu, 3, MF_BYPOSITION | MF_STRING, WINAMP_TOGGLE_AUTOSCROLL, olditemstr); + if (ret) SendMessageW(wa2.getMainWindow(), WM_COMMAND, ret, 0); // TODO? + + break; + } + case ACTION_SENDTO: + { + LRESULT IPC_LIBRARY_SENDTOMENU = SendMessageW(plugin.hwndParent, WM_WA_IPC, (WPARAM)&"LibrarySendToMenu", IPC_REGISTER_WINAMP_IPCMESSAGE); + HMENU menu = 0; + memset(&mainSendTo, 0, sizeof(mainSendTo)); + if (IPC_LIBRARY_SENDTOMENU > 65536 && SendMessageW(plugin.hwndParent, WM_WA_IPC, (WPARAM)0, IPC_LIBRARY_SENDTOMENU) == 0xffffffff) + { + menu = CreatePopupMenu(); + + mainSendTo.mode = 1; + mainSendTo.hwnd = plugin.hwndParent; // TODO??? + mainSendTo.data_type = ML_TYPE_FILENAMESW; + mainSendTo.build_hMenu = menu; + } + int ret = DoTrackPopup(menu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON|TPM_RETURNCMD, p1, p2, wa2.getMainWindow()); + if (menu) + { + if (mainSendTo.mode == 2) + { + mainSendTo.menu_id = ret; + if (SendMessageW(plugin.hwndParent, WM_WA_IPC, (WPARAM)&mainSendTo, IPC_LIBRARY_SENDTOMENU) == 0xffffffff) + { + wchar_t buf[FILENAME_SIZE + 1] = {0}; + wchar_t *end=buf; + size_t endSize = 0; + const wchar_t *entry = wa2.getFileW(wa2.getCurPlaylistEntry()); + if (entry && *entry) + { + StringCchCopyExW(buf, FILENAME_SIZE, entry, &end, &endSize, 0); + + mainSendTo.mode = 3; + mainSendTo.data = buf; + mainSendTo.data_type = ML_TYPE_FILENAMESW; + SendMessageW(plugin.hwndParent, WM_WA_IPC, (WPARAM)&mainSendTo, IPC_LIBRARY_SENDTOMENU); + } + } + } + } + if (mainSendTo.mode) + { + mainSendTo.mode = 4; + SendMessageW(plugin.hwndParent, WM_WA_IPC, (WPARAM)&mainSendTo, IPC_LIBRARY_SENDTOMENU); // cleanup + memset(&mainSendTo, 0, sizeof(mainSendTo)); + } + + } + break; + case ACTION_TRACKINFO: + { + wa2.openTrackInfo(); + break; + } + } + in_menu = 0; + return 1; +} + +HMENU MenuActions::makeSkinOptionsSubMenu(GUID g, int *cmdoffset) +{ + CfgItem *item = WASABI_API_CONFIG->config_getCfgItemByGuid(g); + if (item != NULL) + { + HMENU menu = CreatePopupMenu(); + int n = MIN(item->getNumAttributes(), 500); + for (int i = 0;i < n;i++) + { + const wchar_t *attr = item->enumAttribute(i); + if (attr && *attr) + { + HMENU submenu = NULL; + wchar_t txt[256] = {0}; + item->getData(attr, txt, 256); + GUID g = nsGUID::fromCharW(txt); + if (g != INVALID_GUID) + { // submenu ! + submenu = makeSkinOptionsSubMenu(g, cmdoffset); + } + int v = item->getDataAsInt(attr, 0); + if (WCSCASEEQLSAFE(txt, L"-")) + { + InsertMenu(menu, i, MF_SEPARATOR | MF_BYPOSITION, 0, NULL); + } + else + InsertMenuW(menu, i, ((v && !submenu) ? MF_CHECKED : MF_UNCHECKED) | MF_STRING | MF_BYPOSITION | (submenu ? MF_POPUP : 0), submenu ? (UINT_PTR)submenu : 44000 + *cmdoffset, _(attr)); + } + (*cmdoffset)++; + } + return menu; + } + return NULL; +} + +void MenuActions::installSkinOptions(HMENU menu) +{ + optionsmenu_wa = 0; + HMENU omenu = NULL; + if (menu == NULL) + { + optionsmenu_wa = 1; + menu = wa2.getMenuBarMenu(Winamp2FrontEnd::WA2_MAINMENUBAR_OPTIONS); + omenu = GetSubMenu(wa2.getPopupMenu(), 11 + wa2.adjustOptionsPopupMenu(0)); + } + int pos2 = 12; + int cmdoffset = 0; + int pos = optionsmenu_wa ? wa2.adjustFFOptionsMenu(0) + 6 + NUMSTATICWINDOWS /*+ 1*//* + 9*/ : 0; + lowest_itempos = pos; + int insertedline = 0; + if (menu && optionsmenuitems) + { + int n = MIN(optionsmenuitems->getNumAttributes(), 500); + for (int i = 0;i < n;i++) + { + const wchar_t *attr = optionsmenuitems->enumAttribute(i); + if (attr && *attr) + { + HMENU submenu = NULL; + wchar_t txt[256] = {0}; + optionsmenuitems->getData(attr, txt, 256); + GUID g = nsGUID::fromCharW(txt); + if (g != INVALID_GUID) + { // submenu ! + submenu = makeSkinOptionsSubMenu(g, &cmdoffset); + if (submenu) + menulist.addItem(submenu); + } + int v = optionsmenuitems->getDataAsInt(attr, 0); + if (optionsmenu_wa && !insertedline) + { + wa2.adjustFFOptionsMenu(1); + insertedline = 1; + InsertMenu(menu, pos++, MF_SEPARATOR | MF_BYPOSITION, 0, NULL); + if (omenu) InsertMenu(omenu, pos2++, MF_SEPARATOR | MF_BYPOSITION, 0, NULL); + } + if (optionsmenu_wa) wa2.adjustFFOptionsMenu(1); + if (WCSCASEEQLSAFE(txt, L"-")) + { + InsertMenu(menu, pos++, MF_SEPARATOR | MF_BYPOSITION, 0, NULL); + if (omenu) InsertMenu(omenu, pos2++, MF_SEPARATOR | MF_BYPOSITION, 0, NULL); + } + else + InsertMenuW(menu, pos++, (v ? MF_CHECKED : MF_UNCHECKED) | MF_STRING | MF_BYPOSITION | (submenu ? MF_POPUP : 0), submenu ? (UINT_PTR)submenu : 44000 + cmdoffset, _(attr)); + if (omenu) InsertMenuW(omenu, pos2++, (v ? MF_CHECKED : MF_UNCHECKED) | MF_STRING | MF_BYPOSITION | (submenu ? MF_POPUP : 0), submenu ? (UINT_PTR)submenu : 44000 + cmdoffset, _(attr)); + } + cmdoffset++; + } + ffoptionstop = 44000 + cmdoffset; + } + // insert colorthemes submenu + if (omenu) + { + PtrListQuickSorted<ColorThemeSlot, ColorThemeSlotSort> sortedthemes; + int fn = MIN(WASABI_API_SKIN->colortheme_getNumColorSets(), 500); + for (int t = 0;t < fn;t++) + sortedthemes.addItem(new ColorThemeSlot(WASABI_API_SKIN->colortheme_enumColorSet(t), t)); + if (!insertedline) + { + wa2.adjustFFOptionsMenu(1); + InsertMenu(menu, pos++, MF_SEPARATOR | MF_BYPOSITION, 0, NULL); + if (omenu) InsertMenu(omenu, pos2++, MF_SEPARATOR | MF_BYPOSITION, 0, NULL); + } + HMENU submenu = CreatePopupMenu(); + if (WASABI_API_SKIN->colortheme_getNumColorSets() == 0) + { + InsertMenuW(submenu, 0, MF_GRAYED | MF_STRING | MF_BYPOSITION, 0, WASABI_API_LNGSTRINGW(IDS_NO_THEME_AVAILABLE)); + } + else + { + int n = sortedthemes.getNumItems(); + for (int i = 0;i < n;i++) + { + const wchar_t *ct = sortedthemes.enumItem(i)->name; + int entry = sortedthemes.enumItem(i)->entry; + int iscurrent = WCSCASEEQLSAFE(ct, WASABI_API_SKIN->colortheme_getColorSet()); + InsertMenuW(submenu, i, (iscurrent ? MF_CHECKED : MF_UNCHECKED) | MF_STRING | MF_BYPOSITION, 44500 + entry, ct); + } + } + if (optionsmenu_wa) wa2.adjustFFOptionsMenu(1); + InsertMenuW(menu, pos++, MF_STRING | MF_BYPOSITION | (submenu ? MF_POPUP : 0), submenu ? (UINT_PTR)submenu : 44000 + cmdoffset, WASABI_API_LNGSTRINGW(IDS_COLOR_THEMES)); + if (omenu) InsertMenuW(omenu, pos2++, MF_STRING | MF_BYPOSITION | (submenu ? MF_POPUP : 0), submenu ? (UINT_PTR)submenu : 44000 + cmdoffset, WASABI_API_LNGSTRINGW(IDS_COLOR_THEMES)); + cmdoffset++; + sortedthemes.deleteAll(); + } + highest_itempos = pos; +} + +void MenuActions::removeSkinOptions() +{ + if (highest_itempos == -1 || !optionsmenu_wa) return ; + for (int j = 0;j < menulist.getNumItems();j++) + DestroyMenu(menulist.enumItem(j)); + menulist.removeAll(); + + HMENU menu = wa2.getMenuBarMenu(Winamp2FrontEnd::WA2_MAINMENUBAR_OPTIONS); + HMENU omenu = GetSubMenu(wa2.getPopupMenu(), 11 + wa2.adjustOptionsPopupMenu(0)); + if (menu && optionsmenuitems) + { + for (int i = lowest_itempos;i < highest_itempos;i++) + { + RemoveMenu(menu, lowest_itempos, MF_BYPOSITION); + if (omenu) RemoveMenu(omenu, 12, MF_BYPOSITION); + wa2.adjustFFOptionsMenu( -1); + } + } + highest_itempos = -1; +} + +int MenuActions::toggleOption(int n, GUID guid, int *cmdoffset) +{ + int _cmdoffset = 0; + if (!cmdoffset) cmdoffset = &_cmdoffset; + CfgItem *item = NULL; + if (guid == INVALID_GUID) + item = optionsmenuitems; + else + item = WASABI_API_CONFIG->config_getCfgItemByGuid(guid); + + if (!item) // not sure why this happens, but it happened in a crash report so I'm going to check for it. + return 1; // TODO: guru + + for (int i = 0; i < item->getNumAttributes();i++) + { + const wchar_t *name = item->enumAttribute(i); + if (name && *name) + { + wchar_t txt[256] = {0}; + item->getData(name, txt, 256); + GUID g = nsGUID::fromCharW(txt); + if (g != INVALID_GUID) + { // submenu ! + if (toggleOption(n, g, cmdoffset)) return 1; + } + if (*cmdoffset == n) + { + int newv = item->getDataAsInt(name) ? 0 : 1; + item->setDataAsInt(name, newv); + return 1; + } + } + (*cmdoffset)++; + } + return 0; +} + +const wchar_t* MenuActions::localizeSkinWindowName(const wchar_t* attr) +{ + static wchar_t tweaked_attr[96]; + ZERO(tweaked_attr); + + // allows us to map some of the common actions to localised versions (primarily with bundled skins) + if(!_wcsicmp(attr,L"Equalizer\tAlt+G")) + { + // if there's a match then we can force things to use the previous menu + // string (fixes localisation inconsistancy without altering the scripts!) + lstrcpynW(tweaked_attr, eqmenustring, 96); + } + else if(!_wcsicmp(attr,L"Skin Settings\tAlt+C")) + { + WASABI_API_LNGSTRINGW_BUF(IDS_SKIN_SETTINGS,tweaked_attr,96); + } + else if(!_wcsicmp(attr,L"Web Browser\tAlt+X")) + { + WASABI_API_LNGSTRINGW_BUF(IDS_WEB_BROWSER,tweaked_attr,96); + } + else if(!_wcsicmp(attr,L"Album Art\tAlt+A")) + { + WASABI_API_LNGSTRINGW_BUF(IDS_ALBUM_ART,tweaked_attr,96); + } + else if(!_wcsicmp(attr,L"Color Editor")) + { + WASABI_API_LNGSTRINGW_BUF(IDS_COLOR_EDITOR,tweaked_attr,96); + } + else + { + return attr; + } + return tweaked_attr; +} + +// FIX ME - menu weirdness going on!! +void MenuActions::installSkinWindowOptions() +{ + HMENU menu = wa2.getMenuBarMenu(Winamp2FrontEnd::WA2_MAINMENUBAR_WINDOWS); + int pos = lowest_witempos = wa2.adjustFFWindowsMenu(0) + NUMSTATICWINDOWS; + HMENU omenu = wa2.getPopupMenu(); + int pos2 = lowest_witempos2 = wa2.adjustOptionsPopupMenu(0) + 6 + NUMSTATICWINDOWS + 1; + + MENUITEMINFOW mii = {sizeof(mii), }; + mii.fMask = MIIM_TYPE | MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_SUBMENU; + mii.fType = MFT_STRING; + mii.wID = 42000; + mii.dwItemData = 0xD02; // use this as a check so we're only removing the correct items!! + + if (menu && windowsmenuitems) + { + int n = MIN(windowsmenuitems->getNumAttributes(), 500); + int cmdoffset = 0; + for (int i = 0;i < n;i++) + { + const wchar_t *attr = windowsmenuitems->enumAttribute(i); + + if (attr && *attr) + { + HMENU submenu = NULL; + wchar_t txt[256] = {0}; + windowsmenuitems->getData(attr, txt, 256); + GUID g = nsGUID::fromCharW(txt); + if (g != INVALID_GUID) + { // submenu ! + submenu = makeSkinOptionsSubMenu(g, &cmdoffset); + if (submenu) + wmenulist.addItem(submenu); + } + int v = windowsmenuitems->getDataAsInt(attr, 0); + wa2.adjustFFWindowsMenu(1); + wa2.adjustOptionsPopupMenu(1); + + attr = localizeSkinWindowName(attr); + const wchar_t* t = _(attr); + mii.dwTypeData = const_cast<wchar_t *>(t); + + if (WCSCASEEQLSAFE(txt, L"-")) + { + InsertMenu(menu, pos++, MF_SEPARATOR | MF_BYPOSITION, 0, NULL); + InsertMenu(omenu, pos2++, MF_SEPARATOR | MF_BYPOSITION, 0, NULL); + } + else{ + mii.cch = wcslen(mii.dwTypeData); + mii.fState = (v ? MFS_CHECKED : 0); + mii.wID = 42000 + cmdoffset; + mii.hSubMenu = submenu; + InsertMenuItemW(menu, pos++, TRUE, &mii); + } + InsertMenuItemW(omenu, pos2++, TRUE, &mii); + } + cmdoffset++; + } + ffwoptionstop = 42000 + cmdoffset; + } + highest_witempos = pos; + highest_witempos2 = pos2; +} + +void MenuActions::removeSkinWindowOptions() +{ + if (highest_witempos == -1) return ; + for (int j = 0;j < wmenulist.getNumItems();j++) + DestroyMenu(wmenulist.enumItem(j)); + wmenulist.removeAll(); + + HMENU menu = wa2.getMenuBarMenu(Winamp2FrontEnd::WA2_MAINMENUBAR_WINDOWS); + HMENU omenu = wa2.getPopupMenu(); + if (menu && windowsmenuitems) + { + for(int i = GetMenuItemCount(menu)-1; i != 0; i--) + { + MENUITEMINFOW info = {sizeof(info), MIIM_DATA, 0, }; + if(GetMenuItemInfoW(menu,i,TRUE,&info)) + { + if(info.dwItemData == 0xD02){ + RemoveMenu(menu,i,MF_BYPOSITION); + wa2.adjustFFWindowsMenu(-1); + } + } + } + + for(int i = GetMenuItemCount(omenu)-1; i != 0; i--) + { + MENUITEMINFOW info = {sizeof(info), MIIM_DATA, 0, }; + if(GetMenuItemInfoW(omenu,i,TRUE,&info)) + { + if(info.dwItemData == 0xD02){ + RemoveMenu(omenu,i,MF_BYPOSITION); + wa2.adjustOptionsPopupMenu(-1); + } + } + } + + /*for (int i = highest_witempos;i >= lowest_witempos;i--) + { + RemoveMenu(menu, i, MF_BYPOSITION); + wa2.adjustFFWindowsMenu(-1); + } + + for (int i = highest_witempos2;i >= lowest_witempos2;i--) + { + RemoveMenu(menu, i, MF_BYPOSITION); + wa2.adjustOptionsPopupMenu(-1); + } + /*/ + /*for (int i = lowest_witempos;i < highest_witempos;i++) + { + RemoveMenu(menu, lowest_witempos, MF_BYPOSITION); + wa2.adjustFFWindowsMenu(-1); + } + + for (int i = lowest_witempos2;i < highest_witempos2;i++) + { + RemoveMenu(omenu, lowest_witempos2, MF_BYPOSITION); + wa2.adjustOptionsPopupMenu(-1); + }/**/ + } + highest_witempos = -1; + highest_witempos2 = -1; +} + +int MenuActions::toggleWindowOption(int n, GUID guid, int *cmdoffset) +{ + int _cmdoffset = 0; + if (!cmdoffset) cmdoffset = &_cmdoffset; + CfgItem *item = NULL; + if (guid == INVALID_GUID) + item = windowsmenuitems; + else + item = WASABI_API_CONFIG->config_getCfgItemByGuid(guid); + + for (int i = 0; i < item->getNumAttributes();i++) + { + const wchar_t *name = item->enumAttribute(i); + if (name && *name) + { + wchar_t txt[256] = {0}; + item->getData(name, txt, 256); + GUID g = nsGUID::fromCharW(txt); + if (g != INVALID_GUID) + { // submenu ! + if (toggleWindowOption(n, g, cmdoffset)) return 1; + } + if (*cmdoffset == n) + { + int newv = item->getDataAsInt(name) ? 0 : 1; + item->setDataAsInt(name, newv); + return 1; + } + } + (*cmdoffset)++; + } + return 0; +}
\ No newline at end of file |