?? cpi_playlistwindow.c
字號:
|| pMSG->message == WM_NCRBUTTONDOWN)
&& pMSG->hwnd != windows.wnd_playlist_IPEdit)
{
// Get the classname to ensure that it's not our combo popup that's got the message
char cClassname[64];
GetClassName(pMSG->hwnd, cClassname, 64);
if(strcmp("ComboLBox", cClassname))
CPlaylistWindow_DestroyIPEdit();
}
}
if(globals.m_hhkListView_Posted)
return CallNextHookEx(globals.m_hhkListView_Posted, iCode, wParam, lParam);
else
return 0;
}
//
//
//
void CPlaylistWindow_TrackStackMenu(iItem)
{
HWND hWndList;
POINT ptItem;
RECT rSubItem;
HMENU hmMenu;
UINT uiMenuCommand;
int iSearchItemIDX;
CP_HPLAYLISTITEM hClickedItem;
CPe_ItemStackState enClickedItemState;
BOOL bMultipleSelection;
// We want to get the subitem's rect in the co-ordinate space of the dialog
hWndList = CLV_GetHWND(globals.m_hPlaylistViewControl);
CLV_GetItemSubRect(globals.m_hPlaylistViewControl, &rSubItem, iItem, 0);
// Are there multiple items selected?
iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, CPC_INVALIDITEM);
if(iSearchItemIDX != CPC_INVALIDITEM)
iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, iSearchItemIDX);
if(iSearchItemIDX != CPC_INVALIDITEM)
bMultipleSelection = TRUE;
else
bMultipleSelection = FALSE;
ptItem.x = rSubItem.left;
ptItem.y = rSubItem.bottom;
ClientToScreen(hWndList, &ptItem);
// Create menu
hmMenu = CreatePopupMenu();
hClickedItem = (CP_HPLAYLISTITEM)CLV_GetItemData(globals.m_hPlaylistViewControl, iItem);
enClickedItemState = CPL_Stack_GetItemState(globals.m_hPlaylist, hClickedItem);
if(enClickedItemState != issUnstacked)
{
AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_PLAYFROMHERE, "Play from here");
SetMenuDefaultItem(hmMenu, IDC_CMDTS_PLAYFROMHERE, FALSE);
if(enClickedItemState != issStacked_Top)
{
AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_PLAYNEXT, "Play next");
AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_UNSTACK, "Unstack");
}
// Not played yet?
if(enClickedItemState == issStacked || enClickedItemState == issStacked_Top)
{
if(options.repeat_playlist == TRUE)
{
AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_STOPAFTER, "Repeat after this");
AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_STOPAFTER_NOREP, "Stop after this (repeat->off)");
}
else
{
AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_STOPAFTER, "Stop after this");
}
}
if(enClickedItemState != issStacked_Top)
AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_QUEUE, "Queue at end");
}
else
{
AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_PLAYNOW, "Play now");
SetMenuDefaultItem(hmMenu, IDC_CMDTS_PLAYNOW, FALSE);
AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_PLAYNEXT, "Play next");
AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_QUEUE, "Queue at end");
}
AppendMenu(hmMenu, MF_SEPARATOR, 0, NULL);
AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_CLEARSTACK, "Clear stack");
AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_RESTACKALL, "Restack all");
uiMenuCommand = TrackPopupMenuEx( hmMenu,
TPM_NONOTIFY
| TPM_RETURNCMD
| TPM_RIGHTBUTTON,
ptItem.x, ptItem.y,
IF_GetHWnd(windows.m_hifPlaylist),
NULL);
DestroyMenu(hmMenu);
if(uiMenuCommand == IDC_CMDTS_CLEARSTACK)
{
CPL_Stack_Clear(globals.m_hPlaylist);
}
else if(uiMenuCommand == IDC_CMDTS_RESTACKALL)
{
CPL_Stack_RestackAll(globals.m_hPlaylist);
}
else if(uiMenuCommand == IDC_CMDTS_PLAYFROMHERE)
{
CPL_Stack_SetCursor(globals.m_hPlaylist, hClickedItem);
CPL_PlayItem(globals.m_hPlaylist, TRUE, pmCurrentItem);
}
else if(uiMenuCommand == IDC_CMDTS_UNSTACK)
{
iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, CPC_INVALIDITEM);
while(iSearchItemIDX != CPC_INVALIDITEM)
{
CPL_Stack_Remove(globals.m_hPlaylist, (CP_HPLAYLISTITEM)CLV_GetItemData(globals.m_hPlaylistViewControl, iSearchItemIDX) );
iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, iSearchItemIDX);
}
}
else if(uiMenuCommand == IDC_CMDTS_PLAYNOW)
{
CP_HPLAYLISTITEM hFirstItem;
CPL_Stack_ClipFromCurrent(globals.m_hPlaylist);
iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, CPC_INVALIDITEM);
hFirstItem = NULL;
while(iSearchItemIDX != CPC_INVALIDITEM)
{
CP_HPLAYLISTITEM hItem;
hItem = (CP_HPLAYLISTITEM)CLV_GetItemData(globals.m_hPlaylistViewControl, iSearchItemIDX);
if(!hFirstItem)
hFirstItem = hItem;
CPL_Stack_Append(globals.m_hPlaylist, hItem);
iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, iSearchItemIDX);
}
CPL_Stack_SetCursor(globals.m_hPlaylist, hFirstItem);
CPL_PlayItem(globals.m_hPlaylist, TRUE, pmCurrentItem);
}
else if(uiMenuCommand == IDC_CMDTS_STOPAFTER)
{
CPL_Stack_ClipFromItem(globals.m_hPlaylist, hClickedItem);
}
else if(uiMenuCommand == IDC_CMDTS_STOPAFTER_NOREP)
{
options.repeat_playlist = FALSE;
InvalidateRect(windows.wnd_main, NULL, FALSE);
CPL_Stack_ClipFromItem(globals.m_hPlaylist, hClickedItem);
}
else if(uiMenuCommand == IDC_CMDTS_PLAYNEXT)
{
iSearchItemIDX = CLV_GetPrevSelectedItem(globals.m_hPlaylistViewControl, CPC_INVALIDITEM);
while(iSearchItemIDX != CPC_INVALIDITEM)
{
CPL_Stack_PlayNext(globals.m_hPlaylist, (CP_HPLAYLISTITEM)CLV_GetItemData(globals.m_hPlaylistViewControl, iSearchItemIDX) );
iSearchItemIDX = CLV_GetPrevSelectedItem(globals.m_hPlaylistViewControl, iSearchItemIDX);
}
}
else if(uiMenuCommand == IDC_CMDTS_QUEUE)
{
iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, CPC_INVALIDITEM);
while(iSearchItemIDX != CPC_INVALIDITEM)
{
CP_HPLAYLISTITEM hItem;
hItem = (CP_HPLAYLISTITEM)CLV_GetItemData(globals.m_hPlaylistViewControl, iSearchItemIDX);
CPL_Stack_Remove(globals.m_hPlaylist, hItem);
CPL_Stack_Append(globals.m_hPlaylist, hItem);
iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, iSearchItemIDX);
}
}
}
//
//
//
void CPlaylistWindow_RenameMenu(const int iItem, const int iSubItem)
{
HWND hWndList;
POINT ptItem;
RECT rSubItem;
HMENU hmMenu;
UINT uiMenuCommand;
// We want to get the subitem's rect in the co-ordinate space of the dialog
hWndList = CLV_GetHWND(globals.m_hPlaylistViewControl);
CLV_GetItemSubRect(globals.m_hPlaylistViewControl, &rSubItem, iItem, iSubItem);
ptItem.x = rSubItem.left;
ptItem.y = rSubItem.bottom;
ClientToScreen(hWndList, &ptItem);
// Create menu
hmMenu = CreatePopupMenu();
AppendMenu(hmMenu, MF_STRING, (DWORD)rwsArtistAlbumNumberTitle, "Rename to <artist> - <album> - <tracknum> - <title>");
AppendMenu(hmMenu, MF_STRING, (DWORD)rwsArtistNumberTitle, "Rename to <artist> - <tracknum> - <title>");
AppendMenu(hmMenu, MF_STRING, (DWORD)rwsAlbumNumberTitle, "Rename to <album> - <tracknum> - <title>");
AppendMenu(hmMenu, MF_STRING, (DWORD)rwsAlbumNumber, "Rename to <album> - <tracknum>");
AppendMenu(hmMenu, MF_STRING, (DWORD)rwsNumberTitle, "Rename to <tracknum> - <title>");
AppendMenu(hmMenu, MF_STRING, (DWORD)rwsTitle, "Rename to <title>");
uiMenuCommand = TrackPopupMenuEx( hmMenu,
TPM_NONOTIFY
| TPM_RETURNCMD
| TPM_RIGHTBUTTON,
ptItem.x, ptItem.y,
IF_GetHWnd(windows.m_hifPlaylist),
NULL);
DestroyMenu(hmMenu);
if(uiMenuCommand)
{
int iSearchItemIDX;
int iNumberOfErrors;
iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, CPC_INVALIDITEM);
iNumberOfErrors = 0;
while(iSearchItemIDX != CPC_INVALIDITEM)
{
BOOL bSucceeded;
bSucceeded = CPLI_RenameTrack((CP_HPLAYLISTITEM)CLV_GetItemData(globals.m_hPlaylistViewControl, iSearchItemIDX),
(CPe_FilenameFormat)uiMenuCommand);
iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, iSearchItemIDX);
if(!bSucceeded)
iNumberOfErrors++;
}
if(iNumberOfErrors > 0)
{
MessageBox(IF_GetHWnd(windows.m_hifPlaylist),
"Some files could not be renamed.\n\nThis could be because they are either currently playing or are read-only.",
"Error",
MB_OK | MB_ICONASTERISK);
}
}
}
//
//
//
void CPlaylistWindow_CreateIPEdit(const int iItem, const int iSubItem)
{
RECT rSubItem;
const char* pcClass;
DWORD dwStyle;
int iSearchItemIDX;
UINT uiControlID;
BOOL bClearNonSelectedItems;
CP_HPLAYLISTITEM hClickedItem;
HWND hWndList;
int iNumItemsSelected;
// If the clicked item is not read/write then skip this
hClickedItem = (CP_HPLAYLISTITEM)CLV_GetItemData(globals.m_hPlaylistViewControl, iItem);
if(CPLI_GetReadWriteState(hClickedItem) != rwsReadWrite)
{
MessageBox(windows.m_hWndPlaylist, "This file's ID3 tag cannot be updated. This is because CoolPlayer cannot write to this file.", "Cannot update tag", MB_OK | MB_ICONSTOP);
return;
}
// For some sub items it is not logical to multi update - action these
if(iSubItem == PLAYLIST_TITLE)
bClearNonSelectedItems = TRUE;
else
bClearNonSelectedItems = FALSE;
// Go through the selected items and remove the selection of items that
// cannot be written to (eg because of a read only file)
iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, CPC_INVALIDITEM);
iNumItemsSelected = 1;
for(;iSearchItemIDX != -1; iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, iSearchItemIDX))
{
CP_HPLAYLISTITEM hItem = (CP_HPLAYLISTITEM)CLV_GetItemData(globals.m_hPlaylistViewControl, iSearchItemIDX);
CPLI_ReadTag(hItem);
// We've already checked this item
if(iSearchItemIDX == iItem)
continue;
iNumItemsSelected++;
if(bClearNonSelectedItems == TRUE || CPLI_GetReadWriteState(hItem) != rwsReadWrite)
CLV_SetItemSelected(globals.m_hPlaylistViewControl, iSearchItemIDX, FALSE);
}
// If the "track number" column was clicked - and there are multiple selections - auto number them
if(iSubItem == PLAYLIST_TRACKNUM && iNumItemsSelected > 1)
{
char cStatusMessage[1024];
int iTrackNumber;
// Autonumber
SetCursor(LoadCursor(NULL, IDC_WAIT));
iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, CPC_INVALIDITEM);
iTrackNumber = 1;
for(;iSearchItemIDX != CPC_INVALIDITEM; iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, iSearchItemIDX))
{
CP_HPLAYLISTITEM hItem = (CP_HPLAYLISTITEM)CLV_GetItemData(globals.m_hPlaylistViewControl, iSearchItemIDX);
sprintf(cStatusMessage, "Tagging \"%s\"", CPLI_GetFilename(hItem));
CP_TRACE1("status: %s",cStatusMessage);
CPIC_SetIndicatorValue("status", cStatusMessage);
UpdateWindow(IF_GetHWnd(windows.m_hifPlaylist));
// CPLI_SetTrackNum(hItem, iTrackNumber);
CPLI_WriteTag(hItem);
iTrackNumber++;
}
SetCursor(LoadCursor(NULL, IDC_ARROW));
CPIC_SetIndicatorValue("status", NULL);
return;
}
// If the length was clicked - work out the lengths for all selected items
if(iSubItem == PLAYLIST_LENGTH)
{
char cStatusMessage[1024];
SetCursor(LoadCursor(NULL, IDC_WAIT));
iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, CPC_INVALIDITEM);
for(; iSearchItemIDX != CPC_INVALIDITEM; iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, iSearchItemIDX))
{
CP_HPLAYLISTITEM hItem = (CP_HPLAYLISTITEM)CLV_GetItemData(globals.m_hPlaylistViewControl, iSearchItemIDX);
CPLI_CalculateLength(hItem);
sprintf(cStatusMessage, "Tagging \"%s\"", CPLI_GetFilename(hItem));
CPIC_SetIndicatorValue("status", cStatusMessage);
CP_TRACE1("status: %s",cStatusMessage);
UpdateWindow(IF_GetHWnd(windows.m_hifPlaylist));
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -