diff options
author | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
---|---|---|
committer | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
commit | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Plugins/Library/ml_plg/view.cpp | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/Plugins/Library/ml_plg/view.cpp')
-rw-r--r-- | Src/Plugins/Library/ml_plg/view.cpp | 368 |
1 files changed, 368 insertions, 0 deletions
diff --git a/Src/Plugins/Library/ml_plg/view.cpp b/Src/Plugins/Library/ml_plg/view.cpp new file mode 100644 index 00000000..9520a34b --- /dev/null +++ b/Src/Plugins/Library/ml_plg/view.cpp @@ -0,0 +1,368 @@ +#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 <strsafe.h> + +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;i<l;i++) + { + if(PlayList_getselect(i)) selcnt++; + } + if ((selcnt == 1 && !enqueue) || selcnt == 0) + { + foo_all=-1; + } + } + + */ +} + + +static void playlist_DisplayChange() +{ + playlist_list.SetTextColors(dialogSkinner.Color(WADLG_ITEMFG), dialogSkinner.Color(WADLG_ITEMBG)); + ListView_SetBkColor(playlist_list.getwnd(), dialogSkinner.Color(WADLG_ITEMBG)); + playlist_list.SetFont(dialogSkinner.GetFont()); +} + +static BOOL playlist_GetDisplayInfo(NMLVDISPINFO *lpdi) +{ + size_t item = lpdi->item.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; +}
\ No newline at end of file |