🏡 index : ~doyle/shalom.git

use iced::{
    advanced::graphics::core::Element,
    theme::Text,
    widget::{
        column as icolumn, component, container,
        image::{self, Image},
        row, text, vertical_space, Component,
    },
    Alignment, Background, Renderer, Theme,
};

use crate::theme::colours::SLATE_400;

pub fn track_card(artist: String, song: String, image: Option<image::Handle>) -> TrackCard {
    TrackCard {
        artist,
        song,
        image,
    }
}

pub struct TrackCard {
    artist: String,
    song: String,
    image: Option<image::Handle>,
}

impl<M> Component<M, Renderer> for TrackCard {
    type State = State;
    type Event = Event;

    fn update(&mut self, _state: &mut Self::State, event: Self::Event) -> Option<M> {
        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(64).height(64))
            } else {
                Element::from(container(vertical_space(0)).width(64).height(64).style(
                    |_t: &Theme| container::Appearance {
                        background: Some(Background::Color(SLATE_400)),
                        ..container::Appearance::default()
                    },
                ))
            };

        row![
            image,
            icolumn![
                text(&self.song).size(14),
                text(&self.artist).style(Text::Color(SLATE_400)).size(14)
            ]
        ]
        .align_items(Alignment::Center)
        .spacing(10)
        .into()
    }
}

#[derive(Default)]
pub struct State {}

#[derive(Clone)]
pub enum Event {}

impl<'a, M> From<TrackCard> for Element<'a, M, Renderer>
where
    M: 'a + Clone,
{
    fn from(card: TrackCard) -> Self {
        component(card)
    }
}