diff --git a/data/ui/recording_tile.blp b/data/ui/recording_tile.blp index 8acb307..405ee74 100644 --- a/data/ui/recording_tile.blp +++ b/data/ui/recording_tile.blp @@ -66,6 +66,7 @@ template $MusicusRecordingTile: Gtk.FlowBoxChild { } menu edit_menu { - item (_("Edit recording"), "recording.edit-recording") - item (_("Edit tracks"), "recording.edit-tracks") + item (_("_Add to playlist"), "recording.add-to-playlist") + item (_("Edit _recording"), "recording.edit-recording") + item (_("Edit _tracks"), "recording.edit-tracks") } diff --git a/src/album_page.rs b/src/album_page.rs index 3e15483..f021812 100644 --- a/src/album_page.rs +++ b/src/album_page.rs @@ -84,12 +84,14 @@ impl AlbumPage { .build(); obj.imp().title_label.set_label(&album.to_string()); - obj.imp().subtitle_label.set_label(&album.performers_string()); + obj.imp() + .subtitle_label + .set_label(&album.performers_string()); for recording in &album.recordings { obj.imp() .recordings_flow_box - .append(&RecordingTile::new(navigation, library, recording)); + .append(&RecordingTile::new(navigation, library, player, recording)); } obj.imp().album.set(album).unwrap(); diff --git a/src/player.rs b/src/player.rs index 94fcd3f..ec7bba7 100644 --- a/src/player.rs +++ b/src/player.rs @@ -280,6 +280,7 @@ impl Player { if first_index == 0 { self.set_active(true); self.set_current_index(0); + self.pause(); } Ok(first_index) diff --git a/src/recording_tile.rs b/src/recording_tile.rs index 28f240d..be0644a 100644 --- a/src/recording_tile.rs +++ b/src/recording_tile.rs @@ -3,7 +3,9 @@ use std::cell::OnceCell; use gettextrs::gettext; use gtk::{gio, glib, prelude::*, subclass::prelude::*}; -use crate::{db::models::Recording, editor::recording::RecordingEditor, library::Library}; +use crate::{ + db::models::Recording, editor::recording::RecordingEditor, library::Library, player::Player, +}; mod imp { use super::*; @@ -21,6 +23,7 @@ mod imp { pub navigation: OnceCell, pub library: OnceCell, + pub player: OnceCell, pub recording: OnceCell, } @@ -43,6 +46,17 @@ mod imp { fn constructed(&self) { self.parent_constructed(); + let obj = self.obj().to_owned(); + let append_action = gio::ActionEntry::builder("add-to-playlist") + .activate(move |_, _, _| { + let player = obj.imp().player.get().unwrap(); + let playlist = player.recording_to_playlist(obj.imp().recording.get().unwrap()); + if let Err(err) = player.append(playlist) { + log::error!("Failed to add recording to playlist: {err}"); + } + }) + .build(); + let obj = self.obj().to_owned(); let edit_recording_action = gio::ActionEntry::builder("edit-recording") .activate(move |_, _, _| { @@ -70,7 +84,7 @@ mod imp { .build(); let actions = gio::SimpleActionGroup::new(); - actions.add_action_entries([edit_recording_action, edit_tracks_action]); + actions.add_action_entries([append_action, edit_recording_action, edit_tracks_action]); self.obj().insert_action_group("recording", Some(&actions)); } } @@ -85,7 +99,12 @@ glib::wrapper! { } impl RecordingTile { - pub fn new(navigation: &adw::NavigationView, library: &Library, recording: &Recording) -> Self { + pub fn new( + navigation: &adw::NavigationView, + library: &Library, + player: &Player, + recording: &Recording, + ) -> Self { let obj: Self = glib::Object::new(); let imp = obj.imp(); @@ -101,6 +120,7 @@ impl RecordingTile { imp.navigation.set(navigation.to_owned()).unwrap(); imp.library.set(library.to_owned()).unwrap(); + imp.player.set(player.to_owned()).unwrap(); imp.recording.set(recording.to_owned()).unwrap(); obj diff --git a/src/search_page.rs b/src/search_page.rs index a52c9cc..4d47b78 100644 --- a/src/search_page.rs +++ b/src/search_page.rs @@ -460,6 +460,7 @@ impl SearchPage { imp.recordings_flow_box.append(&RecordingTile::new( &self.navigation(), &self.library(), + &self.player(), recording, )); }