[rhythmbox/media-player-sync] media-player: rework sync settings a bit
- From: Jonathan Matthew <jmatthew src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [rhythmbox/media-player-sync] media-player: rework sync settings a bit
- Date: Thu, 4 Feb 2010 13:18:14 +0000 (UTC)
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]