📄 event.cpp
字号:
/*____________________________________________________________________________
FreeAmp - The Free MP3 Player
Portions Copyright (C) 1999 EMusic.com
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: Event.cpp,v 1.58 2000/01/14 20:44:18 elrod Exp $
____________________________________________________________________________*/
#define STRICT
#include <windows.h>
#include <windowsx.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <direct.h>
#include "config.h"
#include "utility.h"
#include "resource.h"
#include "Win32MusicBrowser.h"
#include "EditTrackInfoDialog.h"
#include "eventdata.h"
#include "debug.h"
const char* kAudioFileFilter =
"MPEG Audio Streams (.mpg, .mp1, .mp2, .mp3, .mpp)\0"
"*.mpg;*.mp1;*.mp2;*.mp3;*.mpp\0"
"All Files (*.*)\0"
"*.*\0";
void MusicBrowserUI::ClearPlaylistEvent(void)
{
m_context->target->AcceptEvent(new Event(CMD_Stop));
m_oPlm->RemoveAll();
}
void MusicBrowserUI::RenameEvent(void)
{
HWND hwnd = m_hMusicView;
HTREEITEM item;
//TV_HITTESTINFO hti;
//GetCursorPos(&hti.pt);
//ScreenToClient(hwnd, &hti.pt);
//item = TreeView_HitTest(hwnd, &hti);
item = TreeView_GetSelection(hwnd);
if(item /*&& (hti.flags & TVHT_ONITEM)*/ &&
item != m_hMyMusicItem &&
item != m_hPlaylistItem &&
item != m_hAllItem &&
item != m_hUncatItem &&
item != m_hNewPlaylistItem &&
item != m_hPortableItem &&
TreeView_GetParent(m_hMusicView, item) != m_hPortableItem)
{
EditItemLabel(hwnd, item);
}
}
const char kErrorMsg[] = "Cannot delete %s: Access is denied.\r\n\r\n"
"Make sure the file is not currently in use.";
bool MusicBrowserUI::DeleteFromDrive(const char* url)
{
bool result = true;
char path[MAX_PATH];
uint32 length = sizeof(path);
BOOL success = FALSE;
URLToFilePath(url, path, &length);
do
{
success = DeleteFile(path);
if(!success)
{
int ret;
char msg[MAX_PATH + sizeof(kErrorMsg) + 1];
char* cp;
cp = strrchr(path, '\\');
if(cp)
cp++;
else
cp = path;
sprintf(msg, kErrorMsg, cp);
ret = MessageBox(m_hWnd,
msg,
"Unable To Delete File",
MB_ABORTRETRYIGNORE|MB_ICONSTOP);
switch(ret)
{
case IDABORT:
result = false;
success = TRUE;
break;
case IDRETRY:
result = true;
success = FALSE;
break;
case IDIGNORE:
result = true;
success = TRUE;
break;
}
}
}while(!success);
return result;
}
void MusicBrowserUI::RemoveEvent(void)
{
// first figure out which control has focus
HWND hwndFocus = GetFocus();
if(hwndFocus == m_hPlaylistView)
{
uint32 count = ListView_GetSelectedCount(m_hPlaylistView);
uint32 found = 0;
uint32 index = ListView_GetItemCount(m_hPlaylistView) - 1;
while(found < count)
{
uint32 state = ListView_GetItemState(m_hPlaylistView,
index,
LVIS_SELECTED);
if(state & LVIS_SELECTED)
{
found++;
bool isCurrent = (m_oPlm->GetCurrentIndex() == index);
if(isCurrent)
m_context->target->AcceptEvent(new Event(CMD_Stop));
m_oPlm->RemoveItem(index);
if(isCurrent)
m_context->target->AcceptEvent(new Event(CMD_Play));
}
index--;
}
}
else if(hwndFocus == m_hMusicView)
{
bool deleteFromDrive = false;
if(0 < DialogBoxParam(g_hinst,
MAKEINTRESOURCE(IDD_REMOVETRACKS),
m_hWnd,
::RemoveTracksDlgProc,
(LPARAM)&deleteFromDrive))
{
vector<PlaylistItem*> items;
GetSelectedMusicTreeItems(&items);
bool keepGoing = true;
vector<PlaylistItem*>::iterator i;
for(i = items.begin(); i != items.end(); i++)
{
m_context->catalog->RemoveSong((*i)->URL().c_str());
if(deleteFromDrive)
{
keepGoing = DeleteFromDrive((*i)->URL().c_str());
if(!keepGoing)
break;
}
}
if(keepGoing)
{
vector<string> urls;
GetSelectedPlaylistItems(&urls);
vector<string>::iterator j;
for(j = urls.begin(); j != urls.end(); j++)
{
m_context->catalog->RemovePlaylist((*j).c_str());
if(deleteFromDrive)
{
keepGoing = DeleteFromDrive((*j).c_str());
if(!keepGoing)
break;
}
}
}
}
}
}
void MusicBrowserUI::MoveUpEvent(void)
{
uint32 count = ListView_GetSelectedCount(m_hPlaylistView);
uint32 found = 0;
uint32 index = 0;
while(found < count)
{
uint32 state = ListView_GetItemState(m_hPlaylistView,
index,
LVIS_SELECTED);
if(state & LVIS_SELECTED)
{
found++;
if(index == 0)
break;
m_oPlm->MoveItem(index, index - 1);
}
index++;
}
}
void MusicBrowserUI::MoveDownEvent(void)
{
uint32 count = ListView_GetSelectedCount(m_hPlaylistView);
uint32 found = 0;
uint32 index = ListView_GetItemCount(m_hPlaylistView) - 1;;
while(found < count)
{
uint32 state = ListView_GetItemState(m_hPlaylistView,
index,
LVIS_SELECTED);
if(state & LVIS_SELECTED)
{
found++;
if(index == m_oPlm->CountItems() - 1)
break;
m_oPlm->MoveItem(index, index + 1);
}
index--;
}
}
void MusicBrowserUI::MoveItemEvent(int source, int dest)
{
m_oPlm->MoveItem(source, dest);
}
void MusicBrowserUI::StartStopMusicSearch(bool useWizard)
{
HMENU hMenu;
MENUITEMINFO sItem;
bool doSearch = false;
if (m_bSearchInProgress)
{
m_bSearchInProgress = false;
m_context->catalog->StopSearchMusic();
return;
}
m_searchPathList.clear();
if(useWizard)
doSearch = IntroductionWizard(&m_searchPathList);
else
doSearch = (0 < DialogBoxParam(g_hinst,
MAKEINTRESOURCE(IDD_MUSICSEARCH),
m_hWnd,
::MusicSearchDlgProc,
(LPARAM )this));
if(doSearch)
{
m_context->catalog->SearchMusic(m_searchPathList);
m_bSearchInProgress = true;
hMenu = GetMenu(m_hWnd);
hMenu = GetSubMenu(hMenu, 0);
sItem.cbSize = sizeof(MENUITEMINFO);
sItem.fMask = MIIM_TYPE;
sItem.fType = MFT_STRING;
sItem.dwTypeData = "Stop &Music Search";
sItem.cch = strlen(sItem.dwTypeData);
SetMenuItemInfo(hMenu, ID_FILE_SEARCHFORMUSIC, false, &sItem);
}
}
void MusicBrowserUI::ExportPlaylistEvent()
{
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;
// iterate the items and see if any are selected.
// for now we only grab the first one on an export
// but i need to figure out a good way to allow a
// user to export multiple items since we allow
// multi-select in the treeview.
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;
ExportPlaylist(playlistPath);
}
break;
}
}while(result &&
(tv_item.hItem = TreeView_GetNextSibling(m_hMusicView,
tv_item.hItem)));
}
}
const char* kMultipleArtists = "<Multiple Artists Selected>";
const char* kMultipleAlbums = "<Multiple Albums Selected>";
const char* kMultipleGenres = "<Multiple Genres Selected>";
const char* kMultipleTracks = "<Multiple Tracks Selected>";
const char* kMultipleComments = "<Enter a new comment for all selected tracks.>";
void MusicBrowserUI::EditInfoEvent()
{
MetaData metadata;
vector<PlaylistItem*> items;
if(m_hPlaylistView == GetFocus())
GetSelectedPlaylistItems(&items);
else if(m_hMusicView == GetFocus())
GetSelectedMusicTreeItems(&items);
if(!items.size())
return;
metadata = items[0]->GetMetaData();
bool sameArtist = true;
bool sameAlbum = true;
bool sameGenre = true;
bool sameYear = true;
vector<PlaylistItem*>::iterator track;
for(track = items.begin(); track != items.end(); track++)
{
MetaData metadata = (*track)->GetMetaData();
if(metadata.Artist() != metadata.Artist())
sameArtist = false;
if(metadata.Album() != metadata.Album())
sameAlbum = false;
if(metadata.Genre() != metadata.Genre())
sameGenre = false;
if(metadata.Year() != metadata.Year())
sameYear = false;
}
if(!sameArtist)
metadata.SetArtist(kMultipleArtists);
if(!sameAlbum)
metadata.SetAlbum(kMultipleAlbums);
if(!sameYear)
metadata.SetYear(-1);
if(!sameGenre)
metadata.SetGenre(kMultipleGenres);
if(items.size() > 1)
{
metadata.SetTitle(kMultipleTracks);
metadata.SetTrack(-1);
metadata.SetComment(kMultipleComments);
}
EditTrackInfoDialog editTrackInfo(m_context,
m_hWnd,
m_context->catalog->GetMusicList(),
&metadata);
if(editTrackInfo.Show())
{
for(track = items.begin(); track != items.end(); track++)
{
MetaData oldMetaData, newMetaData;
oldMetaData = newMetaData = (*track)->GetMetaData();
if(metadata.Artist() != kMultipleArtists)
newMetaData.SetArtist(metadata.Artist().c_str());
if(metadata.Album() != kMultipleAlbums)
newMetaData.SetAlbum(metadata.Album().c_str());
if(metadata.Title() != kMultipleTracks)
newMetaData.SetTitle(metadata.Title().c_str());
if(metadata.Genre() != kMultipleGenres)
newMetaData.SetGenre(metadata.Genre().c_str());
if(metadata.Comment() != kMultipleComments)
newMetaData.SetComment(metadata.Comment().c_str());
if(metadata.Year() != -1)
newMetaData.SetYear(metadata.Year());
if(metadata.Track() != -1)
newMetaData.SetTrack(metadata.Track());
if(newMetaData != oldMetaData)
{
(*track)->SetMetaData(&newMetaData);
m_context->catalog->UpdateSong(*track);
m_oPlm->UpdateTrackMetaData(*track);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -