#include "resource.h" #include "main.h" #include "api.h" #include "../nu/listview.h" #include "../nu/ChildSizer.h" #include "../nu/DialogSkinner.h" #include "impl_playlist.h" #include "../nu/SendTo.h" #include static ChildWndResizeItem view_rlist[] = { { IDC_PLAYLIST, ResizeBottom | ResizeRight}, { IDC_PLAY, DockToBottom}, { IDC_ENQUEUE, DockToBottom}, { IDC_SAVE, DockToBottom}, { IDC_SENDTO, DockToBottom}, }; W_ListView playlist_list; Playlist currentPlaylist; int playlist_skin; static SendToMenu sendTo(plugin); static void PlaySelection(int enqueue, int is_all) { if (!enqueue) SendMessage(plugin.hwndWinampParent, WM_WA_IPC, 0, IPC_DELETE); int numTracks = playlist_list.GetCount(); for (int i = 0;i < numTracks;i++) { if (is_all || playlist_list.GetSelected(i)) { if (currentPlaylist.IsCached(i)) { enqueueFileWithMetaStructW s; s.filename = currentPlaylist.ItemName(i); s.title = currentPlaylist.ItemTitle(i); s.length = currentPlaylist.GetItemLengthMilliseconds(i) / 1000; SendMessage(plugin.hwndWinampParent, WM_WA_IPC, (WPARAM)&s, IPC_PLAYFILEW); } else { enqueueFileWithMetaStructW s; s.filename = currentPlaylist.ItemName(i); s.title = 0; s.length = 0; SendMessage(plugin.hwndWinampParent, WM_WA_IPC, (WPARAM)&s, IPC_PLAYFILEW); } } } if (!enqueue) { if (is_all) { int pos = playlist_list.GetNextSelected(-1); if (pos != -1) { SendMessage(plugin.hwndWinampParent, WM_WA_IPC, pos, IPC_SETPLAYLISTPOS); SendMessage(plugin.hwndWinampParent, WM_COMMAND, 40047, 0); // stop button, literally SendMessage(plugin.hwndWinampParent, WM_COMMAND, 40045, 0); // play button, literally return ; } } SendMessage(plugin.hwndWinampParent, WM_WA_IPC, 0, IPC_STARTPLAY); } /* int cnt=0; int l=PlayList_getlength(); int foo_all=0; // all but play the only selected int foo_selected=-1; if (g_config->ReadInt("plplaymode",1)||is_all) { int selcnt=0; for(int i=0;iitem.iItem; if (item < 0 || item >= currentPlaylist.GetNumItems()) return 0; if (lpdi->item.mask & LVIF_TEXT) { switch (lpdi->item.iSubItem) { case 0: { bool cached = currentPlaylist.IsCached(item); if (!cached) { wchar_t title[400]; int length; mediaLibrary.GetFileInfo(currentPlaylist.ItemName(item), title, 400, &length); if (length == 0) currentPlaylist.SetItemLengthMilliseconds(item, -1000); else currentPlaylist.SetItemLengthMilliseconds(item, length*1000); currentPlaylist.SetItemTitle(item, title); } // CUT: currentPlaylist.GetItemTitle(item, lpdi->item.pszText, lpdi->item.cchTextMax); StringCchPrintf(lpdi->item.pszText, lpdi->item.cchTextMax, L"%d. %s", item + 1, currentPlaylist.ItemTitle(item)); } break; case 1: { if (currentPlaylist.GetItemLengthMilliseconds(item) == 0) // if the length is 0, then we'll re-read it { wchar_t title[400]; int length; mediaLibrary.GetFileInfo(currentPlaylist.ItemName(item), title, 400, &length); if (length == 0) currentPlaylist.SetItemLengthMilliseconds(item, -1000); else { currentPlaylist.SetItemLengthMilliseconds(item, length*1000); // currentPlaylist.SetItemTitle(item, AutoWide(title)); } } int length = currentPlaylist.GetItemLengthMilliseconds(item) / 1000; if (length <= 0) lpdi->item.pszText[0] = 0; else StringCchPrintf(lpdi->item.pszText, lpdi->item.cchTextMax, L"%d:%02d", length / 60, length % 60); } break; } } return 0; } static INT_PTR playlist_Notify(HWND hwndDlg, WPARAM wParam, LPARAM lParam) { LPNMHDR l = (LPNMHDR)lParam; if (l->idFrom == IDC_PLAYLIST) { switch (l->code) { /* case NM_RETURN: if (!(GetAsyncKeyState(VK_SHIFT)&0x8000)) PlaySelection(g_config->ReadInt("enqueuedef", 0), g_config->ReadInt("plplaymode", 1)); else PlaySelection(!g_config->ReadInt("enqueuedef", 0), 0); break; case NM_DBLCLK: PlaySelection(g_config->ReadInt("enqueuedef", 0), g_config->ReadInt("plplaymode", 1)); break;*/ case LVN_GETDISPINFO: return playlist_GetDisplayInfo((NMLVDISPINFO*) lParam); /*case LVN_BEGINDRAG: we_are_drag_and_dropping = 1; SetCapture(hwndDlg); break; */ /* case LVN_ITEMCHANGED: case LVN_ODSTATECHANGED: UpdatePlaylistTime(hwndDlg); break; */ /* case LVN_KEYDOWN: { LPNMLVKEYDOWN pnkd = (LPNMLVKEYDOWN) lParam; switch (pnkd->wVKey) { case VK_DELETE: if (GetAsyncKeyState(VK_CONTROL)&0x8000) Playlist_DeleteSelected(0); else Playlist_DeleteSelected(1); break; case '3': if (GetAsyncKeyState(VK_MENU)&0x8000) TagEditor(hwndDlg); break; case 'A': if (GetAsyncKeyState(VK_CONTROL)&0x8000) playlist_list.SelectAll(); break; case 'I': if (GetAsyncKeyState(VK_CONTROL)&0x8000) playlist_list.InvertSelection(); break; case 'L': if (GetAsyncKeyState(VK_CONTROL)&0x8000) CurrentPlaylist_AddLocation(hwndDlg); else if (GetAsyncKeyState(VK_SHIFT)&0x8000) CurrentPlaylist_AddDirectory(hwndDlg); else CurrentPlaylist_AddFiles(hwndDlg); SyncPlaylist(); break; case 'R': if (GetAsyncKeyState(VK_CONTROL)&0x8000) { if (GetAsyncKeyState(VK_SHIFT)&0x8000) AGAVE_API_PLAYLISTMANAGER->Randomize(¤tPlaylist); else AGAVE_API_PLAYLISTMANAGER->Reverse(¤tPlaylist); playlist_list.RefreshAll(); } break; case 'E': if (GetAsyncKeyState(VK_CONTROL)&0x8000) { if (GetAsyncKeyState(VK_MENU)&0x8000) Playlist_ResetSelected(); else EditEntry(l->hwndFrom); } break; } } break; */ } } return 0; } static wchar_t *BuildFilenameList(int is_all) { wchar_t filename[MAX_PATH] = {0}; size_t len = 200; wchar_t *str = (wchar_t *)malloc(len*sizeof(wchar_t)); size_t sofar = 0; int numTracks = playlist_list.GetCount(); for (int i = 0;i < numTracks;i++) { if (is_all || playlist_list.GetSelected(i)) { if (currentPlaylist.GetItem(i, filename, MAX_PATH)) { size_t filenameLen = wcslen(filename); if ((filenameLen + sofar) > len) { size_t newLen = filenameLen + sofar + 32; // add some cushion wchar_t *newStr = (wchar_t *)malloc(newLen*sizeof(wchar_t)); memcpy(newStr, str, sofar*sizeof(wchar_t)); len = newLen; free(str); str = newStr; } StringCchCopyW(str + sofar, filenameLen, filename); sofar += filenameLen + 1; } } } *(str + sofar) = 0; return str; } INT_PTR CALLBACK ViewProcedure(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { INT_PTR a = dialogSkinner.Handle(hwndDlg, msg, wParam, lParam); if (a) return a; switch (msg) { case WM_INITMENUPOPUP: sendTo.InitPopupMenu(wParam); return 0; case WM_INITDIALOG: childSizer.Init(hwndDlg, view_rlist, sizeof(view_rlist) / sizeof(view_rlist[0])); playlist_list.setwnd(GetDlgItem(hwndDlg, IDC_PLAYLIST)); playlist_skin = mediaLibrary.SkinList(GetDlgItem(hwndDlg, IDC_PLAYLIST)); playlist_list.AddCol(L"Song",200); playlist_list.AddCol(L"Length",100); playlist_list.JustifyColumn(1, LVCFMT_RIGHT); playlist_DisplayChange(); playlist_list.SetVirtualCount(currentPlaylist.GetNumItems()); break; case WM_PAINT: { int tab[] = {IDC_PLAYLIST|DCW_SUNKENBORDER}; dialogSkinner.Draw(hwndDlg,tab,1); } return 0; case WM_SIZE: if (wParam != SIZE_MINIMIZED) childSizer.Resize(hwndDlg, view_rlist, sizeof(view_rlist) / sizeof(view_rlist[0])); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_PLAY: if (playlist_list.GetSelectedCount() > 0) PlaySelection(0, 0/*g_config->ReadInt("plplaymode", 1)*/); else PlaySelection(0, 1); break; case IDC_ENQUEUE: if (playlist_list.GetSelectedCount() > 0) PlaySelection(0, 0); else PlaySelection(1, 0); break; case IDC_SAVE: break; case IDC_SENDTO: { HMENU blah = CreatePopupMenu(); RECT r; GetWindowRect(GetDlgItem(hwndDlg, IDC_SENDTO), &r); sendTo.AddHere(hwndDlg, blah, ML_TYPE_FILENAMESW); int x = TrackPopupMenu(blah, TPM_RIGHTBUTTON | TPM_LEFTBUTTON | TPM_BOTTOMALIGN | TPM_LEFTALIGN | TPM_RETURNCMD, r.left, r.top, 0, hwndDlg, NULL); if (sendTo.WasClicked(x)) { int is_all = playlist_list.GetSelectedCount() == 0; wchar_t *names = BuildFilenameList(is_all); sendTo.SendFilenames(names); free(names); } sendTo.Cleanup(); } break; } break; case WM_DISPLAYCHANGE: playlist_DisplayChange(); return 0; case WM_NOTIFY: return playlist_Notify(hwndDlg, wParam, lParam); case WM_DESTROY: mediaLibrary.UnskinList(playlist_skin); break; } return 0; }