diff --git a/amadeus/src/app.rs b/amadeus/src/app.rs index 1dc0b0bbcc2cd3738f398decba7a3d1e7d43f1f2..86b9c8ec6d6c7805f1c533f03e6d4df4c5bd55ce 100644 --- a/amadeus/src/app.rs +++ b/amadeus/src/app.rs @@ -22,7 +22,7 @@ use iced::{ }; use iced_aw::{native::Split, split}; use lektor_lib::{requests::*, ConnectConfigPtr}; -use lektor_payloads::{KId, Kara, PlayState, PlayStateWithCurrent}; +use lektor_payloads::{KId, Kara, KaraFilter, PlayState, PlayStateWithCurrent}; use lektor_utils::{config::UserConfig, log}; use std::{future::Future, sync::Arc}; @@ -250,6 +250,12 @@ impl Amadeus { playlists::Request::Inner(plt, karalist::Request(req)) => { self.handle_kara_request(req, Some(plt)) } + playlists::Request::AddTo(name, id) => { + send(add_to_playlist(cfg, name, KaraFilter::KId(id))) + } + playlists::Request::RemoveFrom(name, id) => { + send(remove_from_playlist(cfg, name, KaraFilter::KId(id))) + } }, // Search/Database @@ -315,27 +321,35 @@ impl Amadeus { // Need to open a modal to take decision. (None, RemoveFromPlaylist(id)) => { let plts = self.playlist_list().to_vec(); - let on_select = OnPlaylistSelectCallback::new(move |name| { - playlists::Message::RemoveKaraFromPlaylist(name, id.clone()).into() + let callback = OnPlaylistSelectCallback::new(move |name| { + Message::from_iter([ + playlists::Request::RemoveFrom(name.clone(), id.clone()).into(), + playlists::Message::RemoveKaraFromPlaylist(name, id.clone()).into(), + ]) }); - Command::perform(async {}, |_| { - ShowModal::ChoosePlaylist(plts, on_select).into() - }) + let action = |_| ShowModal::ChoosePlaylist(plts, callback).into(); + Command::perform(async {}, action) } (Some(plt), AddToPlaylist(id)) => { let plts = self.playlist_list().to_vec(); - self.with_kara(id, |kara| { + self.with_kara(id.clone(), |kara| { let cb = OnPlaylistSelectCallback::new(move |name| { - playlists::Message::AddKaraToPlaylist(name, kara.clone()).into() + Message::from_iter([ + playlists::Request::AddTo(name.clone(), id.clone()).into(), + playlists::Message::AddKaraToPlaylist(name, kara.clone()).into(), + ]) }); ShowModal::ChoosePlaylistExpect(plt, plts, cb).into() }) } (None, AddToPlaylist(id)) => { let plts = self.playlist_list().to_vec(); - self.with_kara(id, |kara| { + self.with_kara(id.clone(), |kara| { let cb = OnPlaylistSelectCallback::new(move |name| { - playlists::Message::AddKaraToPlaylist(name, kara.clone()).into() + Message::from_iter([ + playlists::Request::AddTo(name.clone(), id.clone()).into(), + playlists::Message::AddKaraToPlaylist(name, kara.clone()).into(), + ]) }); ShowModal::ChoosePlaylist(plts, cb).into() }) diff --git a/amadeus/src/components/mainpanel/playlists.rs b/amadeus/src/components/mainpanel/playlists.rs index 5d9b4ca456fa0ef3b9ea8cf3be0879461c5dc435..5a5956e9b2a972b7e1470f0438e0ae4c39c575a4 100644 --- a/amadeus/src/components/mainpanel/playlists.rs +++ b/amadeus/src/components/mainpanel/playlists.rs @@ -32,6 +32,12 @@ pub enum Request { /// Refresh a playlist. Refresh(Arc<str>), + /// Add a [KId] to a playlist. + AddTo(Arc<str>, KId), + + /// Remove a [KId] from a playlist. + RemoveFrom(Arc<str>, KId), + /// Inner playlist event, wrapper around the [karalist::Request] Inner(Arc<str>, karalist::Request), }