📄 browsertree.cpp
字号:
(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 + -