📄 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.44 2000/01/20 00:33:14 elrod Exp $
____________________________________________________________________________*/
#define STRICT
#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>
using namespace std;
#include "config.h"
#include "utility.h"
#include "resource.h"
#include "Win32MusicBrowser.h"
#include "DropSource.h"
#include "DropObject.h"
#include "registrar.h"
#include "FooCast.h"
char* kMyMusic = "My Music";
char* kAllTracks = "All Tracks";
char* kUncatagorized = "Uncategorized Tracks";
char* kPlaylists = "My Playlists";
char* kStreams = "My Favorite Streams";
char* kPortables = "My Portables";
char* kNewPlaylist = "Create a New Playlist...";
char* kNewPortable = "Setup a Portable Player...";
char* kWiredPlanet = "Wired Planet";
char* kShoutCast = "ShoutCast";
char* kIceCast = "IceCast";
void MusicBrowserUI::InitTree(void)
{
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);
/*
HTREEITEM temp;
insert.item.pszText = "Streams";
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;
temp = TreeView_InsertItem(m_hMusicView, &insert);
insert.item.pszText = kWiredPlanet;
insert.item.cchTextMax = lstrlen(insert.item.pszText);
insert.item.iImage = 9;
insert.item.iSelectedImage = 9;
insert.item.cChildren= 1;
insert.item.lParam = NULL;
insert.hInsertAfter = TVI_LAST;
insert.hParent = temp;
m_hWiredPlanetItem = TreeView_InsertItem(m_hMusicView, &insert);
insert.item.pszText = kIceCast;
insert.item.cchTextMax = lstrlen(insert.item.pszText);
insert.item.iImage = 10;
insert.item.iSelectedImage = 10;
insert.item.cChildren= 1;
insert.item.lParam = NULL;
insert.hInsertAfter = TVI_LAST;
insert.hParent = temp;
m_hIceCastItem = TreeView_InsertItem(m_hMusicView, &insert);
insert.item.pszText = kShoutCast;
insert.item.cchTextMax = lstrlen(insert.item.pszText);
insert.item.iImage = 11;
insert.item.iSelectedImage = 11;
insert.item.cChildren= 1;
insert.item.lParam = NULL;
insert.hInsertAfter = TVI_LAST;
insert.hParent = NULL;
m_hShoutCastItem = 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(void)
{
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= 1;
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= 1;
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();
if(metadata.Track() == 0)
insert.hInsertAfter = TVI_SORT;
else
insert.hInsertAfter = TVI_LAST;
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 = pItem->hItem;
TreeView_InsertItem(m_hMusicView, &insert);
}
//if(needToSort)
//TreeView_SortChildren(m_hMusicView, pItem->hItem, 0);
}
void MusicBrowserUI::FillAllTracks(void)
{
TV_INSERTSTRUCT insert;
const vector<ArtistList*>* artistList;
vector<ArtistList*>::const_iterator artist;
TreeData data;
MetaData metadata;
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);
}
}
}
data.m_iLevel = 3;
data.m_pArtist = NULL;
data.m_pAlbum = NULL;
const vector<PlaylistItem*>* trackList;
vector<PlaylistItem*>::const_iterator track;
trackList = m_context->catalog->GetUnsortedMusic();
for(track = trackList->begin();
track != trackList->end();
track++)
{
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);
}
TreeView_SortChildren(m_hMusicView, m_hAllItem, 0);
}
void MusicBrowserUI::FillUncatTracks(void)
{
TV_INSERTSTRUCT insert;
const vector<PlaylistItem*>* trackList;
vector<PlaylistItem *>::const_iterator track;
TreeData data;
MetaData metadata;
insert.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_CHILDREN |
TVIF_SELECTEDIMAGE | TVIF_PARAM;
data.m_iLevel = 3;
data.m_pArtist = NULL;
data.m_pAlbum = NULL;
trackList = m_context->catalog->GetUnsortedMusic();
for(track = trackList->begin();
track != trackList->end();
track++)
{
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_hUncatItem;
TreeView_InsertItem(m_hMusicView, &insert);
}
TreeView_SortChildren(m_hMusicView, m_hUncatItem, 0);
}
void MusicBrowserUI::FillPlaylists(void)
{
TV_INSERTSTRUCT insert;
vector<string>::const_iterator url;
const vector<string>* playlists;
char szBase[MAX_PATH];
TreeData data;
insert.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_CHILDREN |
TVIF_SELECTEDIMAGE | TVIF_PARAM;
playlists = m_context->catalog->GetPlaylists();
data.m_iLevel = 1;
for(url = playlists->begin();
url != playlists->end();
url++)
{
_splitpath((char *)(*url).c_str(), NULL, NULL, szBase, NULL);
data.m_oPlaylistName = string(szBase);
data.m_oPlaylistPath = *url;
insert.item.pszText = szBase;
insert.item.cchTextMax = strlen(szBase);
insert.item.iImage = 1;
insert.item.iSelectedImage = 1;
insert.item.cChildren= 0;
insert.item.lParam = (LPARAM) new TreeData(data);
insert.hInsertAfter = TVI_SORT;
insert.hParent = m_hPlaylistItem;
TreeView_InsertItem(m_hMusicView, &insert);
}
insert.item.pszText = kNewPlaylist;
insert.item.cchTextMax = strlen(kNewPlaylist);
insert.item.iImage = 1;
insert.item.iSelectedImage = 1;
insert.item.cChildren= 0;
insert.item.lParam = NULL;
insert.hInsertAfter = TVI_FIRST;
insert.hParent = m_hPlaylistItem;
m_hNewPlaylistItem = TreeView_InsertItem(m_hMusicView, &insert);
}
void MusicBrowserUI::FillWiredPlanet()
{
TV_INSERTSTRUCT insert;
TreeData data;
char* stations[] = {
"Alpha 2.0", // (Downtempo / Trip-Hop)",
"Axis", // (Jazz in its many forms)",
"Nova Mundi", // (New Age / Ambient)",
"Oscillations", // (Electronic / Trance / House)",
"Red Shift", // (Drum \'n Bass / Jungle)",
"Radio TMBG" // (They Might Be Giants)"
};
char* urls[] = {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -