⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 musictree.cpp

📁 FreeAMP(MP3播放)程序源代码-用来研究MP3解码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/*____________________________________________________________________________

        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 + -