[rhythmbox] generic-player: implement move-to-trash in playlists



commit 8b1b586d6030e653ad2fd62aec5f3969151498ba
Author: Jonathan Matthew <jonathan d14n org>
Date:   Wed Jun 24 19:27:33 2009 +1000

    generic-player: implement move-to-trash in playlists

 .../rb-generic-player-playlist-source.c            |   38 +++++++++-
 plugins/generic-player/rb-generic-player-source.c  |   82 ++++++++++++++------
 plugins/generic-player/rb-generic-player-source.h  |    5 +
 3 files changed, 100 insertions(+), 25 deletions(-)
---
diff --git a/plugins/generic-player/rb-generic-player-playlist-source.c b/plugins/generic-player/rb-generic-player-playlist-source.c
index e2f0eef..9d604c7 100644
--- a/plugins/generic-player/rb-generic-player-playlist-source.c
+++ b/plugins/generic-player/rb-generic-player-playlist-source.c
@@ -33,6 +33,7 @@
 #include <totem-pl-parser.h>
 
 #include "rb-generic-player-playlist-source.h"
+#include "rb-generic-player-source.h"
 #include "rb-debug.h"
 #include "rb-plugin.h"
 #include "rb-file-helpers.h"
@@ -471,12 +472,47 @@ impl_set_property (GObject *object, guint prop_id, const GValue *value, GParamSp
 }
 
 static gboolean
-rb_generic_player_playlist_source_show_popup (RBSource *source)
+impl_show_popup (RBSource *source)
 {
 	_rb_source_show_popup (source, "/GenericPlayerPlaylistSourcePopup");
 	return TRUE;
 }
 
+static gboolean
+impl_can_move_to_trash (RBSource *source)
+{
+	RBGenericPlayerPlaylistSourcePrivate *priv = GET_PRIVATE (source);
+	RBEntryView *songs;
+	GList *sel;
+	gboolean ret;
+
+	songs = rb_source_get_entry_view (source);
+	sel = rb_entry_view_get_selected_entries (songs);
+
+	ret = rb_generic_player_source_can_trash_entries (priv->player_source, sel);
+
+	g_list_foreach (sel, (GFunc) rhythmdb_entry_unref, NULL);
+	g_list_free (sel);
+
+	return ret;
+}
+
+static void
+impl_move_to_trash (RBSource *source)
+{
+	RBGenericPlayerPlaylistSourcePrivate *priv = GET_PRIVATE (source);
+	RBEntryView *songs;
+	GList *sel;
+
+	songs = rb_source_get_entry_view (source);
+	sel = rb_entry_view_get_selected_entries (songs);
+
+	rb_generic_player_source_trash_or_delete_entries (priv->player_source, sel, FALSE);
+
+	g_list_foreach (sel, (GFunc) rhythmdb_entry_unref, NULL);
+	g_list_free (sel);
+}
+
 static void
 rb_generic_player_playlist_source_class_init (RBGenericPlayerPlaylistSourceClass *klass)
 {
diff --git a/plugins/generic-player/rb-generic-player-source.c b/plugins/generic-player/rb-generic-player-source.c
index adcfd84..d0a973d 100644
--- a/plugins/generic-player/rb-generic-player-source.c
+++ b/plugins/generic-player/rb-generic-player-source.c
@@ -901,12 +901,12 @@ impl_show_popup (RBSource *source)
 	return TRUE;
 }
 
-static gboolean
-impl_can_move_to_trash (RBSource *source)
+gboolean
+rb_generic_player_source_can_trash_entries (RBGenericPlayerSource *source,
+					    GList *entries)
 {
 	RBGenericPlayerSourcePrivate *priv = GENERIC_PLAYER_SOURCE_GET_PRIVATE (source);
-	RBEntryView *view;
-	GList *sel, *tem;
+	GList *tem;
 	gboolean ret;
 
 	if (priv->read_only != FALSE)
@@ -914,10 +914,7 @@ impl_can_move_to_trash (RBSource *source)
 
 	ret = FALSE;
 
-	view = rb_source_get_entry_view (source);
-	sel = rb_entry_view_get_selected_entries (view);
-
-	for (tem = sel; tem != NULL; tem = tem->next) {
+	for (tem = entries; tem != NULL; tem = tem->next) {
 		RhythmDBEntry *entry;
 		const char *uri;
 		GFile *file;
@@ -926,7 +923,11 @@ impl_can_move_to_trash (RBSource *source)
 		entry = tem->data;
 		uri = rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_LOCATION);
 		file = g_file_new_for_uri (uri);
-		info = g_file_query_info (file, G_FILE_ATTRIBUTE_ACCESS_CAN_TRASH, G_FILE_QUERY_INFO_NONE, NULL, NULL);
+		info = g_file_query_info (file,
+					  G_FILE_ATTRIBUTE_ACCESS_CAN_TRASH,
+					  G_FILE_QUERY_INFO_NONE,
+					  NULL,
+					  NULL);
 		g_object_unref (file);
 		if (info == NULL) {
 			ret = FALSE;
@@ -938,6 +939,23 @@ impl_can_move_to_trash (RBSource *source)
 			break;
 	}
 
+	return ret;
+}
+
+static gboolean
+impl_can_move_to_trash (RBSource *source)
+{
+	RBEntryView *view;
+	GList *sel;
+	gboolean ret;
+
+
+	view = rb_source_get_entry_view (source);
+	sel = rb_entry_view_get_selected_entries (view);
+
+	ret = rb_generic_player_source_can_trash_entries (RB_GENERIC_PLAYER_SOURCE (source),
+							  sel);
+
 	g_list_foreach (sel, (GFunc)rhythmdb_entry_unref, NULL);
 	g_list_free (sel);
 
@@ -1190,7 +1208,7 @@ impl_can_delete (RBSource *source)
 }
 
 static gboolean
-can_delete_directory (RBSource *source, GFile *dir)
+can_delete_directory (RBGenericPlayerSource *source, GFile *dir)
 {
 	RBGenericPlayerSourcePrivate *priv = GENERIC_PLAYER_SOURCE_GET_PRIVATE (source);
 	gboolean result;
@@ -1229,20 +1247,18 @@ can_delete_directory (RBSource *source, GFile *dir)
 	return result;
 }
 
-static void
-impl_move_to_trash_or_delete (RBSource *source, gboolean delete)
+void
+rb_generic_player_source_trash_or_delete_entries (RBGenericPlayerSource *source,
+						  GList *entries,
+						  gboolean _delete)
 {
 	RBGenericPlayerSourcePrivate *priv = GENERIC_PLAYER_SOURCE_GET_PRIVATE (source);
-	RBEntryView *view;
-	GList *sel, *tem;
+	GList *tem;
 
 	if (priv->read_only != FALSE)
 		return;
 
-	view = rb_source_get_entry_view (source);
-	sel = rb_entry_view_get_selected_entries (view);
-
-	for (tem = sel; tem != NULL; tem = tem->next) {
+	for (tem = entries; tem != NULL; tem = tem->next) {
 		RhythmDBEntry *entry;
 		const char *uri;
 		GFile *file;
@@ -1251,7 +1267,7 @@ impl_move_to_trash_or_delete (RBSource *source, gboolean delete)
 		entry = tem->data;
 		uri = rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_LOCATION);
 		file = g_file_new_for_uri (uri);
-		if (delete)
+		if (_delete)
 			g_file_delete (file, NULL, NULL);
 		else
 			g_file_trash (file, NULL, NULL);
@@ -1284,23 +1300,41 @@ impl_move_to_trash_or_delete (RBSource *source, gboolean delete)
 		g_object_unref (file);
 
 		rhythmdb_entry_delete (priv->db, entry);
-		rhythmdb_commit (priv->db);
 	}
 
-	g_list_foreach (sel, (GFunc)rhythmdb_entry_unref, NULL);
-	g_list_free (sel);
+	rhythmdb_commit (priv->db);
 }
 
 static void
 impl_move_to_trash (RBSource *source)
 {
-	impl_move_to_trash_or_delete (source, FALSE);
+	RBEntryView *view;
+	GList *sel;
+
+	view = rb_source_get_entry_view (source);
+	sel = rb_entry_view_get_selected_entries (view);
+
+	rb_generic_player_source_trash_or_delete_entries (RB_GENERIC_PLAYER_SOURCE (source),
+							  sel,
+							  FALSE);
+	g_list_foreach (sel, (GFunc)rhythmdb_entry_unref, NULL);
+	g_list_free (sel);
 }
 
 static void
 impl_delete (RBSource *source)
 {
-	impl_move_to_trash_or_delete (source, TRUE);
+	RBEntryView *view;
+	GList *sel;
+
+	view = rb_source_get_entry_view (source);
+	sel = rb_entry_view_get_selected_entries (view);
+
+	rb_generic_player_source_trash_or_delete_entries (RB_GENERIC_PLAYER_SOURCE (source),
+							  sel,
+							  TRUE);
+	g_list_foreach (sel, (GFunc)rhythmdb_entry_unref, NULL);
+	g_list_free (sel);
 }
 
 static char *
diff --git a/plugins/generic-player/rb-generic-player-source.h b/plugins/generic-player/rb-generic-player-source.h
index 0920a73..53e2a1f 100644
--- a/plugins/generic-player/rb-generic-player-source.h
+++ b/plugins/generic-player/rb-generic-player-source.h
@@ -81,6 +81,11 @@ char *			rb_generic_player_source_get_playlist_path	(RBGenericPlayerSource *sour
 
 gboolean		rb_generic_player_is_mount_player		(GMount *mount);
 
+void			rb_generic_player_source_trash_or_delete_entries (RBGenericPlayerSource *source,
+									 GList *entries,
+									 gboolean _delete);
+gboolean		rb_generic_player_source_can_trash_entries	(RBGenericPlayerSource *source,
+									 GList *entries);
 
 /* for subclasses */
 void			rb_generic_player_source_add_playlist		(RBGenericPlayerSource *source,



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