📄 gtkmusicbrowser.cpp
字号:
char *text2 = NULL;
GtkCListRow *row1 = (GtkCListRow *) ptr1;
GtkCListRow *row2 = (GtkCListRow *) ptr2;
switch (row1->cell[clist->sort_column].type) {
case GTK_CELL_TEXT:
text1 = GTK_CELL_TEXT (row1->cell[clist->sort_column])->text;
break;
case GTK_CELL_PIXTEXT:
text1 = GTK_CELL_PIXTEXT (row1->cell[clist->sort_column])->text;
break;
default:
break;
}
switch (row2->cell[clist->sort_column].type) {
case GTK_CELL_TEXT:
text2 = GTK_CELL_TEXT (row2->cell[clist->sort_column])->text;
break;
case GTK_CELL_PIXTEXT:
text2 = GTK_CELL_PIXTEXT (row2->cell[clist->sort_column])->text;
break;
default:
break;
}
if (!text2)
return (text1 != NULL);
if (!text1)
return -1;
return strcasecmp (text1, text2);
}
static gint TreeDataCompare(TreeData *a, TreeData *b)
{
bool retvalue = true;
if ((a->type == b->type) && (a->catalog == b->catalog) &&
(a->artist == b->artist) && (a->album == b->album) &&
(a->track == b->track) && (a->playlistname == b->playlistname))
retvalue = false;
return retvalue;
}
GtkCTreeNode *GTKMusicBrowser::FindNode(TreeNodeType type, ArtistList *artist,
AlbumList *album, PlaylistItem *item,
GtkCTreeNode *searchFrom)
{
TreeData *data = NewTreeData(type, NULL, artist, album, item);
GtkCTreeNode *retnode;
retnode = gtk_ctree_find_by_row_data_custom(musicBrowserTree, searchFrom,
data,
(GCompareFunc)TreeDataCompare);
delete data;
return retnode;
}
GtkCTreeNode *GTKMusicBrowser::FindPlaylistNode(string playlist)
{
GtkCTreeNode *retnode;
TreeData *data = NewTreeData(kTreePlaylist, NULL, NULL, NULL, NULL,
(char *)playlist.c_str());
retnode = gtk_ctree_find_by_row_data_custom(musicBrowserTree, playlistTree,
data,
(GCompareFunc)TreeDataCompare);
delete data;
return retnode;
}
void GTKMusicBrowser::RemoveCatTrack(ArtistList *artist, AlbumList *album,
PlaylistItem *item)
{
gtk_clist_freeze(GTK_CLIST(musicBrowserTree));
GtkCTreeNode *toRemove;
toRemove = FindNode(kTreeTrack, artist, album, item, allTree);
if (toRemove)
gtk_ctree_remove_node(musicBrowserTree, toRemove);
toRemove = FindNode(kTreeTrack, artist, album, item);
if (toRemove) {
GtkCTreeRow *row = GTK_CTREE_ROW(toRemove);
GtkCTreeNode *alb = row->parent;
GtkCTreeNode *art = GTK_CTREE_ROW(alb)->parent;
gtk_ctree_remove_node(musicBrowserTree, toRemove);
if (!GTK_CTREE_ROW(alb)->children) {
gtk_ctree_remove_node(musicBrowserTree, alb);
if (!GTK_CTREE_ROW(art)->children)
gtk_ctree_remove_node(musicBrowserTree, art);
}
}
gtk_clist_thaw(GTK_CLIST(musicBrowserTree));
}
void GTKMusicBrowser::AddCatTrack(ArtistList *artist, AlbumList *album,
PlaylistItem *item, bool expand)
{
gtk_clist_freeze(GTK_CLIST(musicBrowserTree));
char *name[1];
GdkPixmap *pixmap;
GdkBitmap *mask;
GtkStyle *style = gtk_widget_get_style(musicBrowserWindow);
TreeData *data;
if (!artist) {
GtkCTreeNode *treeItem;
MetaData mdata = item->GetMetaData();
name[0] = (char *)mdata.Title().c_str();
pixmap = gdk_pixmap_create_from_xpm_d(musicBrowserWindow->window, &mask,
&style->bg[GTK_STATE_NORMAL],
track_pix);
treeItem = gtk_ctree_insert_node(musicBrowserTree, uncatTree,
NULL, name, 5,
pixmap, mask, pixmap, mask, true,
false);
data = NewTreeData(kTreeTrack, NULL, NULL, NULL, item);
gtk_ctree_node_set_row_data(musicBrowserTree, treeItem, data);
if (expand) {
gtk_ctree_expand(musicBrowserTree, uncatTree);
gtk_ctree_select(musicBrowserTree, treeItem);
gtk_ctree_node_moveto(musicBrowserTree, treeItem, 0, 0.5, 0);
}
treeItem = gtk_ctree_insert_node(musicBrowserTree, allTree,
NULL, name, 5, pixmap, mask, pixmap,
mask, true, false);
data = NewTreeData(kTreeTrack, NULL, NULL, NULL, item);
gtk_ctree_node_set_row_data(musicBrowserTree, treeItem, data);
gtk_ctree_sort_recursive(musicBrowserTree, allTree);
gtk_ctree_sort_recursive(musicBrowserTree, uncatTree);
gtk_clist_thaw(GTK_CLIST(musicBrowserTree));
return;
}
GtkCTreeNode *artTree, *albTree, *newItem;
albTree = FindNode(kTreeAlbum, artist, album, NULL);
if (!albTree) {
artTree = FindNode(kTreeArtist, artist, NULL, NULL);
if (!artTree) {
name[0] = (char *)artist->name.c_str();
pixmap = gdk_pixmap_create_from_xpm_d(musicBrowserWindow->window,
&mask,
&style->bg[GTK_STATE_NORMAL],
artist_pix);
artTree = gtk_ctree_insert_node(musicBrowserTree, mainTree,
NULL, name, 5, pixmap, mask,
pixmap, mask, false, false);
data = NewTreeData(kTreeArtist, NULL, artist);
gtk_ctree_node_set_row_data(musicBrowserTree, artTree, data);
if (expand)
gtk_ctree_expand(musicBrowserTree, artTree);
}
name[0] = (char *)album->name.c_str();
pixmap = gdk_pixmap_create_from_xpm_d(musicBrowserWindow->window,
&mask,
&style->bg[GTK_STATE_NORMAL],
album_pix);
albTree = gtk_ctree_insert_node(musicBrowserTree, artTree,
NULL, name, 5, pixmap, mask,
pixmap, mask, false, false);
data = NewTreeData(kTreeAlbum, NULL, artist, album);
gtk_ctree_node_set_row_data(musicBrowserTree, albTree, data);
if (expand)
gtk_ctree_expand(musicBrowserTree, albTree);
}
name[0] = (char *)item->GetMetaData().Title().c_str();
pixmap = gdk_pixmap_create_from_xpm_d(musicBrowserWindow->window,
&mask, &style->bg[GTK_STATE_NORMAL],
track_pix);
newItem = gtk_ctree_insert_node(musicBrowserTree, albTree, NULL, name, 5,
pixmap, mask, pixmap, mask, true, false);
data = NewTreeData(kTreeTrack, NULL, artist, album, item);
gtk_ctree_node_set_row_data(musicBrowserTree, newItem, data);
if (expand) {
gtk_ctree_expand_recursive(musicBrowserTree, newItem);
gtk_ctree_select(musicBrowserTree, newItem);
gtk_ctree_node_moveto(musicBrowserTree, newItem, 0, 0.5, 0);
}
newItem = gtk_ctree_insert_node(musicBrowserTree, allTree, NULL, name, 5,
pixmap, mask, pixmap, mask, true, false);
data = NewTreeData(kTreeTrack, NULL, artist, album, item);
gtk_ctree_node_set_row_data(musicBrowserTree, newItem, data);
gtk_ctree_sort_recursive(musicBrowserTree, allTree);
gtk_ctree_sort_node(musicBrowserTree, albTree);
gtk_clist_thaw(GTK_CLIST(musicBrowserTree));
}
void GTKMusicBrowser::ClearTree(void)
{
gtk_clist_freeze(GTK_CLIST(musicBrowserTree));
gtk_clist_clear(GTK_CLIST(musicBrowserTree));
CreateMainTreeItems();
gtk_clist_thaw(GTK_CLIST(musicBrowserTree));
}
void GTKMusicBrowser::AddCatPlaylist(string playlist)
{
gtk_clist_freeze(GTK_CLIST(musicBrowserTree));
char *fullname = new char[playlist.length() + 1];
strcpy(fullname, playlist.c_str());
char *listname = fullname;
char *temp = strrchr(fullname, '.');
if (temp)
*temp = '\0';
temp = strrchr(fullname, '/');
if (temp)
listname = temp + 1;
char *name[1];
name[0] = listname;
GdkPixmap *pixmap;
GdkBitmap *mask;
GtkStyle *style = gtk_widget_get_style(musicBrowserWindow);
TreeData *data;
GtkCTreeNode *allItem;
pixmap = gdk_pixmap_create_from_xpm_d(musicBrowserWindow->window, &mask,
&style->bg[GTK_STATE_NORMAL],
playlist_pix);
allItem = gtk_ctree_insert_node(musicBrowserTree, playlistTree, NULL,
name, 5, pixmap, mask, pixmap, mask,
true, false);
data = NewTreeData(kTreePlaylist, NULL, NULL, NULL, NULL,
(char *)playlist.c_str(), (char *)playlist.c_str());
gtk_ctree_node_set_row_data(musicBrowserTree, allItem, data);
delete [] fullname;
gtk_clist_thaw(GTK_CLIST(musicBrowserTree));
}
void GTKMusicBrowser::RemoveCatPlaylist(string playlist)
{
gtk_clist_freeze(GTK_CLIST(musicBrowserTree));
GtkCTreeNode *toRemove;
toRemove = FindPlaylistNode(playlist);
if (toRemove)
gtk_ctree_remove_node(musicBrowserTree, toRemove);
gtk_clist_thaw(GTK_CLIST(musicBrowserTree));
}
void GTKMusicBrowser::CreateMainTreeItems(void)
{
gtk_clist_freeze(GTK_CLIST(musicBrowserTree));
TreeData *data;
char *name[1];
GdkPixmap *pixmap;
GdkBitmap *mask;
GtkStyle *style = gtk_widget_get_style(musicBrowserWindow);
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, NULL, NULL, NULL, NULL, NULL,
"This tree item contains all of your music");
gtk_ctree_node_set_row_data(musicBrowserTree, mainTree, data);
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(musicBrowserTree, allTree, data);
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(musicBrowserTree, uncatTree, data);
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(musicBrowserTree, playlistTree, data);
gtk_clist_thaw(GTK_CLIST(musicBrowserTree));
}
void GTKMusicBrowser::UpdateCatalog(void)
{
m_musicCatalog = m_context->catalog;
static bool triedUpdate = false;
m_musicCatalog->GetCatalogLock();
vector<ArtistList *> *artistList =
(vector<ArtistList *> *)m_musicCatalog->GetMusicList();
vector<PlaylistItem *> *unsorted =
(vector<PlaylistItem *> *)m_musicCatalog->GetUnsortedMusic();
vector<string> *playlists =
(vector<string> *)m_musicCatalog->GetPlaylists();
if ((artistList->size() == 0) && (unsorted->size() == 0) &&
(playlists->size() == 0) && (triedUpdate == false)) {
GTKMessageDialog oBox;
string oMessage = string("Your music database does not contain any items. Would you like to start a music search to find music and playlists on your machine?");
triedUpdate = true;
if (oBox.Show(oMessage.c_str(), "MusicBrowser", kMessageYesNo)
== kMessageReturnYes)
StartMusicSearch(false);
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -