📄 event.cpp
字号:
case LVN_KEYDOWN:
{
LV_KEYDOWN* pnkd = (LV_KEYDOWN*)pHdr;
if(pnkd->wVKey == VK_DELETE)
{
RemoveEvent();
}
else if(pnkd->wVKey == 'A' && (GetKeyState(VK_CONTROL) < 0))
{
uint32 count = ListView_GetItemCount(pListView->hdr.hwndFrom);
for(uint32 index = 0; index < count; index++)
ListView_SetItemState(pListView->hdr.hwndFrom,
index,
LVIS_SELECTED,
LVIS_SELECTED);
}
break;
}
}
}
if(pHdr->code == TTN_NEEDTEXT)
{
pToolTipText = (LPTOOLTIPTEXT)pHdr;
switch(pToolTipText->hdr.idFrom)
{
case ID_FILE_NEWPLAYLIST:
pToolTipText->lpszText = "Create a new playlist";
result = TRUE;
break;
case ID_FILE_SAVEPLAYLIST:
pToolTipText->lpszText = "Save current playlist";
result = TRUE;
break;
case ID_FILE_IMPORT:
pToolTipText->lpszText = "Import tracks and playlists from disk";
result = TRUE;
break;
case ID_EDIT_REMOVE:
pToolTipText->lpszText = "Remove selected tracks and playlists";
result = TRUE;
break;
case ID_EDIT_EDITINFO:
pToolTipText->lpszText = "Edit track or playlist info";
result = TRUE;
break;
case ID_EDIT_ADDTRACK:
pToolTipText->lpszText = "Add selected tracks and playlists to playlist";
result = TRUE;
break;
case ID_EDIT_ADDFILE:
pToolTipText->lpszText = "Add files from disk to playlist";
result = TRUE;
break;
case ID_EDIT_MOVEUP:
pToolTipText->lpszText = "Move selected playlist items up";
result = TRUE;
break;
case ID_EDIT_MOVEDOWN:
pToolTipText->lpszText = "Move selected playlist items down";
result = TRUE;
break;
}
}
return result;
}
void MusicBrowserUI::SortEvent(int id)
{
PlaylistSortKey oldKey, newKey;
PlaylistSortType type;
if(!m_oPlm->CountItems())
return;
switch(id)
{
case ID_SORT_ARTIST:
newKey = kPlaylistSortKey_Artist;
break;
case ID_SORT_ALBUM:
newKey = kPlaylistSortKey_Album;
break;
case ID_SORT_TITLE:
newKey = kPlaylistSortKey_Title;
break;
case ID_SORT_LENGTH:
newKey = kPlaylistSortKey_Time;
break;
case ID_SORT_YEAR:
newKey = kPlaylistSortKey_Year;
break;
case ID_SORT_TRACK:
newKey = kPlaylistSortKey_Track;
break;
case ID_SORT_GENRE:
newKey = kPlaylistSortKey_Genre;
break;
case ID_SORT_LOCATION:
newKey = kPlaylistSortKey_Location;
break;
case IDC_RANDOMIZE:
case ID_SORT_RANDOMIZE:
newKey = kPlaylistSortKey_Random;
break;
default:
return;
}
oldKey = m_oPlm->GetPlaylistSortKey();
type = (oldKey == newKey &&
m_oPlm->GetPlaylistSortType() == kPlaylistSortType_Ascending)
? kPlaylistSortType_Descending : kPlaylistSortType_Ascending;
::SetCursor(LoadCursor(NULL, IDC_WAIT));
m_oPlm->Sort(newKey, type);
::SetCursor(LoadCursor(NULL, IDC_ARROW));
}
void MusicBrowserUI::ToggleVisEvent(void)
{
Event *e;
if (m_state == STATE_COLLAPSED)
e = new Event(CMD_TogglePlaylistUI);
else
e = new Event(CMD_ToggleMusicBrowserUI);
AcceptEvent(e);
delete e;
}
void MusicBrowserUI::PlayNowEvent(void)
{
if(!m_pParent)
{
uint32 count = ListView_GetItemCount(m_hPlaylistView);
uint32 index = 0;
for(index = 0; index < count; index++)
{
uint32 state = ListView_GetItemState(m_hPlaylistView,
index,
LVIS_SELECTED);
if(state & LVIS_SELECTED)
{
// only do this for the root browser
m_playerEQ->AcceptEvent(new Event(CMD_Stop));
m_oPlm->SetCurrentIndex(index);
m_playerEQ->AcceptEvent(new Event(CMD_Play));
break;
}
}
}
}
void MusicBrowserUI::AddTrackEvent(void)
{
vector<PlaylistItem*> items;
vector<string> urls;
GetSelectedMusicTreeItems(&items);
vector<PlaylistItem*>::iterator i;
for(i = items.begin(); i != items.end(); i++)
{
urls.push_back((*i)->URL().c_str());
}
GetSelectedPlaylistItems(&urls);
//GetSelectedStreamItems(&urls);
// we know that we are gonna be adding a
// bunch of items so let windows know.
// it will make the adds more efficient
uint32 newSize = ListView_GetItemCount(m_hPlaylistView);
newSize += urls.size();
ListView_SetItemCount(m_hPlaylistView, newSize);
m_oPlm->AddItems(urls);
}
void MusicBrowserUI::AddTrackAndPlayEvent(void)
{
uint32 count = m_oPlm->CountItems();
AddTrackEvent();
if(m_oPlm->CountItems())
{
m_oPlm->SetCurrentIndex(count);
m_context->target->AcceptEvent(new Event(CMD_Play));
}
}
void MusicBrowserUI::AddFileEvent(HWND hwndParent)
{
PlaylistFormatInfo format;
int32 i, iOffset = 0;
char szFilter[1024] = "MPEG Audio Streams (.mp1;.mp2;.mp3;.mpp)\0"
"*.mp1;*.mp2;*.mp3;*.mpp\0";
// we need a way to iterate LMCs...
iOffset += strlen(szFilter) + 1;
iOffset += strlen(szFilter + iOffset) + 1;
for(i = 0; ; i++)
{
if (m_oPlm->GetSupportedPlaylistFormats(&format, i) != kError_NoErr)
break;
sprintf(szFilter + iOffset, "%s (.%s)",
format.GetDescription(),
format.GetExtension());
iOffset += strlen(szFilter + iOffset) + 1;
sprintf(szFilter + iOffset, "*.%s",
format.GetExtension());
iOffset += strlen(szFilter + iOffset) + 1;
}
strcpy(szFilter + iOffset, "All Files (*.*)\0");
iOffset += strlen(szFilter + iOffset) + 1;
strcpy(szFilter + iOffset, "*.*\0");
iOffset += strlen(szFilter + iOffset) + 1;
szFilter[iOffset] = 0;
vector<string> oFileList;
if (FileOpenDialog(hwndParent,
"Add Tracks and Playlists",
szFilter,
&oFileList,
true) )
{
// we know that we are gonna be adding a
// bunch of items so let windows know.
// it will make the adds more efficient
uint32 newSize = ListView_GetItemCount(m_hPlaylistView);
newSize += oFileList.size();
ListView_SetItemCount(m_hPlaylistView, newSize);
m_oPlm->AddItems(oFileList);
}
}
void MusicBrowserUI::EmptyDBCheck(void)
{
int iRet;
if (m_context->catalog->GetPlaylists()->size() > 0 ||
m_context->catalog->GetMusicList()->size() > 0 ||
m_context->catalog->GetUnsortedMusic()->size() > 0)
return;
bool welcome = false;
m_context->prefs->GetPrefBoolean(kWelcomePref, &welcome);
if(welcome)
{
m_context->prefs->SetPrefBoolean(kWelcomePref, false);
StartStopMusicSearch(true);
}
else
{
iRet = MessageBox(m_hWnd, "Your music database does not contain any items.\r\n"
"Would you like to start a search to find music\r\n"
"and playlists on your machine?",
"Search For Music", MB_YESNO|MB_SETFOREGROUND);
if (iRet == IDYES)
StartStopMusicSearch();
}
}
void MusicBrowserUI::EditPlaylistEvent(void)
{
TV_ITEM tv_item;
// get the first playlist item
tv_item.hItem = TreeView_GetChild(m_hMusicView, m_hPlaylistItem);
tv_item.mask = TVIF_STATE|TVIF_PARAM;
tv_item.stateMask = TVIS_SELECTED;
tv_item.state = 0;
// skip the "Create New Playlist..." item
tv_item.hItem = TreeView_GetNextSibling(m_hMusicView, tv_item.hItem);
if(tv_item.hItem)
{
BOOL result = FALSE;
do
{
result = TreeView_GetItem(m_hMusicView, &tv_item);
if(result && (tv_item.state & TVIS_SELECTED))
{
string playlistPath;
TreeData* treedata = (TreeData*)tv_item.lParam;
if(treedata)
{
playlistPath = treedata->m_oPlaylistPath;
EditPlaylist(playlistPath);
}
}
}while(result &&
(tv_item.hItem = TreeView_GetNextSibling(m_hMusicView,
tv_item.hItem)));
}
}
void MusicBrowserUI::PlayerControlsEvent(int command)
{
switch(command)
{
case ID_CONTROLS_PLAYPAUSE:
if(m_playerState == PLAYERSTATE_PLAYING)
m_context->target->AcceptEvent(new Event(CMD_Pause));
else
m_context->target->AcceptEvent(new Event(CMD_Play));
break;
case ID_CONTROLS_STOP:
m_context->target->AcceptEvent(new Event(CMD_Stop));
break;
case ID_CONTROLS_PREVIOUSSONG:
m_context->target->AcceptEvent(new Event(CMD_PrevMediaPiece));
break;
case ID_CONTROLS_NEXTSONG:
m_context->target->AcceptEvent(new Event(CMD_NextMediaPiece));
break;
case ID_CONTROLS_NORMALORDER:
m_oPlm->SetShuffleMode(false);
break;
case ID_CONTROLS_SHUFFLE:
m_oPlm->SetShuffleMode(true);
break;
case ID_CONTROLS_REPEATNONE:
m_oPlm->SetRepeatMode(kPlaylistMode_RepeatNone);
break;
case ID_CONTROLS_REPEATONE:
m_oPlm->SetRepeatMode(kPlaylistMode_RepeatOne);
break;
case ID_CONTROLS_REPEATALL:
m_oPlm->SetRepeatMode(kPlaylistMode_RepeatAll);
break;
}
}
void MusicBrowserUI::ChangePlayerState(int32 event)
{
HMENU menu;
MENUITEMINFO item;
menu = GetMenu(m_hWnd);
menu = GetSubMenu(menu, 3);
item.cbSize = sizeof(MENUITEMINFO);
item.fMask = MIIM_TYPE;
item.fType = MFT_STRING;
switch(event)
{
case INFO_Playing:
{
m_playerState = PLAYERSTATE_PLAYING;
item.dwTypeData = "Pa&use the Current Track";
item.cch = strlen(item.dwTypeData);
SetMenuItemInfo(menu, ID_CONTROLS_PLAYPAUSE, false, &item);
break;
}
case INFO_Paused:
case INFO_Stopped:
{
if(event == INFO_Paused)
m_playerState = PLAYERSTATE_PAUSED;
else
m_playerState = PLAYERSTATE_STOPPED;
item.dwTypeData = "&Play the Current Track";
item.cch = strlen(item.dwTypeData);
SetMenuItemInfo(menu, ID_CONTROLS_PLAYPAUSE, false, &item);
break;
}
}
}
void MusicBrowserUI::ChangeShuffleMode(bool shuffled)
{
HMENU menu;
MENUITEMINFO item;
menu = GetMenu(m_hWnd);
menu = GetSubMenu(menu, 3);
item.cbSize = sizeof(MENUITEMINFO);
item.fMask = MIIM_STATE;
item.fState = shuffled ? MFS_CHECKED:MFS_UNCHECKED;
SetMenuItemInfo(menu, ID_CONTROLS_SHUFFLE, false, &item);
item.fState = shuffled ? MFS_UNCHECKED: MFS_CHECKED;
SetMenuItemInfo(menu, ID_CONTROLS_NORMALORDER, false, &item);
}
void MusicBrowserUI::ChangeRepeatMode(RepeatMode mode)
{
HMENU menu;
MENUITEMINFO item;
menu = GetMenu(m_hWnd);
menu = GetSubMenu(menu, 3);
item.fMask = MIIM_STATE;
item.cbSize = sizeof(MENUITEMINFO);
switch(mode)
{
case kPlaylistMode_RepeatNone:
item.fState = MFS_CHECKED;
SetMenuItemInfo(menu, ID_CONTROLS_REPEATNONE, false, &item);
item.fState = MFS_UNCHECKED;
SetMenuItemInfo(menu, ID_CONTROLS_REPEATONE, false, &item);
item.fState = MFS_UNCHECKED;
SetMenuItemInfo(menu, ID_CONTROLS_REPEATALL, false, &item);
break;
case kPlaylistMode_RepeatOne:
item.fState = MFS_UNCHECKED;
SetMenuItemInfo(menu, ID_CONTROLS_REPEATNONE, false, &item);
item.fState = MFS_CHECKED;
SetMenuItemInfo(menu, ID_CONTROLS_REPEATONE, false, &item);
item.fState = MFS_UNCHECKED;
SetMenuItemInfo(menu, ID_CONTROLS_REPEATALL, false, &item);
break;
case kPlaylistMode_RepeatAll:
item.fState = MFS_UNCHECKED;
SetMenuItemInfo(menu, ID_CONTROLS_REPEATNONE, false, &item);
item.fState = MFS_UNCHECKED;
SetMenuItemInfo(menu, ID_CONTROLS_REPEATONE, false, &item);
item.fState = MFS_CHECKED;
SetMenuItemInfo(menu, ID_CONTROLS_REPEATALL, false, &item);
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -