📄 gtkmusicbrowser.cpp
字号:
char *name[1];
GdkPixmap *pixmap;
GdkBitmap *mask;
GtkStyle *style = gtk_widget_get_style(musicBrowserWindow);
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();
pixmap = gdk_pixmap_create_from_xpm_d(musicBrowserWindow->window, &mask,
&style->bg[GTK_STATE_NORMAL],
track_pix);
uncatItem = gtk_ctree_insert_node(musicBrowserTree, uncatTree,
NULL, name, 5,
pixmap, mask, pixmap, mask, true,
false);
data = NewTreeData(kTreeTrack, NULL, NULL, NULL, *l);
gtk_ctree_node_set_row_data(musicBrowserTree, uncatItem, data);
allItem = gtk_ctree_insert_node(musicBrowserTree, allTree,
NULL, name, 5, pixmap, mask, pixmap,
mask, true, false);
data = NewTreeData(kTreeTrack, NULL, NULL, NULL, *l);
gtk_ctree_node_set_row_data(musicBrowserTree, allItem, data);
}
vector<ArtistList *>::iterator i = artistList->begin();
for (; i != artistList->end(); i++) {
GtkCTreeNode *artTree, *artItem = NULL;
name[0] = (char *)(*i)->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, (*i));
gtk_ctree_node_set_row_data(musicBrowserTree, artTree, data);
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();
pixmap = gdk_pixmap_create_from_xpm_d(musicBrowserWindow->window,
&mask, &style->bg[GTK_STATE_NORMAL],
album_pix);
artItem = gtk_ctree_insert_node(musicBrowserTree, artTree,
NULL, name, 5, pixmap, mask,
pixmap, mask, false, false);
data = NewTreeData(kTreeAlbum, NULL, (*i), (*j));
gtk_ctree_node_set_row_data(musicBrowserTree, artItem, data);
vector<PlaylistItem *>::iterator k = (*j)->m_trackList->begin();
for (;k != (*j)->m_trackList->end(); k++) {
name[0] = (char *)(*k)->GetMetaData().Title().c_str();
pixmap =gdk_pixmap_create_from_xpm_d(musicBrowserWindow->window,
&mask, &style->bg[GTK_STATE_NORMAL],
track_pix);
trackItem = gtk_ctree_insert_node(musicBrowserTree, artItem,
NULL, name,
5, pixmap, mask, pixmap, mask,
true, false);
data = NewTreeData(kTreeTrack, NULL, (*i), (*j), (*k));
gtk_ctree_node_set_row_data(musicBrowserTree, trackItem, data);
allItem = gtk_ctree_insert_node(musicBrowserTree, allTree,
NULL, name,
5, pixmap, mask, pixmap, mask,
true, false);
data = NewTreeData(kTreeTrack, NULL, (*i), (*j), (*k));
gtk_ctree_node_set_row_data(musicBrowserTree, allItem, data);
}
}
}
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 = NULL;
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 *)(*m).c_str(), (char *)(*m).c_str());
gtk_ctree_node_set_row_data(musicBrowserTree, allItem, data);
delete [] fullname;
}
gtk_clist_thaw(GTK_CLIST(musicBrowserTree));
m_musicCatalog->ReleaseCatalogLock();
}
static void music_search(GTKMusicBrowser *p, guint action, GtkWidget *w)
{
p->StartMusicSearch();
}
void GTKMusicBrowser::AddFileCMD()
{
bool playNow = true;
m_context->prefs->GetPlayImmediately(&playNow);
FileSelector *filesel = new FileSelector("Select a file to play");
if (filesel->Run(false)) {
char *returnpath = filesel->GetReturnPath();
char *ext = m_context->player->GetExtension(returnpath);
if (ext) {
uint32 length = strlen(returnpath) + 10;
char *tempurl = new char[length];
if (IsntError(FilePathToURL(returnpath, tempurl, &length))) {
if (playNow)
DeleteListEvent();
if (m_plm->IsSupportedPlaylistFormat(ext)) {
string tobeloaded = tempurl;
LoadPlaylist(tobeloaded);
}
else {
char *filereturn = strdup_new(filesel->GetReturnPath());
if (filereturn) {
char *temp;
char *first= strtok(filereturn, "\n");
while ((temp = strtok(NULL, "\n"))) {
AddTrackPlaylistEvent(temp);
m_currentindex++;
}
AddTrackPlaylistEvent(first);
}
delete [] filereturn;
}
}
delete ext;
delete [] tempurl;
}
if (playNow) {
m_currentindex = 0;
PlayEvent();
}
}
delete filesel;
}
static void import_tool(GtkWidget *w, GTKMusicBrowser *p)
{
FileSelector *filesel = new FileSelector("Import a Track or Playlist into My Music");
if (filesel->Run()) {
FAContext *m_context = p->GetContext();
char *returnpath = filesel->GetReturnPath();
char *ext = m_context->player->GetExtension(returnpath);
uint32 length = strlen(returnpath) + 10;
char *tempurl = new char[length];
if (IsntError(FilePathToURL(returnpath, tempurl, &length))) {
if (m_context->plm->IsSupportedPlaylistFormat(ext))
p->ImportPlaylist(tempurl);
else if (m_context->player->IsSupportedExtension(ext)) {
PlaylistItem *plist = new PlaylistItem(tempurl);
m_context->plm->RetrieveMetaData(plist);
while (plist->GetState() != kPlaylistItemState_Normal)
usleep(5);
m_context->catalog->WriteMetaDataToDatabase(tempurl,
plist->GetMetaData());
m_context->catalog->AddSong(tempurl);
delete plist;
}
}
delete [] tempurl;
delete ext;
}
delete filesel;
}
static void remove_tool(GtkWidget *w, GTKMusicBrowser *p)
{
if (p->GetClickState() == kContextPlaylist) {
p->DeleteEvent();
}
else if (p->GetClickState() == kContextBrowser) {
if (p->GetTreeClick() == kClickPlaylist) {
p->GetContext()->catalog->RemovePlaylist(p->mbSelection->playlistname.c_str());
}
else if (p->GetTreeClick() == kClickTrack) {
p->GetContext()->catalog->RemoveSong(p->mbSelection->track->URL().c_str());
}
}
}
static void edit_tool(GtkWidget *w, GTKMusicBrowser *p)
{
if (p->GetClickState() == kContextPlaylist) {
p->PopUpInfoEditor();
}
else if (p->GetClickState() == kContextBrowser) {
if (p->GetTreeClick() == kClickPlaylist) {
p->CreateNewEditor((char *)p->mbSelection->playlistname.c_str());
}
else if (p->GetTreeClick() == kClickTrack) {
p->PopUpInfoEditor(p->mbSelection->track);
}
}
}
void GTKMusicBrowser::CreateExpanded(void)
{
GtkTargetEntry tree_target_table = {"tree-drag", 0, 1};
GtkWidget *browserlabel;
GtkWidget *browservbox;
GtkWidget *hbox;
if (m_browserCreated)
return;
m_browserCreated = true;
masterBrowserBox = gtk_vbox_new(FALSE, 0);
gtk_paned_pack1(GTK_PANED(masterBox), masterBrowserBox, TRUE, TRUE);
hbox = gtk_hbox_new(FALSE, 0);
gtk_box_pack_start(GTK_BOX(masterBrowserBox), hbox, FALSE, FALSE, 5);
browserlabel = gtk_label_new("My Music:");
gtk_box_pack_start(GTK_BOX(hbox), browserlabel, FALSE, FALSE, 5);
browservbox = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(masterBrowserBox), browservbox);
gtk_container_set_border_width(GTK_CONTAINER(browservbox), 5);
musicBrowserWindow = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(musicBrowserWindow),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_box_pack_start(GTK_BOX(browservbox), musicBrowserWindow, TRUE, TRUE, 0);
gtk_widget_set_usize(musicBrowserWindow, 200, 200);
musicBrowserTree = GTK_CTREE(gtk_ctree_new(1, 0));
gtk_widget_add_events(GTK_WIDGET(musicBrowserTree),
GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK);
gtk_container_add(GTK_CONTAINER(musicBrowserWindow),
GTK_WIDGET(musicBrowserTree));
gtk_signal_connect_after(GTK_OBJECT(musicBrowserTree), "button_press_event",
GTK_SIGNAL_FUNC(tree_clicked), this);
gtk_signal_connect(GTK_OBJECT(musicBrowserTree),"motion_notify_event",
GTK_SIGNAL_FUNC(tree_status), this);
gtk_signal_connect(GTK_OBJECT(musicBrowserTree), "leave_notify_event",
GTK_SIGNAL_FUNC(tree_status_clear), this);
gtk_drag_source_set(GTK_WIDGET(musicBrowserTree), GDK_BUTTON1_MASK,
&tree_target_table, 1, GDK_ACTION_MOVE);
gtk_signal_connect(GTK_OBJECT(musicBrowserTree), "drag_data_get",
GTK_SIGNAL_FUNC(tree_drag_data_get), this);
gtk_signal_connect(GTK_OBJECT(musicBrowserTree), "drag_begin",
GTK_SIGNAL_FUNC(tree_drag_begin), this);
gtk_clist_set_compare_func(GTK_CLIST(musicBrowserTree), nocase_compare);
CreateMainTreeItems();
gtk_widget_show_all(masterBrowserBox);
}
void set_label_menu(GtkWidget *w, gchar *newtitle)
{
if (GTK_IS_ACCEL_LABEL(GTK_OBJECT(w))) {
gtk_label_set_text(&(GTK_ACCEL_LABEL(w)->label), newtitle);
}
}
void GTKMusicBrowser::UpdatePlayPause(void)
{
GtkWidget *w = gtk_item_factory_get_widget(menuFactory, "/Controls/Play");
if (pauseState)
gtk_container_foreach(GTK_CONTAINER(w), set_label_menu, (gpointer)"Pause");
else
gtk_container_foreach(GTK_CONTAINER(w), set_label_menu, (gpointer)"Play");
w = gtk_item_factory_get_widget(menuFactory, "/Controls/Stop");
if (stopState)
gtk_widget_set_sensitive(w, FALSE);
else
gtk_widget_set_sensitive(w, TRUE);
}
void GTKMusicBrowser::ExpandCollapseEvent(void)
{
if (m_state == kStateCollapsed) {
CreateExpanded();
m_state = kStateExpanded;
if (lastPanedPosition != -1) {
gtk_paned_set_position(GTK_PANED(masterBox), lastPanedPosition);
gtk_paned_set_handle_size(GTK_PANED(masterBox), lastPanedHandle);
}
gtk_window_set_title(GTK_WINDOW(musicBrowser), BRANDING" - My Music");
GtkWidget *w = gtk_item_factory_get_widget(menuFactory,
"/View/View Playlist Only");
gtk_container_foreach(GTK_CONTAINER(w), set_label_menu, (gpointer)"View Playlist Only");
UpdateCatalog();
}
else {
m_state = kStateCollapsed;
lastPanedPosition = ((GtkPaned *)masterBox)->child1_size;
lastPanedHandle = ((GtkPaned *)masterBox)->handle_size;
gtk_paned_set_position(GTK_PANED(masterBox), 0);
gtk_paned_set_handle_size(GTK_PANED(masterBox), 0);
gtk_window_set_title(GTK_WINDOW(musicBrowser), BRANDING" - Playlist Editor");
GtkWidget *w = gtk_item_factory_get_widget(menuFactory,
"/View/View Playlist Only");
gtk_container_foreach(GTK_CONTAINER(w), set_label_menu, (gpointer)"View My Music");
}
}
void GTKMusicBrowser::ToggleVisEvent(void)
{
gdk_threads_leave();
Close();
gdk_threads_enter();
}
void GTKMusicBrowser::ToggleVisEventDestroyed(void)
{
ToggleVisEvent();
m_initialized = false;
musicBrowserTree = NULL;
m_browserCreated = false;
}
static gboolean toggle_vis_destroy(GtkWidget *w, GTKMusicBrowser *p)
{
p->ToggleVisEventDestroyed();
return FALSE;
}
static void add_tool(GtkWidget *widget, GTKMusicBrowser *p)
{
p->SetClickState(kContextPlaylist);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -