Mercurial > audlegacy
annotate src/audacious/ui_fileopener.c @ 2448:ff135e2ba10e trunk
[svn] - mark some strings used by GOption as translatable
author | nenolod |
---|---|
date | Tue, 30 Jan 2007 14:21:06 -0800 |
parents | 7f0318090690 |
children | 48c352f89a4e |
rev | line source |
---|---|
2417 | 1 /* Audacious - Cross-platform multimedia player |
2 * Copyright (C) 2005-2007 Audacious development team | |
3 * | |
4 * This program is free software; you can redistribute it and/or modify | |
5 * it under the terms of the GNU General Public License as published by | |
6 * the Free Software Foundation; under version 2 of the License. | |
7 * | |
8 * This program is distributed in the hope that it will be useful, | |
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
11 * GNU General Public License for more details. | |
12 * | |
13 * You should have received a copy of the GNU General Public License | |
14 * along with this program; if not, write to the Free Software | |
15 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |
16 */ | |
17 | |
18 #include "ui_fileopener.h" | |
19 | |
20 #include <glib/gi18n.h> | |
21 #include <string.h> | |
2432
4a1d1c324685
[svn] - restore shortcut key (esc) to close gtk2 fileopener.
yaz
parents:
2422
diff
changeset
|
22 #include <gdk/gdkkeysyms.h> |
2417 | 23 |
24 #include "input.h" | |
25 #include "main.h" | |
26 #include "playback.h" | |
27 #include "strings.h" | |
28 #include "ui_playlist.h" | |
29 | |
30 static void | |
31 filebrowser_add_files(GtkFileChooser * browser, | |
32 GSList * files) | |
33 { | |
34 GSList *cur; | |
35 gchar *ptr; | |
36 guint ctr = 0; | |
37 Playlist *playlist = playlist_get_active(); | |
38 | |
39 if (GTK_IS_WIDGET(mainwin_jtf)) | |
40 gtk_widget_set_sensitive(mainwin_jtf, FALSE); | |
41 | |
42 for (cur = files; cur; cur = g_slist_next(cur)) { | |
43 | |
44 if (g_file_test(cur->data,G_FILE_TEST_IS_DIR)) { | |
45 playlist_add_dir(playlist, (const gchar *) cur->data); | |
46 } else { | |
47 playlist_add(playlist, (const gchar *) cur->data); | |
48 } | |
49 | |
50 if (++ctr == 20) { | |
51 playlistwin_update_list(playlist); | |
52 ctr = 0; | |
53 while (gtk_events_pending() ) gtk_main_iteration(); | |
54 } | |
55 } | |
56 | |
57 playlistwin_update_list(playlist); | |
58 | |
59 if (GTK_IS_WIDGET(mainwin_jtf)) | |
60 gtk_widget_set_sensitive(mainwin_jtf, TRUE); | |
61 | |
62 ptr = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(browser)); | |
63 | |
64 g_free(cfg.filesel_path); | |
65 cfg.filesel_path = ptr; | |
66 } | |
67 | |
68 static void | |
69 action_button_cb(GtkWidget *widget, gpointer data) | |
70 { | |
71 GtkWidget *window = g_object_get_data(data, "window"); | |
72 GtkWidget *chooser = g_object_get_data(data, "chooser"); | |
73 GtkWidget *toggle = g_object_get_data(data, "toggle-button"); | |
74 cfg.close_dialog_open = | |
75 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toggle)); | |
76 | |
77 gboolean play_button = | |
78 GPOINTER_TO_INT(g_object_get_data(data, "play-button")); | |
79 | |
80 | |
81 GSList *files; | |
82 files = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(chooser)); | |
83 if (!files) return; | |
84 | |
85 if (play_button) | |
86 playlist_clear(playlist_get_active()); | |
87 | |
88 filebrowser_add_files(GTK_FILE_CHOOSER(chooser), files); | |
89 g_slist_foreach(files, (GFunc) g_free, NULL); | |
90 g_slist_free(files); | |
91 | |
92 if (play_button) | |
93 playback_initiate(); | |
94 | |
95 | |
96 if (cfg.close_dialog_open) | |
97 gtk_widget_destroy(window); | |
98 } | |
99 | |
100 | |
101 static void | |
102 close_button_cb(GtkWidget *widget, gpointer data) | |
103 { | |
104 gtk_widget_destroy(GTK_WIDGET(data)); | |
105 } | |
106 | |
2432
4a1d1c324685
[svn] - restore shortcut key (esc) to close gtk2 fileopener.
yaz
parents:
2422
diff
changeset
|
107 static gboolean |
4a1d1c324685
[svn] - restore shortcut key (esc) to close gtk2 fileopener.
yaz
parents:
2422
diff
changeset
|
108 filebrowser_on_keypress(GtkWidget * browser, |
4a1d1c324685
[svn] - restore shortcut key (esc) to close gtk2 fileopener.
yaz
parents:
2422
diff
changeset
|
109 GdkEventKey * event, |
4a1d1c324685
[svn] - restore shortcut key (esc) to close gtk2 fileopener.
yaz
parents:
2422
diff
changeset
|
110 gpointer data) |
4a1d1c324685
[svn] - restore shortcut key (esc) to close gtk2 fileopener.
yaz
parents:
2422
diff
changeset
|
111 { |
4a1d1c324685
[svn] - restore shortcut key (esc) to close gtk2 fileopener.
yaz
parents:
2422
diff
changeset
|
112 if (event->keyval == GDK_Escape) { |
4a1d1c324685
[svn] - restore shortcut key (esc) to close gtk2 fileopener.
yaz
parents:
2422
diff
changeset
|
113 gtk_widget_destroy(browser); |
4a1d1c324685
[svn] - restore shortcut key (esc) to close gtk2 fileopener.
yaz
parents:
2422
diff
changeset
|
114 return TRUE; |
4a1d1c324685
[svn] - restore shortcut key (esc) to close gtk2 fileopener.
yaz
parents:
2422
diff
changeset
|
115 } |
4a1d1c324685
[svn] - restore shortcut key (esc) to close gtk2 fileopener.
yaz
parents:
2422
diff
changeset
|
116 |
4a1d1c324685
[svn] - restore shortcut key (esc) to close gtk2 fileopener.
yaz
parents:
2422
diff
changeset
|
117 return FALSE; |
4a1d1c324685
[svn] - restore shortcut key (esc) to close gtk2 fileopener.
yaz
parents:
2422
diff
changeset
|
118 } |
4a1d1c324685
[svn] - restore shortcut key (esc) to close gtk2 fileopener.
yaz
parents:
2422
diff
changeset
|
119 |
2417 | 120 void |
121 util_run_filebrowser_gtk2style(gboolean play_button) | |
122 { | |
123 GtkWidget *window; | |
124 GtkWidget *vbox, *hbox, *bbox; | |
125 GtkWidget *chooser; | |
126 GtkWidget *action_button, *close_button; | |
127 GtkWidget *toggle; | |
128 | |
129 gchar *window_title = play_button ? _("Open Files") : _("Add Files"); | |
130 gchar *toggle_text = play_button ? | |
131 _("Close dialog on Open") : _("Close dialog on Add"); | |
132 gpointer action_stock = play_button ? GTK_STOCK_OPEN : GTK_STOCK_ADD; | |
133 | |
134 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
135 gtk_window_set_title(GTK_WINDOW(window), window_title); | |
136 gtk_window_set_default_size(GTK_WINDOW(window), 700, 450); | |
2440
7f0318090690
[svn] - set the gtk2 fileopener position to the center of the screen
giacomo
parents:
2432
diff
changeset
|
137 gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); |
2417 | 138 gtk_container_set_border_width(GTK_CONTAINER(window), 10); |
139 | |
140 vbox = gtk_vbox_new(FALSE, 0); | |
141 gtk_container_add(GTK_CONTAINER(window), vbox); | |
142 | |
143 chooser = gtk_file_chooser_widget_new(GTK_FILE_CHOOSER_ACTION_OPEN); | |
144 gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(chooser), TRUE); | |
145 if (cfg.filesel_path) | |
146 gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(chooser), | |
147 cfg.filesel_path); | |
2422 | 148 gtk_box_pack_start(GTK_BOX(vbox), chooser, TRUE, TRUE, 3); |
2417 | 149 |
150 hbox = gtk_hbox_new(TRUE, 0); | |
2422 | 151 gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, FALSE, 3); |
2417 | 152 |
153 toggle = gtk_check_button_new_with_label(toggle_text); | |
154 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), | |
155 cfg.close_dialog_open ? TRUE : FALSE); | |
2422 | 156 gtk_box_pack_start(GTK_BOX(hbox), toggle, TRUE, TRUE, 3); |
2417 | 157 |
158 bbox = gtk_hbutton_box_new(); | |
159 gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END); | |
2422 | 160 gtk_box_set_spacing(GTK_BOX(bbox), 6); |
161 gtk_box_pack_end(GTK_BOX(hbox), bbox, TRUE, TRUE, 3); | |
2417 | 162 |
163 close_button = gtk_button_new_from_stock(GTK_STOCK_CANCEL); | |
164 action_button = gtk_button_new_from_stock(action_stock); | |
165 gtk_container_add(GTK_CONTAINER(bbox), close_button); | |
166 gtk_container_add(GTK_CONTAINER(bbox), action_button); | |
167 | |
2420 | 168 /* this storage object holds several other objects which are used in the |
169 * callback functions | |
170 */ | |
2417 | 171 gpointer storage = g_object_new(G_TYPE_OBJECT, NULL); |
172 g_object_set_data(storage, "window", window); | |
173 g_object_set_data(storage, "chooser", chooser); | |
174 g_object_set_data(storage, "toggle-button", toggle); | |
175 g_object_set_data(storage, "play-button", GINT_TO_POINTER(play_button)); | |
176 | |
177 g_signal_connect(chooser, "file-activated", | |
178 G_CALLBACK(action_button_cb), storage); | |
179 g_signal_connect(action_button, "clicked", | |
180 G_CALLBACK(action_button_cb), storage); | |
181 g_signal_connect(close_button, "clicked", | |
182 G_CALLBACK(close_button_cb), window); | |
183 g_signal_connect(window, "destroy", | |
184 G_CALLBACK(gtk_widget_destroyed), &window); | |
185 | |
2432
4a1d1c324685
[svn] - restore shortcut key (esc) to close gtk2 fileopener.
yaz
parents:
2422
diff
changeset
|
186 g_signal_connect(window, "key_press_event", |
4a1d1c324685
[svn] - restore shortcut key (esc) to close gtk2 fileopener.
yaz
parents:
2422
diff
changeset
|
187 G_CALLBACK(filebrowser_on_keypress), |
4a1d1c324685
[svn] - restore shortcut key (esc) to close gtk2 fileopener.
yaz
parents:
2422
diff
changeset
|
188 NULL); |
4a1d1c324685
[svn] - restore shortcut key (esc) to close gtk2 fileopener.
yaz
parents:
2422
diff
changeset
|
189 |
2417 | 190 gtk_widget_show_all(window); |
191 } | |
192 | |
193 /* | |
194 * Derived from Beep Media Player 0.9.6.1. | |
195 * Which is (C) 2003 - 2006 Milosz Derezynski &c | |
196 * | |
197 * Although I changed it quite a bit. -nenolod | |
198 */ | |
199 static void filebrowser_changed_classic(GtkFileSelection * filesel) | |
200 { | |
201 GList *list; | |
202 GList *node; | |
203 char *filename = (char *) | |
204 gtk_file_selection_get_filename(GTK_FILE_SELECTION(filesel)); | |
205 GtkListStore *store; | |
206 GtkTreeIter iter; | |
207 | |
208 if ((list = input_scan_dir(filename)) != NULL) | |
209 { | |
210 /* | |
211 * We enter a directory that has been "hijacked" by an | |
212 * input-plugin. This is used by the CDDA plugin | |
213 */ | |
214 store = | |
215 GTK_LIST_STORE(gtk_tree_view_get_model | |
216 (GTK_TREE_VIEW(filesel->file_list))); | |
217 gtk_list_store_clear(store); | |
218 | |
219 node = list; | |
220 while (node) { | |
221 gtk_list_store_append(store, &iter); | |
222 gtk_list_store_set(store, &iter, 0, node->data, -1); | |
223 g_free(node->data); | |
224 node = g_list_next(node); | |
225 } | |
226 | |
227 g_list_free(list); | |
228 } | |
229 } | |
230 | |
231 static void filebrowser_entry_changed_classic(GtkEditable * entry, gpointer data) | |
232 { | |
233 filebrowser_changed_classic(GTK_FILE_SELECTION(data)); | |
234 } | |
235 | |
236 | |
237 static gboolean | |
238 util_filebrowser_is_dir_classic(GtkFileSelection * filesel) | |
239 { | |
240 char *text; | |
241 struct stat buf; | |
242 gboolean retv = FALSE; | |
243 | |
244 text = g_strdup(gtk_file_selection_get_filename(filesel)); | |
245 | |
246 if (stat(text, &buf) == 0 && S_ISDIR(buf.st_mode)) { | |
247 /* Selected directory */ | |
248 int len = strlen(text); | |
249 if (len > 3 && !strcmp(text + len - 4, "/../")) { | |
250 if (len == 4) | |
251 /* At the root already */ | |
252 *(text + len - 3) = '\0'; | |
253 else { | |
254 char *ptr; | |
255 *(text + len - 4) = '\0'; | |
256 ptr = strrchr(text, '/'); | |
257 *(ptr + 1) = '\0'; | |
258 } | |
259 } else if (len > 2 && !strcmp(text + len - 3, "/./")) | |
260 *(text + len - 2) = '\0'; | |
261 gtk_file_selection_set_filename(filesel, text); | |
262 retv = TRUE; | |
263 } | |
264 g_free(text); | |
265 return retv; | |
266 } | |
267 | |
268 static void filebrowser_add_files_classic(gchar ** files, | |
269 GtkFileSelection * filesel) | |
270 { | |
271 int ctr = 0; | |
272 char *ptr; | |
273 Playlist *playlist = playlist_get_active(); | |
274 | |
275 if (GTK_IS_WIDGET(mainwin_jtf)) | |
276 gtk_widget_set_sensitive(mainwin_jtf, FALSE); | |
277 | |
278 while (files[ctr] != NULL) { | |
279 playlist_add(playlist, files[ctr++]); | |
280 } | |
281 playlistwin_update_list(playlist); | |
282 | |
283 if (GTK_IS_WIDGET(mainwin_jtf)) | |
284 gtk_widget_set_sensitive(mainwin_jtf, TRUE); | |
285 | |
286 gtk_label_get(GTK_LABEL(GTK_BIN(filesel->history_pulldown)->child), | |
287 &ptr); | |
288 | |
289 /* This will give an extra slash if the current dir is the root. */ | |
290 cfg.filesel_path = g_strconcat(ptr, "/", NULL); | |
291 } | |
292 | |
293 static void filebrowser_ok_classic(GtkWidget * w, GtkWidget * filesel) | |
294 { | |
295 gchar **files; | |
296 | |
297 if (util_filebrowser_is_dir_classic(GTK_FILE_SELECTION(filesel))) | |
298 return; | |
299 files = gtk_file_selection_get_selections(GTK_FILE_SELECTION(filesel)); | |
300 filebrowser_add_files_classic(files, GTK_FILE_SELECTION(filesel)); | |
301 gtk_widget_destroy(filesel); | |
302 } | |
303 | |
304 static void filebrowser_play_classic(GtkWidget * w, GtkWidget * filesel) | |
305 { | |
306 gchar **files; | |
307 | |
308 if (util_filebrowser_is_dir_classic | |
309 (GTK_FILE_SELECTION(GTK_FILE_SELECTION(filesel)))) | |
310 return; | |
311 playlist_clear(playlist_get_active()); | |
312 files = gtk_file_selection_get_selections(GTK_FILE_SELECTION(filesel)); | |
313 filebrowser_add_files_classic(files, GTK_FILE_SELECTION(filesel)); | |
314 gtk_widget_destroy(filesel); | |
315 playback_initiate(); | |
316 } | |
317 | |
318 static void filebrowser_add_selected_files_classic(GtkWidget * w, gpointer data) | |
319 { | |
320 gchar **files; | |
321 | |
322 GtkFileSelection *filesel = GTK_FILE_SELECTION(data); | |
323 files = gtk_file_selection_get_selections(filesel); | |
324 | |
325 filebrowser_add_files_classic(files, filesel); | |
326 gtk_tree_selection_unselect_all(gtk_tree_view_get_selection | |
327 (GTK_TREE_VIEW(filesel->file_list))); | |
328 | |
329 gtk_entry_set_text(GTK_ENTRY(filesel->selection_entry), ""); | |
330 } | |
331 | |
332 static void filebrowser_add_all_files_classic(GtkWidget * w, gpointer data) | |
333 { | |
334 gchar **files; | |
335 GtkFileSelection *filesel; | |
336 | |
337 filesel = data; | |
338 gtk_tree_selection_select_all(gtk_tree_view_get_selection | |
339 (GTK_TREE_VIEW(filesel->file_list))); | |
340 files = gtk_file_selection_get_selections(filesel); | |
341 filebrowser_add_files_classic(files, filesel); | |
342 gtk_tree_selection_unselect_all(gtk_tree_view_get_selection | |
343 (GTK_TREE_VIEW(filesel->file_list))); | |
344 gtk_entry_set_text(GTK_ENTRY(filesel->selection_entry), ""); | |
345 } | |
346 | |
347 void | |
348 util_run_filebrowser_classic(gboolean play_button) | |
349 { | |
350 static GtkWidget *dialog; | |
351 GtkWidget *button_add_selected, *button_add_all, *button_close, | |
352 *button_add; | |
353 char *title; | |
354 | |
355 if (dialog != NULL) { | |
356 gtk_window_present(GTK_WINDOW(dialog)); | |
357 return; | |
358 } | |
359 | |
360 if (play_button) | |
361 title = _("Play files"); | |
362 else | |
363 title = _("Load files"); | |
364 | |
365 dialog = gtk_file_selection_new(title); | |
366 | |
367 gtk_file_selection_set_select_multiple | |
368 (GTK_FILE_SELECTION(dialog), TRUE); | |
369 | |
370 if (cfg.filesel_path) | |
371 gtk_file_selection_set_filename(GTK_FILE_SELECTION(dialog), | |
372 cfg.filesel_path); | |
373 | |
374 gtk_file_selection_hide_fileop_buttons(GTK_FILE_SELECTION(dialog)); | |
375 gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); | |
376 | |
377 gtk_widget_hide(GTK_FILE_SELECTION(dialog)->ok_button); | |
378 gtk_widget_destroy(GTK_FILE_SELECTION(dialog)->cancel_button); | |
379 | |
380 /* | |
381 * The mnemonics are quite unorthodox, but that should guarantee they're unique in any locale | |
382 * plus kinda easy to use | |
383 */ | |
384 button_add_selected = | |
385 gtk_dialog_add_button(GTK_DIALOG(dialog), "Add selected", | |
386 GTK_RESPONSE_NONE); | |
387 gtk_button_set_use_underline(GTK_BUTTON(button_add_selected), TRUE); | |
388 g_signal_connect(G_OBJECT(button_add_selected), "clicked", | |
389 G_CALLBACK(filebrowser_add_selected_files_classic), dialog); | |
390 | |
391 button_add_all = | |
392 gtk_dialog_add_button(GTK_DIALOG(dialog), "Add all", | |
393 GTK_RESPONSE_NONE); | |
394 gtk_button_set_use_underline(GTK_BUTTON(button_add_all), TRUE); | |
395 g_signal_connect(G_OBJECT(button_add_all), "clicked", | |
396 G_CALLBACK(filebrowser_add_all_files_classic), dialog); | |
397 | |
398 if (play_button) { | |
399 button_add = | |
400 gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_MEDIA_PLAY, | |
401 GTK_RESPONSE_NONE); | |
402 gtk_button_set_use_stock(GTK_BUTTON(button_add), TRUE); | |
403 g_signal_connect(G_OBJECT(button_add), "clicked", | |
404 G_CALLBACK(filebrowser_play_classic), dialog); | |
405 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(dialog)->ok_button), | |
406 "clicked", G_CALLBACK(filebrowser_play_classic), dialog); | |
407 } else { | |
408 button_add = | |
409 gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_ADD, | |
410 GTK_RESPONSE_NONE); | |
411 gtk_button_set_use_stock(GTK_BUTTON(button_add), TRUE); | |
412 g_signal_connect(G_OBJECT(button_add), "clicked", | |
413 G_CALLBACK(filebrowser_ok_classic), dialog); | |
414 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(dialog)->ok_button), | |
415 "clicked", G_CALLBACK(filebrowser_ok_classic), dialog); | |
416 } | |
417 | |
418 button_close = | |
419 gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CLOSE, | |
420 GTK_RESPONSE_NONE); | |
421 gtk_button_set_use_stock(GTK_BUTTON(button_close), TRUE); | |
422 g_signal_connect_swapped(G_OBJECT(button_close), "clicked", | |
423 G_CALLBACK(gtk_widget_destroy), | |
424 G_OBJECT(dialog)); | |
425 | |
426 gtk_widget_set_size_request(dialog, 600, 450); | |
427 gtk_widget_realize(dialog); | |
428 | |
429 g_signal_connect(G_OBJECT | |
430 (GTK_FILE_SELECTION(dialog)->history_pulldown), | |
431 "changed", G_CALLBACK(filebrowser_entry_changed_classic), | |
432 dialog); | |
433 | |
434 g_signal_connect(G_OBJECT(dialog), "destroy", | |
435 G_CALLBACK(gtk_widget_destroyed), &dialog); | |
436 | |
437 filebrowser_changed_classic(GTK_FILE_SELECTION(dialog)); | |
438 | |
439 gtk_widget_show(dialog); | |
440 } | |
441 | |
442 /* | |
443 * util_run_filebrowser(gboolean play_button) | |
444 * | |
445 * Inputs: | |
446 * - whether or not a play button should be used | |
447 * | |
448 * Outputs: | |
449 * - none | |
450 * | |
451 * Side Effects: | |
452 * - either a GTK1 or a GTK2 fileselector is launched | |
453 */ | |
454 void | |
455 run_filebrowser(gboolean play_button) | |
456 { | |
457 if (!cfg.use_xmms_style_fileselector) | |
458 util_run_filebrowser_gtk2style(play_button); | |
459 else | |
460 util_run_filebrowser_classic(play_button); | |
461 } |