📄 musictree.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: MusicTree.cpp,v 1.77 2001/03/07 09:38:52 elrod Exp $
____________________________________________________________________________*/
// The debugger can't handle symbols more than 255 characters long.
// STL often creates symbols longer than that.
// When symbols are longer than 255 characters, the warning is disabled.
#ifdef WIN32
#pragma warning(disable:4786)
#endif
#include <windows.h>
#include <windowsx.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <direct.h>
#include <set>
#include <string>
#include <functional>
#include <algorithm>
#include <sstream>
using namespace std;
#include "config.h"
#include "player.h"
#include "pmo.h"
#include "utility.h"
#include "resource.h"
#include "Win32MusicBrowser.h"
#include "DropSource.h"
#include "DropObject.h"
#include "registrar.h"
#include "Http.h"
#include "debug.h"
char* kMyMusic = "My Music";
char* kAllTracks = "All Tracks";
char* kUncatagorized = "Uncategorized Tracks";
char* kPlaylists = "My Playlists";
char* kStreams = "Streams";
char* kFavoriteStreams = "My Favorite Streams";
char* kRecommendedStreams = "Recommended Streams";
char* kPortables = "My Portables";
char* kNewPlaylist = "Create a New Playlist...";
char* kNewPortable = "Setup a Portable Player...";
char* kCDAudio = "CD Audio";
char* kFavorites = "Favorites";
char* kNewFavorite = "Add a New Stream...";
void MusicBrowserUI::InitTree()
{
if(m_hMyMusicItem)
TreeView_DeleteItem(m_hMusicView, m_hMyMusicItem);
if(m_hPlaylistItem)
TreeView_DeleteItem(m_hMusicView, m_hPlaylistItem);
if(m_hStreamsItem)
TreeView_DeleteItem(m_hMusicView, m_hStreamsItem);
if(m_hPortableItem)
TreeView_DeleteItem(m_hMusicView, m_hPortableItem);
if(m_hCDItem)
TreeView_DeleteItem(m_hMusicView, m_hCDItem);
TV_INSERTSTRUCT insert;
insert.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_CHILDREN |
TVIF_SELECTEDIMAGE | TVIF_PARAM;
insert.item.pszText = kMyMusic;
insert.item.cchTextMax = lstrlen(insert.item.pszText);
insert.item.iImage = 0;
insert.item.iSelectedImage = 0;
insert.item.cChildren= 1;
insert.item.lParam = NULL;
insert.hInsertAfter = TVI_FIRST;
insert.hParent = NULL;
m_hMyMusicItem = TreeView_InsertItem(m_hMusicView, &insert);
insert.item.pszText = kPlaylists;
insert.item.cchTextMax = lstrlen(insert.item.pszText);
insert.item.iImage = 1;
insert.item.iSelectedImage = 1;
insert.item.cChildren= 1;
insert.item.lParam = NULL;
insert.hInsertAfter = TVI_LAST;
insert.hParent = NULL;
m_hPlaylistItem = TreeView_InsertItem(m_hMusicView, &insert);
insert.item.pszText = kCDAudio;
insert.item.cchTextMax = lstrlen(insert.item.pszText);
insert.item.iImage = 13;
insert.item.iSelectedImage = 13;
insert.item.cChildren= 0;
insert.item.lParam = NULL;
insert.hInsertAfter = TVI_LAST;
insert.hParent = NULL;
m_hCDItem = TreeView_InsertItem(m_hMusicView, &insert);
insert.item.pszText = kStreams;
insert.item.cchTextMax = lstrlen(insert.item.pszText);
insert.item.iImage = 8;
insert.item.iSelectedImage = 8;
insert.item.cChildren= 1;
insert.item.lParam = NULL;
insert.hInsertAfter = TVI_LAST;
insert.hParent = NULL;
m_hStreamsItem = TreeView_InsertItem(m_hMusicView, &insert);
/*insert.item.pszText = kPortables;
insert.item.cchTextMax = lstrlen(insert.item.pszText);
insert.item.iImage = 7;
insert.item.iSelectedImage = 7;
insert.item.cChildren= 1;
insert.item.lParam = NULL;
insert.hInsertAfter = TVI_LAST;
insert.hParent = NULL;
m_hPortableItem = TreeView_InsertItem(m_hMusicView, &insert);*/
}
void MusicBrowserUI::FillArtists()
{
TV_INSERTSTRUCT insert;
const vector<ArtistList*>* artistList;
vector<ArtistList*>::const_iterator artist;
TreeData data;
insert.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_CHILDREN |
TVIF_SELECTEDIMAGE | TVIF_PARAM;
data.m_iLevel = 1;
artistList = m_context->catalog->GetMusicList();
for(artist = artistList->begin();
artist != artistList->end();
artist++)
{
data.m_pArtist = (*artist);
insert.item.pszText = (char *)(*artist)->name.c_str();
insert.item.cchTextMax = (*artist)->name.length();
insert.item.iImage = 2;
insert.item.iSelectedImage = 2;
insert.item.cChildren= 1;
insert.item.lParam = (LPARAM) new TreeData(data);
insert.hInsertAfter = TVI_LAST;
insert.hParent = m_hMyMusicItem;
TreeView_InsertItem(m_hMusicView, &insert);
}
TreeView_SortChildren(m_hMusicView, m_hMyMusicItem, 0);
insert.item.pszText = kUncatagorized;
insert.item.cchTextMax = lstrlen(insert.item.pszText);
insert.item.iImage = 6;
insert.item.iSelectedImage = 6;
insert.item.cChildren = (m_context->catalog->GetUnsortedMusic()->size() ? 1 : 0);
insert.item.lParam = NULL;
insert.hInsertAfter = TVI_FIRST;
insert.hParent = m_hMyMusicItem;
m_hUncatItem = TreeView_InsertItem(m_hMusicView, &insert);
insert.item.pszText = kAllTracks;
insert.item.cchTextMax = lstrlen(insert.item.pszText);
insert.item.iImage = 5;
insert.item.iSelectedImage = 5;
insert.item.cChildren = (artistList->size() ? 1 : 0);
insert.item.lParam = NULL;
insert.hInsertAfter = TVI_FIRST;
insert.hParent = m_hMyMusicItem;
m_hAllItem = TreeView_InsertItem(m_hMusicView, &insert);
}
void MusicBrowserUI::FillAlbums(TV_ITEM *pItem)
{
TV_INSERTSTRUCT insert;
vector<AlbumList*>::iterator album;
TreeData data;
insert.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_CHILDREN |
TVIF_SELECTEDIMAGE | TVIF_PARAM;
data.m_iLevel = 2;
data.m_pArtist = ((TreeData*)pItem->lParam)->m_pArtist;
for(album = data.m_pArtist->m_albumList->begin();
album != data.m_pArtist->m_albumList->end();
album++)
{
data.m_pAlbum = (*album);
if ((*album)->name == string(" ") ||
(*album)->name.length() == 0)
insert.item.pszText = "Unknown";
else
insert.item.pszText = (char *)(*album)->name.c_str();
insert.item.cchTextMax = (*album)->name.length();
insert.item.iImage = 3;
insert.item.iSelectedImage = 3;
insert.item.cChildren= 1;
insert.item.lParam = (LPARAM) new TreeData(data);
insert.hInsertAfter = TVI_LAST;
insert.hParent = pItem->hItem;
TreeView_InsertItem(m_hMusicView, &insert);
}
TreeView_SortChildren(m_hMusicView, pItem->hItem, 0);
}
void MusicBrowserUI::FillTracks(TV_ITEM *pItem)
{
TV_INSERTSTRUCT insert;
vector<PlaylistItem*>::iterator track;
TreeData data;
MetaData metadata;
//bool needToSort = false;
insert.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_CHILDREN |
TVIF_SELECTEDIMAGE | TVIF_PARAM;
data.m_iLevel = 3;
data.m_pArtist = ((TreeData*)pItem->lParam)->m_pArtist;
data.m_pAlbum = ((TreeData*)pItem->lParam)->m_pAlbum;
stable_sort(data.m_pAlbum->m_trackList->begin(),
data.m_pAlbum->m_trackList->end(),
TrackSort());
for(track = data.m_pAlbum->m_trackList->begin();
track != data.m_pAlbum->m_trackList->end();
track++)
{
data.m_pTrack = (*track);
metadata = (*track)->GetMetaData();
ostringstream ost;
if(metadata.Track() == 0)
ost << "?. ";
else
ost << metadata.Track() << ". ";
ost << metadata.Title();
string title = ost.str();
if(metadata.Title() == string(" ") ||
metadata.Title().length() == 0)
insert.item.pszText = "Unknown";
else
insert.item.pszText = (char *)(title.c_str());
insert.item.cchTextMax = strlen(insert.item.pszText);
insert.item.iImage = 4;
insert.item.iSelectedImage = 4;
insert.item.cChildren= 0;
insert.item.lParam = (LPARAM) new TreeData(data);
insert.hInsertAfter = TVI_LAST;
insert.hParent = pItem->hItem;
TreeView_InsertItem(m_hMusicView, &insert);
}
//if(needToSort)
//TreeView_SortChildren(m_hMusicView, pItem->hItem, 0);
}
void MusicBrowserUI::RefreshCDList(vector<PlaylistItem*>* trackList)
{
TV_INSERTSTRUCT insert;
TreeData data;
MetaData metadata;
HTREEITEM treeItem;
while(treeItem = TreeView_GetChild(m_hMusicView, m_hCDItem))
{
TreeView_DeleteItem(m_hMusicView, treeItem);
}
insert.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_CHILDREN |
TVIF_SELECTEDIMAGE | TVIF_PARAM;
data.m_iLevel = 3;
vector<PlaylistItem*>::iterator track;
uint32 trackNumber = 1;
for(track = trackList->begin();
track != trackList->end();
track++)
{
ostringstream ost;
string trackString;
data.m_pArtist = NULL;
data.m_pAlbum = NULL;
data.m_pTrack = (*track);
metadata = (*track)->GetMetaData();
if(metadata.Title().size())
insert.item.pszText = (char*)(metadata.Title().c_str());
else
{
ost << "CD Audio Track " << trackNumber;
trackString = ost.str();
insert.item.pszText = (char*)(trackString.c_str());
}
insert.item.cchTextMax = strlen(insert.item.pszText);
insert.item.iImage = 4;
insert.item.iSelectedImage = 4;
insert.item.cChildren= 0;
insert.item.lParam = (LPARAM) new TreeData(data);
insert.hInsertAfter = TVI_LAST;
insert.hParent = m_hCDItem;
TreeView_InsertItem(m_hMusicView, &insert);
trackNumber++;
}
string CD;
if(trackList->size())
{
CD = (metadata.Album().size() ? metadata.Album() : "Unknown Album");
CD += " by ";
CD += (metadata.Artist().size() ? metadata.Artist() : "Unknown Artist");
}
else
{
CD = kCDAudio;
}
TV_ITEM tv_item;
tv_item.mask = TVIF_CHILDREN|TVIF_TEXT;
tv_item.hItem = m_hCDItem;
tv_item.pszText = (char*)(CD.c_str());
tv_item.cchTextMax = strlen(tv_item.pszText);
tv_item.cChildren = (trackList->size() ? 1 : 0);
TreeView_SetItem(m_hMusicView, &tv_item);
}
void
MusicBrowserUI::
fill_all_tracks(void* arg)
{
MusicBrowserUI* ui = (MusicBrowserUI*) arg;
ui->FillAllTracks();
}
void MusicBrowserUI::FillAllTracks()
{
TV_INSERTSTRUCT insert;
const vector<ArtistList*>* artistList;
vector<ArtistList*>::const_iterator artist;
TreeData data;
MetaData metadata;
bool gotOne = false;
insert.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_CHILDREN |
TVIF_SELECTEDIMAGE | TVIF_PARAM;
data.m_iLevel = 3;
artistList = m_context->catalog->GetMusicList();
for(artist = artistList->begin();
artist != artistList->end();
artist++)
{
vector<AlbumList*>::iterator album;
for(album = (*artist)->m_albumList->begin();
album != (*artist)->m_albumList->end();
album++)
{
vector<PlaylistItem*>::iterator track;
for(track = (*album)->m_trackList->begin();
track != (*album)->m_trackList->end();
track++)
{
data.m_pArtist = (*artist);
data.m_pAlbum = (*album);
data.m_pTrack = (*track);
metadata = (*track)->GetMetaData();
if(metadata.Title() == string(" ") ||
metadata.Title().length() == 0)
insert.item.pszText = "Unknown";
else
insert.item.pszText = (char *)(metadata.Title().c_str());
insert.item.cchTextMax = metadata.Title().length();
insert.item.iImage = 4;
insert.item.iSelectedImage = 4;
insert.item.cChildren= 0;
insert.item.lParam = (LPARAM) new TreeData(data);
insert.hInsertAfter = TVI_LAST;
insert.hParent = m_hAllItem;
TreeView_InsertItem(m_hMusicView, &insert);
if(!gotOne)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -