[rhythmbox/media-player-sync] media-player: rework sync settings a bit



commit d876529d6038c33576cf18439c038a8181717320
Author: Jonathan Matthew <jonathan d14n org>
Date:   Thu Feb 4 23:08:01 2010 +1000

    media-player: rework sync settings a bit
    
    Instead of the separate 'sync all music' and 'sync all podcasts'
    settings, now everything is controlled from the tree view.
    If the category item ('music' or 'podcasts') is enabled, everything in
    the category will be synced.  Otherwise, only the enabled groups will
    be.  If there are groups enabled, the category will be displayed as
    inconsistent.
    
    There's a new group in the 'music' category: 'all music', which
    corresponds to the library source.  If enabled, all music will be
    synced.  When this is enabled, the playlist items just control whether
    to create playlists on the device.

 data/ui/media-player-properties.ui      |   42 +----
 sources/rb-media-player-source.c        |  298 +++++++++++++++----------------
 sources/rb-media-player-sync-settings.c |   42 ++++-
 sources/rb-media-player-sync-settings.h |   11 +-
 4 files changed, 189 insertions(+), 204 deletions(-)
---
diff --git a/data/ui/media-player-properties.ui b/data/ui/media-player-properties.ui
index 6340281..5962ac4 100644
--- a/data/ui/media-player-properties.ui
+++ b/data/ui/media-player-properties.ui
@@ -109,12 +109,10 @@
                     <property name="label_xalign">0</property>
                     <property name="shadow_type">none</property>
                     <child>
-                      <object class="GtkTable" id="table-content3">
+                      <object class="GtkVBox" id="vbox4">
                         <property name="visible">True</property>
                         <property name="border_width">12</property>
-                        <property name="n_rows">4</property>
-                        <property name="column_spacing">12</property>
-                        <property name="row_spacing">6</property>
+                        <property name="orientation">vertical</property>
                         <child>
                           <object class="GtkScrolledWindow" id="scrolledwindow1">
                             <property name="visible">True</property>
@@ -130,43 +128,9 @@
                             </child>
                           </object>
                           <packing>
-                            <property name="top_attach">3</property>
-                            <property name="bottom_attach">4</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkCheckButton" id="checkbutton-sync-music-all">
-                            <property name="label" translatable="yes">Sync All Music</property>
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="receives_default">False</property>
-                            <property name="draw_indicator">True</property>
-                          </object>
-                          <packing>
-                            <property name="top_attach">1</property>
-                            <property name="bottom_attach">2</property>
-                            <property name="x_options">GTK_FILL</property>
-                            <property name="y_options"></property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkCheckButton" id="checkbutton-sync-podcasts-all">
-                            <property name="label" translatable="yes">Sync All Podcasts</property>
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="receives_default">False</property>
-                            <property name="draw_indicator">True</property>
-                          </object>
-                          <packing>
-                            <property name="top_attach">2</property>
-                            <property name="bottom_attach">3</property>
-                            <property name="x_options">GTK_FILL</property>
-                            <property name="y_options"></property>
+                            <property name="position">0</property>
                           </packing>
                         </child>
-                        <child>
-                          <placeholder/>
-                        </child>
                       </object>
                     </child>
                     <child type="label">
diff --git a/sources/rb-media-player-source.c b/sources/rb-media-player-source.c
index 36addf0..b16f6a9 100644
--- a/sources/rb-media-player-source.c
+++ b/sources/rb-media-player-source.c
@@ -353,26 +353,29 @@ static void
 set_treeview_children (RBMediaPlayerSource *source,
 		       GtkTreeIter *parent,
 		       const char *category,
-		       gboolean value)
+		       gboolean value,
+		       gboolean apply_to_settings)
 {
 	RBMediaPlayerSourcePrivate *priv = MEDIA_PLAYER_SOURCE_GET_PRIVATE (source);
 	GtkTreeIter iter;
-	gchar *name;
+	char *group;
 	gboolean valid;
 
 	valid = gtk_tree_model_iter_children (GTK_TREE_MODEL (priv->sync_tree_store), &iter, parent);
 
 	while (valid) {
 		gtk_tree_model_get (GTK_TREE_MODEL (priv->sync_tree_store), &iter,
-				    1, &name,
+				    2, &group,
 				    -1);
 
+		if (apply_to_settings) {
+			rb_media_player_sync_settings_set_group (priv->sync_settings, category, group, value);
+		}
 		gtk_tree_store_set (priv->sync_tree_store, &iter,
-		/* Active */	    0, rb_media_player_sync_settings_sync_group (priv->sync_settings, category, name),
-		/* Activatable */   2, value,
+		/* Active */	    0, value,
 				    -1);
 
-		g_free (name);
+		g_free (group);
 		valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (priv->sync_tree_store), &iter);
 	}
 }
@@ -384,98 +387,86 @@ sync_entries_changed_cb (GtkCellRendererToggle *cell_renderer,
 {
 	RBMediaPlayerSourcePrivate *priv = MEDIA_PLAYER_SOURCE_GET_PRIVATE (source);
 	GtkTreeIter iter;
-	if (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (priv->sync_tree_store), &iter, path) == TRUE) {
-		char *name;
-		char *category_name;
-		gboolean is_category;
-		gboolean value;
-
-		gtk_tree_model_get (GTK_TREE_MODEL (priv->sync_tree_store),
-				    &iter,
-				    1, &name,
-				    3, &is_category,
-				    4, &category_name,
-				    -1);
-		value = !gtk_cell_renderer_toggle_get_active (cell_renderer);
-
-		gtk_tree_store_set (priv->sync_tree_store,
-				    &iter,
-				    0, value,
-				    -1 );
+	char *group;
+	char *category_name;
+	gboolean is_category;
+	gboolean value;
 
-		if (is_category) {
-			rb_media_player_sync_settings_set_category (priv->sync_settings, category_name, value);
-			set_treeview_children (source, &iter, category_name, value);
-		} else {
-			rb_media_player_sync_settings_set_group (priv->sync_settings, category_name, name, value);
-		}
-		g_free (category_name);
+	if (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (priv->sync_tree_store), &iter, path) == FALSE) {
+		return;
 	}
 
-	update_sync_preview_bar (source);
-}
+	gtk_tree_model_get (GTK_TREE_MODEL (priv->sync_tree_store),
+			    &iter,
+			    2, &group,
+			    4, &is_category,
+			    5, &category_name,
+			    -1);
 
-static void
-sync_music_all_changed_cb (GtkWidget *togglebutton,
-			   RBMediaPlayerSource *source)
-{
-	RBMediaPlayerSourcePrivate *priv = MEDIA_PLAYER_SOURCE_GET_PRIVATE (source);
-	GtkTreeIter iter;
-	gboolean value;
-	gboolean sync_all_playlists;
+	value = !gtk_cell_renderer_toggle_get_active (cell_renderer);
 
-	value = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (togglebutton));
-	rb_media_player_sync_settings_set_category (priv->sync_settings, SYNC_CATEGORY_MUSIC, value);
-	sync_all_playlists = rb_media_player_sync_settings_sync_category (priv->sync_settings, SYNC_CATEGORY_PLAYLIST);
+	if (is_category) {
+		rb_debug ("state for category %s changed to %d", category_name, value);
+		rb_media_player_sync_settings_set_category (priv->sync_settings, category_name, value);
+		rb_media_player_sync_settings_clear_groups (priv->sync_settings, category_name);
 
-	if (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (priv->sync_tree_store), &iter, "0") == TRUE) {
-		gtk_tree_store_set (priv->sync_tree_store, &iter,
-		/* Active */	    0, sync_all_playlists || value,
-		/* Activatable */   2, !value,
+		gtk_tree_store_set (priv->sync_tree_store,
+				    &iter,
+				    0, value,
+				    1, FALSE,		/* category is no longer inconsistent */
 				    -1);
+		set_treeview_children (source, &iter, category_name, value, FALSE);
+	} else {
+		gboolean parent_value;
+		gboolean parent_inconsistent;
+		GtkTreeIter parent;
+		rb_debug ("state for group %s in category %s changed to %d", group, category_name, value);
+
+		/* update parent state.  if the parent was previously enabled or disabled, then we
+		 * set all the other groups to that state before setting the row that was just changed,
+		 * and set the parent to inconsistent state.
+		 */
+		gtk_tree_model_iter_parent (GTK_TREE_MODEL (priv->sync_tree_store), &parent, &iter);
+		gtk_tree_model_get (GTK_TREE_MODEL (priv->sync_tree_store), &parent,
+				    0, &parent_value,
+				    1, &parent_inconsistent,
+				    -1);
+		if (parent_inconsistent == FALSE) {
+			/* category is now inconsistent */
+			rb_debug ("setting category %s to disabled, inconsistent", category_name);
+			rb_media_player_sync_settings_set_category (priv->sync_settings, category_name, FALSE);
+			gtk_tree_store_set (priv->sync_tree_store,
+					    &parent,
+					    0, FALSE,
+					    1, TRUE,
+					    -1);
+
+			/* set all groups in the category to the parent's state */
+			set_treeview_children (source, &parent, category_name, parent_value, TRUE);
+		}
 
-		set_treeview_children (source,
-				       &iter,
-				       SYNC_CATEGORY_PLAYLIST,
-				       !value && sync_all_playlists);
-	}
-
-	update_sync_preview_bar (source);
-}
-
-/* i'm not really sure why we have 'sync all podcasts'; selecting the
- * podcast container does the same thing..
- */
-static void
-sync_podcasts_all_changed_cb (GtkWidget *togglebutton,
-			      RBMediaPlayerSource *source)
-{
-	RBMediaPlayerSourcePrivate *priv = MEDIA_PLAYER_SOURCE_GET_PRIVATE (source);
-	GtkTreeIter iter;
-	gboolean value;
-	gboolean sync_podcasts;
-
-	value = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (togglebutton));
-	rb_media_player_sync_settings_set_category (priv->sync_settings, SYNC_CATEGORY_ALL_PODCASTS, value);
-	sync_podcasts = rb_media_player_sync_settings_sync_category (priv->sync_settings, SYNC_CATEGORY_PODCAST);
-
-	if (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (priv->sync_tree_store), &iter, "1") == TRUE) {
+		rb_media_player_sync_settings_set_group (priv->sync_settings, category_name, group, value);
 		gtk_tree_store_set (priv->sync_tree_store, &iter,
-		/* Active */	    0, sync_podcasts || value,
-		/* Activatable */   2, !value,
+				    0, value,
 				    -1);
 
-		set_treeview_children (source,
-				       &iter,
-				       SYNC_CATEGORY_PODCAST,
-				       !value && sync_podcasts);
+		/* if no groups are enabled, the category is no longer inconsistent */
+		if (value == FALSE && rb_media_player_sync_settings_has_enabled_groups (priv->sync_settings, category_name) == FALSE) {
+			rb_debug ("no enabled groups left in category %s", category_name);
+			gtk_tree_store_set (priv->sync_tree_store, &parent,
+					    1, FALSE,
+					    -1);
+		} else if (value == FALSE) {
+			rb_debug ("category %s still has some groups", category_name);
+		}
 	}
 
+	g_free (category_name);
+	g_free (group);
 	update_sync_preview_bar (source);
 }
 
 
-
 void
 rb_media_player_source_show_properties (RBMediaPlayerSource *source)
 {
@@ -499,8 +490,6 @@ rb_media_player_source_show_properties (RBMediaPlayerSource *source)
 	guint64 capacity;
 	guint64 free_space;
 	gboolean valid;
-	gboolean sync_category;
-	gboolean sync_all;
 	RBShell *shell;
 	RhythmDB *db;
 	RBPlaylistManager *playlist_manager;
@@ -568,27 +557,37 @@ rb_media_player_source_show_properties (RBMediaPlayerSource *source)
 					     GTK_WIDGET (gtk_builder_get_object (builder, "media-player-notebook")));
 	}
 
-	/* set up sync widgetry.
-	 * tree_store columns are: Active, Name, Activatable, is-category, category name
-	 */
+	/* set up sync widgetry */
 	priv->preview_bar = GTK_WIDGET (gtk_builder_get_object (builder, "progressbar-sync-preview"));
-	priv->sync_tree_store = gtk_tree_store_new (5, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_STRING);
+
+	/* tree_store columns are: active, inconsistent, name, display-name, is-category, category name */
+	priv->sync_tree_store = gtk_tree_store_new (6, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_STRING);
 
 	/* music library parent */
-	sync_all = rb_media_player_sync_settings_sync_category (priv->sync_settings, SYNC_CATEGORY_MUSIC);
-	sync_category = rb_media_player_sync_settings_sync_category (priv->sync_settings, SYNC_CATEGORY_PLAYLIST);
 	gtk_tree_store_append (priv->sync_tree_store, &parent_iter, NULL);
 	gtk_tree_store_set (priv->sync_tree_store, &parent_iter,
-			    0, sync_all || sync_category,
-			    1, _("Music Playlists"),
-			    2, sync_all == FALSE,
-			    3, TRUE,
-			    4, SYNC_CATEGORY_PLAYLIST,
+			    0, rb_media_player_sync_settings_sync_category (priv->sync_settings, SYNC_CATEGORY_MUSIC),
+			    1, rb_media_player_sync_settings_has_enabled_groups (priv->sync_settings, SYNC_CATEGORY_MUSIC),
+			    2, _("Music"),
+			    3, _("Music"),
+			    4, TRUE,
+			    5, SYNC_CATEGORY_MUSIC,
+			    -1);
+
+	/* 'all music' entry */
+	gtk_tree_store_append (priv->sync_tree_store, &tree_iter, &parent_iter);
+	gtk_tree_store_set (priv->sync_tree_store, &tree_iter,
+			    0, rb_media_player_sync_settings_sync_group (priv->sync_settings, SYNC_CATEGORY_MUSIC, SYNC_GROUP_ALL_MUSIC),
+			    1, FALSE,
+			    2, SYNC_GROUP_ALL_MUSIC,
+			    3, _("All Music"),
+			    4, FALSE,
+			    5, SYNC_CATEGORY_MUSIC,
 			    -1);
 
 	/* playlist entries */
 	playlists = rb_playlist_manager_get_playlists (playlist_manager);
