📄 music_browser.c
字号:
/* -*- linux-c -*- Copyright (C) 2004 Tom Szilagyi This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. $Id: music_browser.c,v 1.106 2006/10/02 17:50:27 peterszilagyi Exp $*/#include <config.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <sys/stat.h>#include <gtk/gtk.h>#include <gdk/gdkkeysyms.h>#include <libxml/xmlmemory.h>#include <libxml/parser.h>#include "common.h"#include "build_store.h"#include "cddb_lookup.h"#include "core.h"#include "cover.h"#include "file_info.h"#include "decoder/file_decoder.h"#include "meta_decoder.h"#include "gui_main.h"#include "options.h"#include "volume.h"#include "playlist.h"#include "search.h"#include "i18n.h"#include "music_browser.h"extern options_t options;extern volatile int build_thread_state;#ifdef HAVE_CDDBextern volatile int cddb_thread_state;#endif /* HAVE_CDDB */extern GtkWidget * vol_window;extern GtkWidget * play_list;extern GtkWidget * musicstore_toggle;extern GtkTreeStore * play_store;extern GtkListStore * ms_pathlist_store;extern PangoFontDescription *fd_browser;extern PangoFontDescription *fd_statusbar;extern char pl_color_active[14];extern char pl_color_inactive[14];extern GtkWidget * gui_stock_label_button(gchar * label, const gchar * stock);extern void assign_audio_fc_filters(GtkFileChooser * fc);extern GtkTooltips * aqualung_tooltips;GtkWidget * browser_window;GtkWidget * dialog;gint browser_pos_x;gint browser_pos_y;gint browser_size_x;gint browser_size_y;gint browser_on;gint browser_paned_pos;gint music_store_changed = 0;GtkWidget * music_tree;GtkTreeStore * music_store = NULL;GtkTreeSelection * music_select;GtkWidget * comment_view;GtkWidget * browser_paned;GtkWidget * statusbar_ms;/* popup menus for tree items */GtkWidget * store_menu;GtkWidget * store__addlist;GtkWidget * store__addlist_albummode;GtkWidget * store__separator1;GtkWidget * store__add;GtkWidget * store__build;GtkWidget * store__edit;GtkWidget * store__save;GtkWidget * store__remove;GtkWidget * store__separator2;GtkWidget * store__addart;GtkWidget * store__separator3;GtkWidget * store__volume;GtkWidget * store__volume_menu;GtkWidget * store__volume_unmeasured;GtkWidget * store__volume_all;GtkWidget * store__search;GtkWidget * artist_menu;GtkWidget * artist__addlist;GtkWidget * artist__addlist_albummode;GtkWidget * artist__separator1;GtkWidget * artist__add;GtkWidget * artist__build;GtkWidget * artist__edit;GtkWidget * artist__remove;GtkWidget * artist__separator2;GtkWidget * artist__addrec;GtkWidget * artist__separator3;GtkWidget * artist__volume;GtkWidget * artist__volume_menu;GtkWidget * artist__volume_unmeasured;GtkWidget * artist__volume_all;GtkWidget * artist__search;GtkWidget * record_menu;GtkWidget * record__addlist;GtkWidget * record__addlist_albummode;GtkWidget * record__separator1;GtkWidget * record__add;GtkWidget * record__edit;GtkWidget * record__remove;GtkWidget * record__separator2;GtkWidget * record__addtrk;#ifdef HAVE_CDDBGtkWidget * record__cddb;GtkWidget * record__cddb_submit;#endif /* HAVE_CDDB */GtkWidget * record__separator3;GtkWidget * record__volume;GtkWidget * record__volume_menu;GtkWidget * record__volume_unmeasured;GtkWidget * record__volume_all;GtkWidget * record__search;GtkWidget * track_menu;GtkWidget * track__addlist;GtkWidget * track__separator1;GtkWidget * track__add;GtkWidget * track__edit;GtkWidget * track__remove;GtkWidget * track__separator2;GtkWidget * track__fileinfo;GtkWidget * track__separator3;GtkWidget * track__volume;GtkWidget * track__volume_menu;GtkWidget * track__volume_unmeasured;GtkWidget * track__volume_all;GtkWidget * track__search;GtkWidget * blank_menu;GtkWidget * blank__add;GtkWidget * blank__search;GtkWidget * blank__save;GtkWidget * save_button;GtkWidget * name_entry;GtkWidget * sort_name_entry;GdkPixbuf * icon_artist;GdkPixbuf * icon_record;GdkPixbuf * icon_store;GdkPixbuf * icon_track;#if defined(HAVE_TAGLIB) && defined(HAVE_METAEDIT)GtkWidget * store__tag;GtkWidget * artist__tag;GtkWidget * record__tag;GtkWidget * track__tag;typedef struct _batch_tag_t { char filename[MAXLEN]; char title[MAXLEN]; char artist[MAXLEN]; char album[MAXLEN]; char comment[MAXLEN]; char year[MAXLEN]; char track[MAXLEN]; struct _batch_tag_t * next;} batch_tag_t;batch_tag_t * batch_tag_root = NULL;#endif /* HAVE_TAGLIB && HAVE_METAEDIT *//* prototypes, when we need them */gboolean music_tree_event_cb(GtkWidget * widget, GdkEvent * event);void store__add_cb(gpointer data);void store__build_cb(gpointer data);void store__edit_cb(gpointer data);void store__save_cb(gpointer data);void store__volume_unmeasured_cb(gpointer data);void store__volume_all_cb(gpointer data);void store__remove_cb(gpointer data);void artist__add_cb(gpointer data);void artist__build_cb(gpointer data);void artist__edit_cb(gpointer data);void artist__volume_unmeasured_cb(gpointer data);void artist__volume_all_cb(gpointer data);void artist__remove_cb(gpointer data);void record__add_cb(gpointer data);void record__edit_cb(gpointer data);void record__volume_unmeasured_cb(gpointer data);void record__volume_all_cb(gpointer data);void record__remove_cb(gpointer data);void track__add_cb(gpointer data);void track__edit_cb(gpointer data);void track__volume_unmeasured_cb(gpointer data);void track__volume_all_cb(gpointer data);void track__remove_cb(gpointer data);void track__fileinfo_cb(gpointer data);void search_cb(gpointer data);void collapse_all_items_cb(gpointer data);struct keybinds { void (*callback)(gpointer); int keyval1; int keyval2;};struct keybinds blank_keybinds[] = { {store__add_cb, GDK_n, GDK_N}, {store__build_cb, GDK_b, GDK_B}, {search_cb, GDK_f, GDK_F}, {collapse_all_items_cb, GDK_w, GDK_W}, {NULL, 0}};struct keybinds store_keybinds[] = { {store__addlist_defmode, GDK_a, GDK_A}, {store__add_cb, GDK_n, GDK_N}, {store__build_cb, GDK_b, GDK_B}, {store__edit_cb, GDK_e, GDK_E}, {store__save_cb, GDK_s, GDK_S}, {store__volume_unmeasured_cb, GDK_v, GDK_V}, {store__remove_cb, GDK_Delete, GDK_KP_Delete}, {artist__add_cb, GDK_plus, GDK_KP_Add}, {search_cb, GDK_f, GDK_F}, {collapse_all_items_cb, GDK_w, GDK_W}, {NULL, 0}};struct keybinds artist_keybinds[] = { {artist__addlist_defmode, GDK_a, GDK_A}, {artist__add_cb, GDK_n, GDK_N}, {artist__build_cb, GDK_b, GDK_B}, {artist__edit_cb, GDK_e, GDK_E}, {artist__volume_unmeasured_cb, GDK_v, GDK_V}, {artist__remove_cb, GDK_Delete, GDK_KP_Delete}, {record__add_cb, GDK_plus, GDK_KP_Add}, {search_cb, GDK_f, GDK_F}, {collapse_all_items_cb, GDK_w, GDK_W}, {NULL, 0}};struct keybinds record_keybinds[] = { {record__addlist_defmode, GDK_a, GDK_A}, {record__add_cb, GDK_n, GDK_N}, {record__edit_cb, GDK_e, GDK_E}, {record__volume_unmeasured_cb, GDK_v, GDK_V}, {record__remove_cb, GDK_Delete, GDK_KP_Delete}, {track__add_cb, GDK_plus, GDK_KP_Add}, {search_cb, GDK_f, GDK_F}, {collapse_all_items_cb, GDK_w, GDK_W}, {NULL, 0}};struct keybinds track_keybinds[] = { {track__addlist_cb, GDK_a, GDK_A}, {track__add_cb, GDK_n, GDK_N}, {track__edit_cb, GDK_e, GDK_E}, {track__volume_unmeasured_cb, GDK_v, GDK_V}, {track__remove_cb, GDK_Delete, GDK_KP_Delete}, {track__fileinfo_cb, GDK_i, GDK_I}, {search_cb, GDK_f, GDK_F}, {collapse_all_items_cb, GDK_w, GDK_W}, {NULL, 0}};gbooleanbrowser_window_close(GtkWidget * widget, GdkEvent * event, gpointer data) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(musicstore_toggle), FALSE); return TRUE;}gintbrowser_window_key_pressed(GtkWidget * widget, GdkEventKey * event) { switch (event->keyval) { case GDK_q: case GDK_Q: case GDK_Escape: browser_window_close(NULL, NULL, NULL); return TRUE; break; } return FALSE;}voidmake_title_string(char * dest, char * templ, char * artist, char * record, char * track) { int i; int j; int argc = 0; char * arg[3] = { "", "", "" }; char temp[MAXLEN]; temp[0] = templ[0]; for (i = j = 1; i < strlen(templ) && j < MAXLEN - 1; i++, j++) { if (templ[i - 1] == '%') { if (argc < 3) { switch (templ[i]) { case 'a': arg[argc++] = artist; temp[j] = 's'; break; case 'r': arg[argc++] = record; temp[j] = 's'; break; case 't': arg[argc++] = track; temp[j] = 's'; break; default: temp[j++] = '%'; temp[j] = templ[i]; break; } } else { temp[j++] = '%'; temp[j] = templ[i]; } } else { temp[j] = templ[i]; } } temp[j] = '\0'; snprintf(dest, MAXLEN - 1, temp, arg[0], arg[1], arg[2]);}intbrowse_button_store_clicked(GtkWidget * widget, gpointer * data) { GtkWidget * dialog; const gchar * selected_filename = gtk_entry_get_text(GTK_ENTRY(data)); dialog = gtk_file_chooser_dialog_new(_("Please select the xml file for this store."), GTK_WINDOW(browser_window), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_APPLY, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); if (options.show_hidden) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -