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

📄 browsertree.cpp

📁 FreeAMP(MP3播放)程序源代码-用来研究MP3解码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                         (vector<PlaylistItem *> *)m_musicCatalog->GetStreams();

    if (CheckEmptyDatabase()) {
        m_musicCatalog->ReleaseCatalogLock();
        return;
    }

    if ((artistList->size() == 0) && (unsorted->size() == 0) &&
        (playlists->size() == 0)) {
        m_musicCatalog->ReleaseCatalogLock();
        return;
    }

    gtk_clist_freeze(GTK_CLIST(musicBrowserTree));

    ClearTree();

    GtkCTreeNode *allItem, *uncatItem;
    TreeData *data;
    char *name[1];

    uncatItem = NULL;
    allItem = NULL;

    vector<PlaylistItem *>::iterator l = unsorted->begin();
    for (; l != unsorted->end(); l++) {
        MetaData mdata = (*l)->GetMetaData();
        name[0] = (char *)mdata.Title().c_str();
        uncatItem = gtk_ctree_insert_node(musicBrowserTree, uncatTree,
                                          NULL, name, 5,
                                          track_pmap, track_mask, track_pmap, 
                                          track_mask, true,
                                          false);
        data = NewTreeData(kTreeTrack, NULL, NULL, NULL, *l);
        gtk_ctree_node_set_row_data_full(musicBrowserTree, uncatItem, data,
                                         (GtkDestroyNotify)kill_treedata);

        allItem = gtk_ctree_insert_node(musicBrowserTree, allTree,
                                        NULL, name, 5, track_pmap, track_mask, 
                                        track_pmap,
                                        track_mask, true, false);
        data = NewTreeData(kTreeTrack, NULL, NULL, NULL, *l);
        gtk_ctree_node_set_row_data_full(musicBrowserTree, allItem, data,
                                         (GtkDestroyNotify)kill_treedata);
    }

    gtk_ctree_sort_recursive(musicBrowserTree, uncatTree);

    vector<ArtistList *>::iterator i = artistList->begin();
    for (; i != artistList->end(); i++) {
        GtkCTreeNode *artTree, *artItem = NULL;

        name[0] = (char *)(*i)->name.c_str();
        GtkCTreeNode *sib = GTK_CTREE_ROW(mainTree)->children;
        /* skip uncat and all subtrees */
        sib = GTK_CTREE_ROW(sib)->sibling;
        sib = GTK_CTREE_ROW(sib)->sibling;

        while (sib) {
            GtkCListRow *row = (GtkCListRow *)GTK_CTREE_ROW(sib);
            char *sibtext = GTK_CELL_PIXTEXT(row->cell[0])->text;
            if (strcasecmp(name[0], sibtext) < 0)
                break;
            sib = GTK_CTREE_ROW(sib)->sibling;
        }

        artTree = gtk_ctree_insert_node(musicBrowserTree, mainTree,
                                        sib, name, 5, artist_pmap, artist_mask,
                                        artist_pmap, artist_mask, false, false);
        data = NewTreeData(kTreeArtist, NULL, (*i));
        gtk_ctree_node_set_row_data_full(musicBrowserTree, artTree, data,
                                         (GtkDestroyNotify)kill_treedata);

        vector<AlbumList *>::iterator j = (*i)->m_albumList->begin();
        for (; j != (*i)->m_albumList->end(); j++) {
            GtkCTreeNode *trackItem = NULL;

            name[0] = (char *)(*j)->name.c_str();
            artItem = gtk_ctree_insert_node(musicBrowserTree, artTree,
                                            NULL, name, 5, album_pmap, 
                                            album_mask,
                                            album_pmap, album_mask, false, 
                                            false);
            data = NewTreeData(kTreeAlbum, NULL, (*i), (*j));
            gtk_ctree_node_set_row_data_full(musicBrowserTree, artItem, data,
                                             (GtkDestroyNotify)kill_treedata);

            vector<PlaylistItem *>::iterator k = (*j)->m_trackList->begin();
            for (;k != (*j)->m_trackList->end(); k++) {
                string title = (*k)->GetMetaData().Title();
                char *fullname = new char[title.size() + 10];
                uint32 trackno = (*k)->GetMetaData().Track();

                if (trackno > 0) 
                    sprintf(fullname, "%d - %s", trackno, title.c_str());
                else
                    sprintf(fullname, "? - %s", title.c_str());

                name[0] = fullname;
                trackItem = gtk_ctree_insert_node(musicBrowserTree, artItem,
                                                  NULL, name,
                                                  5, track_pmap, track_mask, 
                                                  track_pmap, track_mask,
                                                  true, false);
                data = NewTreeData(kTreeTrack, NULL, (*i), (*j), (*k));
                gtk_ctree_node_set_row_data_full(musicBrowserTree, trackItem, 
                                                 data,
                                                 (GtkDestroyNotify)kill_treedata);

                delete [] fullname;

                name[0] = (char *)(*k)->GetMetaData().Title().c_str();
                allItem = gtk_ctree_insert_node(musicBrowserTree, allTree,
                                                NULL, name,
                                                5, track_pmap, track_mask, 
                                                track_pmap, track_mask,
                                                true, false);
                data = NewTreeData(kTreeTrack, NULL, (*i), (*j), (*k));
                gtk_ctree_node_set_row_data_full(musicBrowserTree, allItem, 
                                                 data,
                                                 (GtkDestroyNotify)kill_treedata);
            }
        }
        gtk_ctree_sort_recursive(musicBrowserTree, artTree);
    }

    gtk_ctree_sort_recursive(musicBrowserTree, allTree);

    vector<string>::iterator m = playlists->begin();
    for (; m != playlists->end(); m++) {
        char *fullname = new char[(*m).length() + 1];
        strcpy(fullname, (*m).c_str());
        char *listname = fullname;
        char *temp = strrchr(fullname, '.');
        if (temp)
            *temp = '\0';
        temp = strrchr(fullname, '/');
        if (temp)
            listname = temp + 1;

        name[0] = listname;
        allItem = gtk_ctree_insert_node(musicBrowserTree, playlistTree, NULL,
                                        name, 5, playlist_pmap, playlist_mask, 
                                        playlist_pmap, playlist_mask,
                                        true, false);
        data = NewTreeData(kTreePlaylist, NULL, NULL, NULL, NULL,
                           (char *)(*m).c_str(), (char *)(*m).c_str());
        gtk_ctree_node_set_row_data_full(musicBrowserTree, allItem, data,
                                         (GtkDestroyNotify)kill_treedata);

        delete [] fullname;
    }

    gtk_ctree_sort_recursive(musicBrowserTree, playlistTree);

    if (m_bCDMode) {
        gtk_clist_thaw(GTK_CLIST(musicBrowserTree));
        m_musicCatalog->ReleaseCatalogLock();
        return;
    }

    l = streams->begin();
    for (; l != streams->end(); l++) {

        name[0] = (char *)((*l)->GetMetaData().Title().c_str());

        allItem = gtk_ctree_insert_node(musicBrowserTree, favoritesTree, NULL,
                                        name, 5, stream_pmap, stream_mask, 
                                        stream_pmap, stream_mask,
                                        true, false);
        data = NewTreeData(kTreeFavStream, NULL, NULL, NULL, (*l));
        gtk_ctree_node_set_row_data_full(musicBrowserTree, allItem, data, 
                                         (GtkDestroyNotify)kill_treedata);    
    }
    gtk_ctree_sort_recursive(musicBrowserTree, favoritesTree);

    RegenerateCDTree();

    gtk_clist_thaw(GTK_CLIST(musicBrowserTree));

    m_musicCatalog->ReleaseCatalogLock();
}

void GTKMusicBrowser::CreateMainTreeItems(void)
{
    TreeData *data;
    char *name[1];
    GdkPixmap *pixmap;
    GdkBitmap *mask;
    GtkStyle  *style = gtk_widget_get_style(musicBrowserWindow);

    if (!album_pmap)
    {
        album_pmap = gdk_pixmap_create_from_xpm_d(musicBrowserWindow->window, 
                                                  &album_mask,
                                                  &style->bg[GTK_STATE_NORMAL],
                                                  album_pix);
        artist_pmap = gdk_pixmap_create_from_xpm_d(musicBrowserWindow->window, 
                                                   &artist_mask,
                                                   &style->bg[GTK_STATE_NORMAL],
                                                   artist_pix);
        playlist_pmap = gdk_pixmap_create_from_xpm_d(musicBrowserWindow->window,
                                                     &playlist_mask,
                                                   &style->bg[GTK_STATE_NORMAL],
                                                     playlist_pix);
        track_pmap = gdk_pixmap_create_from_xpm_d(musicBrowserWindow->window, 
                                                  &track_mask,
                                                  &style->bg[GTK_STATE_NORMAL],
                                                  track_pix);
        stream_pmap = gdk_pixmap_create_from_xpm_d(musicBrowserWindow->window, 
                                                   &stream_mask,
                                                   &style->bg[GTK_STATE_NORMAL],
                                                   streams_pix);
    }

    pixmap = gdk_pixmap_create_from_xpm_d(musicBrowserWindow->window,
                                          &mask,
                                          &style->bg[GTK_STATE_NORMAL],
                                          catalog_pix);
    name[0] = "My Music";
    mainTree = gtk_ctree_insert_node(musicBrowserTree, NULL, NULL, name, 5,
                                     pixmap, mask, pixmap, mask, false, false);
    data = NewTreeData(kTreeMyMusic, m_musicCatalog, NULL, NULL, NULL, NULL,
                       "This tree item contains all of your music");
    gtk_ctree_node_set_row_data_full(musicBrowserTree, mainTree, data, 
                                     (GtkDestroyNotify)kill_treedata);

    pixmap = gdk_pixmap_create_from_xpm_d(musicBrowserWindow->window, &mask,
                                          &style->bg[GTK_STATE_NORMAL],
                                          all_pix);
    name[0] = "All Tracks";
    allTree = gtk_ctree_insert_node(musicBrowserTree, mainTree, NULL, name, 5,
                                    pixmap, mask, pixmap, mask, false, false);
    data = NewTreeData(kTreeAll, m_musicCatalog, NULL, NULL, NULL, NULL,
                       "This tree item lists all of your music tracks");
    gtk_ctree_node_set_row_data_full(musicBrowserTree, allTree, data,
                                     (GtkDestroyNotify)kill_treedata);

    pixmap = gdk_pixmap_create_from_xpm_d(musicBrowserWindow->window, &mask,
                                          &style->bg[GTK_STATE_NORMAL],
                                          uncatagorized_pix);
    name[0] = "Uncategorized Tracks";
    uncatTree = gtk_ctree_insert_node(musicBrowserTree, mainTree, NULL,
                                      name, 5, pixmap, mask, pixmap, mask,
                                      false, false);
    data = NewTreeData(kTreeUncat, m_musicCatalog, NULL, NULL, NULL, NULL,
                       "This tree item lists all of your uncategorized music "
                       "tracks");
    gtk_ctree_node_set_row_data_full(musicBrowserTree, uncatTree, data,
                                     (GtkDestroyNotify)kill_treedata);

    pixmap = gdk_pixmap_create_from_xpm_d(musicBrowserWindow->window, &mask,
                                          &style->bg[GTK_STATE_NORMAL],
                                          playlist_pix);
    name[0] = "My Playlists";
    playlistTree = gtk_ctree_insert_node(musicBrowserTree, NULL, NULL, name, 5,
                                         pixmap, mask, pixmap, mask, false,
                                         false);
    data = NewTreeData(kTreePlaylistHead, NULL, NULL, NULL, NULL, NULL,
                       "This tree item contains all of your playlists");
    gtk_ctree_node_set_row_data_full(musicBrowserTree, playlistTree, data,
                                     (GtkDestroyNotify)kill_treedata);

    pixmap = gdk_pixmap_create_from_xpm_d(musicBrowserWindow->window, &mask,
                                          &style->bg[GTK_STATE_NORMAL],
                                          streams_pix);

    if (m_bCDMode)
        return;

    name[0] = "My Streams";
    streamTree = gtk_ctree_insert_node(musicBrowserTree, NULL, NULL, name, 5,
                                       pixmap, mask, pixmap, mask, false, false);
    data = NewTreeData(kTreeStreamsHead, NULL, NULL, NULL, NULL, NULL,
                 "This tree item contains information on various music streams");
    gtk_ctree_node_set_row_data_full(musicBrowserTree, streamTree, data,
                                     (GtkDestroyNotify)kill_treedata);

    pixmap = gdk_pixmap_create_from_xpm_d(musicBrowserWindow->window, &mask,
                                          &style->bg[GTK_STATE_NORMAL],
                                          favorites_pix);
    name[0] = "Favorites";
    favoritesTree = gtk_ctree_insert_node(musicBrowserTree, streamTree, NULL, 
                                          name, 5, pixmap, mask, pixmap, mask, 
                                          false, false);    
    data = NewTreeData(kTreeFavoriteStreamsHead, NULL, NULL, NULL, NULL, NULL,
                "This tree item contains all your favorite streams");
    gtk_ctree_node_set_row_data_full(musicBrowserTree, favoritesTree, data,
                                     (GtkDestroyNotify)kill_treedata);

    pixmap = gdk_pixmap_create_from_xpm_d(musicBrowserWindow->window, &mask,
                                          &style->bg[GTK_STATE_NORMAL],
                                          favorites_pix);
    name[0] = "Recommended Streams";
    relatableTree = gtk_ctree_insert_node(musicBrowserTree, streamTree, NULL,
                                          name, 5, pixmap, mask, pixmap, mask, 
                                          false, false);
    data = NewTreeData(kTreeRelatableHead, NULL, NULL, NULL, NULL, NULL,
                       "This tree item contains recommended streams, personalized to you");
    gtk_ctree_node_set_row_data_full(musicBrowserTree, relatableTree, data,
                                     (GtkDestroyNotify)kill_treedata);

    name[0] = "Getting Recommendations...";
    relatableSpace = gtk_ctree_insert_node(musicBrowserTree, relatableTree, NULL,
                                           name, 5, NULL, NULL, NULL, NULL, true,
                                           false);
    
    name[0] = "Searching for Stations...";
    streamSpace = gtk_ctree_insert_node(musicBrowserTree, streamTree, NULL,
                                        name, 5, NULL, NULL, NULL, NULL, true,
                                        false);

    pixmap = gdk_pixmap_create_from_xpm_d(musicBrowserWindow->window, &mask,
                                          &style->bg[GTK_STATE_NORMAL],
                                          cd_pix);
    name[0] = "CD Audio";
    CDTree = gtk_ctree_insert_node(musicBrowserTree, NULL, NULL, name, 5,
                                   pixmap, mask, pixmap, mask, false, false);
    data = NewTreeData(kTreeCDHead, NULL, NULL, NULL, NULL, NULL,
                       "This tree item contains information on the CD that is currently in your CD-ROM", CDTracks);
    gtk_ctree_node_set_row_data_full(musicBrowserTree, CDTree, data,
                                     (GtkDestroyNotify)kill_treedata);

    relatableExpanded = false;
    streamExpanded = false;

    gtk_clist_thaw(GTK_CLIST(musicBrowserTree));
}

static void tree_status_clear(GtkWidget *w, GdkEventCrossing *event,
                              GTKMusicBrowser *p)
{
    gdk_threads_leave();
    Event *e = new BrowserMessageEvent(" ");
    p->AcceptEvent(e);
    delete e;
    gdk_threads_enter();
}

static void tree_status(GtkWidget *w, GdkEventMotion *event,
                        GTKMusicBrowser *p)
{
    int x, y, row, column;
    GtkCTree *ctree = GTK_CTREE(w);
    GtkCList *clist = GTK_CLIST(w);

    x = (int)event->x;

⌨️ 快捷键说明

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