static void impl_add_playlist (RBMediaPlayerSource *source, char *name, GList *entries) { RBSource *playlist; RhythmDBEntryType *entry_type; RBShell *shell; GList *i; g_object_get (source, "shell", &shell, "entry-type", &entry_type, NULL); playlist = rb_generic_player_playlist_source_new (shell, RB_GENERIC_PLAYER_SOURCE (source), NULL, NULL, entry_type); g_object_unref (entry_type); rb_generic_player_source_add_playlist (RB_GENERIC_PLAYER_SOURCE (source), shell, playlist); g_object_set (playlist, "name", name, NULL); for (i = entries; i != NULL; i = i->next) { rb_static_playlist_source_add_entry (RB_STATIC_PLAYLIST_SOURCE (playlist), i->data, -1); } g_object_unref (shell); }
static void impl_paste (RBSource *asource, GList *entries) { RBStaticPlaylistSource *source = RB_STATIC_PLAYLIST_SOURCE (asource); for (; entries; entries = g_list_next (entries)) rb_static_playlist_source_add_entry (source, entries->data, -1); }
static RBTrackTransferBatch * impl_paste (RBSource *asource, GList *entries) { RBStaticPlaylistSource *source = RB_STATIC_PLAYLIST_SOURCE (asource); for (; entries; entries = g_list_next (entries)) rb_static_playlist_source_add_entry (source, entries->data, -1); return NULL; }
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 *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); }
/** * rb_static_playlist_source_new_from_xml: * @shell: the #RBShell * @node: XML node containing playlist entries * * Constructs a new playlist from the given XML document node. * * Return value: playlist read from XML */ RBSource * rb_static_playlist_source_new_from_xml (RBShell *shell, xmlNodePtr node) { RBSource *psource = rb_static_playlist_source_new (shell, NULL, NULL, TRUE, RHYTHMDB_ENTRY_TYPE_SONG); RBStaticPlaylistSource *source = RB_STATIC_PLAYLIST_SOURCE (psource); rb_static_playlist_source_load_from_xml (source, node); return RB_SOURCE (source); }
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 void impl_search (RBSource *source, RBSourceSearch *search, const char *cur_text, const char *new_text) { RBStaticPlaylistSourcePrivate *priv = RB_STATIC_PLAYLIST_SOURCE_GET_PRIVATE (source); RhythmDB *db; if (search == NULL) { search = priv->default_search; } /* replace our search query */ if (priv->search_query != NULL) { rhythmdb_query_free (priv->search_query); priv->search_query = NULL; } db = rb_playlist_source_get_db (RB_PLAYLIST_SOURCE (source)); priv->search_query = rb_source_search_create_query (search, db, new_text); rb_static_playlist_source_do_query (RB_STATIC_PLAYLIST_SOURCE (source)); }
static void impl_reset_filters (RBSource *source) { RBStaticPlaylistSourcePrivate *priv = RB_STATIC_PLAYLIST_SOURCE_GET_PRIVATE (source); gboolean changed = FALSE; if (rb_library_browser_reset (priv->browser)) changed = TRUE; if (priv->search_query != NULL) { changed = TRUE; rhythmdb_query_free (priv->search_query); priv->search_query = NULL; } if (changed) { rb_static_playlist_source_do_query (RB_STATIC_PLAYLIST_SOURCE (source)); rb_source_notify_filter_changed (source); } }
static void handle_playlist_entry_cb (TotemPlParser *playlist, const char *uri, GHashTable *metadata, RBGenericPlayerPlaylistSource *source) { char *local_uri; char *name; char *canon_uri; RBGenericPlayerPlaylistSourcePrivate *priv = GET_PRIVATE (source); local_uri = rb_generic_player_source_uri_from_playlist_uri (priv->player_source, uri); if (local_uri == NULL) return; canon_uri = rb_canonicalise_uri (local_uri); g_object_get (source, "name", &name, NULL); rb_debug ("adding '%s' as '%s' to playlist '%s' (%s)", uri, canon_uri, name, priv->playlist_path); rb_static_playlist_source_add_location (RB_STATIC_PLAYLIST_SOURCE (source), canon_uri, -1); g_free (canon_uri); g_free (local_uri); g_free (name); }
static gboolean impl_receive_drag (RBDisplayPage *page, GtkSelectionData *data) { GdkAtom type; GList *list; RBStaticPlaylistSource *source = RB_STATIC_PLAYLIST_SOURCE (page); type = gtk_selection_data_get_data_type (data); if (type == gdk_atom_intern ("text/uri-list", TRUE) || type == gdk_atom_intern ("application/x-rhythmbox-entry", TRUE)) { list = rb_uri_list_parse ((char *)gtk_selection_data_get_data (data)); if (list == NULL) return FALSE; if (type == gdk_atom_intern ("text/uri-list", TRUE)) rb_static_playlist_source_add_uri_list (source, list); else rb_static_playlist_source_add_id_list (source, list); rb_list_deep_free (list); } return TRUE; }
static void rb_static_playlist_source_constructed (GObject *object) { RBStaticPlaylistSource *source; RBStaticPlaylistSourcePrivate *priv; RBPlaylistSource *psource; RBEntryView *songs; RBShell *shell; RhythmDBEntryType *entry_type; RB_CHAIN_GOBJECT_METHOD (rb_static_playlist_source_parent_class, constructed, object); source = RB_STATIC_PLAYLIST_SOURCE (object); priv = RB_STATIC_PLAYLIST_SOURCE_GET_PRIVATE (source); psource = RB_PLAYLIST_SOURCE (source); priv->base_model = rb_playlist_source_get_query_model (RB_PLAYLIST_SOURCE (psource)); g_object_set (priv->base_model, "show-hidden", TRUE, NULL); g_object_ref (priv->base_model); g_signal_connect_object (priv->base_model, "filter-entry-drop", G_CALLBACK (rb_static_playlist_source_filter_entry_drop), source, 0); priv->paned = gtk_vpaned_new (); g_object_get (source, "shell", &shell, NULL); priv->action_group = _rb_display_page_register_action_group (RB_DISPLAY_PAGE (source), "StaticPlaylistActions", NULL, 0, shell); if (gtk_action_group_get_action (priv->action_group, rb_static_playlist_source_radio_actions[0].name) == NULL) { gtk_action_group_add_radio_actions (priv->action_group, rb_static_playlist_source_radio_actions, G_N_ELEMENTS (rb_static_playlist_source_radio_actions), 0, NULL, NULL); rb_source_search_basic_create_for_actions (priv->action_group, rb_static_playlist_source_radio_actions, G_N_ELEMENTS (rb_static_playlist_source_radio_actions)); } priv->default_search = rb_source_search_basic_new (RHYTHMDB_PROP_SEARCH_MATCH); g_object_unref (shell); g_object_get (source, "entry-type", &entry_type, NULL); priv->browser = rb_library_browser_new (rb_playlist_source_get_db (RB_PLAYLIST_SOURCE (source)), entry_type); if (entry_type != NULL) { g_object_unref (entry_type); } gtk_paned_pack1 (GTK_PANED (priv->paned), GTK_WIDGET (priv->browser), TRUE, FALSE); g_signal_connect_object (priv->browser, "notify::output-model", G_CALLBACK (rb_static_playlist_source_browser_changed_cb), source, 0); rb_library_browser_set_model (priv->browser, priv->base_model, FALSE); rb_static_playlist_source_do_query (source); /* reparent the entry view */ songs = rb_source_get_entry_view (RB_SOURCE (source)); g_object_ref (songs); gtk_container_remove (GTK_CONTAINER (source), GTK_WIDGET (songs)); gtk_paned_pack2 (GTK_PANED (priv->paned), GTK_WIDGET (songs), TRUE, FALSE); gtk_container_add (GTK_CONTAINER (source), priv->paned); rb_source_bind_settings (RB_SOURCE (source), GTK_WIDGET (songs), priv->paned, GTK_WIDGET (priv->browser)); g_object_unref (songs); /* watch these to find out when things are dropped into the entry view */ g_signal_connect_object (priv->base_model, "row-inserted", G_CALLBACK (rb_static_playlist_source_row_inserted), source, 0); g_signal_connect_object (priv->base_model, "non-entry-dropped", G_CALLBACK (rb_static_playlist_source_non_entry_dropped), source, 0); g_signal_connect_object (priv->base_model, "rows-reordered", G_CALLBACK (rb_static_playlist_source_rows_reordered), source, 0); gtk_widget_show_all (GTK_WIDGET (source)); }