-	for (l = playlists; l != NULL; l=l->next) {
+	for (l = playlists; l != NULL; l = l->next) {
 		char *name;
 
 		gtk_tree_store_append (priv->sync_tree_store, &tree_iter, &parent_iter);
@@ -597,11 +596,12 @@ rb_media_player_source_show_properties (RBMediaPlayerSource *source)
 
 		/* set this row's data */
 		gtk_tree_store_set (priv->sync_tree_store, &tree_iter,
-				    0, rb_media_player_sync_settings_sync_group (priv->sync_settings, SYNC_CATEGORY_PLAYLIST, name),
-				    1, name,
-				    2, sync_category && !sync_all,
-				    3, FALSE,
-				    4, SYNC_CATEGORY_PLAYLIST,
+				    0, rb_media_player_sync_settings_sync_group (priv->sync_settings, SYNC_CATEGORY_MUSIC, name),
+				    1, FALSE,
+				    2, name,
+				    3, name,
+				    4, FALSE,
+				    5, SYNC_CATEGORY_MUSIC,
 				    -1);
 
 		g_free (name);
@@ -611,18 +611,20 @@ rb_media_player_source_show_properties (RBMediaPlayerSource *source)
 	gtk_tree_store_append (priv->sync_tree_store,
 			       &parent_iter,
 			       NULL);
-	sync_all = rb_media_player_sync_settings_sync_category (priv->sync_settings, SYNC_CATEGORY_ALL_PODCASTS);
-	sync_category = rb_media_player_sync_settings_sync_category (priv->sync_settings, SYNC_CATEGORY_PODCAST);
 	gtk_tree_store_set (priv->sync_tree_store, &parent_iter,
-			    0, sync_category || sync_all,
-			    1, _("Podcasts"),
-			    2, sync_all == FALSE,
-			    3, TRUE,
-			    4, SYNC_CATEGORY_PODCAST,
+			    0, rb_media_player_sync_settings_sync_category (priv->sync_settings, SYNC_CATEGORY_PODCAST),
+			    1, rb_media_player_sync_settings_has_enabled_groups (priv->sync_settings, SYNC_CATEGORY_PODCAST),
+			    2, _("Podcasts"),
+			    3, _("Podcasts"),
+			    4, TRUE,
+			    5, SYNC_CATEGORY_PODCAST,
 			    -1);
 
 	/* this really needs to use a live query model */
 	query_model = GTK_TREE_MODEL (rhythmdb_query_model_new_empty (db));
+	rhythmdb_query_model_set_sort_order (RHYTHMDB_QUERY_MODEL (query_model),
+					     (GCompareDataFunc) rhythmdb_query_model_title_sort_func,
+					     NULL, NULL, FALSE);
 	rhythmdb_do_full_query (db, RHYTHMDB_QUERY_RESULTS (query_model),
 				RHYTHMDB_QUERY_PROP_EQUALS,
 				RHYTHMDB_PROP_TYPE, RHYTHMDB_ENTRY_TYPE_PODCAST_FEED,
@@ -632,18 +634,22 @@ rb_media_player_source_show_properties (RBMediaPlayerSource *source)
 		RhythmDBEntry *entry;
 		GtkTreeIter tree_iter2;
 		const char *name;
+		const char *feed;
 
 		entry = rhythmdb_query_model_iter_to_entry (RHYTHMDB_QUERY_MODEL (query_model), &tree_iter);
 		gtk_tree_store_append (priv->sync_tree_store, &tree_iter2, &parent_iter);
 
 		/* set up this row */
 		name = rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_TITLE);
+		feed = rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_LOCATION);
+		rb_debug ("adding feed %s (name %s)", feed, name);
 		gtk_tree_store_set (priv->sync_tree_store, &tree_iter2,
 				    0, rb_media_player_sync_settings_sync_group (priv->sync_settings, SYNC_CATEGORY_PODCAST, name),
-				    1, name,
-				    2, sync_category && !sync_all,
-				    3, FALSE,
-				    4, SYNC_CATEGORY_PODCAST,
+				    1, FALSE,
+				    2, feed,
+				    3, name,
+				    4, FALSE,
+				    5, SYNC_CATEGORY_PODCAST,
 				    -1);
 
 		valid = gtk_tree_model_iter_next (query_model, &tree_iter);
@@ -657,8 +663,7 @@ rb_media_player_source_show_properties (RBMediaPlayerSource *source)
 	col = gtk_tree_view_column_new_with_attributes (NULL,
 							renderer,
 							"active", 0,
-							"sensitive", 2,
-							"activatable", 2,
+							"inconsistent", 1,
 							NULL);
 	g_signal_connect (G_OBJECT (renderer),
 			  "toggled", G_CALLBACK (sync_entries_changed_cb),
@@ -669,8 +674,7 @@ rb_media_player_source_show_properties (RBMediaPlayerSource *source)
 	renderer = gtk_cell_renderer_text_new ();
 	col = gtk_tree_view_column_new_with_attributes (NULL,
 							renderer,
-							"text", 1,
-							"sensitive", 2,
+							"text", 3,
 							NULL);
 	gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), col);
 	gtk_tree_view_set_model (GTK_TREE_VIEW (tree_view),
@@ -678,20 +682,6 @@ rb_media_player_source_show_properties (RBMediaPlayerSource *source)
 	gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
 				    GTK_SELECTION_NONE);
 
-	widget = GTK_WIDGET (gtk_builder_get_object (builder, "checkbutton-sync-music-all"));
-	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget),
-				      rb_media_player_sync_settings_sync_category (priv->sync_settings, SYNC_CATEGORY_MUSIC));
-	g_signal_connect (widget, "toggled",
-			  (GCallback)sync_music_all_changed_cb,
-			  source);
-
-	widget = GTK_WIDGET (gtk_builder_get_object (builder, "checkbutton-sync-podcasts-all"));
-	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget),
-				      rb_media_player_sync_settings_sync_category (priv->sync_settings, SYNC_CATEGORY_ALL_PODCASTS));
-	g_signal_connect (widget, "toggled",
-			  (GCallback)sync_podcasts_all_changed_cb,
-			  source);
-
 	update_sync_preview_bar (source);
 
 	gtk_widget_show (GTK_WIDGET (priv->properties_dialog));
