40 #include "freedb_window.h"
49 static void add_freedb_row(gchar *album_name, gint album_id, gint revisions_number,
ui_state *ui)
51 GtkTreeModel *model = gtk_tree_view_get_model(ui->gui->freedb_tree);
54 gtk_tree_store_append (GTK_TREE_STORE(model), &iter,NULL);
55 gtk_tree_store_set(GTK_TREE_STORE(model), &iter,
56 ALBUM_NAME, album_name, NUMBER, album_id, -1);
58 gint malloc_number = strlen(album_name) + 20;
59 gchar *number = malloc(malloc_number *
sizeof(gchar *));
61 for(i = 0; i < revisions_number; i++)
63 g_snprintf(number,malloc_number, _(
"%s Revision %d"),album_name, i);
65 GtkTreeIter child_iter;
66 gtk_tree_store_append(GTK_TREE_STORE(model), &child_iter, &iter);
67 gtk_tree_store_set(GTK_TREE_STORE(model), &child_iter,
68 ALBUM_NAME, number, NUMBER, album_id + i + 1, -1);
71 ui->infos->freedb_table_number++;
76 static GtkTreeModel *create_freedb_model()
78 GtkTreeStore *model = gtk_tree_store_new(FREEDB_TABLE, G_TYPE_STRING, G_TYPE_INT);
79 return GTK_TREE_MODEL(model);
83 static GtkTreeView *create_freedb_tree()
85 GtkTreeModel *model = create_freedb_model();
86 return GTK_TREE_VIEW(gtk_tree_view_new_with_model(model));
90 static void create_freedb_columns(GtkTreeView *freedb_tree)
92 GtkCellRendererText *renderer = GTK_CELL_RENDERER_TEXT(gtk_cell_renderer_text_new());
93 g_object_set_data(G_OBJECT(renderer),
"col", GINT_TO_POINTER(ALBUM_NAME));
94 GtkTreeViewColumn *name_column = gtk_tree_view_column_new_with_attributes
95 (_(
"Album title"), GTK_CELL_RENDERER(renderer),
"text", ALBUM_NAME, NULL);
97 gtk_tree_view_insert_column(freedb_tree, GTK_TREE_VIEW_COLUMN(name_column), ALBUM_NAME);
99 gtk_tree_view_column_set_alignment(GTK_TREE_VIEW_COLUMN(name_column), 0.5);
100 gtk_tree_view_column_set_sizing(GTK_TREE_VIEW_COLUMN(name_column), GTK_TREE_VIEW_COLUMN_AUTOSIZE);
101 gtk_tree_view_column_set_expand(GTK_TREE_VIEW_COLUMN(name_column), TRUE);
103 gtk_tree_view_column_set_resizable(GTK_TREE_VIEW_COLUMN(name_column), TRUE);
106 static void set_freedb_selected_id_safe(gint selected_id,
ui_state *ui)
108 lock_mutex(&ui->variables_mutex);
109 ui->infos->freedb_selected_id = selected_id;
110 unlock_mutex(&ui->variables_mutex);
113 static gint get_freedb_selected_id_safe(
ui_state *ui)
115 lock_mutex(&ui->variables_mutex);
116 gint selected_id = ui->infos->freedb_selected_id;
117 unlock_mutex(&ui->variables_mutex);
122 static void freedb_selection_changed(GtkTreeSelection *selection,
ui_state *ui)
124 GtkTreeModel *model = gtk_tree_view_get_model(ui->gui->freedb_tree);
127 if (gtk_tree_selection_get_selected(selection, &model, &iter))
131 gtk_tree_model_get(model, &iter, ALBUM_NAME, &info, NUMBER, &selected_id, -1);
134 set_freedb_selected_id_safe(selected_id, ui);
136 gtk_widget_set_sensitive(ui->gui->freedb_add_button, TRUE);
140 gtk_widget_set_sensitive(ui->gui->freedb_add_button, FALSE);
145 static void remove_all_freedb_rows(
ui_state *ui)
147 GtkTreeModel *model = gtk_tree_view_get_model(ui->gui->freedb_tree);
148 while (ui->infos->freedb_table_number > 0)
151 gtk_tree_model_get_iter_first(model, &iter);
152 gtk_tree_store_remove(GTK_TREE_STORE(model), &iter);
153 ui->infos->freedb_table_number--;
157 static gboolean freedb_search_start(
ui_state *ui)
161 gtk_widget_hide(gui->freedb_search_button);
162 gtk_widget_show(gui->freedb_spinner);
163 gtk_spinner_start(GTK_SPINNER(gui->freedb_spinner));
165 gtk_widget_set_sensitive(gui->freedb_add_button, FALSE);
166 gtk_widget_set_sensitive(gui->freedb_entry, FALSE);
167 gtk_widget_set_sensitive(GTK_WIDGET(gui->freedb_tree), FALSE);
174 static gboolean freedb_search_end(
ui_with_err *ui_err)
177 ui_infos *infos = ui_err->ui->infos;
179 remove_all_freedb_rows(ui_err->ui);
181 if (ui_err->err >= 0 && infos->freedb_search_results)
183 gboolean we_have_results = FALSE;
190 if (old_name == NULL)
196 we_have_results = TRUE;
200 char *name = strdup(old_name);
208 if (must_be_freed) { free(name); }
210 we_have_results = TRUE;
215 GtkTreeSelection *selection = gtk_tree_view_get_selection(gui->freedb_tree);
216 GtkTreeModel *model = gtk_tree_view_get_model(gui->freedb_tree);
217 GtkTreePath *path = gtk_tree_path_new_from_indices (0 ,-1);
220 gtk_tree_model_get_iter(model, &iter, path);
221 gtk_tree_selection_select_iter(selection, &iter);
222 gtk_tree_path_free(path);
226 gtk_widget_show(gui->freedb_search_button);
227 gtk_spinner_stop(GTK_SPINNER(gui->freedb_spinner));
228 gtk_widget_hide(gui->freedb_spinner);
230 gtk_widget_set_sensitive(gui->freedb_entry, TRUE);
231 gtk_widget_set_sensitive(GTK_WIDGET(gui->freedb_tree), TRUE);
233 set_process_in_progress_and_wait_safe(FALSE, ui_err->ui);
241 static gpointer freedb_search(
ui_state *ui)
243 set_process_in_progress_and_wait_safe(TRUE, ui);
245 gdk_threads_add_idle_full(G_PRIORITY_HIGH_IDLE, (GSourceFunc)freedb_search_start, ui, NULL);
250 const gchar *freedb_search_value = gtk_entry_get_text(GTK_ENTRY(ui->gui->freedb_entry));
254 ui->infos->freedb_search_results =
258 print_status_bar_confirmation_in_idle(err, ui);
263 gdk_threads_add_idle_full(G_PRIORITY_HIGH_IDLE, (GSourceFunc)freedb_search_end, ui_err, NULL);
269 static void freedb_search_start_thread(
ui_state *ui)
271 create_thread((GThreadFunc)freedb_search, ui);
275 static void freedb_search_button_event(GtkWidget *widget,
ui_state *ui)
277 freedb_search_start_thread(ui);
284 static void freedb_entry_activate_event(GtkEntry *entry,
ui_state *ui)
286 freedb_search_start_thread(ui);
290 static void get_secs_mins_hundr(gfloat time, gint *mins,gint *secs, gint *hundr)
292 *mins = (gint)(time / 6000);
293 *secs = (gint)(time - (*mins * 6000)) / 100;
294 *hundr = (gint)(time - (*mins * 6000) - (*secs * 100));
297 static void update_tags_from_mp3splt_state(gint number_of_rows,
ui_state *ui)
303 if (tags_group == NULL)
310 GtkTreeModel *model = gtk_tree_view_get_model(ui->gui->tree_view);
313 gint current_row = 0;
316 if ((current_row + 1) > number_of_rows)
321 GtkTreePath *path = gtk_tree_path_new_from_indices(current_row, -1);
323 gtk_tree_model_get_iter(model, &iter, path);
324 gtk_tree_path_free(path);
327 if (year_str != NULL)
329 gint year = atoi(year_str);
330 gtk_list_store_set(GTK_LIST_STORE(model), &iter, COL_YEAR, year, -1);
334 if (track_str != NULL)
336 gint track = atoi(track_str);
337 if (track < 0) { track = 0; }
338 gtk_list_store_set(GTK_LIST_STORE(model), &iter, COL_TRACK, track, -1);
344 gtk_list_store_set(GTK_LIST_STORE(model), &iter, COL_TITLE, title, -1);
350 gtk_list_store_set(GTK_LIST_STORE(model), &iter, COL_ARTIST, artist, -1);
356 gtk_list_store_set(GTK_LIST_STORE(model), &iter, COL_ALBUM, album, -1);
362 gtk_list_store_set(GTK_LIST_STORE(model), &iter, COL_GENRE, genre, -1);
368 gtk_list_store_set(GTK_LIST_STORE(model), &iter, COL_COMMENT, comment, -1);
386 if (points == NULL) {
return; }
394 gint number_of_rows = 0;
400 int point_value = (int) old_point_value;
401 if (old_point_value > INT_MAX)
403 point_value = INT_MAX;
406 get_secs_mins_hundr(point_value,
407 &ui->status->spin_mins, &ui->status->spin_secs, &ui->status->spin_hundr_secs);
410 if (result_utf8 != NULL)
412 gint must_be_free = FALSE;
414 g_snprintf(ui->status->current_description, 255,
"%s", result_utf8);
418 g_snprintf(ui->status->current_description, 255,
"%s", _(
"description here"));
437 update_tags_from_mp3splt_state(number_of_rows, ui);
439 g_snprintf(ui->status->current_description, 255,
"%s", _(
"description here"));
447 export_cue_file_in_configuration_directory(ui);
450 static gboolean put_freedb_splitpoints_start(
ui_state *ui)
452 gtk_widget_set_sensitive(ui->gui->freedb_add_button, FALSE);
453 gtk_widget_set_sensitive(GTK_WIDGET(ui->gui->freedb_tree), FALSE);
460 static gboolean put_freedb_splitpoints_end(
ui_state *ui)
464 gtk_widget_set_sensitive(ui->gui->freedb_add_button, TRUE);
465 gtk_widget_set_sensitive(GTK_WIDGET(ui->gui->freedb_tree), TRUE);
467 set_process_in_progress_and_wait_safe(FALSE, ui);
472 static gpointer put_freedb_splitpoints(
ui_state *ui)
474 set_process_in_progress_and_wait_safe(TRUE, ui);
476 gint selected_id = get_freedb_selected_id_safe(ui);
478 gdk_threads_add_idle_full(G_PRIORITY_HIGH_IDLE,
479 (GSourceFunc)put_freedb_splitpoints_start, ui, NULL);
481 gchar *configuration_directory = get_configuration_directory();
482 gint malloc_number = strlen(configuration_directory) + 20;
483 gchar *filename = malloc(malloc_number *
sizeof(gchar));
484 g_snprintf(filename, malloc_number,
"%s%s%s", configuration_directory, G_DIR_SEPARATOR_S,
486 g_free(configuration_directory);
490 print_status_bar_confirmation_in_idle(err, ui);
500 const char *data = gtk_entry_get_text(GTK_ENTRY(ui->gui->output_entry));
506 print_status_bar_confirmation_in_idle(error, ui);
510 print_status_bar_confirmation_in_idle(err, ui);
518 gdk_threads_add_idle_full(G_PRIORITY_HIGH_IDLE,
519 (GSourceFunc)put_freedb_splitpoints_end, ui, NULL);
525 static void freedb_add_button_clicked_event(GtkButton *button,
ui_state *ui)
527 create_thread((GThreadFunc)put_freedb_splitpoints, ui);
533 GtkWidget *freedb_hbox = wh_hbox_new();
534 gtk_container_set_border_width(GTK_CONTAINER(freedb_hbox), 0);
536 GtkWidget *freedb_vbox = wh_vbox_new();
537 gtk_box_pack_start(GTK_BOX(freedb_hbox), freedb_vbox, TRUE, TRUE, 4);
540 GtkWidget *search_hbox = wh_hbox_new();
541 gtk_box_pack_start(GTK_BOX(freedb_vbox), search_hbox, FALSE, FALSE, 2);
543 GtkWidget *label = gtk_label_new(_(
"Search tracktype.org:"));
544 gtk_box_pack_start(GTK_BOX(search_hbox), label, FALSE, FALSE, 0);
546 GtkWidget *freedb_entry = gtk_entry_new();
547 ui->gui->freedb_entry = freedb_entry;
548 gtk_editable_set_editable(GTK_EDITABLE(freedb_entry), TRUE);
549 gtk_box_pack_start(GTK_BOX(search_hbox), freedb_entry, TRUE, TRUE, 6);
550 g_signal_connect(G_OBJECT(freedb_entry),
"activate",
551 G_CALLBACK(freedb_entry_activate_event), ui);
554 ui->gui->freedb_search_button = freedb_search_button;
555 g_signal_connect(G_OBJECT(freedb_search_button),
"clicked",
556 G_CALLBACK(freedb_search_button_event), ui);
557 gtk_box_pack_start(GTK_BOX(search_hbox), freedb_search_button, FALSE, FALSE, 0);
559 GtkWidget *freedb_spinner = gtk_spinner_new();
560 ui->gui->freedb_spinner = freedb_spinner;
561 gtk_box_pack_start(GTK_BOX(search_hbox), freedb_spinner, FALSE, FALSE, 4);
564 GtkTreeView *freedb_tree = create_freedb_tree();
565 ui->gui->freedb_tree = freedb_tree;
567 GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL);
568 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window), GTK_SHADOW_NONE);
569 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
570 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
571 gtk_box_pack_start(GTK_BOX(freedb_vbox), scrolled_window, TRUE, TRUE, 1);
573 create_freedb_columns(freedb_tree);
575 gtk_container_add(GTK_CONTAINER(scrolled_window), GTK_WIDGET(freedb_tree));
577 GtkTreeSelection *freedb_tree_selection = gtk_tree_view_get_selection(freedb_tree);
578 g_signal_connect(G_OBJECT(freedb_tree_selection),
"changed",
579 G_CALLBACK(freedb_selection_changed), ui);
583 ui->gui->freedb_add_button = freedb_add_button;
585 gtk_widget_set_sensitive(freedb_add_button, FALSE);
586 g_signal_connect(G_OBJECT(freedb_add_button),
"clicked",
587 G_CALLBACK(freedb_add_button_clicked_event), ui);
588 gtk_widget_set_tooltip_text(freedb_add_button, _(
"Set splitpoints to the splitpoints table"));
595 gtk_widget_hide(gui->freedb_spinner);