1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
3 * arch-tag: Implementation of Rhythmbox first-time druid
5 * Copyright (C) 2003,2004 Colin Walters <walters@debian.org>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
25 #include <glib/gi18n.h>
27 #include <libgnomeui/gnome-druid.h>
28 #include <libgnomeui/gnome-druid-page-edge.h>
29 #include <libgnomeui/gnome-druid-page-standard.h>
30 #include <libgnomevfs/gnome-vfs-utils.h>
33 #include "rb-preferences.h"
35 #include "rb-dialog.h"
36 #include "rb-glade-helpers.h"
37 #include "eel-gconf-extensions.h"
39 static void rb_druid_finalize (GObject
*object
);
40 static void rb_druid_set_property (GObject
*object
,
44 static void rb_druid_get_property (GObject
*object
,
48 static void rb_druid_browse_clicked_cb (GtkButton
*button
, RBDruid
*druid
);
49 static void rb_druid_entry_changed_cb (GtkEntry
*entry
, RBDruid
*druid
);
50 static gboolean
rb_druid_page2_prepare_cb (GnomeDruidPage
*druid_page
, GtkWidget
*druid_widget
,
52 static void rb_druid_skip_toggled_cb (GtkToggleButton
*button
, RBDruid
*druid
);
53 static void rb_druid_page3_finish_cb (GnomeDruidPage
*druid_page
, GtkWidget
*druid_widget
,
55 static void do_response (RBDruid
*druid
);
62 GtkWidget
*page2_vbox
;
63 GtkWidget
*browse_button
;
64 GtkWidget
*page2_skip_radiobutton
;
65 GtkWidget
*path_entry
;
68 G_DEFINE_TYPE (RBDruid
, rb_druid
, GTK_TYPE_DIALOG
)
69 #define RB_DRUID_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), RB_TYPE_DRUID, RBDruidPrivate))
79 rb_druid_class_init (RBDruidClass
*klass
)
81 GObjectClass
*object_class
= G_OBJECT_CLASS (klass
);
83 object_class
->finalize
= rb_druid_finalize
;
84 object_class
->set_property
= rb_druid_set_property
;
85 object_class
->get_property
= rb_druid_get_property
;
87 g_object_class_install_property (object_class
,
89 g_param_spec_object ("db",
95 g_type_class_add_private (klass
, sizeof (RBDruidPrivate
));
99 rb_druid_init (RBDruid
*druid
)
103 druid
->priv
= RB_DRUID_GET_PRIVATE (druid
);
105 xml
= rb_glade_xml_new ("druid.glade", "druid_toplevel", druid
);
107 druid
->priv
->page2_vbox
= glade_xml_get_widget (xml
, "page2_vbox");
108 gtk_object_ref (GTK_OBJECT (druid
->priv
->page2_vbox
));
109 gtk_container_remove (GTK_CONTAINER (gtk_widget_get_parent (druid
->priv
->page2_vbox
)),
110 druid
->priv
->page2_vbox
);
111 druid
->priv
->browse_button
= glade_xml_get_widget (xml
, "browse_button");
112 druid
->priv
->path_entry
= glade_xml_get_widget (xml
, "path_entry");
113 druid
->priv
->page2_skip_radiobutton
= glade_xml_get_widget (xml
, "page2_skip_radiobutton");
115 g_signal_connect_object (G_OBJECT (druid
->priv
->page2_skip_radiobutton
), "toggled",
116 G_CALLBACK (rb_druid_skip_toggled_cb
), druid
, 0);
117 g_signal_connect_object (G_OBJECT (druid
->priv
->browse_button
), "clicked",
118 G_CALLBACK (rb_druid_browse_clicked_cb
), druid
, 0);
119 g_signal_connect_object (G_OBJECT (druid
->priv
->path_entry
), "changed",
120 G_CALLBACK (rb_druid_entry_changed_cb
), druid
, 0);
122 g_object_unref (G_OBJECT (xml
));
126 rb_druid_finalize (GObject
*object
)
130 g_return_if_fail (object
!= NULL
);
131 g_return_if_fail (RB_IS_DRUID (object
));
133 druid
= RB_DRUID (object
);
135 g_return_if_fail (druid
->priv
!= NULL
);
137 G_OBJECT_CLASS (rb_druid_parent_class
)->finalize (object
);
141 rb_druid_set_property (GObject
*object
,
146 RBDruid
*druid
= RB_DRUID (object
);
151 druid
->priv
->db
= g_value_get_object (value
);
154 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, prop_id
, pspec
);
160 rb_druid_get_property (GObject
*object
,
165 RBDruid
*druid
= RB_DRUID (object
);
170 g_value_set_object (value
, druid
->priv
->db
);
173 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, prop_id
, pspec
);
179 rb_druid_init_widgets (RBDruid
*druid
)
181 GnomeDruidPage
*page
;
183 g_return_if_fail (RB_IS_DRUID (druid
));
185 gtk_window_set_title (GTK_WINDOW (druid
),_("Rhythmbox"));
186 gtk_window_set_modal (GTK_WINDOW (druid
), TRUE
);
188 druid
->priv
->druid
= GNOME_DRUID (gnome_druid_new ());
189 gtk_widget_show (GTK_WIDGET (druid
->priv
->druid
));
190 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (druid
)->vbox
),
191 GTK_WIDGET (druid
->priv
->druid
));
192 gnome_druid_set_show_help (druid
->priv
->druid
, FALSE
);
194 g_signal_connect_object (druid
->priv
->druid
, "cancel",
195 G_CALLBACK (do_response
),
196 druid
, G_CONNECT_SWAPPED
);
198 g_signal_connect_object (druid
->priv
->druid
, "destroy",
199 G_CALLBACK (do_response
),
200 druid
, G_CONNECT_SWAPPED
);
203 page
= GNOME_DRUID_PAGE (gnome_druid_page_edge_new (GNOME_EDGE_START
));
204 gtk_widget_show (GTK_WIDGET (page
));
205 gnome_druid_page_edge_set_title (GNOME_DRUID_PAGE_EDGE (page
),
206 _("Welcome to Rhythmbox"));
207 gnome_druid_append_page (druid
->priv
->druid
, page
);
208 gnome_druid_set_page (druid
->priv
->druid
, page
);
209 gnome_druid_page_edge_set_text (GNOME_DRUID_PAGE_EDGE (page
),
210 _("Rhythmbox is the GNOME music player that lets you do everything: play your music files, listen to Internet Radio, import music from CDs, and much more.\n\nThis assistant will help you get started by asking you some simple questions."));
213 page
= GNOME_DRUID_PAGE (gnome_druid_page_standard_new ());
214 gtk_widget_show (GTK_WIDGET (page
));
215 gnome_druid_page_standard_set_title (GNOME_DRUID_PAGE_STANDARD (page
),
216 _("Music library setup"));
217 gtk_container_add (GTK_CONTAINER (GNOME_DRUID_PAGE_STANDARD (page
)->vbox
),
218 druid
->priv
->page2_vbox
);
219 gnome_druid_append_page (druid
->priv
->druid
, page
);
220 g_signal_connect_object (G_OBJECT (page
), "prepare", G_CALLBACK (rb_druid_page2_prepare_cb
), druid
, 0);
223 page
= GNOME_DRUID_PAGE (gnome_druid_page_edge_new (GNOME_EDGE_FINISH
));
224 gtk_widget_show (GTK_WIDGET (page
));
225 gnome_druid_page_edge_set_title (GNOME_DRUID_PAGE_EDGE (page
), _("Finish"));
226 gnome_druid_page_edge_set_text (GNOME_DRUID_PAGE_EDGE (page
),
227 _("You are now ready to start Rhythmbox.\n\nRemember that you may add music to the library using \"Music\" then \"Import Folder\", or by importing it from CDs."));
228 g_signal_connect_object (G_OBJECT (page
), "finish", G_CALLBACK (rb_druid_page3_finish_cb
), druid
, 0);
229 gnome_druid_append_page (druid
->priv
->druid
, page
);
231 /* g_signal_connect_object (page, "prepare", G_CALLBACK (gb_export_druid_page_5_prepare_cb), d, 0); */
234 gnome_druid_set_show_help (druid
->priv
->druid
, FALSE
);
235 gtk_button_set_label (GTK_BUTTON (druid
->priv
->druid
->cancel
), GTK_STOCK_CLOSE
);
239 rb_druid_new (RhythmDB
*db
)
241 RBDruid
*druid
= g_object_new (RB_TYPE_DRUID
, "db", db
, NULL
);
243 g_return_val_if_fail (druid
->priv
!= NULL
, NULL
);
245 rb_druid_init_widgets (druid
);
252 path_dialog_response_cb (GtkDialog
*dialog
,
259 rb_debug ("got response");
261 if (response_id
!= GTK_RESPONSE_ACCEPT
) {
262 gtk_widget_destroy (GTK_WIDGET (dialog
));
266 uri
= gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (dialog
));
268 uri
= gtk_file_chooser_get_current_folder_uri (GTK_FILE_CHOOSER (dialog
));
271 gtk_widget_destroy (GTK_WIDGET (dialog
));
276 path
= gnome_vfs_format_uri_for_display (uri
);
277 gtk_entry_set_text (GTK_ENTRY (druid
->priv
->path_entry
), path
);
284 rb_druid_browse_clicked_cb (GtkButton
*button
, RBDruid
*druid
)
289 dialog
= rb_file_chooser_new (_("Load folder into Library"),
291 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER
,
293 gtk_window_set_modal (GTK_WINDOW (dialog
), TRUE
);
295 g_signal_connect_object (G_OBJECT (dialog
), "response",
296 G_CALLBACK (path_dialog_response_cb
), druid
, 0);
300 rb_druid_page2_sync_sensitive (RBDruid
*druid
)
302 gboolean next_enabled
;
303 gboolean skip_active
;
305 rb_debug ("syncing sensitivity");
307 text
= gtk_entry_get_text (GTK_ENTRY (druid
->priv
->path_entry
));
309 skip_active
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (druid
->priv
->page2_skip_radiobutton
));
310 next_enabled
= g_utf8_strlen (text
, -1) > 0 || skip_active
;
312 gtk_widget_set_sensitive (druid
->priv
->path_entry
, !skip_active
);
313 gtk_widget_set_sensitive (druid
->priv
->druid
->next
, next_enabled
);
317 rb_druid_skip_toggled_cb (GtkToggleButton
*button
, RBDruid
*druid
)
319 rb_debug ("skip changed");
321 rb_druid_page2_sync_sensitive (druid
);
325 rb_druid_entry_changed_cb (GtkEntry
*entry
, RBDruid
*druid
)
327 rb_debug ("entry changed");
329 rb_druid_page2_sync_sensitive (druid
);
333 idle_set_sensitive (RBDruid
*druid
)
335 g_return_val_if_fail (RB_IS_DRUID (druid
), FALSE
);
337 rb_druid_page2_sync_sensitive (druid
);
343 rb_druid_page2_prepare_cb (GnomeDruidPage
*druid_page
, GtkWidget
*druid_widget
,
346 g_return_val_if_fail (RB_IS_DRUID (druid
), FALSE
);
348 rb_debug ("page2 prepare");
350 /* FIXME: this is a gross hack, but setting the next button
351 * to not be sensitive at this point doesn't work! */
352 g_idle_add ((GSourceFunc
) idle_set_sensitive
, druid
);
357 do_response (RBDruid
*druid
)
359 g_return_if_fail (RB_IS_DRUID (druid
));
360 gtk_dialog_response (GTK_DIALOG (druid
), GTK_RESPONSE_OK
);
364 rb_druid_page3_finish_cb (GnomeDruidPage
*druid_page
, GtkWidget
*druid_widget
,
367 rb_debug ("druid finished!");
368 if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (druid
->priv
->page2_skip_radiobutton
))) {
369 const char *uri
= gtk_entry_get_text (GTK_ENTRY (druid
->priv
->path_entry
));
371 rb_debug ("page2 next; adding %s to library", uri
);
372 rhythmdb_add_uri (druid
->priv
->db
, uri
);
374 eel_gconf_set_boolean (CONF_FIRST_TIME
, TRUE
);
375 gnome_druid_set_buttons_sensitive (GNOME_DRUID (druid_widget
),
376 FALSE
, FALSE
, FALSE
, FALSE
);