diff --git a/src/rust/amadeus-rs/amadeus-lib/src/actions.rs b/src/rust/amadeus-rs/amadeus-lib/src/actions.rs index 78c54dfd29c75b9a7be29b1b865f7605a745031c..00743374e7532fc96385bff8827cd4a44950ae49 100644 --- a/src/rust/amadeus-rs/amadeus-lib/src/actions.rs +++ b/src/rust/amadeus-rs/amadeus-lib/src/actions.rs @@ -39,6 +39,9 @@ pub enum Action { /// Disconnect from lektord. DisconnectFromLektord, + /// Refresh the list of playlists + RefreshPlaylists, + PlaybackPrevious, PlaybackPlay, PlaybackPause, @@ -47,25 +50,27 @@ pub enum Action { impl std::fmt::Debug for Action { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + use Action::*; match self { - Self::PlayFromKara => write!(f, "PlayFromKara"), - Self::DeleteKaraFromQueue => write!(f, "DeleteKaraFromQueue"), - Self::InsertKaraInQueue => write!(f, "InsertKaraInQueue"), - Self::AddKaraToQueue => write!(f, "AddKaraToQueue"), - Self::AddKaraToPlaylist => write!(f, "AddKaraToPlaylist"), - Self::DeleteKaraFromPlaylist(arg0) => { + PlayFromKara => write!(f, "PlayFromKara"), + DeleteKaraFromQueue => write!(f, "DeleteKaraFromQueue"), + InsertKaraInQueue => write!(f, "InsertKaraInQueue"), + AddKaraToQueue => write!(f, "AddKaraToQueue"), + AddKaraToPlaylist => write!(f, "AddKaraToPlaylist"), + DeleteKaraFromPlaylist(arg0) => { f.debug_tuple("DeleteKaraFromPlaylist").field(arg0).finish() } - Self::OpenPlaylist => write!(f, "OpenPlaylist"), - Self::AddPlaylistToQueue => write!(f, "AddPlaylistToQueue"), - Self::InsertPlaylistToQueue => write!(f, "InsertPlaylistToQueue"), - Self::ClearPlaylistContent => write!(f, "ClearPlaylistContent"), - Self::ConnectToLektord => write!(f, "ConnectToLektord"), - Self::DisconnectFromLektord => write!(f, "DisconnectFromLektord"), - Self::PlaybackPrevious => write!(f, "PlaybackPrevious"), - Self::PlaybackPlay => write!(f, "PlaybackPlay"), - Self::PlaybackPause => write!(f, "PlaybackPause"), - Self::PlaybackNext => write!(f, "PlaybackNext"), + OpenPlaylist => write!(f, "OpenPlaylist"), + AddPlaylistToQueue => write!(f, "AddPlaylistToQueue"), + InsertPlaylistToQueue => write!(f, "InsertPlaylistToQueue"), + ClearPlaylistContent => write!(f, "ClearPlaylistContent"), + ConnectToLektord => write!(f, "ConnectToLektord"), + DisconnectFromLektord => write!(f, "DisconnectFromLektord"), + PlaybackPrevious => write!(f, "PlaybackPrevious"), + PlaybackPlay => write!(f, "PlaybackPlay"), + PlaybackPause => write!(f, "PlaybackPause"), + PlaybackNext => write!(f, "PlaybackNext"), + RefreshPlaylists => write!(f, "RefreshPlaylists"), } } } @@ -93,5 +98,7 @@ pub fn get_card_action_name(act: &Action) -> &'static str { PlaybackPlay => "Play", PlaybackPause => "Pause", PlaybackNext => "Next", + + RefreshPlaylists => "Refresh playlists", } } diff --git a/src/rust/amadeus-rs/amadeus/src/amadeus.rs b/src/rust/amadeus-rs/amadeus/src/amadeus.rs index 1782856cef98caa1e8c158a07ba68dd511ae4c00..6d33cb273c2a4099c7272ff4df8edc02de047a41 100644 --- a/src/rust/amadeus-rs/amadeus/src/amadeus.rs +++ b/src/rust/amadeus-rs/amadeus/src/amadeus.rs @@ -3,15 +3,15 @@ use amadeus_lib::{ actions, deamon::{self, CommandDeamon, Deamon, StatusDeamon}, }; -use amadeus_macro::{either, then_some}; +use amadeus_macro::*; use eframe::{egui, App}; use lkt_lib::{ Kara, LektorCurrentKaraInnerResponse, LektorPlaybackStatusResponse, LektorQuery, - LektorResponse, LektorState, + LektorResponse, LektorState, Playlist, }; -use log::debug; +use log::*; use std::{ - sync::mpsc::{Receiver, Sender}, + sync::mpsc::{Receiver, SendError, Sender}, time, }; @@ -55,6 +55,13 @@ pub struct Amadeus<'a> { amadeus_logo_texture: Option<egui::TextureHandle>, } +fn handle_sender_error(e: Result<(), SendError<LektorQuery>>) { + if let Err(e) = e { + let query = e.0; + error!("error while sending commands {query:?} to command deamon") + } +} + impl Default for Amadeus<'_> { fn default() -> Self { Self { @@ -170,6 +177,9 @@ impl Amadeus<'_> { self.playlist_store.render(ui, self.config.dark_mode); }); } + if self.playlist_store.refresh_playlists() { + self.actions.push(actions::Action::RefreshPlaylists); + } } fn render_central_panel(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { @@ -360,7 +370,11 @@ impl Amadeus<'_> { match event { PlaybackStatus(_) => todo!(), CurrentKara(_) => todo!(), - PlaylistSet(_) => todo!(), + PlaylistSet(set) => { + self.playlist_store.clear_playlists(); + set.into_iter() + .for_each(|plt| self.playlist_store.create(Playlist { name: plt })) + } EmptyResponse(_) => todo!(), KaraSet(_) => todo!(), } @@ -423,7 +437,8 @@ impl Amadeus<'_> { // This should not occure on items because they are global // actions. - PlaybackPrevious + RefreshPlaylists + | PlaybackPrevious | PlaybackPlay | PlaybackPause | PlaybackNext @@ -470,6 +485,12 @@ impl Amadeus<'_> { debug!("Execute action {act:?} on lektor") } + RefreshPlaylists => { + if let Some(((sender, _), _)) = &self.deamon { + handle_sender_error(sender.send(LektorQuery::ListAllPlaylists)) + } + } + _ => unreachable!(), } } diff --git a/src/rust/amadeus-rs/amadeus/src/cards/card.rs b/src/rust/amadeus-rs/amadeus/src/cards/card.rs index 7511f154e052089b6f0b2b6819692f271ab140ec..ee9ea5e4b788f1a973b17d76fd95d49a77cfd744 100644 --- a/src/rust/amadeus-rs/amadeus/src/cards/card.rs +++ b/src/rust/amadeus-rs/amadeus/src/cards/card.rs @@ -65,7 +65,13 @@ impl ToString for KaraCard { impl ToString for PlaylistCard { fn to_string(&self) -> String { - format!("{} [#{}]", self.inner.name, self.inner.id) + self.inner.name.clone() + } +} + +impl AsRef<str> for PlaylistCard { + fn as_ref(&self) -> &str { + &self.inner.name } } @@ -200,7 +206,6 @@ impl Card<'_, Playlist> for PlaylistCard { constants::get_text_color(dark_mode), self.inner.name.to_string(), ); - ui.label(format!(" #{}", self.inner.id)); }); ui.add_space(constants::PADDING); } @@ -211,7 +216,6 @@ impl Card<'_, Playlist> for PlaylistCard { constants::get_text_color(dark_mode), self.inner.name.to_string(), ); - ui.label(format!(" #{}", self.inner.id)); }); } diff --git a/src/rust/amadeus-rs/amadeus/src/widgets/playlists.rs b/src/rust/amadeus-rs/amadeus/src/widgets/playlists.rs index 0c478bcd1c1a6f5eecbd1e6f7b9f4737eff724fd..0376bb772395011a732f1cb6b45a81d303fe38ff 100644 --- a/src/rust/amadeus-rs/amadeus/src/widgets/playlists.rs +++ b/src/rust/amadeus-rs/amadeus/src/widgets/playlists.rs @@ -26,6 +26,9 @@ pub struct PlaylistsStore { /// A temp buffer for handling actions on a specific item, where we know the /// id to put but not the render function. temp_actions: Vec<actions::Action>, + + /// Whever to refresh all the playlists or not + refresh_playlists: bool, } impl Default for PlaylistsStore { @@ -36,6 +39,7 @@ impl Default for PlaylistsStore { playlists_to_show: HashMap::with_capacity(DEFAULT_HASHSET_SIZE), actions: Vec::new(), temp_actions: Vec::new(), + refresh_playlists: false, } } } @@ -132,7 +136,9 @@ impl PlaylistsStore { ui.add_space(constants::PADDING); ui.horizontal(|ui| { ui.style_mut().override_text_style = Some(utils::font::heading1()); - ui.colored_label(constants::get_text_color(dark_mode), "🗀 Playlists"); + ui.add(egui::widgets::Button::new("🗀 Playlists").frame(false)) + .clicked() + .then(|| self.refresh_playlists = true); ui.style_mut().override_text_style = Some(utils::font::small_body()); }); ui.style_mut().override_text_style = Some(utils::font::body()); @@ -200,6 +206,19 @@ impl PlaylistsStore { } } + pub fn refresh_playlists(&mut self) -> bool { + let refresh = self.refresh_playlists; + self.refresh_playlists = false; + refresh + } + + pub fn clear_playlists(&mut self) { + self.contents.clear(); + self.playlists_to_show.clear(); + self.actions.clear(); + self.playlists.clear(); + } + pub fn create(&mut self, plt: Playlist) { self.contents.insert( plt.unique_id(), diff --git a/src/rust/amadeus-rs/lkt-lib/src/types.rs b/src/rust/amadeus-rs/lkt-lib/src/types.rs index 1c3b7223ad2fbda3850662b383ee94a91374fbf4..cab41589de820bd5f50b231de7888480848eacf2 100644 --- a/src/rust/amadeus-rs/lkt-lib/src/types.rs +++ b/src/rust/amadeus-rs/lkt-lib/src/types.rs @@ -26,9 +26,8 @@ pub struct Kara { pub is_available: bool, } -#[derive(Clone, Eq, serde::Serialize, serde::Deserialize)] +#[derive(Clone, Eq, serde::Serialize, serde::Deserialize, PartialEq, Hash)] pub struct Playlist { - pub id: u32, pub name: String, } @@ -38,12 +37,6 @@ impl PartialEq for Kara { } } -impl PartialEq for Playlist { - fn eq(&self, other: &Self) -> bool { - self.id == other.id - } -} - impl LektorType<'_> for Kara { fn unique_id(&self) -> u64 { private::unique_id(self) @@ -95,11 +88,3 @@ impl Hash for Kara { ((self.id as usize) * 2).hash(state); } } - -/// Sealed implementation of Hash for Playlist. -impl Hash for Playlist { - fn hash<H: Hasher>(&self, state: &mut H) { - self.id.hash(state); - self.name.hash(state); - } -}