mp3splt-gtk
split_files_window.c
Go to the documentation of this file.
1 /**********************************************************
2  *
3  * mp3splt-gtk -- utility based on mp3splt,
4  * for mp3/ogg splitting without decoding
5  *
6  * Copyright: (C) 2005-2012 Alexandru Munteanu
7  * Contact: io_fx@yahoo.fr
8  *
9  * http://mp3splt.sourceforge.net/
10  *
11  *********************************************************/
12 
13 /**********************************************************
14  *
15  * This program is free software; you can redistribute it and/or
16  * modify it under the terms of the GNU General Public License
17  * as published by the Free Software Foundation; either version 2
18  * of the License, or (at your option) any later version.
19  *
20  * This program is distributed in the hope that it will be useful,
21  * but WITHOUT ANY WARRANTY; without even the implied warranty of
22  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23  * GNU General Public License for more details.
24  *
25  * You should have received a copy of the GNU General Public License
26  * along with this program; if not, write to the Free Software
27  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
28  * USA.
29  *
30  *********************************************************/
31 
32 /*!********************************************************
33  * \file
34  * The split tab
35  *
36  * file that handles the split files tab from the main
37  * window
38  **********************************************************/
39 
40 #include "split_files_window.h"
41 
43 enum
44 {
45  COL_NAME,
46  COL_FILENAME,
47  SPLIT_COLUMNS
48 };
49 
51 static GtkTreeModel *create_split_model()
52 {
53  GtkListStore *model = gtk_list_store_new(SPLIT_COLUMNS, G_TYPE_STRING, G_TYPE_STRING);
54  return GTK_TREE_MODEL(model);
55 }
56 
58 static GtkTreeView *create_split_files_tree()
59 {
60  return GTK_TREE_VIEW(gtk_tree_view_new_with_model(create_split_model()));
61 }
62 
64 static void create_split_columns(GtkTreeView *split_tree)
65 {
66  GtkCellRendererText *renderer = GTK_CELL_RENDERER_TEXT(gtk_cell_renderer_text_new());
67  g_object_set_data(G_OBJECT(renderer), "col", GINT_TO_POINTER(COL_NAME));
68  GtkTreeViewColumn *name_column = gtk_tree_view_column_new_with_attributes
69  (_("Filename"), GTK_CELL_RENDERER(renderer), "text", COL_NAME, NULL);
70 
71  gtk_tree_view_insert_column(split_tree, GTK_TREE_VIEW_COLUMN(name_column), COL_NAME);
72 
73  gtk_tree_view_column_set_alignment(GTK_TREE_VIEW_COLUMN(name_column), 0.5);
74  gtk_tree_view_column_set_sizing(GTK_TREE_VIEW_COLUMN(name_column),
75  GTK_TREE_VIEW_COLUMN_AUTOSIZE);
76  gtk_tree_view_column_set_resizable(name_column, TRUE);
77 }
78 
81 {
82  GtkTreeModel *model = gtk_tree_view_get_model(ui->gui->split_tree);
83  GtkTreeIter iter;
84  while (gtk_tree_model_get_iter_first(model, &iter))
85  {
86  gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
87  }
88 }
89 
92 const gchar *get_real_name_from_filename(const gchar *filename)
93 {
94  const gchar *fname = filename;
95  while (strchr(fname, G_DIR_SEPARATOR) != NULL)
96  {
97  fname = strchr(fname, G_DIR_SEPARATOR) + 1;
98  }
99 
100  return fname;
101 }
102 
104 void add_split_row(const gchar *name, ui_state *ui)
105 {
106  GtkTreeIter iter;
107  GtkTreeModel *model = gtk_tree_view_get_model(ui->gui->split_tree);
108  gtk_list_store_append(GTK_LIST_STORE(model), &iter);
109 
110  gtk_list_store_set(GTK_LIST_STORE(model), &iter,
111  COL_NAME, get_real_name_from_filename(name),
112  COL_FILENAME, name, -1);
113 }
114 
116 gchar *get_filename_from_split_files(gint number, gui_state *gui)
117 {
118  gchar *filename = NULL;
119 
120  GtkTreeModel *model = gtk_tree_view_get_model(gui->split_tree);
121  GtkTreePath *path = gtk_tree_path_new_from_indices(number-1 ,-1);
122 
123  GtkTreeIter iter;
124  if (gtk_tree_model_get_iter(model, &iter, path))
125  {
126  gtk_tree_model_get(model, &iter, COL_FILENAME, &filename, -1);
127  }
128  gtk_tree_path_free(path);
129 
130  return filename;
131 }
132 
134 static void queue_files_button_event(GtkWidget *widget, ui_state *ui)
135 {
136  if (!ui->status->timer_active)
137  {
138  connect_button_event(ui->gui->connect_button, ui);
139  }
140 
141  GList *file_list = NULL;
142  GtkTreeModel *model = gtk_tree_view_get_model(ui->gui->split_tree);
143 
144  GtkTreeIter iter;
145  while (gtk_tree_model_get_iter_first(model, &iter))
146  {
147  gchar *filename = NULL;
148  gtk_tree_model_get(model, &iter, COL_FILENAME, &filename, -1);
149  file_list = g_list_append(file_list, strdup(filename));
150  g_free(filename);
151  }
152 
153  if (file_list != NULL)
154  {
155  player_add_files(file_list, ui);
156  }
157 
158  g_list_foreach(file_list, (GFunc)g_free, NULL);
159  g_list_free(file_list);
160 }
161 
163 static void remove_file_button_event(GtkWidget *widget, ui_state *ui)
164 {
165  GtkTreeIter iter;
166  GtkTreeModel *model = gtk_tree_view_get_model(ui->gui->split_tree);
167  GtkTreeSelection *selection = gtk_tree_view_get_selection(ui->gui->split_tree);
168  GList *selected_list = gtk_tree_selection_get_selected_rows(selection, &model);
169 
170  while (g_list_length(selected_list) > 0)
171  {
172  GList *current_element = g_list_last(selected_list);
173  GtkTreePath *path = current_element->data;
174 
175  gtk_tree_model_get_iter(model, &iter, path);
176 
177  gchar *filename = NULL;
178  gtk_tree_model_get(model, &iter, COL_FILENAME, &filename, -1);
179  g_remove(filename);
180 
181  gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
182  selected_list = g_list_remove(selected_list, path);
183 
184  gtk_tree_path_free(path);
185  g_free(filename);
186  }
187 
188  if (!gtk_tree_model_get_iter_first(model, &iter))
189  {
190  gtk_widget_set_sensitive(ui->gui->queue_files_button, FALSE);
191  gtk_widget_set_sensitive(ui->gui->remove_all_files_button, FALSE);
192  }
193 
194  gtk_widget_set_sensitive(ui->gui->remove_file_button,FALSE);
195 
196  g_list_foreach(selected_list, (GFunc)gtk_tree_path_free, NULL);
197  g_list_free(selected_list);
198 }
199 
201 static void remove_all_files_button_event(GtkWidget *widget, ui_state *ui)
202 {
203  GtkTreeModel *model = gtk_tree_view_get_model(ui->gui->split_tree);
204  GtkTreeIter iter;
205 
206  while (gtk_tree_model_get_iter_first(model, &iter))
207  {
208  gchar *filename;
209  gtk_tree_model_get(model, &iter, COL_FILENAME, &filename, -1);
210  g_remove(filename);
211 
212  gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
213  g_free(filename);
214  }
215 
216  gtk_widget_set_sensitive(ui->gui->remove_all_files_button,FALSE);
217  gtk_widget_set_sensitive(ui->gui->remove_file_button,FALSE);
218  gtk_widget_set_sensitive(ui->gui->queue_files_button,FALSE);
219 }
220 
222 static void create_queue_buttons(ui_state *ui)
223 {
224  //button for queueing all files
225  GtkWidget *queue_files_button =
226  wh_create_cool_button(GTK_STOCK_INDEX, _("_Queue to player"),FALSE);
227  ui->gui->queue_files_button = queue_files_button;
228  gtk_widget_set_sensitive(queue_files_button, FALSE);
229  g_signal_connect(G_OBJECT(queue_files_button), "clicked",
230  G_CALLBACK(queue_files_button_event), ui);
231 
232  //button for removing a file
233  GtkWidget *remove_file_button =
234  wh_create_cool_button(GTK_STOCK_DELETE, _("_Delete selected"), FALSE);
235  ui->gui->remove_file_button = remove_file_button;
236  gtk_widget_set_sensitive(remove_file_button, FALSE);
237  g_signal_connect(G_OBJECT(remove_file_button), "clicked",
238  G_CALLBACK(remove_file_button_event), ui);
239 
240  //button for removing a file
241  GtkWidget *remove_all_files_button =
242  wh_create_cool_button(GTK_STOCK_DELETE, _("D_elete all"), FALSE);
243  ui->gui->remove_all_files_button = remove_all_files_button;
244  gtk_widget_set_sensitive(remove_all_files_button, FALSE);
245  g_signal_connect(G_OBJECT(remove_all_files_button), "clicked",
246  G_CALLBACK(remove_all_files_button_event), ui);
247 }
248 
250 void split_tree_row_activated(GtkTreeView *split_tree, GtkTreePath *arg1,
251  GtkTreeViewColumn *arg2, ui_state *ui)
252 {
253  GtkTreeModel *model = gtk_tree_view_get_model(split_tree);
254  GtkTreeSelection *selection = gtk_tree_view_get_selection(split_tree);
255  GList *selected_list = gtk_tree_selection_get_selected_rows(selection, &model);
256 
257  GList *current_element = g_list_first(selected_list);
258  GtkTreePath *path = current_element->data;
259 
260  GtkTreeIter iter;
261  gtk_tree_model_get_iter(model, &iter, path);
262 
263  gchar *filename = NULL;
264  gtk_tree_model_get(model, &iter, COL_FILENAME, &filename, -1);
265 
266  connect_button_event(ui->gui->connect_button, ui);
267  change_current_filename(filename, ui);
269 
270  gtk_tree_path_free(path);
271  if (filename)
272  {
273  g_free(filename);
274  }
275 }
276 
278 static void split_selection_changed(GtkTreeSelection *selec, ui_state *ui)
279 {
280  GtkTreeModel *model = gtk_tree_view_get_model(ui->gui->split_tree);
281  GtkTreeSelection *selection = gtk_tree_view_get_selection(ui->gui->split_tree);
282  GList *selected_list = gtk_tree_selection_get_selected_rows(selection, &model);
283  if (g_list_length(selected_list) > 0)
284  {
285  gtk_widget_set_sensitive(ui->gui->remove_file_button, TRUE);
286  }
287  else
288  {
289  gtk_widget_set_sensitive(ui->gui->remove_file_button, FALSE);
290  }
291 }
292 
295 {
296  GtkWidget *vbox = wh_vbox_new();
297 
298  GtkTreeView *split_tree = create_split_files_tree();
299  ui->gui->split_tree = split_tree;
300  GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL);
301  gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window), GTK_SHADOW_NONE);
302  gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
303  GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
304  gtk_box_pack_start(GTK_BOX(vbox), scrolled_window, TRUE, TRUE, 0);
305  create_split_columns(split_tree);
306  gtk_container_add(GTK_CONTAINER(scrolled_window), GTK_WIDGET(split_tree));
307  g_signal_connect(G_OBJECT(split_tree), "row-activated", G_CALLBACK(split_tree_row_activated), ui);
308 
309  //selection for the tree
310  GtkTreeSelection *split_tree_selection = gtk_tree_view_get_selection(split_tree);
311  g_signal_connect(G_OBJECT(split_tree_selection), "changed",
312  G_CALLBACK(split_selection_changed), ui);
313  gtk_tree_selection_set_mode(GTK_TREE_SELECTION(split_tree_selection), GTK_SELECTION_MULTIPLE);
314 
315  create_queue_buttons(ui);
316 
317  return vbox;
318 }
319