use iced::{ advanced::graphics::core::Element, font::{Stretch, Weight}, theme::Text, widget::{ column as icolumn, component, container, image::{self, Image}, text, vertical_space, Component, }, Background, Color, Font, Renderer, Theme, }; use crate::theme::colours::SLATE_200; pub fn track_card( artist: &str, song: &str, image: Option, artist_logo: Option, ) -> TrackCard { TrackCard { artist: artist.to_uppercase(), song: format!("\"{}\"", song.to_uppercase()), image, artist_logo, } } pub struct TrackCard { artist: String, song: String, image: Option, artist_logo: Option, } impl Component for TrackCard { type State = State; type Event = Event; fn update(&mut self, _state: &mut Self::State, event: Self::Event) -> Option { match event {} } fn view(&self, _state: &Self::State) -> Element<'_, Self::Event, Renderer> { let image = if let Some(handle) = self.image.clone() { Element::from(Image::new(handle).width(192).height(192)) } else { Element::from(container(vertical_space(0)).width(192).height(192).style( |_t: &Theme| container::Appearance { background: Some(Background::Color(SLATE_200)), ..container::Appearance::default() }, )) }; let artist = if let Some(handle) = self.artist_logo.clone() { Element::from(Image::new(handle).height(64)) } else { Element::from( text(&self.artist) .size(49) .style(Text::Color(Color::WHITE)) .font(Font { weight: Weight::Bold, stretch: Stretch::Condensed, ..Font::with_name("Helvetica Neue") }), ) }; let song = text(&self.song) .size(24) .style(Text::Color(Color::WHITE)) .font(Font { weight: Weight::Medium, ..Font::with_name("Helvetica Neue") }); icolumn![icolumn![image, artist,].spacing(5), song,].into() } } #[derive(Default)] pub struct State {} #[derive(Clone)] pub enum Event {} impl<'a, M> From for Element<'a, M, Renderer> where M: 'a + Clone, { fn from(card: TrackCard) -> Self { component(card) } }