mirror of
https://github.com/johrpan/musicus.git
synced 2025-10-26 11:47:25 +01:00
recording tile: Add option to append to playlist
This commit is contained in:
parent
13fed08ebf
commit
610a3d8ff9
5 changed files with 32 additions and 7 deletions
|
|
@ -66,6 +66,7 @@ template $MusicusRecordingTile: Gtk.FlowBoxChild {
|
||||||
}
|
}
|
||||||
|
|
||||||
menu edit_menu {
|
menu edit_menu {
|
||||||
item (_("Edit recording"), "recording.edit-recording")
|
item (_("_Add to playlist"), "recording.add-to-playlist")
|
||||||
item (_("Edit tracks"), "recording.edit-tracks")
|
item (_("Edit _recording"), "recording.edit-recording")
|
||||||
|
item (_("Edit _tracks"), "recording.edit-tracks")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -84,12 +84,14 @@ impl AlbumPage {
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
obj.imp().title_label.set_label(&album.to_string());
|
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 {
|
for recording in &album.recordings {
|
||||||
obj.imp()
|
obj.imp()
|
||||||
.recordings_flow_box
|
.recordings_flow_box
|
||||||
.append(&RecordingTile::new(navigation, library, recording));
|
.append(&RecordingTile::new(navigation, library, player, recording));
|
||||||
}
|
}
|
||||||
|
|
||||||
obj.imp().album.set(album).unwrap();
|
obj.imp().album.set(album).unwrap();
|
||||||
|
|
|
||||||
|
|
@ -280,6 +280,7 @@ impl Player {
|
||||||
if first_index == 0 {
|
if first_index == 0 {
|
||||||
self.set_active(true);
|
self.set_active(true);
|
||||||
self.set_current_index(0);
|
self.set_current_index(0);
|
||||||
|
self.pause();
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(first_index)
|
Ok(first_index)
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,9 @@ use std::cell::OnceCell;
|
||||||
use gettextrs::gettext;
|
use gettextrs::gettext;
|
||||||
use gtk::{gio, glib, prelude::*, subclass::prelude::*};
|
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 {
|
mod imp {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
@ -21,6 +23,7 @@ mod imp {
|
||||||
|
|
||||||
pub navigation: OnceCell<adw::NavigationView>,
|
pub navigation: OnceCell<adw::NavigationView>,
|
||||||
pub library: OnceCell<Library>,
|
pub library: OnceCell<Library>,
|
||||||
|
pub player: OnceCell<Player>,
|
||||||
pub recording: OnceCell<Recording>,
|
pub recording: OnceCell<Recording>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -43,6 +46,17 @@ mod imp {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
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 obj = self.obj().to_owned();
|
||||||
let edit_recording_action = gio::ActionEntry::builder("edit-recording")
|
let edit_recording_action = gio::ActionEntry::builder("edit-recording")
|
||||||
.activate(move |_, _, _| {
|
.activate(move |_, _, _| {
|
||||||
|
|
@ -70,7 +84,7 @@ mod imp {
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
let actions = gio::SimpleActionGroup::new();
|
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));
|
self.obj().insert_action_group("recording", Some(&actions));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -85,7 +99,12 @@ glib::wrapper! {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl RecordingTile {
|
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 obj: Self = glib::Object::new();
|
||||||
let imp = obj.imp();
|
let imp = obj.imp();
|
||||||
|
|
||||||
|
|
@ -101,6 +120,7 @@ impl RecordingTile {
|
||||||
|
|
||||||
imp.navigation.set(navigation.to_owned()).unwrap();
|
imp.navigation.set(navigation.to_owned()).unwrap();
|
||||||
imp.library.set(library.to_owned()).unwrap();
|
imp.library.set(library.to_owned()).unwrap();
|
||||||
|
imp.player.set(player.to_owned()).unwrap();
|
||||||
imp.recording.set(recording.to_owned()).unwrap();
|
imp.recording.set(recording.to_owned()).unwrap();
|
||||||
|
|
||||||
obj
|
obj
|
||||||
|
|
|
||||||
|
|
@ -460,6 +460,7 @@ impl SearchPage {
|
||||||
imp.recordings_flow_box.append(&RecordingTile::new(
|
imp.recordings_flow_box.append(&RecordingTile::new(
|
||||||
&self.navigation(),
|
&self.navigation(),
|
||||||
&self.library(),
|
&self.library(),
|
||||||
|
&self.player(),
|
||||||
recording,
|
recording,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue