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

📄 gtkmusicbrowser.cpp

📁 FreeAMP(MP3播放)程序源代码-用来研究MP3解码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
   PlaylistItem *tip = NULL;
   if (tipee)
       tip = tipee;

   if (!tip) {
       if (GetClickState() == kContextPlaylist) {
           if (m_lastindex == kInvalidIndex)
               return;

           tip = m_plm->ItemAt(*(m_plSelected.begin()));
       }
       else
           return;
   }
   
   string artistname = tip->GetMetaData().Artist();

   if (artistname.size() == 0 || artistname == "Unknown")
       return;

   string encoded;
   ReplaceSpaces(artistname, encoded);
   string url = string("http://www.fairtunes.com/servlet/ArtistLookupServlet?redirectPage=http://www.fairtunes.com/search.jsp&searchTerms=") + encoded;

   LaunchBrowser(url.c_str());
}

void GTKMusicBrowser::PopUpInfoEditor(PlaylistItem *editee)
{
    if (editee) {
        vector<PlaylistItem *> *list = new vector<PlaylistItem *>;
        list->push_back(editee);
        infoeditorUI *infoedit = new infoeditorUI(m_context, m_plm, list);
        infoedit->DisplayInfo();
        return;
    }

    if (GetClickState() == kContextPlaylist) {
        if (m_lastindex == kInvalidIndex)
            return;
   
        vector<PlaylistItem *> *list = new vector<PlaylistItem *>;

        set<uint32>::iterator i = m_plSelected.begin();
        for (; i != m_plSelected.end(); i++)
            list->push_back(m_plm->ItemAt(*i));

        infoeditorUI *infoedit = new infoeditorUI(m_context, m_plm, list);
        infoedit->DisplayInfo();
    }
    else if (GetClickState() == kContextBrowser) {
        vector<PlaylistItem *> *list = NULL;
        vector<TreeData *>::iterator i = mbSelections->begin();
        for (; i != mbSelections->end(); i++) {
            switch ((*i)->type) {
                case kTreePlaylist: {
                    CreateNewEditor((char*)(*i)->playlistname.c_str());
                break; }
                case kTreeTrack: {
                    if (!list)
                        list = new vector<PlaylistItem *>;
                    list->push_back((*i)->track);
                    break; }
                case kTreeUncat: {
                    MusicCatalog *cat = m_context->catalog;
                    vector<PlaylistItem *> *unsort = 
                               (vector<PlaylistItem *>*)cat->GetUnsortedMusic();
                    if (unsort->size() > 0) {
                        if (!list)
                            list = new vector<PlaylistItem *>;
                        vector<PlaylistItem *>::iterator k = unsort->begin();
                        for (; k != unsort->end(); k++)
                            list->push_back(*k);
                    }
                    break; }
                case kTreeAlbum: {
                    AlbumList *alb = (*i)->album;
                    vector<PlaylistItem *>::iterator j = 
                                                    alb->m_trackList->begin();
                    if (!list)
                        list = new vector<PlaylistItem *>;
                    for (; j != alb->m_trackList->end(); j++) 
                        list->push_back(*j);
                    break; }
                case kTreeArtist: {
                    ArtistList *art = (*i)->artist;
                    vector<AlbumList *>::iterator j = 
                                                   art->m_albumList->begin();
                    if (!list)
                        list = new vector<PlaylistItem *>;
                    for (; j != art->m_albumList->end(); j++) {
                        vector<PlaylistItem *>::iterator k = 
                                                (*j)->m_trackList->begin();
                        for (; k != (*j)->m_trackList->end(); k++) 
                            list->push_back(*k);
                    }
                    break; }
                case kTreeMyMusic:
                case kTreeAll: {
                    MusicCatalog *cat = m_context->catalog;
                    vector<PlaylistItem *> *unsort =
                               (vector<PlaylistItem *>*)cat->GetUnsortedMusic();
                    vector<ArtistList *> *artlist = 
                               (vector<ArtistList *>*)cat->GetMusicList();
                    if (!list)
                        list = new vector<PlaylistItem *>;
                    vector<ArtistList *>::iterator h = artlist->begin();
                    for (; h != artlist->end(); h++) {
                        vector<AlbumList *>::iterator z = 
                                                  (*h)->m_albumList->begin();
                        for (; z != (*h)->m_albumList->end(); z++) {
                            vector<PlaylistItem *>::iterator x = 
                                                   (*z)->m_trackList->begin();
                            for (; x != (*z)->m_trackList->end(); x++) 
                                list->push_back(*x);
                        }
                    }
                    
                    if (unsort->size() > 0) {
                        vector<PlaylistItem *>::iterator k = unsort->begin();
                        for (; k != unsort->end(); k++)
                            list->push_back(*k);
                    }
                    break; }
                default:
                    break;
            }
        }
        if (list) {
            infoeditorUI *infoedit = new infoeditorUI(m_context, m_plm, list);
            infoedit->DisplayInfo();
        }
    }
}

