use crate::app::Message; use crate::app::Element; use iced::widget::text_input::{self, TextInput}; use iced::widget::scrollable::{self, Scrollable}; #[derive(Clone, Debug)] pub struct Lyrics { lines: Vec, scroll_state: scrollable::State, } impl Lyrics { pub fn new() -> Self { Lyrics { lines: vec![Lyric::new()], scroll_state: scrollable::State::new() } } pub fn update_line(&mut self, new_content: String, line_no: usize) { self.lines[line_no].set_content(new_content); } pub fn view(&mut self) -> Element { self.lines.iter_mut() .enumerate() .map(|(i, l)| l.view(i)) .fold(Scrollable::new(&mut self.scroll_state), |s, l| s.push(l)) .into() } } #[derive(Clone, Debug)] pub struct Lyric { state: text_input::State, value: String, } impl Lyric { pub fn new() -> Self { Lyric { state: text_input::State::new(), value: String::with_capacity(70), } } pub fn view(&mut self, line_no: usize) -> Element { TextInput::new( &mut self.state, "", &self.value, move|new_value| Message::LyricChanged { line_no, new_value }, ) .into() } pub fn set_content(&mut self, content: String) { self.value = content; } }