src/mn-sound-file-chooser-dialog.gob (3754B) - raw
1 /*
2 * Mail Notification
3 * Copyright (C) 2003-2008 Jean-Yves Lefort <jylefort@brutele.be>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19
20 %headertop{
21 #include <gtk/gtk.h>
22 %}
23
24 %privateheader{
25 #include "mn-sound-player.h"
26 %}
27
28 %{
29 #include <glib/gi18n.h>
30
31 enum
32 {
33 RESPONSE_PLAY = 1,
34 RESPONSE_STOP
35 };
36 %}
37
38 class MN:Sound:File:Chooser:Dialog from Gtk:File:Chooser:Dialog
39 {
40 private MNSoundPlayer *sound_player unrefwith g_object_unref;
41
42 constructor (self)
43 {
44 GtkFileFilter *filter;
45
46 selfp->sound_player = mn_sound_player_new();
47
48 gtk_window_set_title(GTK_WINDOW(self), _("Select a File"));
49
50 gtk_dialog_add_buttons(GTK_DIALOG(self),
51 GTK_STOCK_MEDIA_PLAY, RESPONSE_PLAY,
52 GTK_STOCK_MEDIA_STOP, RESPONSE_STOP,
53 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
54 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
55 NULL);
56
57 filter = gtk_file_filter_new();
58 gtk_file_filter_set_name(filter, _("All files"));
59 gtk_file_filter_add_pattern(filter, "*");
60 gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(self), filter);
61
62 filter = gtk_file_filter_new();
63 gtk_file_filter_set_name(filter, _("Audio files"));
64 gtk_file_filter_add_mime_type(filter, "audio/*");
65 gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(self), filter);
66 gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(self), filter);
67
68 g_object_connect(self,
69 "signal::response", self_response_h, NULL,
70 "signal::selection-changed", self_update_sensitivity, NULL,
71 NULL);
72
73 g_object_connect(selfp->sound_player,
74 "swapped-signal::notify::can-play", self_update_sensitivity, self,
75 "swapped-signal::notify::can-stop", self_update_sensitivity, self,
76 NULL);
77
78 self_update_sensitivity(self);
79 }
80
81 private void
82 response_h (GtkDialog *dialog, int response, gpointer user_data)
83 {
84 Self *self = SELF(dialog);
85
86 if (response == RESPONSE_PLAY)
87 {
88 char *filename;
89
90 filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
91 if (filename)
92 {
93 mn_sound_player_play(selfp->sound_player, filename, GTK_WINDOW(dialog));
94 g_free(filename);
95 }
96 }
97 else if (response == RESPONSE_STOP)
98 mn_sound_player_stop(selfp->sound_player);
99 else
100 return;
101
102 /*
103 * Do not pass our internal responses to client code and do not
104 * let the dialog be destroyed.
105 */
106 g_signal_stop_emission_by_name(dialog, "response");
107 }
108
109 private void
110 update_sensitivity (self)
111 {
112 gtk_dialog_set_response_sensitive(GTK_DIALOG(self), RESPONSE_PLAY, self_has_selected_file(self) && mn_sound_player_get_can_play(selfp->sound_player));
113 gtk_dialog_set_response_sensitive(GTK_DIALOG(self), RESPONSE_STOP, mn_sound_player_get_can_stop(selfp->sound_player));
114 }
115
116 private gboolean
117 has_selected_file (self)
118 {
119 char *filename;
120 gboolean has;
121
122 filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(self));
123 has = filename && ! g_file_test(filename, G_FILE_TEST_IS_DIR);
124 g_free(filename);
125
126 return has;
127 }
128
129 public GtkWidget *
130 new (void)
131 {
132 return GTK_WIDGET(GET_NEW);
133 }
134 }