void GTKMusicBrowser::SaveCurrentPlaylist(char *path)
{
    if (path != NULL)
        m_currentListName = path;

    if (m_currentListName.length() == 0)
        return;

    char *ext = strrchr(m_currentListName.c_str(), '.');
    if (ext)
        ext = ext + 1;
    Error result = kError_NoErr;
    int i = 0;
    bool found = false;
    PlaylistFormatInfo format;
    while (ext && result == kError_NoErr) {
        result = m_plm->GetSupportedPlaylistFormats(&format, i);
        if (!strcmp(ext, format.GetExtension())) {
            found = true;
            break;
        }
        i++;
    }
    if (!found) {
        m_plm->GetSupportedPlaylistFormats(&format, 0);
        m_currentListName += "." ;
        m_currentListName += format.GetExtension();
    }
   
    if (!strncmp("file://", m_currentListName.c_str(), 7)) {
        m_plm->WritePlaylist(m_currentListName.c_str(), &format);
        m_context->catalog->AddPlaylist(m_currentListName.c_str());
    }
    else {
        uint32 urlLength = m_currentListName.length() + 20;
        char *writeURL = new char[urlLength];
        Error err = FilePathToURL(m_currentListName.c_str(), writeURL, &urlLength);
        if (IsntError(err)) {
            m_plm->WritePlaylist(writeURL, &format);
            m_context->catalog->AddPlaylist(writeURL);
        }
        delete [] writeURL;
    }

    if (!master && !m_bCDMode) {
        string labelstr = string("Editing playlist: ");
        if (m_currentListName.length() == 0)
            labelstr += string("New Playlist");
        else
            labelstr += m_currentListName;
        gtk_label_set_text(GTK_LABEL(playlistLabel), labelstr.c_str());
    }
}

void GTKMusicBrowser::LoadPlaylist(string &oPlaylist)
{
    if (oPlaylist == m_currentListName)
        return;

    if (oPlaylist.length() == 0)
        return;

    if (m_currentListName.length() != 0 && !master)
        SaveCurrentPlaylist(NULL);

    if (!strncmp("file://", oPlaylist.c_str(), 7)) {
        m_plm->ReadPlaylist(oPlaylist.c_str());
        m_currentListName = oPlaylist;
    }
    else {
        uint32 length = _MAX_PATH;
        char *PlaylistURL = new char[length];
        if (IsntError(FilePathToURL(oPlaylist.c_str(), PlaylistURL, &length))) {
            m_plm->ReadPlaylist(PlaylistURL);
            m_currentListName = PlaylistURL;
        }
        delete [] PlaylistURL;
    }
}

void GTKMusicBrowser::ImportPlaylist(char *path)
{
    if (!path)
        return;
    uint32 length = strlen(path) + 10;
    char *url = new char[length];
    if (IsntError(FilePathToURL(path, url, &length)))
        m_context->catalog->AddPlaylist(path);
    delete [] url;
}

void GTKMusicBrowser::ReadPlaylist(char *path, vector<PlaylistItem *> *plist)
{
    m_plm->ReadPlaylist(path, plist);
}

