📄 musictree.cpp
字号:
void MusicBrowserUI::GetSelectedStreamItems(vector<string>* urls)
{
TV_ITEM tv_root;
tv_root.hItem = m_hWiredPlanetItem;
tv_root.mask = TVIF_STATE;
tv_root.stateMask = TVIS_SELECTED;
tv_root.state = 0;
TreeView_GetItem(m_hMusicView, &tv_root);
// if selected then we add all the wired planet streams
if(tv_root.state & TVIS_SELECTED)
{
TV_ITEM tv_item;
// get the first playlist item
tv_item.hItem = TreeView_GetChild(m_hMusicView, m_hWiredPlanetItem);
tv_item.mask = TVIF_STATE|TVIF_PARAM;
tv_item.stateMask = TVIS_SELECTED;
tv_item.state = 0;
if(tv_item.hItem)
{
BOOL result = FALSE;
do
{
result = TreeView_GetItem(m_hMusicView, &tv_item);
if(result)
{
TreeData* treedata = (TreeData*)tv_item.lParam;
if(treedata)
{
PlaylistItem* stream = treedata->m_pStream;
urls->push_back(stream->URL());
}
}
}while(result &&
(tv_item.hItem = TreeView_GetNextSibling(m_hMusicView,
tv_item.hItem)));
}
}
}
void MusicBrowserUI::GetSelectedPlaylistItems(vector<string>* urls)
{
TV_ITEM tv_root;
tv_root.hItem = m_hPlaylistItem;
tv_root.mask = TVIF_STATE;
tv_root.stateMask = TVIS_SELECTED;
tv_root.state = 0;
TreeView_GetItem(m_hMusicView, &tv_root);
// if selected then we add all the playlists
if(tv_root.state & TVIS_SELECTED)
{
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)
{
TreeData* treedata = (TreeData*)tv_item.lParam;
if(treedata)
{
string playlist = treedata->m_oPlaylistPath;
urls->push_back(playlist);
}
}
}while(result &&
(tv_item.hItem = TreeView_GetNextSibling(m_hMusicView,
tv_item.hItem)));
}
}
else // iterate the playlists and add selected ones
{
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))
{
TreeData* treedata = (TreeData*)tv_item.lParam;
if(treedata)
{
string playlist = treedata->m_oPlaylistPath;
urls->push_back(playlist);
}
}
}while(result &&
(tv_item.hItem = TreeView_GetNextSibling(m_hMusicView,
tv_item.hItem)));
}
}
}
// get all the selected items... there are some special
// cases:
//
// 1. If "Music Catalog" item is selected we just
// add all the items as if it were "All Tracks".
//
// 2. If either "All Tracks" is selected we add all
// tracks and stop iterating.
//
// 3. Otherwise we iterate the children and if selected
// add the track items beneath that item.
void MusicBrowserUI::GetSelectedMusicTreeItems(vector<PlaylistItem*>* items)
{
// need to iterate all the items and add selected
// items and their children
HTREEITEM rootItem = TreeView_GetRoot(m_hMusicView);
if(rootItem)
{
// is the "Music Catalog" item selected?
TV_ITEM tv_root;
tv_root.hItem = rootItem;
tv_root.mask = TVIF_STATE;
tv_root.stateMask = TVIS_SELECTED;
tv_root.state = 0;
TreeView_GetItem(m_hMusicView, &tv_root);
// if so then we add all the items under "All Tracks"
if(tv_root.state & TVIS_SELECTED)
{
AddAllTrackItems(items);
}
else
{
TV_ITEM tv_all;
// is the "All Tracks" item selected
tv_all.hItem = TreeView_GetChild(m_hMusicView, rootItem);
tv_all.mask = TVIF_STATE;
tv_all.stateMask = TVIS_SELECTED;
tv_all.state = 0;
TreeView_GetItem(m_hMusicView, &tv_all);
// if so then we add all the items under "All Tracks"
if(tv_all.state & TVIS_SELECTED)
{
AddAllTrackItems(items);
}
else // if not we iterate the catalog for selected items
{
HTREEITEM firstSearchItem = TreeView_GetChild(m_hMusicView, tv_all.hItem);
if(firstSearchItem)
FindSelectedItems(firstSearchItem, items);
TV_ITEM tv_uncat;
// is the "Uncatagorized" item selected
tv_uncat.hItem = TreeView_GetNextSibling(m_hMusicView, tv_all.hItem);
tv_uncat.mask = TVIF_STATE;
tv_uncat.stateMask = TVIS_SELECTED;
tv_uncat.state = 0;
TreeView_GetItem(m_hMusicView, &tv_uncat);
firstSearchItem = tv_uncat.hItem;
// if so then we add all the items under "Uncatagorized"
if(tv_uncat.state & TVIS_SELECTED)
{
AddUncatagorizedTrackItems(items);
// wanna skip the uncated tracks if we just added them all
firstSearchItem = TreeView_GetNextSibling(m_hMusicView, tv_uncat.hItem);
}
if(firstSearchItem)
FindSelectedItems(firstSearchItem, items);
}
}
}
}
bool MusicBrowserUI::IsItemSelected(HTREEITEM item)
{
bool result = false;
BOOL success = FALSE;
HWND hwnd = m_hMusicView;
TV_ITEM tv_item;
tv_item.hItem = item;
tv_item.mask = TVIF_STATE;
tv_item.stateMask = TVIS_SELECTED;
tv_item.state = 0;
success = TreeView_GetItem(hwnd, &tv_item);
if(success && (tv_item.state & TVIS_SELECTED))
{
result = true;
}
return result;
}
uint32 MusicBrowserUI::CountSelectedItems(HTREEITEM root)
{
uint32 result = 0;
BOOL success = FALSE;
HWND hwnd = m_hMusicView;
TV_ITEM tv_item;
tv_item.hItem = root;
tv_item.mask = TVIF_STATE;
tv_item.stateMask = TVIS_SELECTED;
tv_item.state = 0;
do
{
success = TreeView_GetItem(hwnd, &tv_item);
HTREEITEM childItem = TreeView_GetChild(hwnd, tv_item.hItem);
if(success && (tv_item.state & TVIS_SELECTED))
{
result++;
}
if(success && childItem)
{
result += CountSelectedItems(childItem);
}
}while(success && (tv_item.hItem = TreeView_GetNextSibling(hwnd, tv_item.hItem)));
return result;
}
uint32 MusicBrowserUI::GetSelectedTrackCount()
{
uint32 result = 0;
HTREEITEM rootItem = TreeView_GetChild(m_hMusicView, m_hMyMusicItem);
if(rootItem)
{
result = CountSelectedItems(rootItem);
}
return result;
}
uint32 MusicBrowserUI::GetSelectedPlaylistCount()
{
uint32 result = 0;
HTREEITEM rootItem = TreeView_GetChild(m_hMusicView, m_hPlaylistItem);
if(rootItem)
{
result = CountSelectedItems(rootItem);
}
return result;
}
uint32 MusicBrowserUI::GetSelectedStreamCount()
{
uint32 result = 0;
HTREEITEM rootItem = TreeView_GetChild(m_hMusicView, m_hWiredPlanetItem);
if(rootItem)
{
result = CountSelectedItems(rootItem);
}
return result;
}
void MusicBrowserUI::UpdateUncatagorizedTrackName(PlaylistItem* track,
const char* name)
{
MetaData metadata = track->GetMetaData();
metadata.SetTitle(name);
track->SetMetaData(&metadata);
m_context->catalog->UpdateSong(track);
}
void MusicBrowserUI::UpdateTrackName(PlaylistItem* track,
const char* name)
{
MetaData metadata = track->GetMetaData();
metadata.SetTitle(name);
track->SetMetaData(&metadata);
m_context->catalog->UpdateSong(track);
}
const char* kFileExists = "There is already a playlist with that name.";
void MusicBrowserUI::UpdatePlaylistName(const string& playlist,
const char* name)
{
char path[MAX_PATH];
char orig[MAX_PATH];
uint32 len = sizeof(orig);
URLToFilePath(playlist.c_str(), orig, &len);
strcpy(path, orig);
char* cp = strrchr(path, '\\');
if(cp)
{
strcpy(cp + 1, name);
cp = strrchr(playlist.c_str(), '.');
if(cp)
{
strcat(path, cp);
}
}
if(strcmp(orig, path))
{
HANDLE findFileHandle = NULL;
WIN32_FIND_DATA findData;
findFileHandle = FindFirstFile(path, &findData);
if(findFileHandle == INVALID_HANDLE_VALUE)
{
rename(orig, path);
char url[MAX_PATH + 7];
uint32 len = sizeof(url);
FilePathToURL(path, url, &len);
m_context->catalog->RemovePlaylist(playlist.c_str());
m_context->catalog->AddPlaylist(url);
}
else
{
MessageBox(m_hWnd,
kFileExists,
"Unable to Rename Playlist",
MB_OK|MB_ICONERROR);
FindClose(findFileHandle);
}
}
}
void MusicBrowserUI::UpdateAlbumName(AlbumList* album,
const char* name)
{
vector<PlaylistItem *>::reverse_iterator track;
for(track = album->m_trackList->rbegin();
track != album->m_trackList->rend();
track++)
{
MetaData metadata = (*track)->GetMetaData();
metadata.SetAlbum(name);
(*track)->SetMetaData(&metadata);
m_context->catalog->UpdateSong(*track);
}
}
void MusicBrowserUI::UpdateArtistName(ArtistList* artist,
const char* name)
{
vector<AlbumList*>::reverse_iterator album;
for(album = artist->m_albumList->rbegin();
album != artist->m_albumList->rend();
album++)
{
vector<PlaylistItem*>::reverse_iterator track;
for(track = (*album)->m_trackList->rbegin();
track != (*album)->m_trackList->rend();
track++)
{
MetaData metadata = (*track)->GetMetaData();
metadata.SetArtist(name);
(*track)->SetMetaData(&metadata);
m_context->catalog->UpdateSong(*track);
}
}
}
// Function object used for sorting PlaylistItems in PlaylistManager
bool TrackSort::operator() (PlaylistItem* item1,
PlaylistItem* item2) const
{
bool result = true;
assert(item1);
assert(item2);
if(item1 && item2)
{
MetaData m1 = item1->GetMetaData();
MetaData m2 = item2->GetMetaData();
result = m1.Track() < m2.Track();
}
return result;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -