From d4c109bc93db97a6aa89dc24f91dc67cd01c1abf Mon Sep 17 00:00:00 2001 From: Nuno Pereira Date: Sat, 1 Apr 2023 10:52:50 +0100 Subject: [PATCH] Updated lyrics UI, added convenience method for when a view is entered --- src/lyrics.rs | 2 +- src/lyrics_fetcher.rs | 3 ++ src/traits.rs | 5 +++ src/ui/layout.rs | 14 ++++++- src/ui/lyrics.rs | 92 +++++++++++++++++++++++++++++++------------ 5 files changed, 89 insertions(+), 27 deletions(-) diff --git a/src/lyrics.rs b/src/lyrics.rs index a942819a1..ef4e5ced1 100644 --- a/src/lyrics.rs +++ b/src/lyrics.rs @@ -41,7 +41,7 @@ impl LyricsManager { } /// Returns the track being played currently, or nothing if the user is listening to a podcast episodes - fn get_current_track(&self) -> Option { + pub fn get_current_track(&self) -> Option { let playable = self.queue.get_current().unwrap(); match playable { diff --git a/src/lyrics_fetcher.rs b/src/lyrics_fetcher.rs index 9761ef3b4..68f22ebae 100644 --- a/src/lyrics_fetcher.rs +++ b/src/lyrics_fetcher.rs @@ -1,3 +1,5 @@ +use log::trace; + use crate::model::track::Track; #[derive(Clone)] @@ -11,6 +13,7 @@ impl LyricsFetcher { /// Fetches the lyrics of the given song using the specified lyrics source pub fn fetch(&self, track: &Track) -> String { // std::thread::sleep(std::time::Duration::from_secs(2)); + trace!("Fetching lyrics for {track}"); format!("Sample Lyrics for {}\n", track.title) } diff --git a/src/traits.rs b/src/traits.rs index 0578023ac..61df4fa2f 100644 --- a/src/traits.rs +++ b/src/traits.rs @@ -72,6 +72,7 @@ pub trait ViewExt: View { } fn on_leave(&self) {} + fn on_enter(&mut self) {} // TODO: see if there are args that should go here fn on_command(&mut self, _s: &mut Cursive, _cmd: &Command) -> Result { Ok(CommandResult::Ignored) @@ -91,6 +92,10 @@ impl ViewExt for NamedView { self.with_view(|v| v.on_leave()); } + fn on_enter(&mut self) { + self.with_view_mut(|v| v.on_enter()); + } + fn on_command(&mut self, s: &mut Cursive, cmd: &Command) -> Result { self.with_view_mut(move |v| v.on_command(s, cmd)).unwrap() } diff --git a/src/ui/layout.rs b/src/ui/layout.rs index 417c2f9b2..de71a77f4 100644 --- a/src/ui/layout.rs +++ b/src/ui/layout.rs @@ -148,6 +148,11 @@ impl Layout { self.focus = Some(s); self.cmdline_focus = false; + self.screens + .get_mut(self.focus.as_ref().unwrap()) + .unwrap() + .on_enter(); + // trigger a redraw self.ev.trigger(); } @@ -173,12 +178,13 @@ impl Layout { self.result.clone() } - pub fn push_view(&mut self, view: Box) { + pub fn push_view(&mut self, mut view: Box) { if let Some(view) = self.get_top_view() { view.on_leave(); } if let Some(stack) = self.get_focussed_stack_mut() { + view.on_enter(); stack.push(view) } } @@ -495,4 +501,10 @@ impl ViewExt for Layout { } } } + + fn on_enter(&mut self) { + if let Some(view) = self.get_current_view_mut() { + view.on_enter() + } + } } diff --git a/src/ui/lyrics.rs b/src/ui/lyrics.rs index bbd93ac58..b3755be32 100644 --- a/src/ui/lyrics.rs +++ b/src/ui/lyrics.rs @@ -2,9 +2,8 @@ use std::sync::Arc; use cursive::{ theme::Effect, - utils::markup::StyledString, view::ViewWrapper, - views::{DummyView, LinearLayout, ScrollView, TextView}, + views::{DummyView, LinearLayout, ResizedView, ScrollView, TextContent, TextView}, }; use crate::{commands::CommandResult, lyrics::LyricsManager, traits::ViewExt, command::Command}; @@ -12,39 +11,76 @@ use crate::{commands::CommandResult, lyrics::LyricsManager, traits::ViewExt, com pub struct LyricsView { manager: Arc, view: LinearLayout, + track_lyrics: TextContent, + track_title: TextContent, + track_authors: TextContent, + track_album: TextContent, } impl LyricsView { pub fn new(manager: Arc) -> LyricsView { - let mut text = StyledString::styled("Keybindings\n\n", Effect::Bold); + // INITIALIZE THESE WITH "TRASHY" VALUE THAT IS GOING TO BE REPLACED AFTER + let track_title = TextContent::new("No track being played"); + let track_authors = TextContent::new("No track being played"); + let track_album = TextContent::new("No track being played"); + let track_lyrics = TextContent::new("No track being played"); - let note = format!( - "Custom bindings can be set in the {} file within the [keybindings] section.\n\n", - "test" - ); + let lyrics_view = + ScrollView::new(TextView::new_with_content(track_lyrics.clone()).center()); - // TODO: fixme - let content = String::from(""); + let view = LinearLayout::vertical() + .child(ResizedView::with_full_width( + ResizedView::with_fixed_height(5, DummyView), + )) + .child( + TextView::new_with_content(track_title.clone()) + .center() + .style(Effect::Bold), + ) + .child(TextView::new_with_content(track_authors.clone()).center()) + .child( + TextView::new_with_content(track_album.clone()) + .center() + .style(Effect::Italic), + ) + .child(DummyView) + .child(lyrics_view); - text.append(StyledString::styled(note, Effect::Italic)); - text.append(content); + let lyrics_view = LyricsView { + manager, + view, + track_lyrics, + track_album, + track_authors, + track_title, + }; - text.append("\n\n"); - text.append(StyledString::styled( - manager.get_lyrics_for_current(), - Effect::Simple, - )); + lyrics_view.update_lyrics(); - let lyrics_view = ScrollView::new(TextView::new(text).center()); + lyrics_view + } - let view = LinearLayout::vertical() - .child(TextView::new("Title").center()) - .child(TextView::new("Authors").center()) - .child(TextView::new("Album").center()) - .child(DummyView) - .child(lyrics_view); + // needs to be made public in order to be updated from main's event loop + pub fn update_lyrics(&self) { + let current_track = self.manager.get_current_track(); - LyricsView { manager, view } + if let Some(track) = current_track { + let track_title_str = track.clone().title; + + let track_authors_str = track.clone().artists.join(", "); + + let track_album_str = match track.clone().album { + None => String::default(), + Some(album_name) => album_name, + }; + + let track_lyrics_str = self.manager.get_lyrics(track); + + self.track_title.set_content(track_title_str); + self.track_authors.set_content(track_authors_str); + self.track_album.set_content(track_album_str); + self.track_lyrics.set_content(track_lyrics_str); + } } /// Saves the lyrics of the current song @@ -70,7 +106,9 @@ impl ViewExt for LyricsView { "".to_string() } - fn on_leave(&self) {} + fn on_enter(&mut self) { + self.update_lyrics(); + } fn on_command( &mut self, @@ -79,6 +117,10 @@ impl ViewExt for LyricsView { ) -> Result { match cmd { Command::Save => self.save_lyrics(), + Command::Next | Command::Previous => { + // still does not work + Ok(CommandResult::Ignored) // return ignored so it is processed by the default command handler + } _ => Ok(CommandResult::Ignored), } }