Updated Macedonian Translation <arangela@cvs.gnome.org>
[rhythmbox.git] / widgets / rb-druid.c
blobe48633ba3eb36fe17a21e5340836fa883299ee53
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
2 *
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.
23 #include <config.h>
25 #include <glib/gi18n.h>
26 #include <gtk/gtk.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>
32 #include "rb-druid.h"
33 #include "rb-preferences.h"
34 #include "rb-debug.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,
41 guint prop_id,
42 const GValue *value,
43 GParamSpec *pspec);
44 static void rb_druid_get_property (GObject *object,
45 guint prop_id,
46 GValue *value,
47 GParamSpec *pspec);
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,
51 RBDruid *druid);
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,
54 RBDruid *druid);
55 static void do_response (RBDruid *druid);
57 struct RBDruidPrivate
59 RhythmDB *db;
60 GnomeDruid *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))
71 enum
73 PROP_0,
74 PROP_DB,
78 static void
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,
88 PROP_DB,
89 g_param_spec_object ("db",
90 "RhythmDB",
91 "RhythmDB object",
92 RHYTHMDB_TYPE,
93 G_PARAM_READWRITE));
95 g_type_class_add_private (klass, sizeof (RBDruidPrivate));
98 static void
99 rb_druid_init (RBDruid *druid)
101 GladeXML *xml;
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));
125 static void
126 rb_druid_finalize (GObject *object)
128 RBDruid *druid;
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);
140 static void
141 rb_druid_set_property (GObject *object,
142 guint prop_id,
143 const GValue *value,
144 GParamSpec *pspec)
146 RBDruid *druid = RB_DRUID (object);
148 switch (prop_id)
150 case PROP_DB:
151 druid->priv->db = g_value_get_object (value);
152 break;
153 default:
154 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
155 break;
159 static void
160 rb_druid_get_property (GObject *object,
161 guint prop_id,
162 GValue *value,
163 GParamSpec *pspec)
165 RBDruid *druid = RB_DRUID (object);
167 switch (prop_id)
169 case PROP_DB:
170 g_value_set_object (value, druid->priv->db);
171 break;
172 default:
173 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
174 break;
178 static void
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);
202 /* page 1 */
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."));
212 /* page 2 */
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);
222 /* page 3 */
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); */
233 /* misc */
234 gnome_druid_set_show_help (druid->priv->druid, FALSE);
235 gtk_button_set_label (GTK_BUTTON (druid->priv->druid->cancel), GTK_STOCK_CLOSE);
238 RBDruid *
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);
248 return druid;
251 static void
252 path_dialog_response_cb (GtkDialog *dialog,
253 int response_id,
254 RBDruid *druid)
256 char *uri;
257 char *path;
259 rb_debug ("got response");
261 if (response_id != GTK_RESPONSE_ACCEPT) {
262 gtk_widget_destroy (GTK_WIDGET (dialog));
263 return;
266 uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (dialog));
267 if (uri == NULL) {
268 uri = gtk_file_chooser_get_current_folder_uri (GTK_FILE_CHOOSER (dialog));
271 gtk_widget_destroy (GTK_WIDGET (dialog));
273 if (uri == NULL)
274 return;
276 path = gnome_vfs_format_uri_for_display (uri);
277 gtk_entry_set_text (GTK_ENTRY (druid->priv->path_entry), path);
278 g_free (uri);
279 g_free (path);
283 static void
284 rb_druid_browse_clicked_cb (GtkButton *button, RBDruid *druid)
286 GtkWidget *dialog;
287 rb_debug ("browse");
289 dialog = rb_file_chooser_new (_("Load folder into Library"),
290 GTK_WINDOW (druid),
291 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
292 FALSE);
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);
299 static void
300 rb_druid_page2_sync_sensitive (RBDruid *druid)
302 gboolean next_enabled;
303 gboolean skip_active;
304 const char *text;
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);
316 static void
317 rb_druid_skip_toggled_cb (GtkToggleButton *button, RBDruid *druid)
319 rb_debug ("skip changed");
321 rb_druid_page2_sync_sensitive (druid);
324 static void
325 rb_druid_entry_changed_cb (GtkEntry *entry, RBDruid *druid)
327 rb_debug ("entry changed");
329 rb_druid_page2_sync_sensitive (druid);
332 static gboolean
333 idle_set_sensitive (RBDruid *druid)
335 g_return_val_if_fail (RB_IS_DRUID (druid), FALSE);
337 rb_druid_page2_sync_sensitive (druid);
339 return FALSE;
342 static gboolean
343 rb_druid_page2_prepare_cb (GnomeDruidPage *druid_page, GtkWidget *druid_widget,
344 RBDruid *druid)
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);
353 return FALSE;
356 static void
357 do_response (RBDruid *druid)
359 g_return_if_fail (RB_IS_DRUID (druid));
360 gtk_dialog_response (GTK_DIALOG (druid), GTK_RESPONSE_OK);
363 static void
364 rb_druid_page3_finish_cb (GnomeDruidPage *druid_page, GtkWidget *druid_widget,
365 RBDruid *druid)
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);
377 do_response (druid);