📄 music_browser.c
字号:
return ret;}voiduse_rva_check_button_cb(GtkWidget * widget, gpointer data) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) { gtk_widget_set_sensitive((GtkWidget *)data, TRUE); } else { gtk_widget_set_sensitive((GtkWidget *)data, FALSE); }}intedit_track_dialog(char * name, char * sort_name, char * file, char * comment, float duration, float volume, float * rva, float * use_rva) { GtkWidget * dialog; GtkWidget * table; GtkWidget * hbox; GtkWidget * name_label; GtkWidget * sort_name_label; GtkWidget * hbox2; GtkWidget * file_entry; GtkWidget * file_label; GtkWidget * browse_button; GtkWidget * viewport; GtkWidget * scrolled_window; GtkWidget * comment_label; GtkWidget * comment_view; GtkTextBuffer * buffer; GtkTextIter iter_start; GtkTextIter iter_end; GtkWidget * table2; GtkWidget * duration_label; GtkWidget * duration_hbox; GtkWidget * duration_entry; GtkWidget * volume_label; GtkWidget * volume_hbox; GtkWidget * volume_entry; GtkWidget * check_button; GtkObject * adj_manual_rva; GtkWidget * spin_button; char str[MAXLEN]; char * utf8; int ret; dialog = gtk_dialog_new_with_buttons(_("Edit Track"), GTK_WINDOW(browser_window), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); gtk_widget_set_size_request(GTK_WIDGET(dialog), 400, 400); gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_REJECT); table = gtk_table_new(3, 2, FALSE); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), table, FALSE, TRUE, 2); name_label = gtk_label_new(_("Visible name:")); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), name_label, FALSE, FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 5, 5); name_entry = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(name_entry), MAXLEN - 1); gtk_entry_set_text(GTK_ENTRY(name_entry), name); gtk_table_attach(GTK_TABLE(table), name_entry, 1, 2, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 5); sort_name_label = gtk_label_new(_("Name to sort by:")); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), sort_name_label, FALSE, FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 5, 5); sort_name_entry = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(sort_name_entry), MAXLEN - 1); gtk_entry_set_text(GTK_ENTRY(sort_name_entry), sort_name); gtk_table_attach(GTK_TABLE(table), sort_name_entry, 1, 2, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 5); file_label = gtk_label_new(_("Filename:")); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), file_label, FALSE, FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 0, 1, 2, 3, GTK_FILL, GTK_FILL, 5, 5); hbox2 = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox2, 1, 2, 2, 3, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 5); file_entry = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(file_entry), MAXLEN - 1); utf8 = g_locale_to_utf8(file, -1, NULL, NULL, NULL); gtk_entry_set_text(GTK_ENTRY(file_entry), utf8); g_free(utf8); gtk_box_pack_start(GTK_BOX(hbox2), file_entry, TRUE, TRUE, 0); browse_button = gui_stock_label_button(_("_Browse..."), GTK_STOCK_OPEN); gtk_box_pack_start(GTK_BOX(hbox2), browse_button, FALSE, TRUE, 2); g_signal_connect(G_OBJECT(browse_button), "clicked", G_CALLBACK(browse_button_track_clicked), (gpointer *)file_entry); comment_label = gtk_label_new(_("Comments:")); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), comment_label, FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, FALSE, TRUE, 2); viewport = gtk_viewport_new(NULL, NULL); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), viewport, TRUE, TRUE, 2); scrolled_window = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(viewport), scrolled_window); comment_view = gtk_text_view_new(); gtk_text_view_set_left_margin(GTK_TEXT_VIEW(comment_view), 3); gtk_text_view_set_right_margin(GTK_TEXT_VIEW(comment_view), 3); gtk_text_view_set_editable(GTK_TEXT_VIEW(comment_view), TRUE); buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(comment_view)); gtk_text_buffer_set_text(GTK_TEXT_BUFFER(buffer), comment, -1); gtk_text_view_set_buffer(GTK_TEXT_VIEW(comment_view), buffer); gtk_container_add(GTK_CONTAINER(scrolled_window), comment_view); table = gtk_table_new(3, 2, FALSE); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), table, FALSE, FALSE, 4); duration_label = gtk_label_new(_("Duration:")); duration_hbox = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(duration_hbox), duration_label, FALSE, FALSE, 0); gtk_table_attach(GTK_TABLE(table), duration_hbox, 0, 1, 0, 1, GTK_FILL, GTK_EXPAND | GTK_FILL, 5, 3); duration_entry = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(duration_entry), MAXLEN - 1); time2time(duration, str); gtk_entry_set_text(GTK_ENTRY(duration_entry), str); gtk_editable_set_editable(GTK_EDITABLE(duration_entry), FALSE); gtk_table_attach(GTK_TABLE(table), duration_entry, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 3); volume_label = gtk_label_new(_("Volume level:")); volume_hbox = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(volume_hbox), volume_label, FALSE, FALSE, 0); gtk_table_attach(GTK_TABLE(table), volume_hbox, 0, 1, 1, 2, GTK_FILL, GTK_EXPAND | GTK_FILL, 5, 3); volume_entry = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(volume_entry), MAXLEN - 1); if (volume <= 0.1f) { snprintf(str, MAXLEN-1, "%.1f dBFS", volume); } else { snprintf(str, MAXLEN-1, _("Unmeasured")); } gtk_entry_set_text(GTK_ENTRY(volume_entry), str); gtk_editable_set_editable(GTK_EDITABLE(volume_entry), FALSE); gtk_table_attach(GTK_TABLE(table), volume_entry, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 3); table2 = gtk_table_new(1, 2, FALSE); gtk_table_attach(GTK_TABLE(table), table2, 0, 2, 2, 3, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); check_button = gtk_check_button_new_with_label(_("Use manual RVA value [dB]")); gtk_widget_set_name(check_button, "check_on_window"); gtk_table_attach(GTK_TABLE(table2), check_button, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 5, 3); adj_manual_rva = gtk_adjustment_new(*rva, -70.0f, 20.0f, 0.1f, 1.0f, 0.0f); spin_button = gtk_spin_button_new(GTK_ADJUSTMENT(adj_manual_rva), 0.3, 1); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin_button), TRUE); gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(spin_button), FALSE); gtk_table_attach(GTK_TABLE(table2), spin_button, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 3); g_signal_connect(G_OBJECT(check_button), "toggled", G_CALLBACK(use_rva_check_button_cb), (gpointer)spin_button); if (*use_rva >= 0.0f) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button), TRUE); } else { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button), FALSE); gtk_widget_set_sensitive(spin_button, FALSE); } gtk_widget_grab_focus(name_entry); gtk_widget_show_all(dialog); display: name[0] = '\0'; sort_name[0] = '\0'; file[0] = '\0'; comment[0] = '\0'; if (aqualung_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { char * pfile = g_locale_from_utf8(gtk_entry_get_text(GTK_ENTRY(file_entry)), -1, NULL, NULL, NULL); if (pfile == NULL) { gtk_widget_grab_focus(file_entry); goto display; } strcpy(name, gtk_entry_get_text(GTK_ENTRY(name_entry))); strcpy(sort_name, gtk_entry_get_text(GTK_ENTRY(sort_name_entry))); strcpy(file, pfile); g_free(pfile); buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(comment_view)); gtk_text_buffer_get_iter_at_offset(GTK_TEXT_BUFFER(buffer), &iter_start, 0); gtk_text_buffer_get_iter_at_offset(GTK_TEXT_BUFFER(buffer), &iter_end, -1); strcpy(comment, gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buffer), &iter_start, &iter_end, TRUE)); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_button))) { *use_rva = 1.0f; *rva = gtk_adjustment_get_value(GTK_ADJUSTMENT(adj_manual_rva)); } else { *use_rva = -1.0f; *rva = gtk_adjustment_get_value(GTK_ADJUSTMENT(adj_manual_rva)); } if ((name[0] == '\0') || (file[0] == '\0')) { goto display; } ret = 1; } else { name[0] = '\0'; sort_name[0] = '\0'; file[0] = '\0'; comment[0] = '\0'; ret = 0; } gtk_widget_destroy(dialog); return ret;}intconfirm_dialog(char * title, char * text, GtkResponseType resp) { int ret; dialog = gtk_message_dialog_new(GTK_WINDOW(browser_window), GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, text); gtk_window_set_title(GTK_WINDOW(dialog), title); gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); gtk_dialog_set_default_response(GTK_DIALOG(dialog), resp); gtk_container_set_border_width(GTK_CONTAINER(dialog), 5); if (aqualung_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_YES) { ret = 1; } else { ret = 0; } gtk_widget_destroy(dialog); return ret;}intis_store_path_readonly(GtkTreePath * p) { GtkTreeIter iter; GtkTreePath * path; float state; path = gtk_tree_path_copy(p); while (gtk_tree_path_get_depth(path) > 1) { gtk_tree_path_up(path); } gtk_tree_model_get_iter(GTK_TREE_MODEL(music_store), &iter, path); gtk_tree_model_get(GTK_TREE_MODEL(music_store), &iter, 7, &state, -1); gtk_tree_path_free(path); return state < 0;}intis_store_iter_readonly(GtkTreeIter * i) { return is_store_path_readonly(gtk_tree_model_get_path(GTK_TREE_MODEL(music_store), i));}voidset_popup_sensitivity(GtkTreePath * path) { gboolean val = (is_store_path_readonly(path)) ? FALSE : TRUE; gboolean val2 = (vol_window == NULL) ? val : FALSE;#if defined(HAVE_TAGLIB) && defined(HAVE_METAEDIT) gboolean val3 = (batch_tag_root == NULL) ? TRUE : FALSE; gtk_widget_set_sensitive(store__tag, val3); gtk_widget_set_sensitive(artist__tag, val3); gtk_widget_set_sensitive(record__tag, val3); gtk_widget_set_sensitive(track__tag, val3);#endif /* HAVE_TAGLIB && HAVE_METAEDIT */ gtk_widget_set_sensitive(store__build, val); gtk_widget_set_sensitive(store__edit, val); gtk_widget_set_sensitive(store__save, val); gtk_widget_set_sensitive(store__addart, val); gtk_widget_set_sensitive(store__volume, val2); gtk_widget_set_sensitive(artist__add, val); gtk_widget_set_sensitive(artist__build, val); gtk_widget_set_sensitive(artist__edit, val); gtk_widget_set_sensitive(artist__remove, val); gtk_widget_set_sensitive(artist__addrec, val); gtk_widget_set_sensitive(artist__volume, val2); gtk_widget_set_sensitive(record__add, val); gtk_widget_set_sensitive(record__edit, val); gtk_widget_set_sensitive(record__remove, val); gtk_widget_set_sensitive(record__addtrk, val);#ifdef HAVE_CDDB gtk_widget_set_sensitive(record__cddb, val); gtk_widget_set_sensitive(record__cddb_submit, TRUE);#endif /* HAVE_CDDB */ gtk_widget_set_sensitive(record__volume, val2); gtk_widget_set_sensitive(track__add, val); gtk_widget_set_sensitive(track__edit, val); gtk_widget_set_sensitive(track__remove, val); gtk_widget_set_sensitive(track__volume, val2); if (#ifdef HAVE_CDDB cddb_thread_state != CDDB_THREAD_FREE ||#endif /* HAVE_CDDB */ build_thread_state != BUILD_THREAD_FREE) { gtk_widget_set_sensitive(store__build, FALSE); gtk_widget_set_sensitive(artist__build, FALSE);#ifdef HAVE_CDDB gtk_widget_set_sensitive(record__cddb, FALSE); gtk_widget_set_sensitive(record__cddb_submit, FALSE);#endif /* HAVE_CDDB */ }}gbooleanmusic_tree_event_cb(GtkWidget * widget, GdkEvent * event) { GtkTreePath * path; GtkTreeViewColumn * column; if (event->type == GDK_BUTTON_PRESS) { GdkEventButton * bevent = (GdkEventButton *) event; if (bevent->button == 3) { if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(music_tree), bevent->x, bevent->y, &path, &column, NULL, NULL)) { set_popup_sensitivity(path); gtk_tree_view_set_cursor(GTK_TREE_VIEW(music_tree), path, NULL, FALSE); switch (gtk_tree_path_get_depth(path)) { case 1:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -