deLyrium/src/editor.rs

94 lines
2.2 KiB
Rust

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<dyn FormatReader>, 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<Message> {
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()
}
}