123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485 |
- #include "main.h"
- #include <windowsx.h>
- #include "./resource.h"
- #include "./commandbar.h"
- #include <shlwapi.h>
- #include <strsafe.h>
- static HMLIMGLST hmlilButton = NULL;
- static LPCTSTR GetImageTagStr(INT resId)
- {
- switch(resId)
- {
- case IDB_PLAY_NORMAL: return TEXT("button.play");
- case IDB_PLAY_HIGHLIGHTED: return TEXT("button.play.highlighted");
- case IDB_PLAY_PRESSED: return TEXT("button.play.pressed");
- case IDB_PLAY_DISABLED: return TEXT("button.play.disabled");
- case IDB_ENQUEUE_NORMAL: return TEXT("button.enqueue");
- case IDB_ENQUEUE_HIGHLIGHTED: return TEXT("button.enqueue.highlighted");
- case IDB_ENQUEUE_PRESSED: return TEXT("button.enqueue.pressed");
- case IDB_ENQUEUE_DISABLED: return TEXT("button.enqueue.disabled");
- case IDB_EJECT2_NORMAL: return TEXT("button.eject");
- case IDB_EJECT2_HIGHLIGHTED: return TEXT("button.eject.highlighted");
- case IDB_EJECT2_PRESSED: return TEXT("button.eject.pressed");
- case IDB_EJECT2_DISABLED: return TEXT("button.eject.disabled");
- }
- return NULL;
- }
- static HMLIMGLST DataCmdBar_CreateImageList()
- {
- HMLIMGLST hmlil;
- MLIMAGELISTCREATE mlilCreate;
- MLIMAGESOURCE mlis;
- MLIMAGELISTITEM mlilItem;
-
- mlilCreate.cx = g_view_metaconf->ReadIntEx(TEXT("artwork"), TEXT("button.icon.cx"), 12);
- mlilCreate.cy = g_view_metaconf->ReadIntEx(TEXT("artwork"), TEXT("button.icon.cy"), 12);
- mlilCreate.cInitial = 12;
- mlilCreate.cGrow = 3;
- mlilCreate.cCacheSize = 4;
- mlilCreate.flags = MLILC_COLOR32;
- hmlil = MLImageList_Create(plugin.hwndLibraryParent, &mlilCreate);
- if (NULL == hmlil) return NULL;
-
-
- ZeroMemory(&mlilItem, sizeof(MLIMAGELISTITEM));
- mlilItem.cbSize = sizeof(MLIMAGELISTITEM);
- mlilItem.hmlil = hmlil;
- mlilItem.filterUID = MLIF_BUTTONBLENDPLUSCOLOR_UID;
- mlilItem.pmlImgSource = &mlis;
- ZeroMemory(&mlis, sizeof(MLIMAGESOURCE));
- mlis.cbSize = sizeof(MLIMAGESOURCE);
- mlis.type = SRC_TYPE_PNG;
- mlis.hInst = plugin.hDllInstance;
-
- INT imageList[] =
- { IDB_PLAY_NORMAL, IDB_PLAY_PRESSED, IDB_PLAY_HIGHLIGHTED, IDB_PLAY_DISABLED,
- IDB_ENQUEUE_NORMAL, IDB_ENQUEUE_PRESSED, IDB_ENQUEUE_HIGHLIGHTED, IDB_ENQUEUE_DISABLED,
- IDB_EJECT2_NORMAL, IDB_EJECT2_PRESSED, IDB_EJECT2_HIGHLIGHTED, IDB_EJECT2_DISABLED,
- };
-
-
- TCHAR szResource[MAX_PATH] = {0}, szPath[MAX_PATH] = {0}, szFullPath[MAX_PATH] = {0};
- g_view_metaconf->ReadCchStringEx(szPath, ARRAYSIZE(szPath), TEXT("artwork"), TEXT("path"), NULL);
- for(int i = 0; i < sizeof(imageList)/sizeof(imageList[0]); i++)
- {
- mlilItem.nTag = imageList[i];
- g_view_metaconf->ReadCchStringEx(szResource, ARRAYSIZE(szResource), TEXT("artwork"), GetImageTagStr(imageList[i]), NULL);
- if (TEXT('\0') != szResource[0])
- {
- PathCombine(szFullPath, szPath, szResource);
- mlis.lpszName = szFullPath;
- mlis.flags |= ISF_LOADFROMFILE;
- }
- else
- {
- mlis.lpszName = MAKEINTRESOURCE(imageList[i]);
- mlis.flags &= ~ISF_LOADFROMFILE;
- }
- MLImageList_Add(plugin.hwndLibraryParent, &mlilItem);
- }
- return hmlil;
- }
- static HMLIMGLST DataCmdBar_CreateDropDownImageList(HMENU hMenu)
- {
- HMLIMGLST hmlil;
- MLIMAGELISTCREATE mlilCreate;
- MLIMAGESOURCE mlis;
-
- if (!hMenu) return NULL;
- mlilCreate.cx = 16;
- mlilCreate.cy = 16;
- mlilCreate.cInitial = 2;
- mlilCreate.cGrow = 1;
- mlilCreate.cCacheSize = 3;
- mlilCreate.flags = MLILC_COLOR32;
- hmlil = MLImageList_Create(plugin.hwndLibraryParent, &mlilCreate);
- if (NULL == hmlil) return NULL;
-
- ZeroMemory(&mlis, sizeof(MLIMAGESOURCE));
- mlis.cbSize = sizeof(MLIMAGESOURCE);
- mlis.type = SRC_TYPE_PNG;
- mlis.hInst = plugin.hDllInstance;
-
- INT imageList[] = { IDB_PLAY_MENU, IDB_ENQUEUE_MENU, };
- MENUITEMINFOW mii = { sizeof(MENUITEMINFOW), };
- mii.fMask = MIIM_ID;
- for(int i = 0; i < sizeof(imageList)/sizeof(imageList[0]); i++)
- {
- if (GetMenuItemInfoW(hMenu, i, TRUE, &mii))
- {
- mlis.lpszName = MAKEINTRESOURCEW(imageList[i]);
- MLImageList_Add2(plugin.hwndLibraryParent, hmlil, MLIF_FILTER1_UID, &mlis, mii.wID);
- }
- }
- return hmlil;
- }
- static void DataCmdBar_SetButtonImages(HWND hButton, HMLIMGLST hmlil, INT normal, INT hover, INT pressed, INT disabled)
- {
- MLBUTTONIMAGELIST bil;
- MLIMAGELISTTAG t;
- bil.hmlil = hmlil;
- t.hmlil = bil.hmlil;
-
- t.nTag = normal;
- bil.normalIndex = (MLImageList_GetIndexFromTag(plugin.hwndLibraryParent, &t)) ? t.mlilIndex : -1;
-
- if (disabled == normal) bil.disabledIndex = bil.normalIndex;
- else
- {
- t.nTag = disabled;
- bil.disabledIndex = (MLImageList_GetIndexFromTag(plugin.hwndLibraryParent, &t)) ? t.mlilIndex : bil.normalIndex;
- }
-
- if (hover == normal) bil.hoverIndex = bil.normalIndex;
- else if (hover == disabled) bil.hoverIndex = bil.disabledIndex;
- else
- {
- t.nTag = hover;
- bil.hoverIndex = (MLImageList_GetIndexFromTag(plugin.hwndLibraryParent, &t)) ? t.mlilIndex : bil.normalIndex;
- }
- if (pressed == normal) bil.pressedIndex = bil.normalIndex;
- else if (pressed == disabled) bil.pressedIndex = bil.disabledIndex;
- else if (pressed == hover) bil.pressedIndex = bil.hoverIndex;
- else
- {
- t.nTag = pressed;
- bil.pressedIndex = (MLImageList_GetIndexFromTag(plugin.hwndLibraryParent, &t)) ? t.mlilIndex : bil.normalIndex;
- }
- SENDMLIPC(hButton, ML_IPC_SKINNEDBUTTON_SETIMAGELIST, (LPARAM)&bil);
- }
- static void PlayEx_Initialize(HWND hdlg)
- {
- HWND hButton = GetDlgItem(hdlg, IDC_BTN_PLAYEX);
- if (!hButton) return;
- HWND hFileView = (HWND)CommandBar_GetData(hdlg);
- if (NULL == hFileView) return;
- HMENU hMenu = FileView_GetMenu(hFileView, FVMENU_PLAY);
- if (!hMenu) return;
- BOOL bPlay = (!hFileView || 0 == (FVS_ENQUEUE & FileView_GetStyle(hFileView)));
- WCHAR szBuffer[256] = {0};
- MENUITEMINFOW mii = { sizeof(MENUITEMINFOW), };
- mii.fMask = MIIM_STRING;
- mii.dwTypeData = szBuffer;
- mii.cch = sizeof(szBuffer)/sizeof(szBuffer[0]);
- if (GetMenuItemInfoW(hMenu, (bPlay) ? 0 : 1, TRUE, &mii))
- {
- while(mii.cch && L'\t' != szBuffer[mii.cch]) mii.cch--;
- if (mii.cch > 0) szBuffer[mii.cch] = L'\0';
- SetWindowTextW(hButton, szBuffer);
- }
- if (bPlay)
- {
- DataCmdBar_SetButtonImages(hButton, hmlilButton, IDB_PLAY_NORMAL,
- IDB_PLAY_PRESSED, IDB_PLAY_HIGHLIGHTED, IDB_PLAY_DISABLED);
- }
- else
- {
- DataCmdBar_SetButtonImages(hButton, hmlilButton, IDB_ENQUEUE_NORMAL,
- IDB_ENQUEUE_PRESSED, IDB_ENQUEUE_HIGHLIGHTED, IDB_ENQUEUE_DISABLED);
- }
- }
- static void DataCmdBar_UpdateControls(HWND hdlg, BOOL bRedraw)
- {
- INT buttonList[] = { IDC_BTN_PLAYEX, IDC_BTN_COPY, };
- HDWP hdwp;
- DWORD flags, size;
- INT w;
- flags = SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER | ((bRedraw) ? 0 : SWP_NOREDRAW);
- hdwp = BeginDeferWindowPos(sizeof(buttonList)/sizeof(buttonList[0]));
- if (!hdwp) return;
- for(int i =0; i < sizeof(buttonList)/sizeof(buttonList[0]); i++)
- {
- HWND hctrl = GetDlgItem(hdlg, buttonList[i]);
- if (NULL != hctrl)
- {
- size = 0;
- switch(buttonList[i])
- {
- case IDC_BTN_PLAYEX:
- {
- HWND hFileView = (HWND)CommandBar_GetData(hdlg);
- if (NULL == hFileView) return;
- HMENU hMenu = FileView_GetMenu(hFileView, FVMENU_PLAY);
- if (hMenu)
- {
- WCHAR szText[256] = {0};
- INT count = GetMenuItemCount(hMenu);
- MENUITEMINFO mii = {0};
- mii.cbSize = sizeof(MENUITEMINFO);
- mii.fMask = MIIM_STRING;
- mii.dwTypeData = szText;
- w = 0;
- for (int i = 0; i < count; i++)
- {
- mii.cch = sizeof(szText)/sizeof(szText[0]);
- if (GetMenuItemInfo(hMenu, i, TRUE, &mii))
- {
- while(mii.cch && L'\t' != szText[mii.cch]) mii.cch--;
- if (mii.cch > 0) szText[mii.cch] = L'\0';
- size = MLSkinnedButton_GetIdealSize(hctrl, szText);
- if (w < LOWORD(size)) w = LOWORD(size);
- }
- }
- size = MAKELONG(w + 8, HIWORD(size));
- }
- }
- break;
- default:
- size = MLSkinnedButton_GetIdealSize(hctrl, NULL);
- break;
- }
- INT width = LOWORD(size), height = HIWORD(size);
- if (width < 82) width = 82;
- if (height < 14) height = 14;
-
- hdwp = DeferWindowPos(hdwp, hctrl, NULL, 0, 0, width, height, flags);
- }
- }
- EndDeferWindowPos(hdwp);
- SetWindowPos(hdlg, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE |
- SWP_NOZORDER | SWP_FRAMECHANGED | ((bRedraw) ? 0 : SWP_NOREDRAW));
- }
- static BOOL DataCmdBar_OnInitDialog(HWND hdlg, HWND hwndFocus, LPARAM lParam)
- {
- MLSKINWINDOW sw;
- sw.skinType = SKINNEDWND_TYPE_AUTO;
- sw.style = SWS_USESKINCOLORS | SWS_USESKINCURSORS | SWS_USESKINFONT;
- sw.hwndToSkin = hdlg;
- MLSkinWindow(plugin.hwndLibraryParent, &sw);
-
-
- sw.hwndToSkin = GetDlgItem(hdlg, IDC_BTN_EJECT);
- MLSkinWindow(plugin.hwndLibraryParent, &sw);
- sw.style |= SWBS_SPLITBUTTON;
- sw.hwndToSkin = GetDlgItem(hdlg, IDC_BTN_PLAYEX);
- MLSkinWindow(plugin.hwndLibraryParent, &sw);
-
- sw.style = SWS_USESKINCOLORS | SWS_USESKINCURSORS | SWS_USESKINFONT;
- sw.hwndToSkin = GetDlgItem(hdlg, IDC_BTN_COPY);
- MLSkinWindow(plugin.hwndLibraryParent, &sw);
-
- sw.skinType = SKINNEDWND_TYPE_STATIC;
- sw.style = SWS_USESKINCOLORS | SWS_USESKINCURSORS | SWS_USESKINFONT;
- sw.hwndToSkin = GetDlgItem(hdlg, IDC_LBL_STATUS);
- MLSkinWindow(plugin.hwndLibraryParent, &sw);
- hmlilButton = DataCmdBar_CreateImageList();
- PlayEx_Initialize(hdlg);
- DataCmdBar_SetButtonImages(GetDlgItem(hdlg, IDC_BTN_EJECT), hmlilButton, IDB_EJECT2_NORMAL,
- IDB_EJECT2_PRESSED, IDB_EJECT2_HIGHLIGHTED, IDB_EJECT2_DISABLED);
- DataCmdBar_UpdateControls(hdlg, FALSE);
- return FALSE;
- }
- static void DataCmdBar_OnDestroy(HWND hdlg)
- {
- if (hmlilButton)
- {
- MLImageList_Destroy(plugin.hwndLibraryParent, hmlilButton);
- hmlilButton = NULL;
- }
- }
- static void DataCmdBar_OnWindowPosChanged(HWND hdlg, WINDOWPOS *pwp)
- {
- if (0 == (SWP_NOSIZE & pwp->flags) || 0 != (SWP_FRAMECHANGED & pwp->flags))
- {
- HWND hctrl;
- HDWP hdwp;
- RECT rc, rw;
- DWORD flags;
- if (!GetClientRect(hdlg, &rc)) return;
- InflateRect(&rc, -2, 0);
- LONG left = rc.left-2;
- LONG right = rc.right;
- hdwp = BeginDeferWindowPos(4);
- if (!hdwp) return;
- flags = SWP_NOACTIVATE | SWP_NOZORDER | ((SWP_NOREDRAW | SWP_NOCOPYBITS) & pwp->flags);
- if (NULL != (hctrl = GetDlgItem(hdlg, IDC_BTN_PLAYEX)) && GetWindowRect(hctrl, &rw))
- {
- hdwp = DeferWindowPos(hdwp, hctrl, NULL, left, rc.top, rw.right - rw.left, rc.bottom - rc.top, flags);
- left += ((rw.right - rw.left) + 8);
- }
- if (NULL != (hctrl = GetDlgItem(hdlg, IDC_BTN_COPY)) && GetWindowRect(hctrl, &rw))
- {
- hdwp = DeferWindowPos(hdwp, hctrl, NULL, left, rc.top, rw.right - rw.left, rc.bottom - rc.top, flags);
- left += ((rw.right - rw.left) + 8);
- }
- if (NULL != (hctrl = GetDlgItem(hdlg, IDC_BTN_EJECT)) && GetWindowRect(hctrl, &rw))
- {
- right -= (rw.right - rw.left);
- if (right < (left + 16)) right = left + 16;
- hdwp = DeferWindowPos(hdwp, hctrl, NULL, right, rc.top, rw.right - rw.left, rc.bottom - rc.top, flags);
- right -= 4;
- }
- if (NULL != (hctrl = GetDlgItem(hdlg, IDC_LBL_STATUS)) && GetWindowRect(hctrl, &rw))
- {
- hdwp = DeferWindowPos(hdwp, hctrl, NULL, left, rc.top, right - left, rc.bottom - rc.top, flags);
- }
- EndDeferWindowPos(hdwp);
- }
- if (0 == (SWP_NOREDRAW & pwp->flags)) InvalidateRect(GetDlgItem(hdlg, IDC_LBL_STATUS), NULL, TRUE);
- }
- static void DataCmdBar_OnPlayDropDown(HWND hdlg, HWND hctrl)
- {
- RECT r;
- if (!GetWindowRect(hctrl, &r)) return;
- HWND hFileView = (HWND)CommandBar_GetData(hdlg);
- if (NULL == hFileView) return;
- HMENU hMenu = FileView_GetMenu(hFileView, FVMENU_PLAY);
- if (!hMenu) return;
-
-
- MLSkinnedButton_SetDropDownState(hctrl, TRUE);
- HMLIMGLST hmlilDropDown = DataCmdBar_CreateDropDownImageList(hMenu);
- MLTrackSkinnedPopupMenuEx(plugin.hwndLibraryParent, hMenu,
- TPM_RIGHTBUTTON | TPM_LEFTBUTTON | TPM_BOTTOMALIGN | TPM_LEFTALIGN | TPM_NONOTIFY,
- r.left, r.top - 2, hFileView, NULL, hmlilDropDown, r.right - r.left,
- SMS_USESKINFONT, NULL, 0L);
- MLSkinnedButton_SetDropDownState(hctrl, FALSE);
- MLImageList_Destroy(plugin.hwndLibraryParent, hmlilDropDown);
- }
- static void DataCmdBar_OnPlayClick(HWND hdlg, HWND hButton)
- {
- EnableWindow(hButton, FALSE);
- HWND hFileView = (HWND)CommandBar_GetData(hdlg);
- if (NULL != hFileView)
- {
- HMENU hMenu = FileView_GetMenu(hFileView, FVMENU_PLAY);
- if (NULL != hMenu)
- {
- UINT uCmd = (FVS_ENQUEUE & FileView_GetStyle(hFileView)) ? FVA_ENQUEUE : FVA_PLAY;
- SendMessageW(hFileView, WM_COMMAND, MAKEWPARAM(FileView_GetActionCommand(hFileView, uCmd), 0), 0L);
- }
- }
- EnableWindow(hButton, TRUE);
- }
- static void DataCmdBar_OnCommand(HWND hdlg, INT eventId, INT ctrlId, HWND hwndCtrl)
- {
- switch (ctrlId)
- {
- case IDC_BTN_PLAYEX:
- switch(eventId)
- {
- case MLBN_DROPDOWN: DataCmdBar_OnPlayDropDown(hdlg, hwndCtrl); break;
- case BN_CLICKED: DataCmdBar_OnPlayClick(hdlg, hwndCtrl); break;
- }
- break;
- case IDC_BTN_EJECT:
- switch(eventId)
- {
- case BN_CLICKED: SendMessageW(GetParent(hdlg), WM_COMMAND, MAKEWPARAM(ID_EJECT_DISC, 0), 0L); break; // straight to container...
- }
- break;
- case IDC_BTN_COPY:
- switch(eventId)
- {
- case BN_CLICKED: SendMessageW(hdlg, WM_COMMAND, MAKEWPARAM(ID_COPY_SELECTION, 0), 0L); break;
- }
- break;
- }
- }
- static INT DataCmdBar_OnGetBestHeight(HWND hdlg)
- {
- INT h, height = 0;
- INT buttonList[] = { IDC_BTN_PLAYEX, };
- for(int i =0; i < sizeof(buttonList)/sizeof(buttonList[0]); i++)
- {
- HWND hctrl = GetDlgItem(hdlg, buttonList[i]);
- if (NULL != hctrl)
- {
- DWORD sz = MLSkinnedButton_GetIdealSize(hctrl, NULL);
- h = HIWORD(sz);
- if (height < h) height = h;
- }
- }
- return height;
- }
- INT_PTR WINAPI DataCmdBar_DialogProc(HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- switch (uMsg)
- {
- case WM_INITDIALOG: return DataCmdBar_OnInitDialog(hdlg, (HWND)wParam, lParam);
- case WM_DESTROY: DataCmdBar_OnDestroy(hdlg); break;
- case WM_WINDOWPOSCHANGED: DataCmdBar_OnWindowPosChanged(hdlg, (WINDOWPOS*)lParam); return TRUE;
- case WM_COMMAND: DataCmdBar_OnCommand(hdlg, HIWORD(wParam), LOWORD(wParam), (HWND)lParam); break;
- case CBM_GETBESTHEIGHT: SetWindowLongPtrW(hdlg, DWLP_MSGRESULT, DataCmdBar_OnGetBestHeight(hdlg)); return TRUE;
- case WM_DISPLAYCHANGE:
- PlayEx_Initialize(hdlg);
- break;
- case WM_SETFONT:
- DataCmdBar_UpdateControls(hdlg, LOWORD(lParam));
- return 0;
- case WM_SETTEXT:
- case WM_GETTEXT:
- case WM_GETTEXTLENGTH:
- SetWindowLongPtrW(hdlg, DWLP_MSGRESULT, (LONGX86)(LONG_PTR)SendDlgItemMessageW(hdlg, IDC_LBL_STATUS, uMsg, wParam, lParam));
- return TRUE;
-
- }
-
- return 0;
- }
|