43 static gboolean check_if_splitpoint_does_not_exists(gint minutes, gint seconds, gint hundr_secs,
46 GtkTreeModel *model = gtk_tree_view_get_model(ui->gui->tree_view);
49 if (!gtk_tree_model_get_iter_first(model, &iter))
60 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter,
61 COL_MINUTES, &tree_minutes,
62 COL_SECONDS, &tree_seconds,
63 COL_HUNDR_SECS, &tree_hundr_secs,
66 GtkTreePath *path = gtk_tree_model_get_path(model, &iter);
67 gint i = gtk_tree_path_get_indices (path)[0];
69 if ((minutes == tree_minutes) &&
70 (seconds == tree_seconds) &&
71 (hundr_secs == tree_hundr_secs) &&
74 gtk_tree_path_free(path);
78 gtk_tree_path_free(path);
80 if (!gtk_tree_model_iter_next(model, &iter))
94 static void update_add_button(
ui_state *ui)
97 if (check_if_splitpoint_does_not_exists(status->spin_mins, status->spin_secs, status->spin_hundr_secs,-1, ui))
99 gtk_widget_set_sensitive(GTK_WIDGET(ui->gui->add_button), TRUE);
103 gtk_widget_set_sensitive(GTK_WIDGET(ui->gui->add_button), FALSE);
110 ui->status->spin_mins = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(ui->gui->spinner_minutes));
111 update_add_button(ui);
117 ui->status->spin_secs = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(ui->gui->spinner_seconds));
118 update_add_button(ui);
124 ui->status->spin_hundr_secs = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(ui->gui->spinner_hundr_secs));
125 update_add_button(ui);
129 static GtkTreeModel *create_model()
131 GtkListStore * model = gtk_list_store_new(NUM_COLUMNS,
141 return GTK_TREE_MODEL(model);
145 static void recompute_length_column(
ui_state *ui)
147 gint line_mins, line_secs, line_hundr;
148 gint line1_mins, line1_secs, line1_hundr;
150 gchar new_length_string[30];
152 GtkTreeModel *model = gtk_tree_view_get_model(ui->gui->tree_view);
155 for (number = 0;number < ui->infos->splitnumber; number++)
157 GtkTreePath *path = gtk_tree_path_new_from_indices(number ,-1);
159 gtk_tree_model_get_iter(model, &iter, path);
161 if (number != ui->infos->splitnumber-1)
163 GtkTreePath *path2 = gtk_tree_path_new_from_indices (number+1 ,-1);
165 gtk_tree_model_get_iter(model, &iter2, path2);
167 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter,
168 COL_MINUTES, &line_mins,
169 COL_SECONDS, &line_secs,
170 COL_HUNDR_SECS, &line_hundr,
172 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter2,
173 COL_MINUTES, &line1_mins,
174 COL_SECONDS, &line1_secs,
175 COL_HUNDR_SECS, &line1_hundr,
178 gint result_secs = 0,result_hundr = 0;
179 gint result_mins = line1_mins - line_mins;
180 if ((result_secs = line1_secs - line_secs) < 0)
182 result_secs = 60 - line_secs + line1_secs;
186 if ((result_hundr = line1_hundr - line_hundr) < 0)
188 result_hundr = 100 - line_hundr + line1_hundr;
197 g_snprintf(new_length_string, 30,
"%d:%02d:%02d", result_mins, result_secs, result_hundr);
199 gtk_tree_path_free(path2);
203 g_snprintf(new_length_string, 30,
"%s",
"-");
206 gtk_tree_path_free(path);
208 gtk_list_store_set(GTK_LIST_STORE(model), &iter, COL_NUMBER, new_length_string, -1);
219 static gboolean check_if_description_exists(gchar *descr, gint number,
ui_state *ui)
221 GtkTreeModel *model = gtk_tree_view_get_model(ui->gui->tree_view);
224 if (!gtk_tree_model_get_iter_first(model, &iter))
232 gchar *description = NULL;
233 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter,
234 COL_DESCRIPTION, &description,
237 if (description != NULL && strcmp(descr, description) == 0 && count != number)
245 if (!gtk_tree_model_iter_next(model, &iter))
257 gint splitpoint_selected = -1;
259 GtkTreeModel *model = gtk_tree_view_get_model(gui->tree_view);
260 GtkTreeSelection *selection = gtk_tree_view_get_selection(gui->tree_view);
262 GList *selected_list =
263 gtk_tree_selection_get_selected_rows(GTK_TREE_SELECTION(selection), &model);
265 if (g_list_length(selected_list) > 0)
267 GList *current_element = g_list_first(selected_list);
268 GtkTreePath *path = current_element->data;
269 splitpoint_selected = gtk_tree_path_get_indices (path)[0];
271 g_list_foreach(selected_list, (GFunc)gtk_tree_path_free, NULL);
272 g_list_free(selected_list);
275 return splitpoint_selected;
279 static void row_selection_event(GtkTreeSelection *selection,
ui_state *ui)
281 gtk_widget_set_sensitive(ui->gui->remove_row_button, TRUE);
294 static void update_current_description(gchar *descr, gint number,
ui_state *ui)
298 gchar *current_description = ui->status->current_description;
300 g_snprintf(current_description, 255,
"%s", descr);
302 while (ll < ui->infos->splitnumber)
304 if (check_if_description_exists(current_description, number, ui))
312 gchar *t = current_description;
313 while ((t = strstr(t, _(
"_part"))) != NULL)
323 gchar *temp = g_strdup(current_description);
324 g_snprintf(current_description, 255, _(
"%s_part%d"), temp, ll + 2);
336 gint *time_secs,gint *time_mins)
338 *time_hundr = time_pos % 100;
339 time_pos = time_pos / 100;
340 *time_secs = time_pos % 60;
341 time_pos = time_pos / 60;
342 *time_mins = time_pos;
348 GtkTreeSelection *selection = gtk_tree_view_get_selection(gui->tree_view);
349 GtkTreeModel *model = gtk_tree_view_get_model(gui->tree_view);
350 GtkTreePath *path = gtk_tree_path_new_from_indices(index ,-1);
353 gtk_tree_model_get_iter(model, &iter, path);
354 gtk_tree_selection_unselect_all(selection);
355 gtk_tree_selection_select_iter(selection, &iter);
357 gtk_tree_path_free(path);
368 g_array_remove_index(ui->splitpoints, index);
370 GtkTreeModel *model = gtk_tree_view_get_model(ui->gui->tree_view);
371 GtkTreePath *path = gtk_tree_path_new_from_indices (index ,-1);
374 gtk_tree_model_get_iter(model, &iter, path);
377 if (((index == ui->status->preview_start_splitpoint) && stop_preview) ||
378 ((index == get_quick_preview_end_splitpoint_safe(ui)) &&
379 (get_quick_preview_end_splitpoint_safe(ui) == (ui->infos->splitnumber-1)) && stop_preview))
385 if (index < ui->status->preview_start_splitpoint)
387 ui->status->preview_start_splitpoint--;
388 set_quick_preview_end_splitpoint_safe(ui->status->preview_start_splitpoint + 1, ui);
391 gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
392 gtk_tree_path_free(path);
394 ui->infos->splitnumber--;
398 gtk_widget_set_sensitive(ui->gui->remove_row_button, FALSE);
401 if (ui->infos->splitnumber == 0)
403 gtk_widget_set_sensitive(ui->gui->remove_all_button, FALSE);
406 recompute_length_column(ui);
408 update_add_button(ui);
410 refresh_drawing_area(ui->gui);
421 if (check_if_splitpoint_does_not_exists(my_split_point.mins,
422 my_split_point.secs, my_split_point.hundr_secs,-1, ui))
426 gchar *temp = g_strdup(ui->status->current_description);
427 update_current_description(temp, -1, ui);
434 GtkTreeModel *model = gtk_tree_view_get_model(ui->gui->tree_view);
437 if (gtk_tree_model_get_iter_first(model, &iter))
439 while (k < ui->infos->splitnumber)
443 gint tree_hundr_secs;
444 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter,
445 COL_MINUTES, &tree_minutes,
446 COL_SECONDS, &tree_seconds,
447 COL_HUNDR_SECS, &tree_hundr_secs,
450 if (my_split_point.mins < tree_minutes)
454 else if (my_split_point.mins == tree_minutes)
456 if (my_split_point.secs < tree_seconds)
460 else if (my_split_point.secs == tree_seconds)
462 if (my_split_point.hundr_secs < tree_hundr_secs)
469 gtk_tree_model_iter_next(model, &iter);
473 gtk_list_store_insert(GTK_LIST_STORE(model), &iter,k--);
474 g_array_insert_val(ui->splitpoints, k+1, my_split_point);
478 gtk_list_store_append(GTK_LIST_STORE(model), &iter);
479 g_array_append_val(ui->splitpoints, my_split_point);
482 ui->infos->splitnumber++;
485 if ((ui->status->first_splitpoint_selected == old_index) &&
488 GtkTreePath *path = gtk_tree_model_get_path(model, &iter);
489 gtk_tree_view_set_cursor(ui->gui->tree_view, path, NULL, FALSE);
490 gtk_tree_path_free(path);
493 if (ui->status->quick_preview)
497 if (old_index == ui->status->preview_start_splitpoint)
499 if (ui->infos->current_time <
get_splitpoint_time(ui->status->preview_start_splitpoint, ui))
512 if ((old_index < ui->status->preview_start_splitpoint))
514 if ((k+1) >= ui->status->preview_start_splitpoint)
516 ui->status->preview_start_splitpoint--;
517 set_quick_preview_end_splitpoint_safe(ui->status->preview_start_splitpoint + 1, ui);
523 if ((old_index > ui->status->preview_start_splitpoint))
525 if ((k+1) <= ui->status->preview_start_splitpoint)
527 ui->status->preview_start_splitpoint++;
528 set_quick_preview_end_splitpoint_safe(ui->status->preview_start_splitpoint + 1, ui);
534 if (old_index == ui->status->preview_start_splitpoint)
536 if ((k+1) > ui->status->preview_start_splitpoint)
538 ui->status->preview_start_splitpoint += (k+1) - ui->status->preview_start_splitpoint;
539 set_quick_preview_end_splitpoint_safe(ui->status->preview_start_splitpoint + 1, ui);
544 if ((k+1) < ui->status->preview_start_splitpoint)
546 ui->status->preview_start_splitpoint -= ui->status->preview_start_splitpoint - (k + 1);
547 set_quick_preview_end_splitpoint_safe(ui->status->preview_start_splitpoint + 1, ui);
554 if (ui->status->preview_start_splitpoint == (ui->infos->splitnumber-1))
563 if ((k+1) <= ui->status->preview_start_splitpoint)
565 ui->status->preview_start_splitpoint++;
566 set_quick_preview_end_splitpoint_safe(ui->status->preview_start_splitpoint + 1, ui);
572 gtk_list_store_set(GTK_LIST_STORE(model),
574 COL_CHECK, my_split_point.checked,
575 COL_DESCRIPTION, ui->status->current_description,
576 COL_MINUTES, my_split_point.mins,
577 COL_SECONDS, my_split_point.secs,
578 COL_HUNDR_SECS, my_split_point.hundr_secs,
581 gtk_widget_set_sensitive(ui->gui->remove_all_button, TRUE);
583 recompute_length_column(ui);
591 if (gtk_toggle_button_get_active(ui->gui->names_from_filename))
597 g_snprintf(ui->status->current_description, 255,
"%s", _(
"description here"));
600 update_add_button(ui);
601 refresh_drawing_area(ui->gui);
616 int splitpoint_does_not_exists =
617 check_if_splitpoint_does_not_exists(new_point.mins, new_point.secs, new_point.hundr_secs,-1, ui);
621 if (splitpoint_does_not_exists ||
622 (old_point.checked != new_point.checked))
627 g_snprintf(ui->status->current_description, 255,
"%s", description);
631 add_splitpoint(new_point, index, ui);
637 if ((new_point.mins == old_point.mins) &&
638 (new_point.secs == old_point.secs) &&
639 (new_point.hundr_secs == old_point.hundr_secs))
658 new_point.checked = old_point.checked;
671 old_point.checked ^= 1;
675 void clear_current_description(
ui_state *ui)
677 update_current_description(_(
"description here"), -1, ui);
680 void copy_filename_to_current_description(
const gchar *fname,
ui_state *ui)
682 if (strcmp(fname,
"") == 0)
684 clear_current_description(ui);
687 gchar *temp = g_strdup(g_path_get_basename(fname));
688 gchar *tmp = strrchr(temp,
'.');
689 if (tmp != NULL) { *tmp =
'\0'; }
691 g_snprintf(ui->status->current_description, 255,
"%s", temp);
696 static void cell_edited_event(GtkCellRendererText *cell, gchar *path_string, gchar *new_text,
ui_state *ui)
698 GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
699 GtkTreeModel *model = gtk_tree_view_get_model(ui->gui->tree_view);
701 gint col = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cell),
"col"));
704 gtk_tree_model_get_iter(model, &iter, path);
705 gint i = gtk_tree_path_get_indices (path)[0];
709 new_point.checked = old_point.checked;
713 case COL_DESCRIPTION:
714 update_current_description(new_text, i, ui);
717 gtk_list_store_set(GTK_LIST_STORE(model), &iter,
718 col, ui->status->current_description,
721 if (gtk_toggle_button_get_active(ui->gui->names_from_filename))
727 g_snprintf(ui->status->current_description, 255,
"%s", _(
"description here"));
732 new_point.mins = old_point.mins;
733 new_point.secs = atoi(new_text);
734 new_point.hundr_secs = old_point.hundr_secs;
736 if (new_point.secs < 0)
740 if (new_point.secs > 59)
749 new_point.mins = atoi(new_text);
750 new_point.secs = old_point.secs;
751 new_point.hundr_secs = old_point.hundr_secs;
753 if (new_point.mins < 0)
757 if (new_point.mins > INT_MAX/6000)
759 new_point.mins = INT_MAX/6000;
766 new_point.mins = old_point.mins;
767 new_point.secs = old_point.secs;
768 new_point.hundr_secs = atoi(new_text);
770 if (new_point.hundr_secs < 0)
772 new_point.hundr_secs = 0;
774 if (new_point.hundr_secs > 99)
776 new_point.hundr_secs = 99;
785 gtk_tree_path_free(path);
788 void add_splitpoint_from_player(GtkWidget *widget,
ui_state *ui)
790 if (!ui->status->timer_active)
796 my_split_point.mins = ui->infos->player_minutes;
797 my_split_point.secs = ui->infos->player_seconds;
798 my_split_point.hundr_secs = ui->infos->player_hundr_secs;
799 my_split_point.checked = TRUE;
801 add_splitpoint(my_split_point, -1, ui);
810 my_split_point.mins = status->spin_mins;
811 my_split_point.secs = status->spin_secs;
812 my_split_point.hundr_secs = status->spin_hundr_secs;
813 my_split_point.checked = checked;
815 add_splitpoint(my_split_point, -1, ui);
818 static void add_row_clicked(GtkWidget *button,
ui_state *ui)
823 static gboolean detect_silence_and_set_splitpoints_end(
ui_with_err *ui_err)
825 gint err = ui_err->err;
838 gtk_widget_set_sensitive(ui->gui->cancel_button, FALSE);
839 gtk_widget_set_sensitive(ui->gui->scan_silence_button, TRUE);
840 gtk_widget_set_sensitive(ui->gui->scan_silence_button_player, TRUE);
841 gtk_widget_set_sensitive(ui->gui->scan_trim_silence_button, TRUE);
842 gtk_widget_set_sensitive(ui->gui->scan_trim_silence_button_player, TRUE);
844 set_is_splitting_safe(FALSE, ui);
846 set_process_in_progress_and_wait_safe(FALSE, ui);
853 static void set_should_trim_safe(gboolean value,
ui_state *ui)
855 lock_mutex(&ui->variables_mutex);
856 ui->status->should_trim = value;
857 unlock_mutex(&ui->variables_mutex);
860 static gint get_should_trim_safe(
ui_state *ui)
862 lock_mutex(&ui->variables_mutex);
863 gint should_trim = ui->status->should_trim;
864 unlock_mutex(&ui->variables_mutex);
869 static gpointer detect_silence_and_set_splitpoints(
ui_state *ui)
871 set_process_in_progress_and_wait_safe(TRUE, ui);
873 set_is_splitting_safe(TRUE, ui);
879 gtk_widget_set_sensitive(ui->gui->scan_silence_button, FALSE);
880 gtk_widget_set_sensitive(ui->gui->scan_silence_button_player, FALSE);
881 gtk_widget_set_sensitive(ui->gui->scan_trim_silence_button, FALSE);
882 gtk_widget_set_sensitive(ui->gui->scan_trim_silence_button_player, FALSE);
883 gtk_widget_set_sensitive(ui->gui->cancel_button, TRUE);
884 gchar *format = strdup(gtk_entry_get_text(GTK_ENTRY(ui->gui->output_entry)));
886 lock_mutex(&ui->variables_mutex);
888 unlock_mutex(&ui->variables_mutex);
896 if (checked_output_radio_box == 0)
898 mp3splt_set_oformat(ui->mp3splt_state, format, &err);
910 print_status_bar_confirmation_in_idle(err, ui);
914 int old_tags_option = mp3splt_get_int_option(ui->mp3splt_state,
SPLT_OPT_TAGS, &err);
916 if (get_should_trim_safe(ui))
918 mp3splt_set_trim_silence_points(ui->mp3splt_state, &err);
922 mp3splt_set_silence_points(ui->mp3splt_state, &err);
925 mp3splt_set_int_option(ui->mp3splt_state,
SPLT_OPT_TAGS, old_tags_option);
932 gdk_threads_add_idle_full(G_PRIORITY_HIGH_IDLE,
933 (GSourceFunc)detect_silence_and_set_splitpoints_end, ui_err, NULL);
938 static void detect_silence_and_set_splitpoints_action(
ui_state *ui)
940 create_thread((GThreadFunc)detect_silence_and_set_splitpoints, ui);
944 static void detect_silence_and_add_splitpoints_start_thread(
ui_state *ui)
946 set_should_trim_safe(FALSE, ui);
947 detect_silence_and_set_splitpoints_action(ui);
950 static void detect_silence_and_add_trim_splitpoints_start_thread(
ui_state *ui)
952 set_should_trim_safe(TRUE, ui);
953 detect_silence_and_set_splitpoints_action(ui);
957 static void update_silence_parameters(GtkWidget *widget,
ui_state *ui)
962 infos->silence_threshold_value =
963 gtk_spin_button_get_value(GTK_SPIN_BUTTON(gui->spinner_silence_threshold));
964 if (gui->spinner_silence_offset != NULL)
966 infos->silence_offset_value =
967 gtk_spin_button_get_value(GTK_SPIN_BUTTON(gui->spinner_silence_offset));
969 if (gui->spinner_silence_number_tracks != NULL)
971 infos->silence_number_of_tracks =
972 gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(gui->spinner_silence_number_tracks));
974 if (gui->spinner_silence_minimum != NULL)
976 infos->silence_minimum_length =
977 gtk_spin_button_get_value(GTK_SPIN_BUTTON(gui->spinner_silence_minimum));
979 if (gui->spinner_silence_minimum_track != NULL)
981 infos->silence_minimum_track_length =
982 gtk_spin_button_get_value(GTK_SPIN_BUTTON(gui->spinner_silence_minimum_track));
984 if (gui->silence_remove_silence != NULL)
986 infos->silence_remove_silence_between_tracks =
987 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gui->silence_remove_silence));
992 static void silence_remove_silence_checked(GtkToggleButton *button,
ui_state *ui)
994 update_silence_parameters(GTK_WIDGET(button), ui);
997 void create_trim_silence_window(GtkWidget *button,
ui_state *ui)
999 GtkWidget *silence_detection_window =
1000 gtk_dialog_new_with_buttons(_(
"Set trim splitpoints using silence detection"),
1001 GTK_WINDOW(ui->gui->window),
1002 GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
1006 GTK_RESPONSE_CANCEL,
1009 gtk_widget_set_size_request(silence_detection_window, 300, 90);
1011 GtkWidget *general_inside_vbox = wh_vbox_new();
1013 GtkWidget *horiz_fake = wh_hbox_new();
1014 gtk_box_pack_start(GTK_BOX(general_inside_vbox), horiz_fake, FALSE, FALSE, 10);
1017 GtkWidget *param_vbox = wh_vbox_new();
1018 gtk_box_pack_start(GTK_BOX(horiz_fake), param_vbox, FALSE, FALSE, 25);
1021 horiz_fake = wh_hbox_new();
1022 gtk_box_pack_start(GTK_BOX(param_vbox), horiz_fake, FALSE, FALSE, 0);
1025 GtkWidget *label = gtk_label_new(_(
"Threshold level (dB):"));
1026 gtk_box_pack_start(GTK_BOX(horiz_fake), label, FALSE, FALSE, 0);
1029 GtkAdjustment *adj = (GtkAdjustment *) gtk_adjustment_new(0.0, -96.0, 0.0, 0.5, 10.0, 0.0);
1030 GtkWidget *spinner_silence_threshold = gtk_spin_button_new(adj, 0.5, 2);
1031 ui->gui->spinner_silence_threshold = spinner_silence_threshold;
1032 gtk_box_pack_start(GTK_BOX(horiz_fake), spinner_silence_threshold, FALSE, FALSE, 6);
1033 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner_silence_threshold), ui->infos->silence_threshold_value);
1034 g_signal_connect(G_OBJECT(spinner_silence_threshold),
"value_changed",
1035 G_CALLBACK(update_silence_parameters), ui);
1037 gtk_widget_show_all(general_inside_vbox);
1038 gtk_container_add(GTK_CONTAINER(
1039 gtk_dialog_get_content_area(GTK_DIALOG(silence_detection_window))), general_inside_vbox);
1041 gint result = gtk_dialog_run(GTK_DIALOG(silence_detection_window));
1043 gtk_widget_destroy(silence_detection_window);
1045 if (result == GTK_RESPONSE_YES)
1048 detect_silence_and_add_trim_splitpoints_start_thread(ui);
1058 GtkWidget *silence_detection_window =
1059 gtk_dialog_new_with_buttons(_(
"Set splitpoints from silence detection"),
1060 GTK_WINDOW(gui->window),
1061 GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
1065 GTK_RESPONSE_CANCEL,
1068 GtkWidget *general_inside_vbox = wh_vbox_new();
1069 GtkWidget *horiz_fake = wh_hbox_new();
1070 gtk_box_pack_start(GTK_BOX(general_inside_vbox), horiz_fake, FALSE, FALSE, 10);
1073 GtkWidget *param_vbox = wh_vbox_new();
1074 gtk_box_pack_start(GTK_BOX(horiz_fake), param_vbox, FALSE, FALSE, 25);
1077 horiz_fake = wh_hbox_new();
1078 gtk_box_pack_start(GTK_BOX(param_vbox), horiz_fake, FALSE, FALSE, 0);
1081 GtkWidget *label = gtk_label_new(_(
"Threshold level (dB):"));
1082 gtk_box_pack_start(GTK_BOX(horiz_fake), label, FALSE, FALSE, 0);
1085 GtkAdjustment *adj = (GtkAdjustment *) gtk_adjustment_new(0.0, -96.0, 0.0, 0.5, 10.0, 0.0);
1086 GtkWidget *spinner_silence_threshold = gtk_spin_button_new(adj, 0.5, 2);
1087 gui->spinner_silence_threshold = spinner_silence_threshold;
1088 gtk_box_pack_start(GTK_BOX(horiz_fake), spinner_silence_threshold, FALSE, FALSE, 6);
1091 horiz_fake = wh_hbox_new();
1092 gtk_box_pack_start(GTK_BOX(param_vbox), horiz_fake, FALSE, FALSE, 0);
1095 label = gtk_label_new(_(
"Cutpoint offset (0 is the begin of silence,"
1096 "and 1 the end):"));
1097 gtk_box_pack_start(GTK_BOX(horiz_fake), label, FALSE, FALSE, 0);
1100 adj = (GtkAdjustment *) gtk_adjustment_new(0.0, -2, 2, 0.05, 10.0, 0.0);
1101 GtkWidget *spinner_silence_offset = gtk_spin_button_new(adj, 0.05, 2);
1102 gui->spinner_silence_offset = spinner_silence_offset;
1103 gtk_box_pack_start(GTK_BOX(horiz_fake), spinner_silence_offset, FALSE, FALSE, 6);
1106 horiz_fake = wh_hbox_new();
1107 gtk_box_pack_start(GTK_BOX(param_vbox), horiz_fake, FALSE, FALSE, 0);
1109 label = gtk_label_new(_(
"Number of tracks (0 means all tracks):"));
1110 gtk_box_pack_start(GTK_BOX(horiz_fake), label, FALSE, FALSE, 0);
1112 adj = (GtkAdjustment *)gtk_adjustment_new(0.0, 0, 2000, 1, 10.0, 0.0);
1113 GtkWidget *spinner_silence_number_tracks = gtk_spin_button_new(adj, 1, 0);
1114 gui->spinner_silence_number_tracks = spinner_silence_number_tracks;
1115 gtk_box_pack_start(GTK_BOX(horiz_fake), spinner_silence_number_tracks, FALSE, FALSE, 6);
1118 horiz_fake = wh_hbox_new();
1119 gtk_box_pack_start(GTK_BOX(param_vbox), horiz_fake, FALSE, FALSE, 0);
1121 label = gtk_label_new(_(
"Minimum silence length (seconds):"));
1122 gtk_box_pack_start(GTK_BOX(horiz_fake), label, FALSE, FALSE, 0);
1124 adj = (GtkAdjustment *)gtk_adjustment_new(0.0, 0, 2000, 0.5, 10.0, 0.0);
1125 GtkWidget *spinner_silence_minimum = gtk_spin_button_new(adj, 1, 2);
1126 gui->spinner_silence_minimum = spinner_silence_minimum;
1127 gtk_box_pack_start(GTK_BOX(horiz_fake), spinner_silence_minimum, FALSE, FALSE, 6);
1130 horiz_fake = wh_hbox_new();
1131 gtk_box_pack_start(GTK_BOX(param_vbox), horiz_fake, FALSE, FALSE, 0);
1133 label = gtk_label_new(_(
"Minimum track length (seconds):"));
1134 gtk_box_pack_start(GTK_BOX(horiz_fake), label, FALSE, FALSE, 0);
1136 adj = (GtkAdjustment *)gtk_adjustment_new(0.0, 0, 2000, 0.5, 10.0, 0.0);
1137 GtkWidget *spinner_silence_minimum_track = gtk_spin_button_new(adj, 1, 2);
1138 gui->spinner_silence_minimum_track = spinner_silence_minimum_track;
1139 gtk_box_pack_start(GTK_BOX(horiz_fake), spinner_silence_minimum_track, FALSE, FALSE, 6);
1143 GtkWidget *silence_remove_silence = gtk_check_button_new_with_mnemonic(_(
"_Remove silence between tracks"));
1144 gui->silence_remove_silence = silence_remove_silence;
1145 gtk_box_pack_start(GTK_BOX(param_vbox), silence_remove_silence, FALSE, FALSE, 0);
1148 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner_silence_threshold),
1149 infos->silence_threshold_value);
1150 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner_silence_offset),
1151 infos->silence_offset_value);
1152 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner_silence_number_tracks),
1153 infos->silence_number_of_tracks);
1154 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner_silence_minimum),
1155 infos->silence_minimum_length);
1156 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner_silence_minimum_track),
1157 infos->silence_minimum_track_length);
1158 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(silence_remove_silence),
1159 infos->silence_remove_silence_between_tracks);
1162 g_signal_connect(G_OBJECT(spinner_silence_threshold),
"value_changed",
1163 G_CALLBACK(update_silence_parameters), ui);
1164 g_signal_connect(G_OBJECT(spinner_silence_offset),
"value_changed",
1165 G_CALLBACK(update_silence_parameters), ui);
1166 g_signal_connect(G_OBJECT(spinner_silence_number_tracks),
"value_changed",
1167 G_CALLBACK(update_silence_parameters), ui);
1168 g_signal_connect(G_OBJECT(spinner_silence_minimum),
"value_changed",
1169 G_CALLBACK(update_silence_parameters), ui);
1170 g_signal_connect(G_OBJECT(spinner_silence_minimum_track),
"value_changed",
1171 G_CALLBACK(update_silence_parameters), ui);
1172 g_signal_connect(G_OBJECT(silence_remove_silence),
"toggled",
1173 G_CALLBACK(silence_remove_silence_checked), ui);
1175 gtk_widget_show_all(general_inside_vbox);
1176 gtk_container_add(GTK_CONTAINER(
1177 gtk_dialog_get_content_area(GTK_DIALOG(silence_detection_window))),
1178 general_inside_vbox);
1180 gint result = gtk_dialog_run(GTK_DIALOG(silence_detection_window));
1182 gtk_widget_destroy(silence_detection_window);
1184 if (result == GTK_RESPONSE_YES)
1187 infos->silence_threshold_value);
1189 infos->silence_offset_value);
1191 infos->silence_number_of_tracks);
1193 infos->silence_minimum_length);
1195 infos->silence_minimum_track_length);
1197 infos->silence_remove_silence_between_tracks);
1199 detect_silence_and_add_splitpoints_start_thread(ui);
1204 static void remove_row(GtkWidget *widget,
ui_state *ui)
1206 GtkTreeModel *model = gtk_tree_view_get_model(ui->gui->tree_view);
1207 GtkTreeSelection *selection = gtk_tree_view_get_selection(ui->gui->tree_view);
1209 GList *selected_list = gtk_tree_selection_get_selected_rows(selection, &model);
1211 while ((g_list_length(selected_list) > 0) && (ui->infos->splitnumber > 0))
1213 GList *current_element = g_list_last(selected_list);
1214 GtkTreePath *path = current_element->data;
1215 gint i = gtk_tree_path_get_indices (path)[0];
1219 selected_list = g_list_remove(selected_list, path);
1221 gtk_tree_path_free(path);
1224 g_list_foreach(selected_list, (GFunc)gtk_tree_path_free, NULL);
1225 g_list_free(selected_list);
1231 GtkTreeModel *model = gtk_tree_view_get_model(ui->gui->tree_view);
1233 while (ui->infos->splitnumber > 0)
1236 gtk_tree_model_get_iter_first(model, &iter);
1237 gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
1238 g_array_remove_index(ui->splitpoints, (ui->infos->splitnumber-1));
1239 ui->infos->splitnumber--;
1242 gtk_widget_set_sensitive(ui->gui->remove_all_button, FALSE);
1243 gtk_widget_set_sensitive(ui->gui->remove_row_button, FALSE);
1247 update_add_button(ui);
1248 refresh_drawing_area(ui->gui);
1253 static GtkWidget *create_init_spinner(GtkWidget *bottomhbox1, gint min, gint max,
1254 gchar *label_text, gint type,
ui_state *ui)
1256 GtkWidget *spinner_box = wh_vbox_new();
1257 GtkWidget *label = gtk_label_new(label_text);
1258 gtk_box_pack_start(GTK_BOX(spinner_box), label, TRUE, FALSE, 0);
1260 GtkAdjustment *adj = (GtkAdjustment *) gtk_adjustment_new(0.0, min, max, 1.0, 10.0, 0.0);
1261 GtkWidget *spinner = gtk_spin_button_new(adj, 0, 0);
1262 gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(spinner), TRUE);
1266 g_signal_connect(G_OBJECT(spinner),
"value_changed",
1271 g_signal_connect(G_OBJECT(spinner),
"value_changed",
1276 g_signal_connect(G_OBJECT(spinner),
"value_changed",
1280 gtk_box_pack_start(GTK_BOX(spinner_box), spinner, TRUE, FALSE, 0);
1281 gtk_box_pack_start(GTK_BOX(bottomhbox1), spinner_box, FALSE, FALSE, 5);
1287 static GtkWidget *create_init_spinners_buttons(
ui_state *ui)
1289 GtkWidget *hbox = wh_hbox_new();
1290 gtk_container_set_border_width(GTK_CONTAINER(hbox), 0);
1293 ui->gui->spinner_minutes = create_init_spinner(hbox, 0, INT_MAX/6000, _(
"Minutes:"), 0, ui);
1295 ui->gui->spinner_seconds = create_init_spinner(hbox, 0, 59, _(
"Seconds:"), 1, ui);
1297 ui->gui->spinner_hundr_secs = create_init_spinner(hbox, 0, 99, _(
"Hundredths:"), 2, ui);
1301 ui->gui->add_button = add_button;
1303 gtk_button_set_relief(GTK_BUTTON(add_button), GTK_RELIEF_NONE);
1304 gtk_widget_set_sensitive(add_button, TRUE);
1305 g_signal_connect(G_OBJECT(add_button),
"clicked", G_CALLBACK(add_row_clicked), ui);
1306 gtk_box_pack_start(GTK_BOX(hbox), add_button, FALSE, FALSE, 5);
1307 gtk_widget_set_tooltip_text(add_button,_(
"Add splitpoint"));
1311 ui->gui->remove_row_button = remove_row_button;
1313 gtk_button_set_relief(GTK_BUTTON(remove_row_button), GTK_RELIEF_NONE);
1314 gtk_widget_set_sensitive(remove_row_button, FALSE);
1315 g_signal_connect(G_OBJECT(remove_row_button),
"clicked", G_CALLBACK(remove_row), ui);
1316 gtk_box_pack_start(GTK_BOX(hbox), remove_row_button, FALSE, FALSE, 5);
1317 gtk_widget_set_tooltip_text(remove_row_button, _(
"Remove rows"));
1321 ui->gui->remove_all_button = remove_all_button;
1323 gtk_button_set_relief(GTK_BUTTON(remove_all_button), GTK_RELIEF_NONE);
1324 gtk_widget_set_sensitive(remove_all_button, FALSE);
1325 g_signal_connect(G_OBJECT(remove_all_button),
"clicked", G_CALLBACK(
remove_all_rows), ui);
1326 gtk_box_pack_start(GTK_BOX(hbox), remove_all_button, FALSE, FALSE, 5);
1327 gtk_widget_set_tooltip_text(remove_all_button, _(
"Remove all rows"));
1333 static void create_init_special_buttons(
ui_state *ui)
1336 GtkWidget *scan_trim_silence_button =
1338 ui->gui->scan_trim_silence_button = scan_trim_silence_button;
1339 gtk_widget_set_sensitive(scan_trim_silence_button, TRUE);
1340 g_signal_connect(G_OBJECT(scan_trim_silence_button),
"clicked",
1341 G_CALLBACK(create_trim_silence_window), ui);
1342 gtk_widget_set_tooltip_text(scan_trim_silence_button,
1343 _(
"Set trim splitpoints using silence detection"));
1346 GtkWidget *scan_silence_button =
1348 ui->gui->scan_silence_button = scan_silence_button;
1349 gtk_widget_set_sensitive(scan_silence_button, TRUE);
1350 g_signal_connect(G_OBJECT(scan_silence_button),
"clicked",
1352 gtk_widget_set_tooltip_text(scan_silence_button,
1353 _(
"Set splitpoints from silence detection"));
1362 GtkTreeModel *model = gtk_tree_view_get_model(ui->gui->tree_view);
1364 gchar *description = NULL;
1367 if (!gtk_tree_model_get_iter_first(model, &iter))
1379 GtkTreePath *path = gtk_tree_path_new_from_indices(index ,-1);
1380 gtk_tree_model_get_iter(model, &iter, path);
1381 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter,
1382 COL_DESCRIPTION,&description,
1384 gtk_tree_path_free(path);
1393 if (splitpoint_index < 0 ||
1394 splitpoint_index >= ui->splitpoints->len)
1400 return point.mins * 6000 + point.secs * 100 + point.hundr_secs;
1403 static gboolean split_preview_end(
ui_with_err *ui_err)
1405 gint err = ui_err->err;
1411 if (split_file != NULL && err > 0)
1424 gtk_progress_bar_set_fraction(ui->gui->percent_progress_bar, 1.0);
1425 gtk_progress_bar_set_text(ui->gui->percent_progress_bar, _(
" finished"));
1428 set_process_in_progress_and_wait_safe(FALSE, ui_err->ui);
1435 static gpointer split_preview(
ui_state *ui)
1437 set_process_in_progress_and_wait_safe(TRUE, ui);
1441 mp3splt_erase_all_tags(ui->mp3splt_state, &err);
1446 "preview", SPLT_SPLITPOINT);
1450 NULL, SPLT_SKIPPOINT);
1452 lock_mutex(&ui->variables_mutex);
1454 unlock_mutex(&ui->variables_mutex);
1465 fname_path[strlen(fname_path) - 18] =
'\0';
1467 if (fname_path) { g_free(fname_path); }
1469 err = mp3splt_split(ui->mp3splt_state);
1475 gdk_threads_add_idle_full(G_PRIORITY_HIGH_IDLE, (GSourceFunc)split_preview_end, ui_err, NULL);
1480 static void split_preview_action(
ui_state *ui)
1482 create_thread((GThreadFunc)split_preview, ui);
1486 static void preview_song(GtkTreeView *tree_view, GtkTreePath *path,
1487 GtkTreeViewColumn *col,
ui_state *ui)
1489 gint number = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(col),
"col"));
1490 if (number != COL_PREVIEW && number != COL_SPLIT_PREVIEW)
1495 if (!ui->status->timer_active)
1502 gint preview_row = gtk_tree_path_get_indices(path)[0];
1503 ui->status->preview_row = preview_row;
1504 if (number == COL_PREVIEW)
1508 else if (number == COL_SPLIT_PREVIEW)
1511 set_quick_preview_end_splitpoint_safe(preview_row + 1, ui);
1513 if (ui->status->preview_row + 1 == ui->infos->splitnumber)
1519 split_preview_action(ui);
1524 static void toggled_splitpoint_event(GtkCellRendererToggle *cell,
1527 GtkTreeModel *model = gtk_tree_view_get_model(ui->gui->tree_view);
1528 GtkTreePath *path = gtk_tree_path_new_from_string(path_str);
1529 gboolean checked = FALSE;
1532 gtk_tree_model_get_iter(model, &iter, path);
1533 gtk_tree_model_get(model, &iter, COL_CHECK, &checked, -1);
1539 gint index = gtk_tree_path_get_indices (path)[0];
1544 old_point = g_array_index(ui->splitpoints,
Split_point, index);
1545 new_point.mins = old_point.mins;
1546 new_point.secs = old_point.secs;
1547 new_point.hundr_secs = old_point.hundr_secs;
1548 new_point.checked = checked;
1552 gtk_tree_path_free(path);
1556 static void create_columns(
ui_state *ui)
1560 GtkTreeView *tree_view = gui->tree_view;
1562 GtkCellRendererText *renderer;
1563 GtkCellRendererPixbuf *renderer_pix;
1564 GtkCellRendererToggle *renderer_toggle;
1566 GtkTreeViewColumn *column_number;
1567 GtkTreeViewColumn *column_check = NULL;
1568 GtkTreeViewColumn *column_description;
1569 GtkTreeViewColumn *column_hundr_secs;
1570 GtkTreeViewColumn *column_minutes;
1571 GtkTreeViewColumn *column_seconds;
1572 GtkTreeViewColumn *column_preview;
1573 GtkTreeViewColumn *column_split_preview;
1576 renderer_toggle = GTK_CELL_RENDERER_TOGGLE(gtk_cell_renderer_toggle_new());
1577 g_signal_connect(renderer_toggle,
"toggled", G_CALLBACK(toggled_splitpoint_event), ui);
1578 g_object_set_data(G_OBJECT(renderer_toggle),
"col", GINT_TO_POINTER(COL_CHECK));
1579 column_check = gtk_tree_view_column_new_with_attributes
1580 (_(
"Keep"), GTK_CELL_RENDERER(renderer_toggle),
"active", COL_CHECK, NULL);
1583 renderer = GTK_CELL_RENDERER_TEXT(gtk_cell_renderer_text_new());
1584 g_signal_connect(renderer,
"edited", G_CALLBACK(cell_edited_event), ui);
1585 g_object_set(renderer,
"editable", TRUE, NULL);
1586 g_object_set_data(G_OBJECT(renderer),
"col", GINT_TO_POINTER(COL_DESCRIPTION));
1587 column_description = gtk_tree_view_column_new_with_attributes
1588 (_(
"Filename"), GTK_CELL_RENDERER(renderer),
"text", COL_DESCRIPTION, NULL);
1591 renderer = GTK_CELL_RENDERER_TEXT(gtk_cell_renderer_text_new());
1592 g_signal_connect(renderer,
"edited", G_CALLBACK(cell_edited_event), ui);
1593 g_object_set(renderer,
"editable", TRUE, NULL);
1594 g_object_set_data(G_OBJECT(renderer),
"col", GINT_TO_POINTER(COL_SECONDS));
1595 column_seconds = gtk_tree_view_column_new_with_attributes
1596 (_(
"Secs"), GTK_CELL_RENDERER(renderer),
"text", COL_SECONDS, NULL);
1599 renderer = GTK_CELL_RENDERER_TEXT(gtk_cell_renderer_text_new());
1600 g_signal_connect(renderer,
"edited", G_CALLBACK(cell_edited_event), ui);
1601 g_object_set(renderer,
"editable", TRUE, NULL);
1602 g_object_set_data(G_OBJECT(renderer),
"col", GINT_TO_POINTER(COL_MINUTES));
1603 column_minutes = gtk_tree_view_column_new_with_attributes
1604 (_(
"Mins"), GTK_CELL_RENDERER(renderer),
"text", COL_MINUTES, NULL);
1607 renderer = GTK_CELL_RENDERER_TEXT(gtk_cell_renderer_text_new());
1608 g_signal_connect(renderer,
"edited", G_CALLBACK(cell_edited_event), ui);
1609 g_object_set(renderer,
"editable", TRUE, NULL);
1610 g_object_set_data(G_OBJECT(renderer),
"col", GINT_TO_POINTER(COL_HUNDR_SECS));
1611 column_hundr_secs = gtk_tree_view_column_new_with_attributes
1612 (_(
"Hundr"), GTK_CELL_RENDERER(renderer),
"text", COL_HUNDR_SECS, NULL);
1616 renderer = GTK_CELL_RENDERER_TEXT(gtk_cell_renderer_text_new());
1617 g_object_set(G_OBJECT (renderer),
"xalign", 1.0, NULL);
1618 g_object_set_data(G_OBJECT(renderer),
"col", GINT_TO_POINTER(COL_NUMBER));
1619 column_number = gtk_tree_view_column_new_with_attributes
1620 (_(
"Length"), GTK_CELL_RENDERER(renderer),
"text", COL_NUMBER, NULL);
1623 renderer_pix = GTK_CELL_RENDERER_PIXBUF(gtk_cell_renderer_pixbuf_new());
1624 g_object_set(renderer_pix,
"stock-id",GTK_STOCK_MEDIA_PLAY,
1625 "stock-size",GTK_ICON_SIZE_MENU,NULL);
1626 column_preview = gtk_tree_view_column_new_with_attributes
1627 (_(
"LiveP"), GTK_CELL_RENDERER(renderer_pix),
"pixbuf",COL_PREVIEW, NULL);
1628 g_object_set_data(G_OBJECT(column_preview),
"col", GINT_TO_POINTER(COL_PREVIEW));
1631 renderer_pix = GTK_CELL_RENDERER_PIXBUF(gtk_cell_renderer_pixbuf_new());
1632 g_object_set(renderer_pix,
"stock-id",GTK_STOCK_MEDIA_PLAY,
1633 "stock-size",GTK_ICON_SIZE_MENU,NULL);
1634 column_split_preview = gtk_tree_view_column_new_with_attributes
1635 (_(
"SplitP"), GTK_CELL_RENDERER(renderer_pix),
"pixbuf",COL_SPLIT_PREVIEW, NULL);
1636 g_object_set_data(G_OBJECT(column_split_preview),
"col", GINT_TO_POINTER(COL_SPLIT_PREVIEW));
1638 gtk_tree_view_insert_column(GTK_TREE_VIEW(tree_view), column_check, COL_CHECK);
1639 gtk_tree_view_insert_column(GTK_TREE_VIEW(tree_view), column_description, COL_DESCRIPTION);
1640 gtk_tree_view_insert_column(GTK_TREE_VIEW(tree_view), column_minutes, COL_MINUTES);
1641 gtk_tree_view_insert_column(GTK_TREE_VIEW(tree_view), column_seconds, COL_SECONDS);
1642 gtk_tree_view_insert_column(GTK_TREE_VIEW(tree_view), column_hundr_secs, COL_HUNDR_SECS);
1643 gtk_tree_view_insert_column(GTK_TREE_VIEW(tree_view), column_number, COL_NUMBER);
1644 gtk_tree_view_insert_column(GTK_TREE_VIEW(tree_view), column_preview, COL_PREVIEW);
1645 gtk_tree_view_insert_column(GTK_TREE_VIEW(tree_view), column_split_preview, COL_SPLIT_PREVIEW);
1647 gtk_tree_view_column_set_alignment(column_check, 0.5);
1648 gtk_tree_view_column_set_alignment(column_description, 0.5);
1649 gtk_tree_view_column_set_alignment(column_minutes, 0.5);
1650 gtk_tree_view_column_set_alignment(column_seconds, 0.5);
1651 gtk_tree_view_column_set_alignment(column_hundr_secs, 0.5);
1652 gtk_tree_view_column_set_alignment(column_number, 0.5);
1653 gtk_tree_view_column_set_alignment(column_preview, 0.5);
1654 gtk_tree_view_column_set_alignment(column_split_preview, 0.5);
1656 gtk_tree_view_column_set_sizing(column_check, GTK_TREE_VIEW_COLUMN_FIXED);
1657 gtk_tree_view_column_set_fixed_width(column_check, 70);
1659 gtk_tree_view_column_set_resizable(column_description, TRUE);
1661 gtk_tree_view_column_set_reorderable(column_check, TRUE);
1662 gtk_tree_view_column_set_reorderable(column_description, TRUE);
1663 gtk_tree_view_column_set_reorderable(column_minutes, TRUE);
1664 gtk_tree_view_column_set_reorderable(column_seconds, TRUE);
1665 gtk_tree_view_column_set_reorderable(column_hundr_secs, TRUE);
1666 gtk_tree_view_column_set_reorderable(column_number, TRUE);
1667 gtk_tree_view_column_set_reorderable(column_preview, TRUE);
1668 gtk_tree_view_column_set_reorderable(column_split_preview, TRUE);
1670 gtk_tree_view_column_set_expand(column_description, TRUE);
1674 static void create_tree_view(
ui_state *ui)
1676 GtkTreeView *tree_view = GTK_TREE_VIEW(gtk_tree_view_new_with_model(create_model()));
1677 dnd_add_drag_data_received_to_widget(GTK_WIDGET(tree_view), DND_DATA_FILES, ui);
1679 ui->gui->tree_view = tree_view;
1681 g_signal_connect(tree_view,
"row-activated", G_CALLBACK(preview_song), ui);
1683 GtkTreeSelection *selection = gtk_tree_view_get_selection(tree_view);
1684 g_signal_connect(selection,
"changed", G_CALLBACK(row_selection_event), ui);
1696 create_tree_view(ui);
1699 GtkWidget *choose_splitpoints_vbox = wh_vbox_new();
1700 gtk_container_set_border_width(GTK_CONTAINER(choose_splitpoints_vbox), 0);
1703 GtkWidget *spinners_buttons_hbox = create_init_spinners_buttons(ui);
1704 gtk_box_pack_start(GTK_BOX(choose_splitpoints_vbox), spinners_buttons_hbox, FALSE, FALSE, 3);
1707 GtkWidget *tree_hbox = wh_hbox_new();
1708 gtk_box_pack_start(GTK_BOX(choose_splitpoints_vbox), tree_hbox, TRUE, TRUE, 0);
1711 GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL);
1712 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(scrolled_window), GTK_SHADOW_NONE);
1713 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
1714 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1715 gtk_box_pack_start(GTK_BOX(tree_hbox), scrolled_window, TRUE, TRUE, 0);
1717 GtkTreeSelection *selection = gtk_tree_view_get_selection(gui->tree_view);
1718 gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE);
1720 gtk_container_add(GTK_CONTAINER(scrolled_window), GTK_WIDGET(gui->tree_view));
1723 create_init_special_buttons(ui);
1725 return choose_splitpoints_vbox;
1728 static void garray_to_array(GArray *spltpoints, glong *hundredth,
ui_state *ui)
1731 for(i = 0; i < ui->infos->splitnumber; i++ )
1734 if (point.mins >= (INT_MAX-1)/6000)
1736 hundredth[i] = LONG_MAX;
1740 hundredth[i] = point.mins * 6000 +
1741 point.secs * 100 + point.hundr_secs;
1749 glong hundr[ui->infos->splitnumber];
1750 garray_to_array(ui->splitpoints, hundr, ui);
1752 GtkTreeModel *model = gtk_tree_view_get_model(ui->gui->tree_view);
1755 for (i = 0; i < ui->infos->splitnumber; i++)
1757 GtkTreePath *path = gtk_tree_path_new_from_indices(i ,-1);
1759 gtk_tree_model_get_iter(model, &iter, path);
1760 gchar *description = NULL;
1761 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter,
1762 COL_DESCRIPTION,&description,
1767 gint splitpoint_type = SPLT_SPLITPOINT;
1769 if (point.checked == FALSE)
1771 splitpoint_type = SPLT_SKIPPOINT;
1776 gtk_tree_path_free(path);