@@ -810,7 +800,7 @@ itinerary_insert_some_playlists (RBMediaPlayerSource *source,
 		g_object_get (G_OBJECT (list_iter->data), "name", &name, NULL);
 
 		/* See if we should sync it */
-		if (rb_media_player_sync_settings_sync_group (priv->sync_settings, SYNC_CATEGORY_PLAYLIST, name)) {
+		if (rb_media_player_sync_settings_sync_group (priv->sync_settings, SYNC_CATEGORY_MUSIC, name)) {
 			GtkTreeModel *query_model;
 
 			rb_debug ("adding entries from playlist %s to itinerary", name);
@@ -841,13 +831,13 @@ itinerary_insert_some_podcasts (RBMediaPlayerSource *source,
 	podcasts = rb_media_player_sync_settings_get_enabled_groups (priv->sync_settings, SYNC_CATEGORY_PODCAST);
 	for (i = podcasts; i != NULL; i = i->next) {
 		GtkTreeModel *query_model;
-		rb_debug ("adding entries from podcast  %s to itinerary", (char *)i->data);
+		rb_debug ("adding entries from podcast %s to itinerary", (char *)i->data);
 		query_model = GTK_TREE_MODEL (rhythmdb_query_model_new_empty (db));
 		rhythmdb_do_full_query (db, RHYTHMDB_QUERY_RESULTS (query_model),
 					RHYTHMDB_QUERY_PROP_EQUALS,
 					RHYTHMDB_PROP_TYPE, RHYTHMDB_ENTRY_TYPE_PODCAST_POST,
 					RHYTHMDB_QUERY_PROP_EQUALS,
-					RHYTHMDB_PROP_ALBUM, i->data,	/* album? */
+					RHYTHMDB_PROP_SUBTITLE, i->data,
 					RHYTHMDB_QUERY_END);
 
 		/* TODO: exclude undownloaded episodes, sort by post date, set limit, optionally exclude things with play count > 0
@@ -882,29 +872,25 @@ build_sync_itinerary (RBMediaPlayerSource *source)
 					   g_free,
 					   (GDestroyNotify)rhythmdb_entry_unref);
 
-	/* duplicating the original logic here; doesn't seem right to me though */
-	if (rb_media_player_sync_settings_sync_category (priv->sync_settings, SYNC_CATEGORY_PLAYLIST)) {
-		if (rb_media_player_sync_settings_sync_category (priv->sync_settings, SYNC_CATEGORY_MUSIC)) {
-			rb_debug ("adding all music to the itinerary");
-			itinerary_insert_all_of_type (db, RHYTHMDB_ENTRY_TYPE_SONG, itinerary);
-		} else {
-			rb_debug ("adding selected playlists to the itinerary");
-			itinerary_insert_some_playlists (source, itinerary);
-		}
+	if (rb_media_player_sync_settings_sync_category (priv->sync_settings, SYNC_CATEGORY_MUSIC) ||
+	    rb_media_player_sync_settings_sync_group (priv->sync_settings, SYNC_CATEGORY_MUSIC, SYNC_GROUP_ALL_MUSIC)) {
+		rb_debug ("adding all music to the itinerary");
+		itinerary_insert_all_of_type (db, RHYTHMDB_ENTRY_TYPE_SONG, itinerary);
+	} else if (rb_media_player_sync_settings_has_enabled_groups (priv->sync_settings, SYNC_CATEGORY_MUSIC)) {
+		rb_debug ("adding selected playlists to the itinerary");
+		itinerary_insert_some_playlists (source, itinerary);
 	}
 
 	if (rb_media_player_sync_settings_sync_category (priv->sync_settings, SYNC_CATEGORY_PODCAST)) {
-		if (rb_media_player_sync_settings_sync_category (priv->sync_settings, SYNC_CATEGORY_ALL_PODCASTS)) {
-			rb_debug ("adding all podcasts to the itinerary");
-			/* TODO: when we get #episodes/not-if-played settings, use
-			 * equivalent of insert_some_podcasts, iterating through all feeds
-			 * (use a query for all entries of type PODCAST_FEED to find them)
-			 */
-			itinerary_insert_all_of_type (db, RHYTHMDB_ENTRY_TYPE_PODCAST_POST, itinerary);
-		} else {
-			rb_debug ("adding selected podcasts to the itinerary");
-			itinerary_insert_some_podcasts (source, db, itinerary);
-		}
+		rb_debug ("adding all podcasts to the itinerary");
+		/* TODO: when we get #episodes/not-if-played settings, use
+		 * equivalent of insert_some_podcasts, iterating through all feeds
+		 * (use a query for all entries of type PODCAST_FEED to find them)
+		 */
+		itinerary_insert_all_of_type (db, RHYTHMDB_ENTRY_TYPE_PODCAST_POST, itinerary);
+	} else if (rb_media_player_sync_settings_has_enabled_groups (priv->sync_settings, SYNC_CATEGORY_PODCAST)) {
+		rb_debug ("adding selected podcasts to the itinerary");
+		itinerary_insert_some_podcasts (source, db, itinerary);
 	}
 
 	g_object_unref (shell);
@@ -938,11 +924,7 @@ build_device_state (RBMediaPlayerSource *source)
 
 	device = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify)rhythmdb_entry_unref);
 
-	/* TODO: could do this by retrieving the list of enabled sync categories, probably.
-	 * would probably require the 'sync all music' option to work differently though.
-	 */
-
-	if (rb_media_player_sync_settings_sync_category (priv->sync_settings, SYNC_CATEGORY_PLAYLIST)) {
+	if (rb_media_player_sync_settings_sync_category (priv->sync_settings, SYNC_CATEGORY_MUSIC)) {
 		GHashTable *entries;
 		rb_debug ("getting music entries from device");
 		entries = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) rhythmdb_entry_unref);
@@ -1046,7 +1028,7 @@ sync_playlists (RBMediaPlayerSource *source)
 
 		/* is this playlist selected for syncing? */
 		g_object_get (playlist_source, "name", &name, NULL);
-		if (rb_media_player_sync_settings_group_enabled (priv->sync_settings, SYNC_CATEGORY_PLAYLIST, name) == FALSE) {
+		if (rb_media_player_sync_settings_group_enabled (priv->sync_settings, SYNC_CATEGORY_MUSIC, name) == FALSE) {
 			rb_debug ("not syncing playlist %s", name);
 			g_free (name);
 			continue;
diff --git a/sources/rb-media-player-sync-settings.c b/sources/rb-media-player-sync-settings.c
index a23ecb3..9e6636f 100644
--- a/sources/rb-media-player-sync-settings.c
+++ b/sources/rb-media-player-sync-settings.c
@@ -56,6 +56,7 @@
 #include "rb-util.h"
 
 #define CATEGORY_ENABLED_KEY	"enabled"
+#define CATEGORY_ALL_GROUPS_KEY "all-groups"
 #define CATEGORY_GROUPS_KEY	"groups"
 
 typedef struct {
@@ -157,7 +158,6 @@ rb_media_player_sync_settings_sync_category (RBMediaPlayerSyncSettings *settings
 					     const char *category)
 {
 	RBMediaPlayerSyncSettingsPrivate *priv = GET_PRIVATE (settings);
-	/* hrm, default? */
 	return _get_boolean_with_default (priv->key_file, category, CATEGORY_ENABLED_KEY, FALSE);
 }
 
@@ -195,6 +195,7 @@ rb_media_player_sync_settings_set_group (RBMediaPlayerSyncSettings *settings,
 
 	ngroups = 0;
 	groups = g_key_file_get_string_list (priv->key_file, category, CATEGORY_GROUPS_KEY, NULL, NULL);
+
 	if (groups != NULL) {
 		int i;
 		ngroups = g_strv_length (groups);
@@ -204,7 +205,10 @@ rb_media_player_sync_settings_set_group (RBMediaPlayerSyncSettings *settings,
 				if (enabled) {
 					return;
 				} else {
+					char *t;
+					t = groups[i];
 					groups[i] = groups[ngroups-1];
+					groups[ngroups-1] = t;
 					ngroups--;
 				}
 			}
@@ -213,12 +217,19 @@ rb_media_player_sync_settings_set_group (RBMediaPlayerSyncSettings *settings,
 
 	if (enabled) {
 		groups = g_realloc (groups, (ngroups+2) * sizeof(char *));
+		if (ngroups > 0 && groups[ngroups] != NULL) {
+			g_free (groups[ngroups]);
+		}
 		groups[ngroups] = g_strdup (group);
 		groups[ngroups+1] = NULL;
 		ngroups++;
 	}
 
-	g_key_file_set_string_list (priv->key_file, category, CATEGORY_GROUPS_KEY, (const char * const *)groups, ngroups);
+	if (ngroups == 0) {
+		g_key_file_remove_key (priv->key_file, category, CATEGORY_GROUPS_KEY, NULL);
+	} else {
+		g_key_file_set_string_list (priv->key_file, category, CATEGORY_GROUPS_KEY, (const char * const *)groups, ngroups);
+	}
 	g_strfreev (groups);
 
 	_save_idle (settings);
@@ -255,11 +266,26 @@ rb_media_player_sync_settings_sync_group (RBMediaPlayerSyncSettings *settings,
 					  const char *category,
 					  const char *group)
 {
-	if (rb_media_player_sync_settings_sync_category (settings, category) == FALSE) {
+	if (rb_media_player_sync_settings_sync_category (settings, category) == TRUE) {
+		return TRUE;
+	}
+	return rb_media_player_sync_settings_group_enabled (settings, category, group);
+}
+
+gboolean
+rb_media_player_sync_settings_has_enabled_groups (RBMediaPlayerSyncSettings *settings,
+						  const char *category)
+{
+	RBMediaPlayerSyncSettingsPrivate *priv = GET_PRIVATE (settings);
+	char **groups;
+
+	groups = g_key_file_get_string_list (priv->key_file, category, CATEGORY_GROUPS_KEY, NULL, NULL);
+	if (groups == NULL) {
 		return FALSE;
 	}
 
-	return rb_media_player_sync_settings_group_enabled (settings, category, group);
+	g_strfreev (groups);
+	return TRUE;
 }
 
 GList *
@@ -284,6 +310,14 @@ rb_media_player_sync_settings_get_enabled_groups (RBMediaPlayerSyncSettings *set
 	return g_list_reverse (glist);
 }
 
+void
+rb_media_player_sync_settings_clear_groups (RBMediaPlayerSyncSettings *settings, const char *category)
+{
+	RBMediaPlayerSyncSettingsPrivate *priv = GET_PRIVATE (settings);
+	g_key_file_remove_key (priv->key_file, category, CATEGORY_GROUPS_KEY, NULL);
+	_save_idle (settings);
+}
+
 
 
 static void
diff --git a/sources/rb-media-player-sync-settings.h b/sources/rb-media-player-sync-settings.h
index f118d54..d1bbb2d 100644
--- a/sources/rb-media-player-sync-settings.h
+++ b/sources/rb-media-player-sync-settings.h
@@ -41,11 +41,12 @@ G_BEGIN_DECLS
 #define RB_MEDIA_PLAYER_SYNC_SETTINGS_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), RB_TYPE_MEDIA_PLAYER_SYNC_SETTINGS, RBMediaPlayerSyncSettingsClass))
 
 /* defined sync categories */
-#define 	SYNC_CATEGORY_MUSIC		"music"
-#define 	SYNC_CATEGORY_PLAYLIST		"playlist"
-#define		SYNC_CATEGORY_ALL_PODCASTS	"all-podcasts"		/* XXX seems a bit meaningless */
+#define		SYNC_CATEGORY_MUSIC		"music"
 #define 	SYNC_CATEGORY_PODCAST		"podcast"
 
+/* defined sync groups */
+#define		SYNC_GROUP_ALL_MUSIC		"x-rb-all-music"
+
 typedef struct
 {
 	GObject parent;
@@ -86,8 +87,12 @@ gboolean			rb_media_player_sync_settings_group_enabled (RBMediaPlayerSyncSetting
 gboolean			rb_media_player_sync_settings_sync_group (RBMediaPlayerSyncSettings *settings,
 									  const char *category,
 									  const char *group);
+gboolean			rb_media_player_sync_settings_has_enabled_groups (RBMediaPlayerSyncSettings *settings,
+										  const char *category);
 GList *				rb_media_player_sync_settings_get_enabled_groups (RBMediaPlayerSyncSettings *settings,
 										  const char *category);
+void				rb_media_player_sync_settings_clear_groups (RBMediaPlayerSyncSettings *settings,
+									    const char *category);
 
 G_END_DECLS
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]