mp3splt-gtk
|
00001 /********************************************************** 00002 * 00003 * mp3splt-gtk -- utility based on mp3splt, 00004 * for mp3/ogg splitting without decoding 00005 * 00006 * Copyright: (C) 2005-2011 Alexandru Munteanu 00007 * Contact: io_fx@yahoo.fr 00008 * 00009 * http://mp3splt.sourceforge.net/ 00010 * 00011 *********************************************************/ 00012 00013 /********************************************************** 00014 * 00015 * This program is free software; you can redistribute it and/or 00016 * modify it under the terms of the GNU General Public License 00017 * as published by the Free Software Foundation; either version 2 00018 * of the License, or (at your option) any later version. 00019 * 00020 * This program is distributed in the hope that it will be useful, 00021 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00022 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00023 * GNU General Public License for more details. 00024 * 00025 * You should have received a copy of the GNU General Public License 00026 * along with this program; if not, write to the Free Software 00027 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 00028 * USA. 00029 * 00030 *********************************************************/ 00031 00032 /*!******************************************************** 00033 * \file 00034 * The preferences tab 00035 * 00036 * this file contains the code for the preferences tab where 00037 * the preferences can be chosen. 00038 ********************************************************/ 00039 00040 #include <gtk/gtk.h> 00041 #include <glib/gi18n.h> 00042 #include <glib.h> 00043 #include <glib/gstdio.h> 00044 #include <string.h> 00045 00046 #include <libmp3splt/mp3splt.h> 00047 00048 #include "preferences_tab.h" 00049 #include "player.h" 00050 #include "util.h" 00051 #include "player_tab.h" 00052 #include "utilities.h" 00053 #include "main_win.h" 00054 #include "preferences_manager.h" 00055 #include "widgets_helper.h" 00056 #include "combo_helper.h" 00057 #include "radio_helper.h" 00058 #include "options_manager.h" 00059 #include "ui_manager.h" 00060 #include "widgets_helper.h" 00061 00067 GString *outputdirname = NULL; 00068 00070 GtkWidget *directory_entry = NULL; 00071 00073 GtkWidget *output_entry = NULL; 00074 GtkWidget *output_label = NULL; 00075 00077 GtkWidget *player_combo_box = NULL; 00078 00080 GList *player_pref_list = NULL; 00081 GList *text_options_list = NULL; 00082 //selected player 00083 gint selected_player = PLAYER_GSTREAMER; 00084 00086 GtkWidget *radio_button = NULL; 00087 00089 GtkWidget *radio_output = NULL; 00090 00092 GtkWidget *tags_radio = NULL; 00093 GtkWidget *tags_version_radio = NULL; 00094 00095 //split options 00097 GtkWidget *frame_mode = NULL; 00099 GtkWidget *adjust_mode = NULL; 00100 // when ticked, name for split tag derived from filename 00101 GtkWidget *names_from_filename = NULL; 00102 00103 GtkWidget *create_dirs_from_output_files = NULL; 00104 00108 GtkWidget *spinner_adjust_gap = NULL; 00109 GtkWidget *gap_label = NULL; 00110 GtkWidget *spinner_adjust_offset = NULL; 00111 GtkWidget *offset_label = NULL; 00112 GtkWidget *spinner_adjust_threshold = NULL; 00113 GtkWidget *threshold_label = NULL; 00115 00119 GtkWidget *replace_underscore_by_space_check_box = NULL; 00120 GtkComboBox *artist_text_properties_combo = NULL; 00121 GtkComboBox *album_text_properties_combo = NULL; 00122 GtkComboBox *title_text_properties_combo = NULL; 00123 GtkComboBox *comment_text_properties_combo = NULL; 00124 GtkComboBox *genre_combo = NULL; 00125 GtkWidget *comment_tag_entry = NULL; 00126 GtkWidget *regex_entry = NULL; 00127 GtkWidget *test_regex_fname_entry = NULL; 00128 GtkWidget *sample_result_label = NULL; 00129 00130 GtkWidget *extract_tags_box = NULL; 00132 00133 extern GtkWidget *player_box; 00134 extern GtkWidget *queue_files_button; 00135 extern splt_state *the_state; 00136 extern gint selected_split_mode; 00137 extern gint split_file_mode; 00138 extern GtkWidget *spinner_time; 00139 extern GtkWidget *spinner_equal_tracks; 00140 00141 extern gint file_browsed; 00142 00143 static GtkWidget *create_extract_tags_from_filename_options_box(); 00144 static GtkWidget *create_test_regex_table(); 00145 00146 extern void clear_current_description(void); 00147 extern void copy_filename_to_current_description(const gchar *fname); 00148 00149 extern ui_state *ui; 00150 00155 GString *get_checked_language() 00156 { 00157 GSList *radio_button_list; 00158 radio_button_list = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_button)); 00159 GtkWidget *our_button; 00160 00161 //0 = german, 1 = french, 2 = english 00162 our_button = (GtkWidget *)g_slist_nth_data(radio_button_list, 0); 00163 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(our_button))) 00164 { 00165 return g_string_new("de_DE"); 00166 } 00167 else 00168 { 00169 our_button = (GtkWidget *)g_slist_nth_data(radio_button_list, 1); 00170 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(our_button))) 00171 { 00172 return g_string_new("fr_FR"); 00173 } 00174 } 00175 00176 return g_string_new("en"); 00177 } 00178 00180 gboolean get_checked_output_radio_box() 00181 { 00182 //get the radio buttons 00183 GSList *radio_button_list; 00184 radio_button_list = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_output)); 00185 //we check which bubble is checked 00186 GtkToggleButton *test; 00187 gint i, selected = 0; 00188 //O = default output mode 00189 //1 = custom output mode 00190 for(i = 0; i<2;i++) 00191 { 00192 test = (GtkToggleButton *)g_slist_nth_data(radio_button_list,i); 00193 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(test))) 00194 { 00195 selected = i; 00196 } 00197 } 00198 00199 return selected; 00200 } 00201 00203 gint get_checked_tags_version_radio_box() 00204 { 00205 //get the radio buttons 00206 GSList *radio_button_list; 00207 radio_button_list = gtk_radio_button_get_group(GTK_RADIO_BUTTON(tags_version_radio)); 00208 00209 //we check which bubble is checked 00210 GtkToggleButton *test; 00211 gint i, selected = 0; 00212 //O = The same version as the original file 00213 //1 = ID3v1 00214 //2 = ID3v2 00215 //3 = ID3v1 & ID3v2 00216 for(i = 0; i<4;i++) 00217 { 00218 test = (GtkToggleButton *)g_slist_nth_data(radio_button_list,i); 00219 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(test))) 00220 { 00221 selected = i; 00222 } 00223 } 00224 00225 return selected; 00226 } 00227 00229 void outputdirectory_set(gchar *dirname) 00230 { 00231 if(dirname!=NULL) 00232 { 00233 // Free the old string before allocating memory for the new one 00234 if(outputdirname!=NULL)g_string_free(outputdirname,TRUE); 00235 outputdirname=g_string_new(dirname); 00236 00237 // Update the text in the gui field displaying the output 00238 // directory - if this field is already there and thus can 00239 // be updated. 00240 if(directory_entry!=NULL) 00241 gtk_entry_set_text(GTK_ENTRY(directory_entry), dirname); 00242 } 00243 } 00244 00251 gchar* outputdirectory_get() 00252 { 00253 if(outputdirname!=NULL) 00254 return(outputdirname->str); 00255 else 00256 return NULL; 00257 } 00258 00259 void save_preferences(GtkWidget *widget, gpointer data) 00260 { 00261 gchar *filename = get_preferences_filename(); 00262 00263 GKeyFile *my_key_file = g_key_file_new(); 00264 g_key_file_load_from_file(my_key_file, filename, G_KEY_FILE_KEEP_COMMENTS, NULL); 00265 00266 //save_path 00267 g_key_file_set_string(my_key_file, "split", "save_path", 00268 outputdirectory_get()); 00269 //default_player 00270 g_key_file_set_integer(my_key_file, "player", "default_player", selected_player); 00271 00272 #ifdef __WIN32__ 00273 //language 00274 GString *selected_lang; 00275 selected_lang = (GString *)get_checked_language(); 00276 g_key_file_set_string(my_key_file, "general", "language", selected_lang->str); 00277 g_string_free(selected_lang, TRUE); 00278 selected_lang = NULL; 00279 #endif 00280 00281 //frame mode 00282 g_key_file_set_boolean(my_key_file, "split", "frame_mode", 00283 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(frame_mode))); 00284 00285 //adjust mode 00286 g_key_file_set_boolean(my_key_file, "split", "adjust_mode", 00287 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(adjust_mode))); 00288 00289 //adjust threshold 00290 g_key_file_set_integer(my_key_file, "split", "adjust_threshold", 00291 gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinner_adjust_threshold)) * 100); 00292 //adjust offset 00293 g_key_file_set_integer(my_key_file, "split", "adjust_offset", 00294 gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinner_adjust_offset)) * 100); 00295 //adjust gap 00296 g_key_file_set_integer(my_key_file, "split", "adjust_gap", 00297 gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinner_adjust_gap))); 00298 00299 g_key_file_set_boolean(my_key_file, "output", "splitpoint_names_from_filename", 00300 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(names_from_filename))); 00301 00302 //output format 00303 g_key_file_set_string(my_key_file, "output", "output_format", 00304 gtk_entry_get_text(GTK_ENTRY(output_entry))); 00305 //default output format 00306 g_key_file_set_boolean(my_key_file, "output", "default_output_format", 00307 get_checked_output_radio_box()); 00308 g_key_file_set_boolean(my_key_file, "output", "create_dirs_if_needed", 00309 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(create_dirs_from_output_files))); 00310 00311 //tags 00312 g_key_file_set_integer(my_key_file, "split", "tags", rh_get_active_value(tags_radio)); 00313 00314 //replace underscores by space 00315 g_key_file_set_boolean(my_key_file, "split", "replace_underscore_by_space", 00316 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(replace_underscore_by_space_check_box))); 00317 00318 //artist text properties 00319 g_key_file_set_integer(my_key_file, "split", "artist_text_properties", 00320 ch_get_active_value(artist_text_properties_combo)); 00321 //album text properties 00322 g_key_file_set_integer(my_key_file, "split", "album_text_properties", 00323 ch_get_active_value(album_text_properties_combo)); 00324 //title text properties 00325 g_key_file_set_integer(my_key_file, "split", "title_text_properties", 00326 ch_get_active_value(title_text_properties_combo)); 00327 //comment text properties 00328 g_key_file_set_integer(my_key_file, "split", "comment_text_properties", 00329 ch_get_active_value(comment_text_properties_combo)); 00330 00331 //genre 00332 gchar *genre_value = ch_get_active_str_value(genre_combo); 00333 if (genre_value != NULL) 00334 { 00335 g_key_file_set_string(my_key_file, "split", "genre", genre_value); 00336 } 00337 00338 const gchar *comment = gtk_entry_get_text(GTK_ENTRY(comment_tag_entry)); 00339 if (comment != NULL) 00340 { 00341 g_key_file_set_string(my_key_file, "split", "default_comment_tag", comment); 00342 } 00343 00344 const gchar *regex_text = gtk_entry_get_text(GTK_ENTRY(regex_entry)); 00345 if (regex_text != NULL) 00346 { 00347 g_key_file_set_string(my_key_file, "split", "tags_from_filename_regex", regex_text); 00348 } 00349 00350 const gchar *test_regex_fname = gtk_entry_get_text(GTK_ENTRY(test_regex_fname_entry)); 00351 if (test_regex_fname_entry != NULL) 00352 { 00353 g_key_file_set_string(my_key_file, "split", "test_regex_fname", test_regex_fname); 00354 } 00355 00356 //tags version 00357 g_key_file_set_integer(my_key_file, "split", "tags_version", 00358 get_checked_tags_version_radio_box()); 00359 00360 //type of split: split mode 00361 g_key_file_set_integer(my_key_file, "split", "split_mode", 00362 selected_split_mode); 00363 //time value 00364 g_key_file_set_integer(my_key_file, "split", "split_mode_time_value", 00365 gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spinner_time))); 00366 //type of split: file mode 00367 g_key_file_set_integer(my_key_file, "split", "file_mode", 00368 split_file_mode); 00369 //equal time tracks value 00370 g_key_file_set_integer(my_key_file, "split", "split_mode_equal_time_tracks", 00371 gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spinner_equal_tracks))); 00372 00373 const ui_main_window *main_win = ui_get_main_window_infos(ui); 00374 g_key_file_set_integer(my_key_file, "gui", "root_x_position", 00375 main_win->root_x_pos); 00376 g_key_file_set_integer(my_key_file, "gui", "root_y_position", 00377 main_win->root_y_pos); 00378 g_key_file_set_integer(my_key_file, "gui", "width", 00379 main_win->width); 00380 g_key_file_set_integer(my_key_file, "gui", "height", 00381 main_win->height); 00382 00383 const char *browser_directory = ui_get_browser_directory(ui); 00384 if (browser_directory != NULL) 00385 { 00386 g_key_file_set_string(my_key_file, "gui", "browser_directory", browser_directory); 00387 } 00388 00389 gchar *key_data = g_key_file_to_data(my_key_file, NULL, NULL); 00390 00391 //we write to the preference file 00392 FILE *preferences_file; 00393 preferences_file = (FILE *)g_fopen(filename,"w"); 00394 g_fprintf(preferences_file,"%s", key_data); 00395 fclose(preferences_file); 00396 preferences_file = NULL; 00397 00398 //we free memory 00399 g_free(key_data); 00400 g_key_file_free(my_key_file); 00401 00402 if (filename) 00403 { 00404 g_free(filename); 00405 filename = NULL; 00406 } 00407 } 00408 00410 GtkWidget *create_scrolled_window() 00411 { 00412 GtkWidget *scrolled_window; 00413 scrolled_window = gtk_scrolled_window_new (NULL, NULL); 00414 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(scrolled_window), GTK_SHADOW_NONE); 00415 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), 00416 GTK_POLICY_AUTOMATIC, 00417 GTK_POLICY_AUTOMATIC); 00418 return scrolled_window; 00419 } 00420 00422 void output_radio_box_event(GtkToggleButton *radio_b, gpointer data) 00423 { 00424 GtkWidget *output_label = (GtkWidget *)data; 00425 00426 gint selected = get_checked_output_radio_box(); 00427 00428 //custom output mode 00429 if (selected == 0) 00430 { 00431 gtk_widget_set_sensitive(GTK_WIDGET(output_entry), TRUE); 00432 gtk_widget_set_sensitive(GTK_WIDGET(output_label), TRUE); 00433 mp3splt_set_int_option(the_state, SPLT_OPT_OUTPUT_FILENAMES, 00434 SPLT_OUTPUT_FORMAT); 00435 } 00436 else 00437 { 00438 gtk_widget_set_sensitive(GTK_WIDGET(output_entry), FALSE); 00439 gtk_widget_set_sensitive(GTK_WIDGET(output_label), FALSE); 00440 mp3splt_set_int_option(the_state, SPLT_OPT_OUTPUT_FILENAMES, 00441 SPLT_OUTPUT_DEFAULT); 00442 } 00443 00444 save_preferences(NULL, NULL); 00445 } 00446 00448 GtkWidget *create_language_box() 00449 { 00450 GtkWidget *radio_vbox = gtk_vbox_new (FALSE, 0); 00451 00452 radio_button = gtk_radio_button_new_with_label(NULL, "English"); 00453 g_signal_connect(GTK_TOGGLE_BUTTON(radio_button), "toggled", 00454 G_CALLBACK(save_preferences), NULL); 00455 gtk_box_pack_start(GTK_BOX(radio_vbox), radio_button, TRUE, TRUE, 0); 00456 00457 radio_button = gtk_radio_button_new_with_label_from_widget 00458 (GTK_RADIO_BUTTON(radio_button), "Français"); 00459 g_signal_connect(GTK_TOGGLE_BUTTON(radio_button), "toggled", 00460 G_CALLBACK(save_preferences), NULL); 00461 gtk_box_pack_start(GTK_BOX(radio_vbox), radio_button, TRUE, TRUE, 0); 00462 00463 radio_button = gtk_radio_button_new_with_label_from_widget 00464 (GTK_RADIO_BUTTON(radio_button), "Deutsch"); 00465 g_signal_connect(GTK_TOGGLE_BUTTON (radio_button), "toggled", 00466 G_CALLBACK(save_preferences), NULL); 00467 gtk_box_pack_start(GTK_BOX(radio_vbox), radio_button, TRUE, TRUE, 0); 00468 00469 return wh_set_title_and_get_vbox(radio_vbox, 00470 _("<b>Choose language (requires restart)</b>")); 00471 } 00472 00474 GtkWidget *create_pref_language_page() 00475 { 00476 GtkWidget *language_hbox = gtk_hbox_new(FALSE, 0);; 00477 00478 //vertical box inside the scrolled window 00479 GtkWidget *language_inside_hbox = gtk_hbox_new(FALSE, 0);; 00480 00481 //scrolled window 00482 GtkWidget *scrolled_window; 00483 scrolled_window = create_scrolled_window(); 00484 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window), 00485 GTK_WIDGET(language_inside_hbox)); 00486 gtk_box_pack_start(GTK_BOX(language_hbox), scrolled_window, TRUE, TRUE, 0); 00487 00488 //vertical box inside the horizontal box from the scrolled window 00489 GtkWidget *vbox = gtk_vbox_new(FALSE, 0);; 00490 gtk_box_pack_start(GTK_BOX(language_inside_hbox), vbox, TRUE, TRUE, 10); 00491 00492 GtkWidget *lang_box = create_language_box(); 00493 gtk_box_pack_start(GTK_BOX(vbox), lang_box, FALSE, FALSE, 10); 00494 00495 return language_hbox; 00496 } 00497 00499 void browse_dir_button_event(GtkWidget *widget, gpointer data) 00500 { 00501 // file chooser 00502 GtkWidget *dir_chooser; 00503 00504 //creates and shows the dialog 00505 dir_chooser = gtk_file_chooser_dialog_new(_("Choose split directory"), 00506 NULL, 00507 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, 00508 GTK_STOCK_CANCEL, 00509 GTK_RESPONSE_CANCEL, 00510 GTK_STOCK_OPEN, 00511 GTK_RESPONSE_ACCEPT, 00512 NULL); 00513 00514 wh_set_browser_directory_handler(ui, dir_chooser); 00515 00516 if (gtk_dialog_run(GTK_DIALOG(dir_chooser)) == GTK_RESPONSE_ACCEPT) 00517 { 00518 gchar *filename = 00519 gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dir_chooser)); 00520 00521 outputdirectory_set(filename); 00522 00523 g_free (filename); 00524 filename = NULL; 00525 00526 save_preferences(NULL, NULL); 00527 } 00528 00529 //destroys dialog 00530 gtk_widget_destroy(dir_chooser); 00531 } 00532 00534 void disable_adjust_spinners() 00535 { 00536 gtk_widget_set_sensitive(spinner_adjust_threshold, FALSE); 00537 gtk_widget_set_sensitive(spinner_adjust_offset, FALSE); 00538 gtk_widget_set_sensitive(spinner_adjust_gap, FALSE); 00539 gtk_widget_set_sensitive(threshold_label, FALSE); 00540 gtk_widget_set_sensitive(offset_label, FALSE); 00541 gtk_widget_set_sensitive(gap_label, FALSE); 00542 } 00543 00545 void enable_adjust_spinners() 00546 { 00547 gtk_widget_set_sensitive(spinner_adjust_threshold, TRUE); 00548 gtk_widget_set_sensitive(spinner_adjust_offset, TRUE); 00549 gtk_widget_set_sensitive(spinner_adjust_gap, TRUE); 00550 gtk_widget_set_sensitive(threshold_label, TRUE); 00551 gtk_widget_set_sensitive(offset_label, TRUE); 00552 gtk_widget_set_sensitive(gap_label, TRUE); 00553 } 00554 00556 void adjust_event(GtkToggleButton *adjust_mode, gpointer user_data) 00557 { 00558 //if it is toggled 00559 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(adjust_mode))) 00560 { 00561 if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(frame_mode))) 00562 { 00563 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(frame_mode),TRUE); 00564 } 00565 enable_adjust_spinners(); 00566 } 00567 else 00568 { 00569 //disable spinners 00570 disable_adjust_spinners(); 00571 } 00572 00573 save_preferences(NULL, NULL); 00574 } 00575 00577 void frame_event(GtkToggleButton *frame_mode, gpointer user_data) 00578 { 00579 if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(frame_mode))) 00580 { 00581 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(adjust_mode))) 00582 { 00583 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(adjust_mode),FALSE); 00584 } 00585 } 00586 00587 save_preferences(NULL, NULL); 00588 } 00589 00590 void splitpoints_from_filename_event(GtkToggleButton *frame_mode, gpointer user_data) 00591 { 00592 gint splitpoints_from_filename = FALSE; 00593 00594 if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(names_from_filename))) 00595 { 00596 splitpoints_from_filename = FALSE; 00597 } 00598 else 00599 { 00600 splitpoints_from_filename = TRUE; 00601 } 00602 00603 if (splitpoints_from_filename == TRUE && file_browsed == TRUE) 00604 { 00605 copy_filename_to_current_description(inputfilename_get()); 00606 } 00607 else 00608 { 00609 clear_current_description(); 00610 } 00611 00612 save_preferences(NULL, NULL); 00613 } 00614 00616 void set_default_prefs_event(GtkWidget *widget, gpointer data) 00617 { 00618 //set frame mode inactive 00619 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(frame_mode), FALSE); 00620 //set adjust mode inactive 00621 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(adjust_mode), FALSE); 00622 //set adjust mode preferences 00623 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner_adjust_threshold), 00624 SPLT_DEFAULT_PARAM_THRESHOLD); 00625 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner_adjust_offset), 00626 SPLT_DEFAULT_PARAM_OFFSET); 00627 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner_adjust_gap), 00628 SPLT_DEFAULT_PARAM_GAP); 00629 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(names_from_filename), FALSE); 00630 00631 save_preferences(NULL, NULL); 00632 } 00633 00635 void song_dir_button_event(GtkWidget *widget, gpointer data) 00636 { 00637 outputdirectory_set(""); 00638 save_preferences(NULL, NULL); 00639 } 00640 00642 GtkWidget *create_directory_box() 00643 { 00644 GtkWidget *dir_hbox = gtk_hbox_new(FALSE, 0); 00645 00646 //directory entry 00647 directory_entry = gtk_entry_new(); 00648 gtk_editable_set_editable(GTK_EDITABLE(directory_entry), FALSE); 00649 gtk_box_pack_start(GTK_BOX(dir_hbox), directory_entry, TRUE, TRUE, 0); 00650 // Put the right text into the text box containing the output directory 00651 // name if this name was provided on command line 00652 if(outputdirectory_get()!=NULL) 00653 gtk_entry_set_text(GTK_ENTRY(directory_entry), outputdirectory_get()); 00654 00655 //browse dir button 00656 GtkWidget *browse_dir_button = (GtkWidget *) 00657 create_cool_button(GTK_STOCK_DIRECTORY,_("Br_owse dir"), FALSE); 00658 g_signal_connect(G_OBJECT(browse_dir_button), "clicked", 00659 G_CALLBACK(browse_dir_button_event), NULL); 00660 gtk_box_pack_start(GTK_BOX(dir_hbox), browse_dir_button, FALSE, FALSE, 8); 00661 00662 //to set the directory for split files to the current song 00663 //directory 00664 GtkWidget *song_dir_button = (GtkWidget *) 00665 create_cool_button(GTK_STOCK_CLEAR, _("_Song dir"), FALSE); 00666 g_signal_connect(G_OBJECT(song_dir_button), "clicked", 00667 G_CALLBACK(song_dir_button_event), NULL); 00668 gtk_box_pack_start(GTK_BOX(dir_hbox), song_dir_button, FALSE, FALSE, 0); 00669 00670 return wh_set_title_and_get_vbox(dir_hbox, _("<b>Directory for split files</b>")); 00671 } 00672 00674 GtkWidget *create_split_options_box() 00675 { 00676 GtkWidget *vbox = gtk_vbox_new(FALSE, 0); 00677 00678 //names from filename 00679 names_from_filename = gtk_check_button_new_with_mnemonic(_("_Splitpoint name from filename (testing)")); 00680 gtk_box_pack_start(GTK_BOX(vbox), names_from_filename, FALSE, FALSE, 0); 00681 g_signal_connect(G_OBJECT(names_from_filename), "toggled", 00682 G_CALLBACK(splitpoints_from_filename_event), NULL); 00683 00684 create_dirs_from_output_files = 00685 gtk_check_button_new_with_mnemonic(_("_Create directories from filenames ")); 00686 gtk_box_pack_start(GTK_BOX(vbox), create_dirs_from_output_files, FALSE, FALSE, 0); 00687 g_signal_connect(G_OBJECT(create_dirs_from_output_files), "toggled", 00688 G_CALLBACK(save_preferences), NULL); 00689 00690 //frame mode option 00691 frame_mode = gtk_check_button_new_with_mnemonic(_("F_rame mode (useful" 00692 " for mp3 VBR) (mp3 only)")); 00693 gtk_box_pack_start(GTK_BOX(vbox), frame_mode, FALSE, FALSE, 0); 00694 g_signal_connect(G_OBJECT(frame_mode), "toggled", 00695 G_CALLBACK(frame_event), NULL); 00696 00697 //auto adjust option 00698 adjust_mode = gtk_check_button_new_with_mnemonic(_("_Auto-adjust mode (uses" 00699 " silence detection to auto-adjust splitpoints)")); 00700 gtk_box_pack_start(GTK_BOX(vbox), adjust_mode, FALSE, FALSE, 0); 00701 g_signal_connect(G_OBJECT(adjust_mode), "toggled", 00702 G_CALLBACK(adjust_event), NULL); 00703 00704 //parameters for the adjust option 00705 GtkWidget *horiz_fake = gtk_hbox_new(FALSE,0); 00706 gtk_box_pack_start(GTK_BOX(vbox), horiz_fake, FALSE, FALSE, 0); 00707 00708 GtkWidget *param_vbox = gtk_vbox_new(FALSE,0); 00709 gtk_box_pack_start(GTK_BOX(horiz_fake), param_vbox, FALSE, FALSE, 25); 00710 00711 //threshold level 00712 horiz_fake = gtk_hbox_new(FALSE,0); 00713 gtk_box_pack_start(GTK_BOX(param_vbox), horiz_fake, FALSE, FALSE, 0); 00714 00715 threshold_label = gtk_label_new(_("Threshold level (dB):")); 00716 gtk_box_pack_start(GTK_BOX(horiz_fake), threshold_label, FALSE, FALSE, 0); 00717 00718 GtkAdjustment *adj = (GtkAdjustment *) gtk_adjustment_new(0.0, -96.0, 0.0, 00719 0.5, 10.0, 0.0); 00720 spinner_adjust_threshold = gtk_spin_button_new (adj, 0.5, 2); 00721 g_signal_connect(G_OBJECT(spinner_adjust_threshold), "value_changed", 00722 G_CALLBACK(save_preferences), NULL); 00723 gtk_box_pack_start(GTK_BOX(horiz_fake), spinner_adjust_threshold, 00724 FALSE, FALSE, 6); 00725 00726 //offset level 00727 horiz_fake = gtk_hbox_new(FALSE,0); 00728 gtk_box_pack_start(GTK_BOX(param_vbox), horiz_fake, FALSE, FALSE, 0); 00729 00730 offset_label = gtk_label_new(_("Cutpoint offset (0 is the begin of silence " 00731 "and 1 the end):")); 00732 gtk_box_pack_start(GTK_BOX(horiz_fake), offset_label, FALSE, FALSE, 0); 00733 00734 //adjustement for the offset spinner 00735 adj = (GtkAdjustment *)gtk_adjustment_new(0.0, -2, 2, 0.05, 10.0, 0.0); 00736 //the offset spinner 00737 spinner_adjust_offset = gtk_spin_button_new (adj, 0.05, 2); 00738 g_signal_connect(G_OBJECT(spinner_adjust_offset), "value_changed", 00739 G_CALLBACK(save_preferences), NULL); 00740 gtk_box_pack_start(GTK_BOX(horiz_fake), spinner_adjust_offset, 00741 FALSE, FALSE, 6); 00742 00743 //gap level (seconds) 00744 horiz_fake = gtk_hbox_new(FALSE,0); 00745 gtk_box_pack_start(GTK_BOX(param_vbox), horiz_fake, FALSE, FALSE, 0); 00746 00747 gap_label = gtk_label_new(_("Gap level (seconds around splitpoint to " 00748 "search for silence):")); 00749 gtk_box_pack_start(GTK_BOX(horiz_fake), gap_label, FALSE, FALSE, 0); 00750 00751 adj = (GtkAdjustment *) gtk_adjustment_new(0.0, 0, 2000, 1.0, 10.0, 0.0); 00752 spinner_adjust_gap = gtk_spin_button_new (adj, 1, 0); 00753 g_signal_connect(G_OBJECT(spinner_adjust_gap), "value_changed", 00754 G_CALLBACK(save_preferences), NULL); 00755 gtk_box_pack_start(GTK_BOX(horiz_fake), spinner_adjust_gap, FALSE, FALSE, 6); 00756 00757 disable_adjust_spinners(); 00758 00759 //set default preferences button 00760 //horizontal box fake for the gap level 00761 horiz_fake = gtk_hbox_new(FALSE,0); 00762 gtk_box_pack_start(GTK_BOX(vbox), horiz_fake, FALSE, FALSE, 0); 00763 00764 GtkWidget *set_default_prefs_button = 00765 (GtkWidget *)create_cool_button(GTK_STOCK_PREFERENCES, 00766 _("Set _default split" " options"),FALSE); 00767 g_signal_connect(G_OBJECT(set_default_prefs_button), "clicked", 00768 G_CALLBACK(set_default_prefs_event), NULL); 00769 gtk_box_pack_start (GTK_BOX (horiz_fake), set_default_prefs_button, 00770 FALSE, FALSE, 5); 00771 00772 return wh_set_title_and_get_vbox(vbox, _("<b>Split options</b>")); 00773 } 00774 00776 GtkWidget *create_pref_splitpoints_page() 00777 { 00778 GtkWidget *general_hbox = gtk_hbox_new(FALSE,0); 00779 GtkWidget *inside_hbox = gtk_hbox_new(FALSE,0); 00780 00781 GtkWidget *scrolled_window = create_scrolled_window(); 00782 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window), 00783 GTK_WIDGET(inside_hbox)); 00784 gtk_box_pack_start(GTK_BOX(general_hbox), scrolled_window, TRUE, TRUE, 0); 00785 00786 //vertical box inside the horizontal box from the scrolled window 00787 GtkWidget *inside_vbox = gtk_vbox_new(FALSE, 0);; 00788 gtk_box_pack_start(GTK_BOX(inside_hbox), inside_vbox, TRUE, TRUE, 10); 00789 00790 GtkWidget *dir_box = create_directory_box(); 00791 gtk_box_pack_start(GTK_BOX(inside_vbox), dir_box, FALSE, FALSE, 10); 00792 00793 GtkWidget *split_options_box = create_split_options_box(); 00794 gtk_box_pack_start(GTK_BOX(inside_vbox), split_options_box, FALSE, FALSE, 2); 00795 00796 return general_hbox; 00797 } 00798 00800 void player_combo_box_event(GtkComboBox *widget, gpointer data) 00801 { 00802 disconnect_button_event(NULL, NULL); 00803 00804 selected_player = ch_get_active_value(widget); 00805 00806 if (selected_player == PLAYER_GSTREAMER) 00807 { 00808 hide_connect_button(); 00809 } 00810 else 00811 { 00812 show_connect_button(); 00813 } 00814 00815 gtk_widget_show(player_box); 00816 gtk_widget_show(queue_files_button); 00817 00818 save_preferences(NULL, NULL); 00819 } 00820 00822 GtkWidget *create_player_options_box() 00823 { 00824 GtkWidget *horiz_fake = gtk_hbox_new(FALSE,0); 00825 00826 GtkWidget *label = gtk_label_new(_("Choose a player:")); 00827 gtk_box_pack_start(GTK_BOX(horiz_fake), label, FALSE, FALSE, 0); 00828 00829 player_combo_box = GTK_WIDGET(ch_new_combo()); 00830 00831 #ifndef NO_AUDACIOUS 00832 ch_append_to_combo(GTK_COMBO_BOX(player_combo_box), "Audacious", PLAYER_AUDACIOUS); 00833 #endif 00834 ch_append_to_combo(GTK_COMBO_BOX(player_combo_box), "SnackAmp", PLAYER_SNACKAMP); 00835 #ifndef NO_GSTREAMER 00836 ch_append_to_combo(GTK_COMBO_BOX(player_combo_box), "GStreamer", PLAYER_GSTREAMER); 00837 #endif 00838 00839 g_signal_connect(G_OBJECT(player_combo_box), "changed", 00840 G_CALLBACK(player_combo_box_event), NULL); 00841 00842 gtk_box_pack_start(GTK_BOX(horiz_fake), player_combo_box, FALSE, FALSE, 12); 00843 00844 return wh_set_title_and_get_vbox(horiz_fake, _("<b>Player options</b>")); 00845 } 00846 00848 GtkWidget *create_pref_player_page() 00849 { 00850 GtkWidget *player_hbox = gtk_hbox_new(FALSE, 0);; 00851 00852 GtkWidget *inside_hbox = gtk_hbox_new(FALSE, 0);; 00853 00854 GtkWidget *scrolled_window = create_scrolled_window(); 00855 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window), 00856 GTK_WIDGET(inside_hbox)); 00857 gtk_box_pack_start(GTK_BOX(player_hbox), scrolled_window, TRUE, TRUE, 0); 00858 00859 //vertical box inside the horizontal box from the scrolled window 00860 GtkWidget *vbox = gtk_vbox_new(FALSE, 0);; 00861 gtk_box_pack_start(GTK_BOX(inside_hbox), vbox, TRUE, TRUE, 10); 00862 00863 //choose player combo box 00864 GtkWidget *player_options_box = create_player_options_box(); 00865 gtk_box_pack_start(GTK_BOX(vbox), player_options_box, FALSE, FALSE, 10); 00866 00867 return player_hbox; 00868 } 00869 00871 gboolean output_entry_event(GtkWidget *widget, GdkEventKey *event, 00872 gpointer user_data) 00873 { 00874 //we check if the output format is correct 00875 const char *data = gtk_entry_get_text(GTK_ENTRY(output_entry)); 00876 gint error = SPLT_OUTPUT_FORMAT_OK; 00877 mp3splt_set_oformat(the_state, data, &error); 00878 remove_status_message(); 00879 print_status_bar_confirmation(error); 00880 00881 save_preferences(NULL, NULL); 00882 00883 return FALSE; 00884 } 00885 00887 GtkWidget *create_output_filename_box() 00888 { 00889 GtkWidget *vbox = gtk_vbox_new(FALSE, 0); 00890 00891 //default/custom radio buttons 00892 radio_output = gtk_radio_button_new_with_label(NULL, _("Default format")); 00893 gtk_box_pack_start(GTK_BOX(vbox), radio_output, FALSE, FALSE, 0); 00894 00895 radio_output = gtk_radio_button_new_with_label_from_widget 00896 (GTK_RADIO_BUTTON(radio_output), _("Custom format")); 00897 gtk_box_pack_start(GTK_BOX(vbox), radio_output, FALSE, FALSE, 0); 00898 00899 //output entry 00900 GtkWidget *horiz_fake = gtk_hbox_new(FALSE,0); 00901 gtk_box_pack_start(GTK_BOX(vbox), horiz_fake, FALSE, FALSE, 5); 00902 00903 output_entry = gtk_entry_new(); 00904 gtk_editable_set_editable(GTK_EDITABLE(output_entry), TRUE); 00905 g_signal_connect(G_OBJECT(output_entry), "key_release_event", 00906 G_CALLBACK(output_entry_event), NULL); 00907 gtk_entry_set_max_length(GTK_ENTRY(output_entry),244); 00908 gtk_box_pack_start(GTK_BOX(horiz_fake), output_entry, TRUE, TRUE, 0); 00909 00910 //output label 00911 horiz_fake = gtk_hbox_new(FALSE,0); 00912 gtk_box_pack_start(GTK_BOX(vbox), horiz_fake, FALSE, FALSE, 5); 00913 output_label = gtk_label_new(_(" @f - file name\n" 00914 " @a - artist name\n" 00915 " @p - performer of each song (does not" 00916 " always exist)\n" 00917 " @b - album title\n" 00918 " @t - song title\n" 00919 " @g - genre\n" 00920 " @n - track number")); 00921 gtk_box_pack_start(GTK_BOX(horiz_fake), output_label, FALSE, FALSE, 0); 00922 00923 g_signal_connect(GTK_TOGGLE_BUTTON(radio_output), 00924 "toggled", G_CALLBACK(output_radio_box_event), output_label); 00925 00926 return wh_set_title_and_get_vbox(vbox, _("<b>Output filename format</b>")); 00927 } 00928 00930 GtkWidget *create_pref_output_page() 00931 { 00932 GtkWidget *output_hbox = gtk_hbox_new(FALSE, 0);; 00933 GtkWidget *output_inside_hbox = gtk_hbox_new(FALSE, 0);; 00934 00935 GtkWidget *scrolled_window = create_scrolled_window(); 00936 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window), 00937 GTK_WIDGET(output_inside_hbox)); 00938 gtk_box_pack_start(GTK_BOX(output_hbox), scrolled_window, TRUE, TRUE, 0); 00939 00940 GtkWidget *vbox = gtk_vbox_new(FALSE, 0);; 00941 gtk_box_pack_start(GTK_BOX(output_inside_hbox), vbox, TRUE, TRUE, 10); 00942 00943 GtkWidget *output_fname_box = create_output_filename_box(); 00944 gtk_box_pack_start(GTK_BOX(vbox), output_fname_box, FALSE, FALSE, 10); 00945 00946 return output_hbox; 00947 } 00948 00949 void change_tags_options(GtkToggleButton *button, gpointer data) 00950 { 00951 if (extract_tags_box != NULL) 00952 { 00953 if (rh_get_active_value(tags_radio) == TAGS_FROM_FILENAME) 00954 { 00955 gtk_widget_set_sensitive(extract_tags_box, SPLT_TRUE); 00956 } 00957 else 00958 { 00959 gtk_widget_set_sensitive(extract_tags_box, SPLT_FALSE); 00960 } 00961 } 00962 00963 save_preferences(NULL, NULL); 00964 } 00965 00967 GtkWidget *create_tags_options_box() 00968 { 00969 GtkWidget *vbox = gtk_vbox_new(FALSE, 0); 00970 00971 tags_radio = rh_append_radio_to_vbox(tags_radio, _("Original file tags"), 00972 ORIGINAL_FILE_TAGS, change_tags_options, vbox); 00973 00974 tags_radio = rh_append_radio_to_vbox(tags_radio, _("Default tags (cddb or cue tags)"), 00975 DEFAULT_TAGS, change_tags_options, vbox); 00976 00977 tags_radio = rh_append_radio_to_vbox(tags_radio, _("No tags"), 00978 NO_TAGS, change_tags_options, vbox); 00979 00980 tags_radio = rh_append_radio_to_vbox(tags_radio, _("Extract tags from filename"), 00981 TAGS_FROM_FILENAME, change_tags_options, vbox); 00982 00983 extract_tags_box = create_extract_tags_from_filename_options_box(); 00984 gtk_widget_set_sensitive(extract_tags_box, SPLT_FALSE); 00985 gtk_box_pack_start(GTK_BOX(vbox), extract_tags_box, FALSE, FALSE, 2); 00986 00987 return wh_set_title_and_get_vbox(vbox, _("<b>Split files tags</b>")); 00988 } 00989 00990 static GtkComboBox *create_genre_combo() 00991 { 00992 GtkComboBox *combo = ch_new_combo(); 00993 00994 int i = 0; 00995 for (i = 0;i < SPLT_ID3V1_NUMBER_OF_GENRES;i++) 00996 { 00997 ch_append_to_combo(combo, splt_id3v1_genres[i], 0); 00998 } 00999 01000 g_signal_connect(G_OBJECT(combo), "changed", G_CALLBACK(save_preferences), NULL); 01001 01002 return combo; 01003 } 01004 01005 static GtkComboBox *create_text_preferences_combo() 01006 { 01007 GtkComboBox *combo = ch_new_combo(); 01008 01009 ch_append_to_combo(combo, _("No change"), SPLT_NO_CONVERSION); 01010 ch_append_to_combo(combo, _("lowercase"), SPLT_TO_LOWERCASE); 01011 ch_append_to_combo(combo, _("UPPERCASE"), SPLT_TO_UPPERCASE); 01012 ch_append_to_combo(combo, _("First uppercase"), SPLT_TO_FIRST_UPPERCASE); 01013 ch_append_to_combo(combo, _("Word Uppercase"), SPLT_TO_WORD_FIRST_UPPERCASE); 01014 01015 g_signal_connect(G_OBJECT(combo), "changed", G_CALLBACK(save_preferences), NULL); 01016 01017 return combo; 01018 } 01019 01020 void test_regex_event(GtkWidget *widget, gpointer data) 01021 { 01022 put_tags_from_filename_regex_options(); 01023 const gchar *test_regex_filename = gtk_entry_get_text(GTK_ENTRY(test_regex_fname_entry)); 01024 mp3splt_set_filename_to_split(the_state, test_regex_filename); 01025 01026 gint error = SPLT_OK; 01027 splt_tags *tags = mp3splt_parse_filename_regex(the_state, &error); 01028 print_status_bar_confirmation(error); 01029 01030 if (error >= 0) 01031 { 01032 GString *regex_result = g_string_new(NULL); 01033 01034 g_string_append(regex_result, _("<artist>: ")); 01035 if (tags->artist) 01036 { 01037 g_string_append(regex_result, tags->artist); 01038 } 01039 g_string_append(regex_result, "\n"); 01040 01041 g_string_append(regex_result, _("<album>: ")); 01042 if (tags->album) 01043 { 01044 g_string_append(regex_result, tags->album); 01045 } 01046 g_string_append(regex_result, "\n"); 01047 01048 01049 g_string_append(regex_result, _("<title>: ")); 01050 if (tags->title) 01051 { 01052 g_string_append(regex_result, tags->title); 01053 } 01054 g_string_append(regex_result, "\n"); 01055 01056 g_string_append(regex_result, _("<genre>: ")); 01057 if (tags->genre) 01058 { 01059 g_string_append(regex_result, tags->genre); 01060 } 01061 g_string_append(regex_result, "\n"); 01062 01063 g_string_append(regex_result, _("<comment>: ")); 01064 if (tags->comment) 01065 { 01066 g_string_append(regex_result, tags->comment); 01067 } 01068 g_string_append(regex_result, "\n"); 01069 01070 g_string_append(regex_result, _("<year>: ")); 01071 if (tags->year) 01072 { 01073 g_string_append(regex_result, tags->year); 01074 } 01075 g_string_append(regex_result, "\n"); 01076 01077 g_string_append(regex_result, _("<track>: ")); 01078 if (tags->track >= 0) 01079 { 01080 g_string_append_printf(regex_result, "%d", tags->track); 01081 } 01082 01083 gchar *regex_result_text = g_string_free(regex_result, FALSE); 01084 if (regex_result_text) 01085 { 01086 gtk_label_set_text(GTK_LABEL(sample_result_label), regex_result_text); 01087 g_free(regex_result_text); 01088 } 01089 } 01090 else 01091 { 01092 gtk_label_set_text(GTK_LABEL(sample_result_label), ""); 01093 } 01094 01095 mp3splt_free_one_tag(tags); 01096 } 01097 01098 static GtkWidget *create_extract_tags_from_filename_options_box() 01099 { 01100 GtkWidget *table = wh_new_table(); 01101 01102 regex_entry = wh_new_entry(save_preferences); 01103 wh_add_in_table_with_label_expand(table, _("Regular expression:"), regex_entry); 01104 01105 GtkWidget *regex_label = gtk_label_new(_( 01106 "Above enter PERL-like regular expression using named subgroups.\nFollowing names are recognized:\n" 01107 " (?<artist>) - artist name\n" 01108 " (?<album>) - album title\n" 01109 " (?<title>) - track title\n" 01110 " (?<tracknum>) - current track number\n" 01111 //" (?<tracks>) - total number of tracks\n" 01112 " (?<year>) - year of emission\n" 01113 " (?<genre>) - genre\n" 01114 " (?<comment>) - comment")); 01115 gtk_misc_set_alignment(GTK_MISC(regex_label), 0.0, 0.5); 01116 wh_add_in_table(table, wh_put_in_new_hbox_with_margin_level(regex_label, 2)); 01117 01118 text_options_list = 01119 g_list_append(text_options_list, GINT_TO_POINTER(SPLT_NO_CONVERSION)); 01120 text_options_list = 01121 g_list_append(text_options_list, GINT_TO_POINTER(SPLT_TO_LOWERCASE)); 01122 text_options_list = 01123 g_list_append(text_options_list, GINT_TO_POINTER(SPLT_TO_UPPERCASE)); 01124 text_options_list = 01125 g_list_append(text_options_list, GINT_TO_POINTER(SPLT_TO_FIRST_UPPERCASE)); 01126 text_options_list = 01127 g_list_append(text_options_list, GINT_TO_POINTER(SPLT_TO_WORD_FIRST_UPPERCASE)); 01128 01129 replace_underscore_by_space_check_box = 01130 gtk_check_button_new_with_mnemonic(_("_Replace underscores by spaces")); 01131 g_signal_connect(G_OBJECT(replace_underscore_by_space_check_box), "toggled", 01132 G_CALLBACK(save_preferences), NULL); 01133 01134 wh_add_in_table(table, replace_underscore_by_space_check_box); 01135 01136 artist_text_properties_combo = create_text_preferences_combo(); 01137 wh_add_in_table_with_label(table, 01138 _("Artist text properties:"), GTK_WIDGET(artist_text_properties_combo)); 01139 01140 album_text_properties_combo = create_text_preferences_combo(); 01141 wh_add_in_table_with_label(table, 01142 _("Album text properties:"), GTK_WIDGET(album_text_properties_combo)); 01143 01144 title_text_properties_combo = create_text_preferences_combo(); 01145 wh_add_in_table_with_label(table, 01146 _("Title text properties:"), GTK_WIDGET(title_text_properties_combo)); 01147 01148 comment_text_properties_combo = create_text_preferences_combo(); 01149 wh_add_in_table_with_label(table, 01150 _("Comment text properties:"), GTK_WIDGET(comment_text_properties_combo)); 01151 01152 genre_combo = create_genre_combo(); 01153 wh_add_in_table_with_label(table, _("Genre tag:"), GTK_WIDGET(genre_combo)); 01154 01155 comment_tag_entry = wh_new_entry(save_preferences); 01156 wh_add_in_table_with_label_expand(table, _("Comment tag:"), comment_tag_entry); 01157 01158 GtkWidget *test_regex_expander = gtk_expander_new(_("Regular expression test")); 01159 gtk_container_add(GTK_CONTAINER(test_regex_expander), create_test_regex_table()); 01160 wh_add_in_table(table, test_regex_expander); 01161 01162 return wh_put_in_new_hbox_with_margin_level(GTK_WIDGET(table), 3); 01163 } 01164 01165 static GtkWidget *create_test_regex_table() 01166 { 01167 GtkWidget *table = wh_new_table(); 01168 01169 GtkWidget *sample_test_hbox = gtk_hbox_new(FALSE, 0); 01170 test_regex_fname_entry = wh_new_entry(save_preferences); 01171 gtk_box_pack_start(GTK_BOX(sample_test_hbox), test_regex_fname_entry, TRUE, TRUE, 0); 01172 01173 GtkWidget *test_regex_button = wh_new_button(_("_Test")); 01174 gtk_box_pack_start(GTK_BOX(sample_test_hbox), test_regex_button, FALSE, FALSE, 5); 01175 g_signal_connect(G_OBJECT(test_regex_button), "clicked", 01176 G_CALLBACK(test_regex_event), NULL); 01177 01178 wh_add_in_table_with_label_expand(table, _("Sample filename:"), sample_test_hbox); 01179 01180 sample_result_label = gtk_label_new(""); 01181 gtk_misc_set_alignment(GTK_MISC(sample_result_label), 0.0, 0.5); 01182 wh_add_in_table_with_label_expand(table, _("Sample result:"), sample_result_label); 01183 01184 return wh_put_in_new_hbox_with_margin_level(GTK_WIDGET(table), 3); 01185 } 01186 01188 GtkWidget *create_tags_version_box() 01189 { 01190 GtkWidget *vbox = gtk_vbox_new(FALSE, 0); 01191 01192 tags_version_radio = 01193 gtk_radio_button_new_with_label(NULL, _("ID3v1 & ID3v2 tags")); 01194 gtk_box_pack_start(GTK_BOX(vbox), tags_version_radio, FALSE, FALSE, 0); 01195 g_signal_connect(GTK_TOGGLE_BUTTON(tags_version_radio), "toggled", 01196 G_CALLBACK(save_preferences), NULL); 01197 01198 tags_version_radio = 01199 gtk_radio_button_new_with_label_from_widget 01200 (GTK_RADIO_BUTTON(tags_version_radio), _("ID3v2 tags")); 01201 gtk_box_pack_start(GTK_BOX(vbox), tags_version_radio, FALSE, FALSE, 0); 01202 g_signal_connect(GTK_TOGGLE_BUTTON(tags_version_radio), "toggled", 01203 G_CALLBACK(save_preferences), NULL); 01204 01205 tags_version_radio = gtk_radio_button_new_with_label_from_widget 01206 (GTK_RADIO_BUTTON(tags_version_radio), _("ID3v1 tags")); 01207 g_signal_connect(GTK_TOGGLE_BUTTON(tags_version_radio), "toggled", 01208 G_CALLBACK(save_preferences), NULL); 01209 gtk_box_pack_start(GTK_BOX(vbox), tags_version_radio, FALSE, FALSE, 0); 01210 01211 tags_version_radio = gtk_radio_button_new_with_label_from_widget 01212 (GTK_RADIO_BUTTON (tags_version_radio),_("Same tags version as the input file")); 01213 g_signal_connect(GTK_TOGGLE_BUTTON(tags_version_radio), "toggled", 01214 G_CALLBACK(save_preferences), NULL); 01215 gtk_box_pack_start(GTK_BOX(vbox), tags_version_radio, FALSE, FALSE, 0); 01216 01217 return wh_set_title_and_get_vbox(vbox, _("<b>Tags version (mp3 only)</b>")); 01218 } 01219 01221 GtkWidget *create_pref_tags_page() 01222 { 01223 GtkWidget *outside_vbox = gtk_vbox_new(FALSE, 0);; 01224 GtkWidget *inside_hbox = gtk_hbox_new(FALSE, 0); 01225 01226 GtkWidget *scrolled_window = create_scrolled_window(); 01227 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window), 01228 GTK_WIDGET(inside_hbox)); 01229 gtk_box_pack_start(GTK_BOX(outside_vbox), scrolled_window, TRUE, TRUE, 0); 01230 01231 GtkWidget *vbox = gtk_vbox_new(FALSE, 0);; 01232 gtk_box_pack_start(GTK_BOX(inside_hbox), vbox, TRUE, TRUE, 10); 01233 01234 GtkWidget *tags_version_box = create_tags_version_box(); 01235 gtk_box_pack_start(GTK_BOX(vbox), tags_version_box, FALSE, FALSE, 10); 01236 01237 GtkWidget *tags_opts_box = create_tags_options_box(); 01238 gtk_box_pack_start(GTK_BOX(vbox), tags_opts_box, FALSE, FALSE, 0); 01239 01240 return outside_vbox; 01241 } 01242 01244 GtkWidget *create_choose_preferences() 01245 { 01246 //our preferences vbox 01247 GtkWidget *pref_vbox = gtk_vbox_new(FALSE, 0); 01248 01249 GtkWidget *notebook = gtk_notebook_new(); 01250 gtk_box_pack_start(GTK_BOX(pref_vbox), notebook, TRUE, TRUE, 0); 01251 01252 gtk_notebook_popup_enable(GTK_NOTEBOOK(notebook)); 01253 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), TRUE); 01254 gtk_notebook_set_show_border(GTK_NOTEBOOK(notebook), FALSE); 01255 gtk_notebook_set_scrollable(GTK_NOTEBOOK(notebook), TRUE); 01256 01257 /* split preferences */ 01258 GtkWidget *splitpoints_prefs = (GtkWidget *)create_pref_splitpoints_page(); 01259 GtkWidget *notebook_label = gtk_label_new(_("Split")); 01260 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), splitpoints_prefs, 01261 (GtkWidget *)notebook_label); 01262 01263 /* tags preferences */ 01264 GtkWidget *tags_prefs = (GtkWidget *)create_pref_tags_page(); 01265 notebook_label = gtk_label_new(_("Tags")); 01266 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), tags_prefs, 01267 (GtkWidget *)notebook_label); 01268 01269 /* output preferences */ 01270 GtkWidget *output_prefs = (GtkWidget *)create_pref_output_page(); 01271 notebook_label = gtk_label_new(_("Output")); 01272 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), output_prefs, 01273 (GtkWidget *)notebook_label); 01274 01275 /* player preferences */ 01276 GtkWidget *player_prefs = (GtkWidget *)create_pref_player_page(); 01277 notebook_label = gtk_label_new(_("Player")); 01278 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), player_prefs, 01279 (GtkWidget *)notebook_label); 01280 01281 /* language preferences page */ 01282 #ifdef __WIN32__ 01283 GtkWidget *language_prefs = (GtkWidget *)create_pref_language_page(); 01284 notebook_label = gtk_label_new(_("Language")); 01285 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), language_prefs, 01286 (GtkWidget *)notebook_label); 01287 #endif 01288 01289 return pref_vbox; 01290 }