📄 event.cpp
字号:
// 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()
{
vector<PlaylistItem*> items;
if(m_hPlaylistView == GetFocus())
GetSelectedPlaylistItems(&items);
else if(m_hMusicView == GetFocus())
GetSelectedMusicTreeItems(&items);
if(items.size())
{
EditInfo(items);
}
}
void MusicBrowserUI::EditInfo(vector<PlaylistItem*>& items, HWND hwnd)
{
MetaData metadata;
metadata = items[0]->GetMetaData();
bool sameArtist = true;
bool sameAlbum = true;
bool sameGenre = true;
bool sameYear = true;
bool samePlayCount = true;
vector<PlaylistItem*>::iterator track;
for(track = items.begin(); track != items.end(); track++)
{
MetaData metadataCheck = (*track)->GetMetaData();
if(metadata.Artist() != metadataCheck.Artist())
sameArtist = false;
if(metadata.Album() != metadataCheck.Album())
sameAlbum = false;
if(metadata.Genre() != metadataCheck.Genre())
sameGenre = false;
if(metadata.Year() != metadataCheck.Year())
sameYear = false;
if(metadata.PlayCount() != metadataCheck.PlayCount())
samePlayCount = false;
}
if(!sameArtist)
metadata.SetArtist(kMultipleArtists);
if(!sameAlbum)
metadata.SetAlbum(kMultipleAlbums);
if(!sameYear)
metadata.SetYear(-1);
if(!sameGenre)
metadata.SetGenre(kMultipleGenres);
if(!samePlayCount)
metadata.SetPlayCount(-1);
char location[MAX_PATH];
if(items.size() > 1)
{
metadata.SetTitle(kMultipleTracks);
metadata.SetTrack(-1);
metadata.SetComment(kMultipleComments);
strcpy(location, kMultipleTracks);
}
else
{
uint32 size = sizeof(location);
if(IsError(URLToFilePath(items[0]->URL().c_str(), location, &size)))
strcpy(location, items[0]->URL().c_str());
}
EditTrackInfoDialog editTrackInfo(m_context,
(HINSTANCE)GetWindowLong(m_hWnd, GWL_HINSTANCE),
(hwnd ? hwnd : m_hWnd),
m_context->catalog->GetMusicList(),
&metadata,
location);
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(metadata.PlayCount() != -1)
newMetaData.SetPlayCount(metadata.PlayCount());
if(newMetaData != oldMetaData)
{
(*track)->SetMetaData(&newMetaData);
m_context->catalog->UpdateSong(*track);
m_plm->UpdateTrackMetaData(*track, true);
}
}
}
}
void MusicBrowserUI::EjectCDEvent()
{
char mciCommand[128];
char mciReturn[128];
sprintf(mciCommand, "sysinfo cdaudio quantity wait");
mciSendString(mciCommand, mciReturn, sizeof(mciReturn), NULL);
if (atoi(mciReturn) <= 0)
return;
sprintf(mciCommand, "open cdaudio shareable alias cd1 wait");
mciSendString(mciCommand, mciReturn, sizeof(mciReturn), NULL);
sprintf(mciCommand, "set cd1 door open");
mciSendString(mciCommand, mciReturn, sizeof(mciReturn), NULL);
sprintf(mciCommand, "close cd1 wait");
mciSendString(mciCommand, mciReturn, sizeof(mciReturn), NULL);
}
void MusicBrowserUI::NewFavoriteEvent()
{
FavoriteDialog favoriteDialog(m_context,
m_hWnd,
NULL);
favoriteDialog.Show();
}
void MusicBrowserUI::AddFavoriteEvent()
{
HWND hwndFocus = GetFocus();
if(hwndFocus == m_hMusicView)
{
vector<PlaylistItem*> items;
GetSelectedStreamItems(&items);
if(items.size())
{
vector<PlaylistItem*>::iterator i = items.begin();
for(; i != items.end(); i++)
{
m_context->catalog->WriteMetaDataToDatabase((*i)->URL().c_str(),
(*i)->GetMetaData(),
kTypeStream);
m_context->catalog->AddStream((*i)->URL().c_str());
}
}
}
else if(hwndFocus == m_hPlaylistView)
{
uint32 count = ListView_GetItemCount(m_hPlaylistView);
uint32 selected = ListView_GetSelectedCount(m_hPlaylistView);
uint32 index = 0;
uint32 found = 0;
for(index = 0; index < count, found < selected; index++)
{
uint32 state = ListView_GetItemState(m_hPlaylistView,
index,
LVIS_SELECTED);
if(state & LVIS_SELECTED)
{
found++;
PlaylistItem* item = m_plm->ItemAt(index);
if(!item->URL().compare(0, 4, "http"))
{
m_context->catalog->WriteMetaDataToDatabase(item->URL().c_str(),
item->GetMetaData(),
kTypeStream);
m_context->catalog->AddStream(item->URL().c_str());
}
}
}
}
}
void MusicBrowserUI::RemoveFavoriteEvent()
{
vector<PlaylistItem*> items;
GetSelectedFavoritesItems(&items);
if(items.size())
{
vector<PlaylistItem*>::iterator i = items.begin();
for(; i != items.end(); i++)
{
m_context->catalog->RemoveStream((*i)->URL().c_str());
}
}
}
void MusicBrowserUI::EditStreamInfoEvent()
{
vector<PlaylistItem*> items;
GetSelectedFavoritesItems(&items);
if(items.size())
{
FavoriteDialog favoriteDialog(m_context,
m_hWnd,
items[0]);
favoriteDialog.Show();
}
}
int32 MusicBrowserUI::Notify(WPARAM command, NMHDR *pHdr)
{
int32 result = 0;
TOOLTIPTEXT *pToolTipText;
if (pHdr->idFrom == IDC_MUSICTREE)
{
NM_TREEVIEW* pTreeView = (NM_TREEVIEW*)pHdr;
switch(pTreeView->hdr.code)
{
case TVN_DELETEITEM:
{
TreeData* treedata = (TreeData*)pTreeView->itemOld.lParam;
if(treedata)
delete treedata;
break;
}
case TVN_BEGINDRAG:
{
TVBeginDrag(m_hMusicView, pTreeView);
break;
}
case TVN_KEYDOWN:
{
TV_KEYDOWN* pnkd = (TV_KEYDOWN*)pHdr;
if(pnkd->wVKey == VK_DELETE)
RemoveEvent();
else if(pnkd->wVKey == VK_F2)
{
HTREEITEM item = TreeView_GetSelection(m_hMusicView);
if(item &&
item != m_hMyMusicItem &&
item != m_hPlaylistItem &&
item != m_hAllItem &&
item != m_hUncatItem &&
item != m_hNewPlaylistItem &&
item != m_hPortableItem &&
item != m_hStreamsItem &&
item != m_hCDItem &&
item != m_hFavoritesItem &&
item != m_hNewFavoritesItem &&
item != m_hRelatableItem &&
TreeView_GetParent(m_hMusicView, item) != m_hStreamsItem &&
TreeView_GetParent(m_hMusicView,TreeView_GetParent(m_hMusicView, item)) != m_hStreamsItem)
TreeView_EditLabel(m_hMusicView, item);
}
break;
}
case TVN_BEGINLABELEDIT:
{
TV_DISPINFO* info = (TV_DISPINFO*)pHdr;
HTREEITEM item = info->item.hItem;
if(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)
{
result = TRUE;
}
break;
}
case TVN_ENDLABELEDIT:
{
TV_DISPINFO* info = (TV_DISPINFO*)pHdr;
TV_ITEM tv_item = info->item;
TreeData* treedata = (TreeData*)tv_item.lParam;
if(treedata)
{
// was the operation cancelled?
if(tv_item.pszText)
{
if(treedata->IsTrack())
{
// just change the title for this song
UpdateTrackName(treedata->m_pTrack,
tv_item.pszText);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -