recording tile: Add option to append to playlist

This commit is contained in:
Elias Projahn 2025-03-02 16:00:18 +01:00
parent 13fed08ebf
commit 610a3d8ff9
5 changed files with 32 additions and 7 deletions

View file

@ -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")
}

View file

@ -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();

View file

@ -280,6 +280,7 @@ impl Player {
if first_index == 0 {
self.set_active(true);
self.set_current_index(0);
self.pause();
}
Ok(first_index)

View file

@ -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<adw::NavigationView>,
pub library: OnceCell<Library>,
pub player: OnceCell<Player>,
pub recording: OnceCell<Recording>,
}
@ -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

View file

@ -460,6 +460,7 @@ impl SearchPage {
imp.recordings_flow_box.append(&RecordingTile::new(
&self.navigation(),
&self.library(),
&self.player(),
recording,
));
}