41 #include <glib/gi18n.h>
44 #include "multiple_files.h"
46 #include "ui_manager.h"
47 #include "widgets_helper.h"
52 GtkWidget *multiple_files_tree = NULL;
53 gint multiple_files_tree_number = 0;
55 GtkWidget *multiple_files_remove_file_button = NULL;
56 GtkWidget *multiple_files_remove_all_files_button = NULL;
58 #define MY_GTK_RESPONSE 200
65 model = gtk_list_store_new(MULTIPLE_FILES_COLUMNS,
69 return GTK_TREE_MODEL(model);
72 GtkTreeView *create_multiple_files_tree()
78 tree_view = (GtkTreeView *)gtk_tree_view_new_with_model(model);
83 void create_multiple_files_columns(GtkTreeView *tree_view)
85 GtkCellRendererText *renderer =
86 GTK_CELL_RENDERER_TEXT(gtk_cell_renderer_text_new());
87 GtkTreeViewColumn *filename_column = gtk_tree_view_column_new_with_attributes
88 (_(
"Complete filename"), GTK_CELL_RENDERER(renderer),
89 "text", MULTIPLE_COL_FILENAME, NULL);
90 gtk_tree_view_insert_column(GTK_TREE_VIEW(tree_view),
91 GTK_TREE_VIEW_COLUMN(filename_column),MULTIPLE_COL_FILENAME);
93 gtk_tree_view_column_set_alignment(GTK_TREE_VIEW_COLUMN(filename_column), 0.5);
94 gtk_tree_view_column_set_sizing(GTK_TREE_VIEW_COLUMN(filename_column),
95 GTK_TREE_VIEW_COLUMN_AUTOSIZE);
96 gtk_tree_view_column_set_sort_column_id(filename_column, MULTIPLE_COL_FILENAME);
99 void multiple_files_open_button_event(GtkWidget *widget, gpointer data)
101 gtk_dialog_response(GTK_DIALOG(data), MY_GTK_RESPONSE);
104 void multiple_files_add_button_event(GtkWidget *widget, gpointer data)
106 GtkWidget *file_chooser;
107 GtkWidget *our_filter;
109 file_chooser = gtk_file_chooser_dialog_new(_(
"Choose file or directory"),
111 GTK_FILE_CHOOSER_ACTION_OPEN,
116 wh_set_browser_directory_handler(ui, file_chooser);
118 GtkWidget *button = gtk_dialog_add_button(GTK_DIALOG(file_chooser),
119 GTK_STOCK_ADD, MY_GTK_RESPONSE);
120 gtk_button_set_use_stock(GTK_BUTTON(button), TRUE);
121 g_signal_connect(G_OBJECT(button),
"clicked",
122 G_CALLBACK(multiple_files_open_button_event), file_chooser);
123 g_signal_connect(G_OBJECT(file_chooser),
"file-activated",
124 G_CALLBACK(multiple_files_open_button_event), file_chooser);
126 gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(file_chooser), TRUE);
129 our_filter = (GtkWidget *)gtk_file_filter_new();
130 gtk_file_filter_set_name (GTK_FILE_FILTER(our_filter), _(
"mp3 and ogg files (*.mp3 *.ogg)"));
131 gtk_file_filter_add_pattern(GTK_FILE_FILTER(our_filter),
"*.mp3");
132 gtk_file_filter_add_pattern(GTK_FILE_FILTER(our_filter),
"*.MP3");
133 gtk_file_filter_add_pattern(GTK_FILE_FILTER(our_filter),
"*.ogg");
134 gtk_file_filter_add_pattern(GTK_FILE_FILTER(our_filter),
"*.OGG");
135 gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(file_chooser), GTK_FILE_FILTER(our_filter));
137 our_filter = (GtkWidget *)gtk_file_filter_new();
138 gtk_file_filter_set_name (GTK_FILE_FILTER(our_filter), _(
"mp3 files (*.mp3)"));
139 gtk_file_filter_add_pattern(GTK_FILE_FILTER(our_filter),
"*.mp3");
140 gtk_file_filter_add_pattern(GTK_FILE_FILTER(our_filter),
"*.MP3");
141 gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(file_chooser), GTK_FILE_FILTER(our_filter));
143 our_filter = (GtkWidget *)gtk_file_filter_new();
144 gtk_file_filter_set_name (GTK_FILE_FILTER(our_filter), _(
"ogg files (*.ogg)"));
145 gtk_file_filter_add_pattern(GTK_FILE_FILTER(our_filter),
"*.ogg");
146 gtk_file_filter_add_pattern(GTK_FILE_FILTER(our_filter),
"*.OGG");
147 gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(file_chooser), GTK_FILE_FILTER(our_filter));
150 our_filter = (GtkWidget *)gtk_file_filter_new();
151 gtk_file_filter_set_name (GTK_FILE_FILTER(our_filter), _(
"All Files"));
152 gtk_file_filter_add_pattern(GTK_FILE_FILTER(our_filter),
"*");
153 gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(file_chooser), GTK_FILE_FILTER(our_filter));
156 if (gtk_dialog_run(GTK_DIALOG(file_chooser)) == MY_GTK_RESPONSE)
158 GSList *files = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(file_chooser));
161 gchar *filename = NULL;
164 GtkTreeModel *model =
165 gtk_tree_view_get_model(GTK_TREE_VIEW(multiple_files_tree));
169 filename = files->data;
172 int num_of_files_found = 0;
173 char **splt_filenames =
174 mp3splt_find_filenames(the_state, filename, &num_of_files_found, &err);
179 for (i = 0;i < num_of_files_found;i++)
181 gtk_list_store_append(GTK_LIST_STORE(model), &iter);
183 gtk_list_store_set (GTK_LIST_STORE(model),
185 MULTIPLE_COL_FILENAME, splt_filenames[i],
187 multiple_files_tree_number++;
189 if (splt_filenames[i])
191 free(splt_filenames[i]);
192 splt_filenames[i] = NULL;
196 free(splt_filenames);
197 splt_filenames = NULL;
203 files = g_slist_next(files);
207 if (multiple_files_tree_number > 0)
209 gtk_widget_set_sensitive(multiple_files_remove_all_files_button, TRUE);
214 gtk_widget_destroy(file_chooser);
217 void multiple_files_remove_button_event(GtkWidget *widget, gpointer data)
222 GList *selected_list = NULL;
223 GList *current_element = NULL;
224 GtkTreeSelection *selection;
226 model = gtk_tree_view_get_model(GTK_TREE_VIEW(multiple_files_tree));
227 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(multiple_files_tree));
228 selected_list = gtk_tree_selection_get_selected_rows(selection, &model);
231 gchar *filename = NULL;
233 while (g_list_length(selected_list) > 0)
236 current_element = g_list_last(selected_list);
237 path = current_element->data;
239 gtk_tree_model_get_iter(model, &iter, path);
240 gtk_tree_model_get(model, &iter, MULTIPLE_COL_FILENAME, &filename, -1);
242 gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
243 selected_list = g_list_remove(selected_list, path);
244 multiple_files_tree_number--;
247 gtk_tree_path_free(path);
251 if (multiple_files_tree_number == 0)
253 gtk_widget_set_sensitive(multiple_files_remove_all_files_button, FALSE);
256 gtk_widget_set_sensitive(multiple_files_remove_file_button,FALSE);
259 g_list_foreach(selected_list, (GFunc)gtk_tree_path_free, NULL);
260 g_list_free(selected_list);
263 void multiple_files_remove_all_button_event(GtkWidget *widget, gpointer data)
268 model = gtk_tree_view_get_model(GTK_TREE_VIEW(multiple_files_tree));
271 gchar *filename = NULL;
273 while (multiple_files_tree_number > 0)
275 gtk_tree_model_get_iter_first(model, &iter);
276 gtk_tree_model_get(model, &iter, MULTIPLE_COL_FILENAME, &filename, -1);
277 gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
278 multiple_files_tree_number--;
282 gtk_widget_set_sensitive(multiple_files_remove_all_files_button,FALSE);
283 gtk_widget_set_sensitive(multiple_files_remove_file_button,FALSE);
286 GtkWidget *create_multiple_files_buttons_hbox()
288 GtkWidget *hbox = gtk_hbox_new(FALSE,0);
291 GtkWidget *multiple_files_add_button = (GtkWidget *)
293 gtk_box_pack_start(GTK_BOX(hbox), multiple_files_add_button, FALSE, FALSE, 5);
294 gtk_widget_set_sensitive(multiple_files_add_button, TRUE);
295 g_signal_connect(G_OBJECT(multiple_files_add_button),
"clicked",
296 G_CALLBACK(multiple_files_add_button_event), NULL);
299 multiple_files_remove_file_button = (GtkWidget *)
301 gtk_box_pack_start(GTK_BOX(hbox),
302 multiple_files_remove_file_button, FALSE, FALSE, 5);
303 gtk_widget_set_sensitive(multiple_files_remove_file_button,FALSE);
304 g_signal_connect(G_OBJECT(multiple_files_remove_file_button),
"clicked",
305 G_CALLBACK(multiple_files_remove_button_event), NULL);
308 multiple_files_remove_all_files_button = (GtkWidget *)
310 gtk_box_pack_start(GTK_BOX(hbox), multiple_files_remove_all_files_button,
312 gtk_widget_set_sensitive(multiple_files_remove_all_files_button,FALSE);
313 g_signal_connect(G_OBJECT(multiple_files_remove_all_files_button),
"clicked",
314 G_CALLBACK(multiple_files_remove_all_button_event), NULL);
319 void multiple_files_selection_changed(GtkTreeSelection *selec, gpointer data)
322 GtkTreeSelection *selection;
323 GList *selected_list = NULL;
325 model = gtk_tree_view_get_model(GTK_TREE_VIEW(multiple_files_tree));
326 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(multiple_files_tree));
327 selected_list = gtk_tree_selection_get_selected_rows(selection, &model);
329 if (g_list_length(selected_list) > 0)
331 gtk_widget_set_sensitive(multiple_files_remove_file_button,TRUE);
335 gtk_widget_set_sensitive(multiple_files_remove_file_button,FALSE);
339 GtkWidget *create_multiple_files_component()
341 GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
343 multiple_files_tree = (GtkWidget *)create_multiple_files_tree();
345 GtkWidget *scrolled_window = gtk_scrolled_window_new (NULL, NULL);
346 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window), GTK_SHADOW_NONE);
347 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (scrolled_window),
348 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
349 gtk_box_pack_start(GTK_BOX(vbox), scrolled_window, TRUE, TRUE, 0);
352 create_multiple_files_columns(GTK_TREE_VIEW(multiple_files_tree));
355 gtk_container_add(GTK_CONTAINER(scrolled_window), GTK_WIDGET(multiple_files_tree));
358 GtkWidget *multiple_files_tree_selection = (GtkWidget *)
359 gtk_tree_view_get_selection(GTK_TREE_VIEW(multiple_files_tree));
360 g_signal_connect(G_OBJECT(multiple_files_tree_selection),
"changed",
361 G_CALLBACK(multiple_files_selection_changed), NULL);
362 gtk_tree_selection_set_mode(GTK_TREE_SELECTION(multiple_files_tree_selection),
363 GTK_SELECTION_MULTIPLE);
366 GtkWidget *buttons_hbox = (GtkWidget *)create_multiple_files_buttons_hbox();
367 gtk_box_pack_start(GTK_BOX(vbox), buttons_hbox, FALSE, FALSE, 2);