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.
28 #include <glib/gi18n.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"
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
,
47 RBShellPreferences
*shell_preferences
);
48 static void rb_shell_preferences_response_cb (GtkDialog
*dialog
,
50 RBShellPreferences
*shell_preferences
);
51 static void rb_shell_preferences_ui_pref_changed (GConfClient
*client
,
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
);
69 const char *styles
[] = { "desktop_default", "both", "both_horiz", "icon", "text" };
71 struct RBShellPreferencesPrivate
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
;
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
)
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
));
110 help_cb (GtkWidget
*widget
,
111 RBShellPreferences
*shell_preferences
)
113 GError
*error
= NULL
;
115 gnome_help_display ("rhythmbox.xml", "prefs", &error
);
118 rb_error_dialog (NULL
,
119 _("Couldn't display help"),
120 "%s", error
->message
);
122 g_error_free (error
);
127 rb_shell_preferences_init (RBShellPreferences
*shell_preferences
)
132 shell_preferences
->priv
= RB_SHELL_PREFERENCES_GET_PRIVATE (shell_preferences
);
134 g_signal_connect_object (G_OBJECT (shell_preferences
),
136 G_CALLBACK (rb_shell_preferences_window_delete_cb
),
137 shell_preferences
, 0);
138 g_signal_connect_object (G_OBJECT (shell_preferences
),
140 G_CALLBACK (rb_shell_preferences_response_cb
),
141 shell_preferences
, 0);
143 gtk_dialog_add_button (GTK_DIALOG (shell_preferences
),
146 tmp
= gtk_dialog_add_button (GTK_DIALOG (shell_preferences
),
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
),
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",
171 rb_glade_boldify_label (xml
, "visible_columns_label");
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
,
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
,
223 g_object_unref (G_OBJECT (xml
));
224 rb_shell_preferences_sync (shell_preferences
);
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
);
243 rb_shell_preferences_append_page (RBShellPreferences
*prefs
,
249 label
= gtk_label_new (name
);
250 gtk_notebook_append_page (GTK_NOTEBOOK (prefs
->priv
->notebook
),
256 rb_shell_preferences_append_view_page (RBShellPreferences
*prefs
,
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
);
269 rb_shell_preferences_append_page (prefs
, name
, widget
);
273 rb_shell_preferences_new (GList
*views
)
275 RBShellPreferences
*shell_preferences
;
277 shell_preferences
= g_object_new (RB_TYPE_SHELL_PREFERENCES
,
280 g_return_val_if_fail (shell_preferences
->priv
!= NULL
, NULL
);
282 for (; views
; views
= views
->next
)
285 g_object_get (views
->data
, "name", &name
, NULL
);
286 g_assert (name
!= NULL
);
287 rb_shell_preferences_append_view_page (shell_preferences
,
289 RB_SOURCE (views
->data
));
293 return GTK_WIDGET (shell_preferences
);
297 rb_shell_preferences_window_delete_cb (GtkWidget
*window
,
299 RBShellPreferences
*shell_preferences
)
301 gtk_widget_hide (GTK_WIDGET (shell_preferences
));
307 rb_shell_preferences_response_cb (GtkDialog
*dialog
,
309 RBShellPreferences
*shell_preferences
)
311 if (response_id
== GTK_RESPONSE_CLOSE
)
312 gtk_widget_hide (GTK_WIDGET (shell_preferences
));
316 rb_shell_preferences_ui_pref_changed (GConfClient
*client
,
319 RBShellPreferences
*shell_preferences
)
321 if (shell_preferences
->priv
->loading
== TRUE
)
324 rb_shell_preferences_sync (shell_preferences
);
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
;
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";
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
);
384 rb_shell_preferences_sync_column_button (RBShellPreferences
*preferences
,
389 g_signal_handlers_block_by_func (G_OBJECT (button
),
390 rb_shell_preferences_column_check_changed_cb
,
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
,
402 rb_shell_preferences_sync (RBShellPreferences
*shell_preferences
)
408 shell_preferences
->priv
->loading
= TRUE
;
410 rb_debug ("syncing prefs");
412 columns
= eel_gconf_get_string (CONF_UI_COLUMNS_SETUP
);
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");
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
));
457 g_signal_handlers_block_by_func (G_OBJECT (shell_preferences
->priv
->toolbar_style_menu
),
458 G_CALLBACK (rb_shell_preferences_toolbar_style_cb
),
461 view
= eel_gconf_get_integer (CONF_UI_TOOLBAR_STYLE
);
462 /* skip the separator row */
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
),
471 shell_preferences
->priv
->loading
= FALSE
;
475 rb_shell_preferences_toolbar_style_cb (GtkComboBox
*box
, RBShellPreferences
*preferences
)
479 selection
= gtk_combo_box_get_active (box
);
481 /* skip the separator row */
485 eel_gconf_set_integer (CONF_UI_TOOLBAR_STYLE
, selection
);
489 rb_shell_preferences_browser_views_activated_cb (GtkWidget
*widget
,
490 RBShellPreferences
*shell_preferences
)
494 if (shell_preferences
->priv
->loading
)
497 index
= g_slist_index (shell_preferences
->priv
->browser_views_group
, widget
);
499 eel_gconf_set_integer (CONF_UI_BROWSER_VIEWS
, index
);