static gboolean update_status_idle (RBImportDialog *dialog) { int count; const char *fmt; char *text; if (rb_entry_view_have_selection (dialog->priv->entry_view)) { GList *sel; sel = rb_entry_view_get_selected_entries (dialog->priv->entry_view); count = g_list_length (sel); g_list_free_full (sel, (GDestroyNotify) rhythmdb_entry_unref); fmt = ngettext ("Import %d selected track", "Import %d selected tracks", count); } else { count = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (dialog->priv->query_model), NULL); fmt = ngettext ("Import %d listed track", "Import %d listed tracks", count); } text = g_strdup_printf (fmt, count); gtk_button_set_label (GTK_BUTTON (dialog->priv->import_button), text); g_free (text); dialog->priv->update_status_id = 0; return FALSE; }
/** * rb_source_gather_selected_properties: * @source: a #RBSource * @prop: property for which to gather selection * * Returns a list containing the values of the specified * property from the selected entries in the source. * This is used to implement the 'browse this artist' (etc.) * actions. * * Return value: (element-type utf8) (transfer full): list of property values */ GList * rb_source_gather_selected_properties (RBSource *source, RhythmDBPropType prop) { RBEntryView *entryview; GList *selected, *tem; GHashTable *selected_set; entryview = rb_source_get_entry_view (source); if (entryview == NULL) return NULL; selected_set = g_hash_table_new (g_str_hash, g_str_equal); selected = rb_entry_view_get_selected_entries (entryview); for (tem = selected; tem; tem = tem->next) { RhythmDBEntry *entry = tem->data; char *val = g_strdup (rhythmdb_entry_get_string (entry, prop)); g_hash_table_insert (selected_set, val, NULL); } g_list_foreach (selected, (GFunc)rhythmdb_entry_unref, NULL); g_list_free (selected); tem = NULL; g_hash_table_foreach (selected_set, (GHFunc) rb_source_gather_hash_keys, &tem); g_hash_table_destroy (selected_set); return tem; }
static void default_move_to_trash (RBSource *source) { GList *sel, *tem; RBEntryView *entry_view; RhythmDB *db; RBSourcePrivate *priv = RB_SOURCE_GET_PRIVATE (source); g_object_get (priv->shell, "db", &db, NULL); sel = NULL; entry_view = rb_source_get_entry_view (source); if (entry_view != NULL) { sel = rb_entry_view_get_selected_entries (entry_view); } for (tem = sel; tem != NULL; tem = tem->next) { rhythmdb_entry_move_to_trash (db, (RhythmDBEntry *)tem->data); rhythmdb_commit (db); } g_list_foreach (sel, (GFunc)rhythmdb_entry_unref, NULL); g_list_free (sel); g_object_unref (db); }
static GList * default_copy (RBSource *source) { RBEntryView *entry_view; entry_view = rb_source_get_entry_view (source); if (entry_view == NULL) return NULL; return rb_entry_view_get_selected_entries (entry_view); }
static void impl_delete (RBSource *source) { GList *sel; RBEntryView *songs; songs = rb_source_get_entry_view (source); sel = rb_entry_view_get_selected_entries (songs); impl_delete_entries (RB_MEDIA_PLAYER_SOURCE (source), sel, NULL, NULL, NULL); rb_list_destroy_free (sel, (GDestroyNotify) rhythmdb_entry_unref); }
static GList * impl_cut (RBSource *asource) { RBStaticPlaylistSource *source = RB_STATIC_PLAYLIST_SOURCE (asource); RBEntryView *songs = rb_source_get_entry_view (asource); GList *sel = rb_entry_view_get_selected_entries (songs); GList *tem; for (tem = sel; tem; tem = tem->next) rb_static_playlist_source_remove_entry (source, (RhythmDBEntry *) tem->data); return sel; }
static void impl_delete (RBSource *source) { RBEntryView *view; GList *sel; view = rb_source_get_entry_view (source); sel = rb_entry_view_get_selected_entries (view); rb_generic_player_source_delete_entries (RB_GENERIC_PLAYER_SOURCE (source), sel); g_list_foreach (sel, (GFunc)rhythmdb_entry_unref, NULL); g_list_free (sel); }
static void impl_delete_selected (RBSource *source) { RBEntryView *view; GList *sel; view = rb_source_get_entry_view (source); sel = rb_entry_view_get_selected_entries (view); delete_entries (RB_ANDROID_SOURCE (source), sel); g_list_foreach (sel, (GFunc)rhythmdb_entry_unref, NULL); g_list_free (sel); }
static void impl_delete (RBSource *asource) { RBEntryView *songs = rb_source_get_entry_view (asource); RBStaticPlaylistSource *source = RB_STATIC_PLAYLIST_SOURCE (asource); GList *sel, *tem; sel = rb_entry_view_get_selected_entries (songs); for (tem = sel; tem != NULL; tem = tem->next) { rb_static_playlist_source_remove_entry (source, (RhythmDBEntry *) tem->data); } g_list_foreach (sel, (GFunc)rhythmdb_entry_unref, NULL); g_list_free (sel); }
static void impl_delete (RBSource *asource) { RBImportErrorsSource *source = RB_IMPORT_ERRORS_SOURCE (asource); GList *sel, *tem; sel = rb_entry_view_get_selected_entries (source->priv->view); for (tem = sel; tem != NULL; tem = tem->next) { rhythmdb_entry_delete (source->priv->db, tem->data); rhythmdb_commit (source->priv->db); } g_list_foreach (sel, (GFunc)rhythmdb_entry_unref, NULL); g_list_free (sel); }
static GList * get_entries (RBImportDialog *dialog) { /* selection if non-empty, all entries otherwise */ if (rb_entry_view_have_selection (dialog->priv->entry_view)) { return rb_entry_view_get_selected_entries (dialog->priv->entry_view); } else { GList *l = NULL; gtk_tree_model_foreach (GTK_TREE_MODEL (dialog->priv->query_model), (GtkTreeModelForeachFunc) collect_entries, &l); return g_list_reverse (l); } }
static void impl_delete_selected (RBSource *asource) { RBMissingFilesSource *source = RB_MISSING_FILES_SOURCE (asource); GList *sel, *tem; sel = rb_entry_view_get_selected_entries (source->priv->view); for (tem = sel; tem != NULL; tem = tem->next) { rhythmdb_entry_delete (source->priv->db, tem->data); rhythmdb_commit (source->priv->db); } g_list_foreach (sel, (GFunc)rhythmdb_entry_unref, NULL); g_list_free (sel); }
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 impl_delete (RBSource *source) { RBMtpSourcePrivate *priv = MTP_SOURCE_GET_PRIVATE (source); GList *sel; GList *tem; RBEntryView *tracks; RhythmDB *db; int ret; db = get_db_for_source (RB_MTP_SOURCE (source)); tracks = rb_source_get_entry_view (source); sel = rb_entry_view_get_selected_entries (tracks); for (tem = sel; tem != NULL; tem = tem->next) { LIBMTP_track_t *track; RhythmDBEntry *entry; const char *uri; const char *album_name; entry = (RhythmDBEntry *)tem->data; uri = rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_LOCATION); track = g_hash_table_lookup (priv->entry_map, entry); if (track == NULL) { rb_debug ("Couldn't find track on mtp-device! (%s)", uri); continue; } ret = LIBMTP_Delete_Object (priv->device, track->item_id); if (ret != 0) { rb_debug ("Delete track %d failed", track->item_id); report_libmtp_errors (priv->device, TRUE); continue; } album_name = rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_ALBUM); if (strcmp (album_name, _("Unknown")) != 0) { remove_track_from_album (RB_MTP_SOURCE (source), album_name, track); } g_hash_table_remove (priv->entry_map, entry); rhythmdb_entry_delete (db, entry); } rhythmdb_commit (db); g_list_free (sel); g_list_free (tem); }
static void impl_delete (RBSource *asource) { RBIRadioSource *source = RB_IRADIO_SOURCE (asource); GList *sel; GList *l; sel = rb_entry_view_get_selected_entries (source->priv->stations); for (l = sel; l != NULL; l = g_list_next (l)) { rhythmdb_entry_delete (source->priv->db, l->data); rhythmdb_commit (source->priv->db); } g_list_foreach (sel, (GFunc)rhythmdb_entry_unref, NULL); g_list_free (sel); }
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 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); return ret; }
static GList * impl_copy (RBSource *source) { RBMtpSourcePrivate *priv = MTP_SOURCE_GET_PRIVATE (RB_MTP_SOURCE (source)); RhythmDB *db; GList *selected_entries; GList *iter; GList *copy_entries; int ret = -1; LIBMTP_track_t *track = NULL; db = get_db_for_source (RB_MTP_SOURCE (source)); copy_entries = NULL; selected_entries = rb_entry_view_get_selected_entries (rb_source_get_entry_view (source)); for (iter = selected_entries; iter != NULL; iter = g_list_next (iter)) { RhythmDBEntry *entry; char *path; char *uri; entry = (RhythmDBEntry *)iter->data; track = g_hash_table_lookup (priv->entry_map, entry); if (track == NULL) continue; path = g_strdup_printf ("%s/%s", g_get_tmp_dir (), track->filename); uri = g_filename_to_uri (path, NULL, NULL); g_free (path); ret = rb_mtp_source_transfer_track_to_disk (priv->device, track, uri); if (ret == 0) { entry_set_string_prop (RHYTHMDB (db), entry, RHYTHMDB_PROP_LOCATION, uri); copy_entries = g_list_prepend (copy_entries, entry); } g_free (uri); } g_list_free (selected_entries); g_object_unref (G_OBJECT (db)); return copy_entries; }
static void default_add_to_queue (RBSource *source, RBSource *queue) { RBEntryView *songs = rb_source_get_entry_view (source); GList *selection = rb_entry_view_get_selected_entries (songs); GList *iter; if (selection == NULL) return; for (iter = selection; iter; iter = iter->next) { rb_static_playlist_source_add_entry (RB_STATIC_PLAYLIST_SOURCE (queue), (RhythmDBEntry *)iter->data, -1); } g_list_foreach (selection, (GFunc)rhythmdb_entry_unref, NULL); g_list_free (selection); }
static gboolean impl_can_move_to_trash (RBSource *source) { RBGenericPlayerSourcePrivate *priv = GENERIC_PLAYER_SOURCE_GET_PRIVATE (source); RBEntryView *view; GList *sel, *tem; gboolean ret; if (priv->read_only != FALSE) return FALSE; 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) { RhythmDBEntry *entry; const char *uri; GFile *file; GFileInfo *info; 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); g_object_unref (file); if (info == NULL) { ret = FALSE; break; } ret = g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_TRASH); g_object_unref (info); if (ret == FALSE) break; } g_list_foreach (sel, (GFunc)rhythmdb_entry_unref, NULL); g_list_free (sel); return ret; }
static GList * default_copy (RBSource *source) { return rb_entry_view_get_selected_entries (rb_source_get_entry_view (source)); }