use crate::controls::ControlsEvent; use crate::controls::Controls; use crate::lyrics::Lyric; use crate::lyrics::Lyrics; use crate::app::Message; use iced::Element; use crate::styles::Theme; use std::sync::Arc; use iced::Container; use iced::Row; use crate::palette::Palette; use crate::load_song::extract_cover; use crate::peripheries::Periphery; use iced::Length; use iced::Align; use symphonia::core::formats::FormatReader; use image::GenericImageView; pub struct Editor { lyrics: Lyrics, theme: Theme, controls: Controls, left_peri: Periphery, rite_peri: Periphery, } impl Editor { pub fn new(mut song: Box, size: (u32, u32)) -> Self { let cover = extract_cover(song.as_mut()); let theme = cover.as_ref() .map(|cover| { Theme::from_palette( Palette::generate(&cover) ) }).unwrap_or_else(|| Theme::default()); let cover = cover.expect("TODO"); let cover = Arc::new(cover.blur((cover.width() / 50) as f32)); let left_peri = Periphery::new(cover.clone(), true, size); let rite_peri = Periphery::new(cover, false, size); let controls = Controls::new(song); Self { lyrics: Lyrics::new(), controls, theme, left_peri, rite_peri, } } // TODO: work on untangling this mess pub fn handle_controls_event(&mut self, event: ControlsEvent) { self.controls.handle_event(event) } pub fn insert_text(&mut self, text: String) { self.lyrics.insert_text(text); } pub fn update_line(&mut self, new_content: String, line_no: usize) { self.lyrics.update_line(new_content, line_no); } pub fn advance_line(&mut self, current_line: usize) { self.lyrics.advance_line(current_line); } pub fn current_line_mut(&mut self) -> (usize, &mut Lyric) { self.lyrics.current_line_mut() } pub fn is_animating(&self) -> bool { self.controls.is_playing() } pub fn notify_resized(&mut self, w: u32, h: u32) { self.left_peri.notify_resized(w, h); self.rite_peri.notify_resized(w, h); } pub fn view(&mut self) -> Element { Container::new( Row::new() .push(self.left_peri.view()) .push(self.controls.view_progress(self.theme)) .push(self.lyrics.view(self.theme)) .push(self.rite_peri.view()) ) .align_y(Align::Center) .style(self.theme) .height(Length::Fill) .into() } }