2006-12-14 Francisco Javier F. Serrador <serrador@openshine.com>
[rhythmbox.git] / shell / rb-shell-preferences.c
blob243e68121bdf6db2455b02c558c5900d546eb4f6
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
3 * arch-tag: Implementation of preferences dialog object
5 * Copyright (C) 2002 Jorn Baayen <jorn@nl.linux.org>
6 * Copyright (C) 2003 Colin Walters <walters@debian.org>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
24 #include <config.h>
26 #include <string.h>
28 #include <glib/gi18n.h>
29 #include <gtk/gtk.h>
30 #include <glade/glade.h>
31 #include <libgnome/gnome-help.h>
33 #include "rb-file-helpers.h"
34 #include "rb-shell-preferences.h"
35 #include "rb-source.h"
36 #include "rb-glade-helpers.h"
37 #include "rb-dialog.h"
38 #include "rb-debug.h"
39 #include "eel-gconf-extensions.h"
40 #include "rb-preferences.h"
42 static void rb_shell_preferences_class_init (RBShellPreferencesClass *klass);
43 static void rb_shell_preferences_init (RBShellPreferences *shell_preferences);
44 static void rb_shell_preferences_finalize (GObject *object);
45 static gboolean rb_shell_preferences_window_delete_cb (GtkWidget *window,
46 GdkEventAny *event,
47 RBShellPreferences *shell_preferences);
48 static void rb_shell_preferences_response_cb (GtkDialog *dialog,
49 int response_id,
50 RBShellPreferences *shell_preferences);
51 static void rb_shell_preferences_ui_pref_changed (GConfClient *client,
52 guint cnxn_id,
53 GConfEntry *entry,
54 RBShellPreferences *shell_preferences);
55 static void rb_shell_preferences_sync (RBShellPreferences *shell_preferences);
57 void rb_shell_preferences_column_check_changed_cb (GtkCheckButton *butt,
58 RBShellPreferences *shell_preferences);
59 void rb_shell_preferences_browser_views_activated_cb (GtkWidget *widget,
60 RBShellPreferences *shell_preferences);
61 static void rb_shell_preferences_toolbar_style_cb (GtkComboBox *box,
62 RBShellPreferences *preferences);
64 enum
66 PROP_0,
69 const char *styles[] = { "desktop_default", "both", "both_horiz", "icon", "text" };
71 struct RBShellPreferencesPrivate
73 GtkWidget *notebook;
75 GtkWidget *config_widget;
76 GtkWidget *artist_check;
77 GtkWidget *album_check;
78 GtkWidget *genre_check;
79 GtkWidget *duration_check;
80 GtkWidget *track_check;
81 GtkWidget *rating_check;
82 GtkWidget *play_count_check;
83 GtkWidget *last_played_check;
84 GtkWidget *first_seen_check;
85 GtkWidget *quality_check;
86 GtkWidget *year_check;
88 GSList *browser_views_group;
90 GtkWidget *toolbar_style_menu;
92 gboolean loading;
95 #define RB_SHELL_PREFERENCES_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), RB_TYPE_SHELL_PREFERENCES, RBShellPreferencesPrivate))
97 G_DEFINE_TYPE (RBShellPreferences, rb_shell_preferences, GTK_TYPE_DIALOG)
99 static void
100 rb_shell_preferences_class_init (RBShellPreferencesClass *klass)
102 GObjectClass *object_class = G_OBJECT_CLASS (klass);
104 object_class->finalize = rb_shell_preferences_finalize;
106 g_type_class_add_private (klass, sizeof (RBShellPreferencesPrivate));
109 static void
110 help_cb (GtkWidget *widget,
111 RBShellPreferences *shell_preferences)
113 GError *error = NULL;
115 gnome_help_display ("rhythmbox.xml", "prefs", &error);
117 if (error != NULL) {
118 rb_error_dialog (NULL,
119 _("Couldn't display help"),
120 "%s", error->message);
122 g_error_free (error);
126 static void
127 rb_shell_preferences_init (RBShellPreferences *shell_preferences)
129 GtkWidget *tmp;
130 GladeXML *xml;
132 shell_preferences->priv = RB_SHELL_PREFERENCES_GET_PRIVATE (shell_preferences);
134 g_signal_connect_object (G_OBJECT (shell_preferences),
135 "delete_event",
136 G_CALLBACK (rb_shell_preferences_window_delete_cb),
137 shell_preferences, 0);
138 g_signal_connect_object (G_OBJECT (shell_preferences),
139 "response",
140 G_CALLBACK (rb_shell_preferences_response_cb),
141 shell_preferences, 0);
143 gtk_dialog_add_button (GTK_DIALOG (shell_preferences),
144 GTK_STOCK_CLOSE,
145 GTK_RESPONSE_CLOSE);
146 tmp = gtk_dialog_add_button (GTK_DIALOG (shell_preferences),
147 GTK_STOCK_HELP,
148 GTK_RESPONSE_HELP);
149 g_signal_connect_object (G_OBJECT (tmp), "clicked",
150 G_CALLBACK (help_cb), shell_preferences, 0);
151 gtk_dialog_set_default_response (GTK_DIALOG (shell_preferences),
152 GTK_RESPONSE_CLOSE);
154 gtk_window_set_title (GTK_WINDOW (shell_preferences), _("Music Player Preferences"));
155 gtk_window_set_resizable (GTK_WINDOW (shell_preferences), FALSE);
157 shell_preferences->priv->notebook = GTK_WIDGET (gtk_notebook_new ());
158 gtk_container_set_border_width (GTK_CONTAINER (shell_preferences->priv->notebook), 5);
160 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (shell_preferences)->vbox),
161 shell_preferences->priv->notebook);
163 gtk_container_set_border_width (GTK_CONTAINER (shell_preferences), 5);
164 gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (shell_preferences)->vbox), 2);
165 gtk_dialog_set_has_separator (GTK_DIALOG (shell_preferences), FALSE);
167 xml = rb_glade_xml_new ("general-prefs.glade",
168 "general_vbox",
169 shell_preferences);
171 rb_glade_boldify_label (xml, "visible_columns_label");
173 /* Columns */
174 shell_preferences->priv->artist_check =
175 glade_xml_get_widget (xml, "artist_check");
176 shell_preferences->priv->album_check =
177 glade_xml_get_widget (xml, "album_check");
178 shell_preferences->priv->genre_check =
179 glade_xml_get_widget (xml, "genre_check");
180 shell_preferences->priv->duration_check =
181 glade_xml_get_widget (xml, "duration_check");
182 shell_preferences->priv->track_check =
183 glade_xml_get_widget (xml, "track_check");
184 shell_preferences->priv->rating_check =
185 glade_xml_get_widget (xml, "rating_check");
186 shell_preferences->priv->play_count_check =
187 glade_xml_get_widget (xml, "play_count_check");
188 shell_preferences->priv->last_played_check =
189 glade_xml_get_widget (xml, "last_played_check");
190 shell_preferences->priv->quality_check =
191 glade_xml_get_widget (xml, "quality_check");
192 shell_preferences->priv->year_check =
193 glade_xml_get_widget (xml, "year_check");
194 shell_preferences->priv->first_seen_check =
195 glade_xml_get_widget (xml, "first_seen_check");
197 /* browser options */
198 rb_glade_boldify_label (xml, "browser_views_label");
200 tmp = glade_xml_get_widget (xml, "library_browser_views_radio");
201 shell_preferences->priv->browser_views_group =
202 g_slist_reverse (g_slist_copy (gtk_radio_button_get_group
203 (GTK_RADIO_BUTTON (tmp))));
205 gtk_notebook_append_page (GTK_NOTEBOOK (shell_preferences->priv->notebook),
206 glade_xml_get_widget (xml, "general_vbox"),
207 gtk_label_new (_("General")));
209 /* toolbar button style */
210 rb_glade_boldify_label (xml, "toolbar_style_label");
211 shell_preferences->priv->toolbar_style_menu =
212 glade_xml_get_widget (xml, "toolbar_style_menu");
213 gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (shell_preferences->priv->toolbar_style_menu),
214 rb_combo_box_hyphen_separator_func,
215 NULL, NULL);
216 g_signal_connect_object (G_OBJECT (shell_preferences->priv->toolbar_style_menu),
217 "changed", G_CALLBACK (rb_shell_preferences_toolbar_style_cb),
218 shell_preferences, 0);
220 eel_gconf_notification_add (CONF_UI_DIR,
221 (GConfClientNotifyFunc) rb_shell_preferences_ui_pref_changed,
222 shell_preferences);
223 g_object_unref (G_OBJECT (xml));
224 rb_shell_preferences_sync (shell_preferences);
227 static void
228 rb_shell_preferences_finalize (GObject *object)
230 RBShellPreferences *shell_preferences;
232 g_return_if_fail (object != NULL);
233 g_return_if_fail (RB_IS_SHELL_PREFERENCES (object));
235 shell_preferences = RB_SHELL_PREFERENCES (object);
237 g_return_if_fail (shell_preferences->priv != NULL);
239 G_OBJECT_CLASS (rb_shell_preferences_parent_class)->finalize (object);
242 void
243 rb_shell_preferences_append_page (RBShellPreferences *prefs,
244 const char *name,
245 GtkWidget *widget)
247 GtkWidget *label;
249 label = gtk_label_new (name);
250 gtk_notebook_append_page (GTK_NOTEBOOK (prefs->priv->notebook),
251 widget,
252 label);
255 static void
256 rb_shell_preferences_append_view_page (RBShellPreferences *prefs,
257 const char *name,
258 RBSource *source)
260 GtkWidget *widget;
262 g_return_if_fail (RB_IS_SHELL_PREFERENCES (prefs));
263 g_return_if_fail (RB_IS_SOURCE (source));
265 widget = rb_source_get_config_widget (source, prefs);
266 if (!widget)
267 return;
269 rb_shell_preferences_append_page (prefs, name, widget);
272 GtkWidget *
273 rb_shell_preferences_new (GList *views)
275 RBShellPreferences *shell_preferences;
277 shell_preferences = g_object_new (RB_TYPE_SHELL_PREFERENCES,
278 NULL, NULL);
280 g_return_val_if_fail (shell_preferences->priv != NULL, NULL);
282 for (; views; views = views->next)
284 char *name = NULL;
285 g_object_get (views->data, "name", &name, NULL);
286 g_assert (name != NULL);
287 rb_shell_preferences_append_view_page (shell_preferences,
288 name,
289 RB_SOURCE (views->data));
290 g_free (name);
293 return GTK_WIDGET (shell_preferences);
296 static gboolean
297 rb_shell_preferences_window_delete_cb (GtkWidget *window,
298 GdkEventAny *event,
299 RBShellPreferences *shell_preferences)
301 gtk_widget_hide (GTK_WIDGET (shell_preferences));
303 return TRUE;
306 static void
307 rb_shell_preferences_response_cb (GtkDialog *dialog,
308 int response_id,
309 RBShellPreferences *shell_preferences)
311 if (response_id == GTK_RESPONSE_CLOSE)
312 gtk_widget_hide (GTK_WIDGET (shell_preferences));
315 static void
316 rb_shell_preferences_ui_pref_changed (GConfClient *client,
317 guint cnxn_id,
318 GConfEntry *entry,
319 RBShellPreferences *shell_preferences)
321 if (shell_preferences->priv->loading == TRUE)
322 return;
324 rb_shell_preferences_sync (shell_preferences);
327 void
328 rb_shell_preferences_column_check_changed_cb (GtkCheckButton *butt,
329 RBShellPreferences *shell_preferences)
331 GString *newcolumns = g_string_new ("");
332 char *currentcols = eel_gconf_get_string (CONF_UI_COLUMNS_SETUP);
333 char **colnames = currentcols ? g_strsplit (currentcols, ",", 0) : NULL;
334 char *colname = NULL;
335 int i;
337 if (butt == GTK_CHECK_BUTTON (shell_preferences->priv->artist_check))
338 colname = "RHYTHMDB_PROP_ARTIST";
339 else if (butt == GTK_CHECK_BUTTON (shell_preferences->priv->album_check))
340 colname = "RHYTHMDB_PROP_ALBUM";
341 else if (butt == GTK_CHECK_BUTTON (shell_preferences->priv->genre_check))
342 colname = "RHYTHMDB_PROP_GENRE";
343 else if (butt == GTK_CHECK_BUTTON (shell_preferences->priv->duration_check))
344 colname = "RHYTHMDB_PROP_DURATION";
345 else if (butt == GTK_CHECK_BUTTON (shell_preferences->priv->track_check))
346 colname = "RHYTHMDB_PROP_TRACK_NUMBER";
347 else if (butt == GTK_CHECK_BUTTON (shell_preferences->priv->rating_check))
348 colname = "RHYTHMDB_PROP_RATING";
349 else if (butt == GTK_CHECK_BUTTON (shell_preferences->priv->play_count_check))
350 colname = "RHYTHMDB_PROP_PLAY_COUNT";
351 else if (butt == GTK_CHECK_BUTTON (shell_preferences->priv->last_played_check))
352 colname = "RHYTHMDB_PROP_LAST_PLAYED";
353 else if (butt == GTK_CHECK_BUTTON (shell_preferences->priv->year_check))
354 colname = "RHYTHMDB_PROP_DATE";
355 else if (butt == GTK_CHECK_BUTTON (shell_preferences->priv->quality_check))
356 colname = "RHYTHMDB_PROP_BITRATE";
357 else if (butt == GTK_CHECK_BUTTON (shell_preferences->priv->first_seen_check))
358 colname = "RHYTHMDB_PROP_FIRST_SEEN";
359 else
360 g_assert_not_reached ();
362 rb_debug ("\"%s\" changed, current cols are \"%s\"", colname, currentcols);
364 /* Append this if we want it */
365 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (butt))) {
366 g_string_append (newcolumns, colname);
367 g_string_append (newcolumns, ",");
370 /* Append everything else */
371 for (i = 0; colnames != NULL && colnames[i] != NULL; i++) {
372 if (strcmp (colnames[i], colname)) {
373 g_string_append (newcolumns, colnames[i]);
374 if (colnames[i+1] != NULL)
375 g_string_append (newcolumns, ",");
379 eel_gconf_set_string (CONF_UI_COLUMNS_SETUP, newcolumns->str);
380 g_string_free (newcolumns, TRUE);
383 static void
384 rb_shell_preferences_sync_column_button (RBShellPreferences *preferences,
385 GtkWidget *button,
386 const char *columns,
387 const char *propid)
389 g_signal_handlers_block_by_func (G_OBJECT (button),
390 rb_shell_preferences_column_check_changed_cb,
391 preferences);
393 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
394 strstr (columns, propid) != NULL);
396 g_signal_handlers_unblock_by_func (G_OBJECT (button),
397 rb_shell_preferences_column_check_changed_cb,
398 preferences);
401 static void
402 rb_shell_preferences_sync (RBShellPreferences *shell_preferences)
404 char *columns;
405 GSList *l;
406 gint view, i;
408 shell_preferences->priv->loading = TRUE;
410 rb_debug ("syncing prefs");
412 columns = eel_gconf_get_string (CONF_UI_COLUMNS_SETUP);
413 if (columns != NULL)
415 rb_shell_preferences_sync_column_button (shell_preferences,
416 shell_preferences->priv->artist_check,
417 columns, "RHYTHMDB_PROP_ARTIST");
418 rb_shell_preferences_sync_column_button (shell_preferences,
419 shell_preferences->priv->album_check,
420 columns, "RHYTHMDB_PROP_ALBUM");
421 rb_shell_preferences_sync_column_button (shell_preferences,
422 shell_preferences->priv->genre_check,
423 columns, "RHYTHMDB_PROP_GENRE");
424 rb_shell_preferences_sync_column_button (shell_preferences,
425 shell_preferences->priv->duration_check,
426 columns, "RHYTHMDB_PROP_DURATION");
427 rb_shell_preferences_sync_column_button (shell_preferences,
428 shell_preferences->priv->track_check,
429 columns, "RHYTHMDB_PROP_TRACK_NUMBER");
430 rb_shell_preferences_sync_column_button (shell_preferences,
431 shell_preferences->priv->rating_check,
432 columns, "RHYTHMDB_PROP_RATING");
433 rb_shell_preferences_sync_column_button (shell_preferences,
434 shell_preferences->priv->play_count_check,
435 columns, "RHYTHMDB_PROP_PLAY_COUNT");
436 rb_shell_preferences_sync_column_button (shell_preferences,
437 shell_preferences->priv->last_played_check,
438 columns, "RHYTHMDB_PROP_LAST_PLAYED");
439 rb_shell_preferences_sync_column_button (shell_preferences,
440 shell_preferences->priv->year_check,
441 columns, "RHYTHMDB_PROP_DATE");
442 rb_shell_preferences_sync_column_button (shell_preferences,
443 shell_preferences->priv->first_seen_check,
444 columns, "RHYTHMDB_PROP_FIRST_SEEN");
445 rb_shell_preferences_sync_column_button (shell_preferences,
446 shell_preferences->priv->quality_check,
447 columns, "RHYTHMDB_PROP_BITRATE");
450 g_free (columns);
452 view = eel_gconf_get_integer (CONF_UI_BROWSER_VIEWS);
453 for (l = shell_preferences->priv->browser_views_group, i = 0; l != NULL; l = g_slist_next (l), i++)
454 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (l->data), (i == view));
456 /* toolbar style */
457 g_signal_handlers_block_by_func (G_OBJECT (shell_preferences->priv->toolbar_style_menu),
458 G_CALLBACK (rb_shell_preferences_toolbar_style_cb),
459 shell_preferences);
461 view = eel_gconf_get_integer (CONF_UI_TOOLBAR_STYLE);
462 /* skip the separator row */
463 if (view >= 1)
464 view++;
465 gtk_combo_box_set_active (GTK_COMBO_BOX (shell_preferences->priv->toolbar_style_menu), view);
467 g_signal_handlers_unblock_by_func (G_OBJECT (shell_preferences->priv->toolbar_style_menu),
468 G_CALLBACK (rb_shell_preferences_toolbar_style_cb),
469 shell_preferences);
471 shell_preferences->priv->loading = FALSE;
474 static void
475 rb_shell_preferences_toolbar_style_cb (GtkComboBox *box, RBShellPreferences *preferences)
477 int selection;
479 selection = gtk_combo_box_get_active (box);
481 /* skip the separator row */
482 if (selection >= 1)
483 selection--;
485 eel_gconf_set_integer (CONF_UI_TOOLBAR_STYLE, selection);
488 void
489 rb_shell_preferences_browser_views_activated_cb (GtkWidget *widget,
490 RBShellPreferences *shell_preferences)
492 int index;
494 if (shell_preferences->priv->loading)
495 return;
497 index = g_slist_index (shell_preferences->priv->browser_views_group, widget);
499 eel_gconf_set_integer (CONF_UI_BROWSER_VIEWS, index);