GTKMusicBrowser::GTKMusicBrowser(FAContext *context, MusicBrowserUI *masterUI,
                                 string playlistURL, bool cdCreationMode)
{
    m_context = context;
    m_initialized = false;
    isVisible = false;
    m_lastindex = 0;
    m_currentListName = "";
    m_state = kStateCollapsed;
    statusContext = 0;
    playlistList = NULL;
    m_musicCatalog = NULL;
    lastPanedPosition = -1;
    lastPanedHandle = -1;
    pauseState = 0;
    stopState = 1;
    musicBrowserTree = NULL;
    m_playingindex = kInvalidIndex;
    iSetRepeatMode = false;
    iSetShuffleMode = false;
    CD_DiscID = 0;
    CD_numtracks = 0;
    scheduleCDredraw = false;
    CDTracks = new vector<PlaylistItem *>;
    m_bIgnoringMusicCatalogMessages = false;
    m_bCDMode = cdCreationMode;
    stream_timer_started = false;
    stream_timer = NULL;
    m_sigsExist = false;
    m_sigsStart = true;
    playlistColsChanged = true;
    for (int i = 0; i < 8; i++)
        playlistCols[i] = kEmptyColumn;
    playlistCols[0] = kPositionColumn;

    mbSelections = new vector<TreeData *>;

    parentUI = masterUI;
 
    if (playlistURL.find("currentlist.m3u") <= playlistURL.length()) {
        m_plm = context->plm;
        master = true;
    }
    else {
        m_plm = new PlaylistManager(context);
        m_plm->SetActivePlaylist(kPlaylistKey_ExternalPlaylist);
        master = false;
    }

    if (master) {
        bool saveOnExit;
        m_context->prefs->GetPrefBoolean(kSaveCurrentPlaylistOnExitPref, &saveOnExit);

        if (saveOnExit) {
            LoadPlaylist(playlistURL);
            uint32 pos = 0; 
            m_context->prefs->GetPrefInt32(kSavedPlaylistPositionPref, 
                                           (int32 *)&pos);

            m_plm->SetCurrentIndex(pos);   
        }
        else
            m_currentListName = playlistURL;
    }
    else if (playlistURL != "")
        LoadPlaylist(playlistURL);
}

GTKMusicBrowser::~GTKMusicBrowser(void)
{
    if (m_initialized) {
        gtk_widget_destroy(musicBrowser);

        if (stream_timer)
            m_context->timerManager->StopTimer(stream_timer);
    }
    delete mbSelections;
    delete CDTracks;
}

void GTKMusicBrowser::ShowMusicBrowser(void)
{
    
    gdk_threads_enter();
    isVisible = true;
    if (m_initialized)
        gtk_widget_show(musicBrowser);
    else {
        CreatePlaylist();
        m_initialized = true;
    }
    if (master) {  
         bool viewMusicBrowser = true;

         m_context->prefs->GetPrefBoolean(kViewMusicBrowserPref, &viewMusicBrowser);
         
         if ((viewMusicBrowser == true) && (m_state == kStateCollapsed))
	     ExpandCollapseEvent();
         else if ((viewMusicBrowser == false) && (m_state == kStateExpanded)) 
             ExpandCollapseEvent();
    }

    SetToolbarType();
    if (scheduleCDredraw)
        RegenerateCDTree();
    UpdatePlaylistList();

    gdk_threads_leave();
}

void GTKMusicBrowser::Close(bool inMain)
{
    gdk_threads_enter();
    isVisible = false;

    if (master) {
        bool saveOnExit = false;
        m_context->prefs->GetPrefBoolean(kSaveCurrentPlaylistOnExitPref, &saveOnExit);

        if (saveOnExit && m_plm) {
            SaveCurrentPlaylist(NULL);
            m_context->prefs->SetPrefInt32(kSavedPlaylistPositionPref, m_plm->GetCurrentIndex());
        }
    }
    else {
        if (m_plm && m_currentListName.length() == 0 && m_plm->CountItems() > 0) 
        {
            gdk_window_raise(musicBrowser->window);
            GTKMessageDialog oBox;
            string oMessage = string("Do you want to save this playlist to disk? ");

            if (oBox.Show(oMessage.c_str(), "Save Confirmation", kMessageYesNo,
                          inMain) == kMessageReturnYes) {

                FileSelector *filesel = new FileSelector("Save This Playlist to Disk");
                if (filesel->Run())
                    m_curren

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -