40 #include "freedb_window.h"
49 static void add_freedb_row(gchar *album_name, gint album_id,
50 gint *revisions, gint revisions_number,
ui_state *ui)
52 GtkTreeModel *model = gtk_tree_view_get_model(ui->gui->freedb_tree);
55 gtk_tree_store_append (GTK_TREE_STORE(model), &iter,NULL);
56 gtk_tree_store_set(GTK_TREE_STORE(model), &iter,
57 ALBUM_NAME, album_name, NUMBER, album_id, -1);
59 gint malloc_number = strlen(album_name) + 20;
60 gchar *number = malloc(malloc_number *
sizeof(gchar *));
62 for(i = 0; i < revisions_number; i++)
64 g_snprintf(number,malloc_number, _(
"%s Revision %d"),album_name, revisions[i]);
66 GtkTreeIter child_iter;
67 gtk_tree_store_append(GTK_TREE_STORE(model), &child_iter, &iter);
68 gtk_tree_store_set(GTK_TREE_STORE(model), &child_iter,
69 ALBUM_NAME, number, NUMBER, album_id + i + 1, -1);
72 ui->infos->freedb_table_number++;
77 static GtkTreeModel *create_freedb_model()
79 GtkTreeStore *model = gtk_tree_store_new(FREEDB_TABLE, G_TYPE_STRING, G_TYPE_INT);
80 return GTK_TREE_MODEL(model);
84 static GtkTreeView *create_freedb_tree()
86 GtkTreeModel *model = create_freedb_model();
87 return GTK_TREE_VIEW(gtk_tree_view_new_with_model(model));
91 static void create_freedb_columns(GtkTreeView *freedb_tree)
93 GtkCellRendererText *renderer = GTK_CELL_RENDERER_TEXT(gtk_cell_renderer_text_new());
94 g_object_set_data(G_OBJECT(renderer),
"col", GINT_TO_POINTER(ALBUM_NAME));
95 GtkTreeViewColumn *name_column = gtk_tree_view_column_new_with_attributes
96 (_(
"Album title"), GTK_CELL_RENDERER(renderer),
"text", ALBUM_NAME, NULL);
98 gtk_tree_view_insert_column(freedb_tree, GTK_TREE_VIEW_COLUMN(name_column), ALBUM_NAME);
100 gtk_tree_view_column_set_alignment(GTK_TREE_VIEW_COLUMN(name_column), 0.5);
101 gtk_tree_view_column_set_sizing(GTK_TREE_VIEW_COLUMN(name_column), GTK_TREE_VIEW_COLUMN_AUTOSIZE);
102 gtk_tree_view_column_set_expand(GTK_TREE_VIEW_COLUMN(name_column), TRUE);
104 gtk_tree_view_column_set_resizable(GTK_TREE_VIEW_COLUMN(name_column), TRUE);
107 static void set_freedb_selected_id_safe(gint selected_id,
ui_state *ui)
109 lock_mutex(&ui->variables_mutex);
110 ui->infos->freedb_selected_id = selected_id;
111 unlock_mutex(&ui->variables_mutex);
114 static gint get_freedb_selected_id_safe(
ui_state *ui)
116 lock_mutex(&ui->variables_mutex);
117 gint selected_id = ui->infos->freedb_selected_id;
118 unlock_mutex(&ui->variables_mutex);
123 static void freedb_selection_changed(GtkTreeSelection *selection,
ui_state *ui)
125 GtkTreeModel *model = gtk_tree_view_get_model(ui->gui->freedb_tree);
128 if (gtk_tree_selection_get_selected(selection, &model, &iter))
132 gtk_tree_model_get(model, &iter, ALBUM_NAME, &info, NUMBER, &selected_id, -1);
135 set_freedb_selected_id_safe(selected_id, ui);
137 gtk_widget_set_sensitive(ui->gui->freedb_add_button, TRUE);
141 gtk_widget_set_sensitive(ui->gui->freedb_add_button, FALSE);
146 static void remove_all_freedb_rows(
ui_state *ui)
148 GtkTreeModel *model = gtk_tree_view_get_model(ui->gui->freedb_tree);
149 while (ui->infos->freedb_table_number > 0)
152 gtk_tree_model_get_iter_first(model, &iter);
153 gtk_tree_store_remove(GTK_TREE_STORE(model), &iter);
154 ui->infos->freedb_table_number--;
158 static gboolean freedb_search_start(
ui_state *ui)
162 gtk_widget_hide(gui->freedb_search_button);
163 gtk_widget_show(gui->freedb_spinner);
164 gtk_spinner_start(GTK_SPINNER(gui->freedb_spinner));
166 gtk_widget_set_sensitive(gui->freedb_add_button, FALSE);
167 gtk_widget_set_sensitive(gui->freedb_entry, FALSE);
168 gtk_widget_set_sensitive(GTK_WIDGET(gui->freedb_tree), FALSE);
175 static gboolean freedb_search_end(
ui_with_err *ui_err)
178 ui_infos *infos = ui_err->ui->infos;
180 remove_all_freedb_rows(ui_err->ui);
182 if (ui_err->err >= 0 && infos->freedb_search_results)
185 for (i = 0; i < infos->freedb_search_results->
number;i++)
190 add_freedb_row(infos->freedb_search_results->
results[i].
name,
191 infos->freedb_search_results->
results[i].
id,
196 if (infos->freedb_search_results->
number > 0)
198 GtkTreeSelection *selection = gtk_tree_view_get_selection(gui->freedb_tree);
199 GtkTreeModel *model = gtk_tree_view_get_model(gui->freedb_tree);
200 GtkTreePath *path = gtk_tree_path_new_from_indices (0 ,-1);
203 gtk_tree_model_get_iter(model, &iter, path);
204 gtk_tree_selection_select_iter(selection, &iter);
205 gtk_tree_path_free(path);
209 gtk_widget_show(gui->freedb_search_button);
210 gtk_spinner_stop(GTK_SPINNER(gui->freedb_spinner));
211 gtk_widget_hide(gui->freedb_spinner);
213 gtk_widget_set_sensitive(gui->freedb_entry, TRUE);
214 gtk_widget_set_sensitive(GTK_WIDGET(gui->freedb_tree), TRUE);
216 set_process_in_progress_and_wait_safe(FALSE, ui_err->ui);
224 static gpointer freedb_search(
ui_state *ui)
226 set_process_in_progress_and_wait_safe(TRUE, ui);
228 gdk_threads_add_idle_full(G_PRIORITY_HIGH_IDLE, (GSourceFunc)freedb_search_start, ui, NULL);
233 const gchar *freedb_search_value = gtk_entry_get_text(GTK_ENTRY(ui->gui->freedb_entry));
237 ui->infos->freedb_search_results =
241 print_status_bar_confirmation_in_idle(err, ui);
246 gdk_threads_add_idle_full(G_PRIORITY_HIGH_IDLE, (GSourceFunc)freedb_search_end, ui_err, NULL);
252 static void freedb_search_start_thread(
ui_state *ui)
254 create_thread((GThreadFunc)freedb_search, ui);
258 static void freedb_search_button_event(GtkWidget *widget,
ui_state *ui)
260 freedb_search_start_thread(ui);
267 static void freedb_entry_activate_event(GtkEntry *entry,
ui_state *ui)
269 freedb_search_start_thread(ui);
273 static void get_secs_mins_hundr(gfloat time, gint *mins,gint *secs, gint *hundr)
275 *mins = (gint)(time / 6000);
276 *secs = (gint)(time - (*mins * 6000)) / 100;
277 *hundr = (gint)(time - (*mins * 6000) - (*secs * 100));
301 for (i = 0; i < max_splits;i++)
305 long old_point_value = points[i].
value;
306 int point_value = (int) old_point_value;
307 if (old_point_value > INT_MAX)
309 point_value = INT_MAX;
312 get_secs_mins_hundr(point_value,
313 &ui->status->spin_mins, &ui->status->spin_secs, &ui->status->spin_hundr_secs);
315 gint must_be_free = FALSE;
316 gchar *result_utf8 = points[i].
name;
317 if (result_utf8 != NULL)
320 g_snprintf(ui->status->current_description, 255,
"%s", result_utf8);
324 g_snprintf(ui->status->current_description, 255,
"%s", _(
"description here"));
333 if (points[i].type == SPLT_SPLITPOINT)
337 else if (points[i].type == SPLT_SKIPPOINT)
343 g_snprintf(ui->status->current_description, 255,
"%s", _(
"description here"));
350 static gboolean put_freedb_splitpoints_start(
ui_state *ui)
352 gtk_widget_set_sensitive(ui->gui->freedb_add_button, FALSE);
353 gtk_widget_set_sensitive(GTK_WIDGET(ui->gui->freedb_tree), FALSE);
360 static gboolean put_freedb_splitpoints_end(
ui_state *ui)
364 gtk_widget_set_sensitive(ui->gui->freedb_add_button, TRUE);
365 gtk_widget_set_sensitive(GTK_WIDGET(ui->gui->freedb_tree), TRUE);
367 set_process_in_progress_and_wait_safe(FALSE, ui);
372 static gpointer put_freedb_splitpoints(
ui_state *ui)
374 set_process_in_progress_and_wait_safe(TRUE, ui);
376 gint selected_id = get_freedb_selected_id_safe(ui);
378 gdk_threads_add_idle_full(G_PRIORITY_HIGH_IDLE,
379 (GSourceFunc)put_freedb_splitpoints_start, ui, NULL);
381 gchar mp3splt_dir[14] =
".mp3splt-gtk";
382 const gchar *home_dir = g_get_home_dir();
383 gint malloc_number = strlen(mp3splt_dir) + strlen(home_dir) + 20;
384 gchar *filename = malloc(malloc_number *
sizeof(gchar));
385 g_snprintf(filename, malloc_number,
"%s%s%s%s%s", home_dir,
386 G_DIR_SEPARATOR_S, mp3splt_dir,
387 G_DIR_SEPARATOR_S,
"query.cddb");
391 mp3splt_write_freedb_file_result(ui->mp3splt_state, selected_id,
392 filename, &err, SPLT_FREEDB_GET_FILE_TYPE_CDDB_CGI,
"\0",-1);
393 print_status_bar_confirmation_in_idle(err, ui);
403 const char *data = gtk_entry_get_text(GTK_ENTRY(ui->gui->output_entry));
408 gint error = SPLT_OUTPUT_FORMAT_OK;
409 mp3splt_set_oformat(ui->mp3splt_state, data, &error);
410 print_status_bar_confirmation_in_idle(error, ui);
414 mp3splt_put_cddb_splitpoints_from_file(ui->mp3splt_state, filename, &err);
415 print_status_bar_confirmation_in_idle(err, ui);
423 gdk_threads_add_idle_full(G_PRIORITY_HIGH_IDLE,
424 (GSourceFunc)put_freedb_splitpoints_end, ui, NULL);
430 static void freedb_add_button_clicked_event(GtkButton *button,
ui_state *ui)
432 create_thread((GThreadFunc)put_freedb_splitpoints, ui);
438 GtkWidget *freedb_hbox = wh_hbox_new();
439 gtk_container_set_border_width(GTK_CONTAINER(freedb_hbox), 0);
441 GtkWidget *freedb_vbox = wh_vbox_new();
442 gtk_box_pack_start(GTK_BOX(freedb_hbox), freedb_vbox, TRUE, TRUE, 4);
445 GtkWidget *search_hbox = wh_hbox_new();
446 gtk_box_pack_start(GTK_BOX(freedb_vbox), search_hbox, FALSE, FALSE, 2);
448 GtkWidget *label = gtk_label_new(_(
"Search tracktype.org:"));
449 gtk_box_pack_start(GTK_BOX(search_hbox), label, FALSE, FALSE, 0);
451 GtkWidget *freedb_entry = gtk_entry_new();
452 ui->gui->freedb_entry = freedb_entry;
453 gtk_editable_set_editable(GTK_EDITABLE(freedb_entry), TRUE);
454 gtk_box_pack_start(GTK_BOX(search_hbox), freedb_entry, TRUE, TRUE, 6);
455 g_signal_connect(G_OBJECT(freedb_entry),
"activate",
456 G_CALLBACK(freedb_entry_activate_event), ui);
459 ui->gui->freedb_search_button = freedb_search_button;
460 g_signal_connect(G_OBJECT(freedb_search_button),
"clicked",
461 G_CALLBACK(freedb_search_button_event), ui);
462 gtk_box_pack_start(GTK_BOX(search_hbox), freedb_search_button, FALSE, FALSE, 0);
464 GtkWidget *freedb_spinner = gtk_spinner_new();
465 ui->gui->freedb_spinner = freedb_spinner;
466 gtk_box_pack_start(GTK_BOX(search_hbox), freedb_spinner, FALSE, FALSE, 4);
469 GtkTreeView *freedb_tree = create_freedb_tree();
470 ui->gui->freedb_tree = freedb_tree;
472 GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL);
473 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window), GTK_SHADOW_NONE);
474 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
475 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
476 gtk_box_pack_start(GTK_BOX(freedb_vbox), scrolled_window, TRUE, TRUE, 1);
478 create_freedb_columns(freedb_tree);
480 gtk_container_add(GTK_CONTAINER(scrolled_window), GTK_WIDGET(freedb_tree));
482 GtkTreeSelection *freedb_tree_selection = gtk_tree_view_get_selection(freedb_tree);
483 g_signal_connect(G_OBJECT(freedb_tree_selection),
"changed",
484 G_CALLBACK(freedb_selection_changed), ui);
488 ui->gui->freedb_add_button = freedb_add_button;
490 gtk_widget_set_sensitive(freedb_add_button, FALSE);
491 g_signal_connect(G_OBJECT(freedb_add_button),
"clicked",
492 G_CALLBACK(freedb_add_button_clicked_event), ui);
493 gtk_widget_set_tooltip_text(freedb_add_button, _(
"Set splitpoints to the splitpoints table"));
500 gtk_widget_hide(gui->freedb_spinner);