diff --git a/src/core/songs.rs b/src/core/songs.rs index 9570270..dff3888 100644 --- a/src/core/songs.rs +++ b/src/core/songs.rs @@ -805,9 +805,28 @@ impl Song { verse: &VerseName, lyrics: T, ) { + let lyric_copy = lyrics.into(); if let Some(verse_map) = self.verse_map.as_mut() { - verse_map.entry(*verse).or_insert(lyrics.into()); + debug!(?verse_map, "should update"); + verse_map + .entry(*verse) + .and_modify(|old_lyrics| { + *old_lyrics = lyric_copy.clone() + }) + .or_insert(lyric_copy); + debug!(?verse_map, "should be updated"); + } else { + debug!(?self.verse_map, "should create"); + let mut verse_map = HashMap::new(); + verse_map + .entry(*verse) + .and_modify(|old_lyrics| { + *old_lyrics = lyric_copy.clone() + }) + .or_insert(lyric_copy); + self.verse_map = Some(verse_map); } + debug!(?self.verse_map); } pub fn get_lyrics(&self) -> Result> { @@ -908,10 +927,12 @@ impl Song { verse: VerseName, lyric: String, ) { + debug!(index, ?verse, lyric); self.set_lyrics(&verse, lyric); if let Some(verses) = self.verses.as_mut() && let Some(old_verse) = verses.get_mut(index) { + debug!(?old_verse, ?verse); *old_verse = verse; } diff --git a/src/ui/song_editor.rs b/src/ui/song_editor.rs index d826333..cc1121f 100644 --- a/src/ui/song_editor.rs +++ b/src/ui/song_editor.rs @@ -463,7 +463,15 @@ impl SongEditor { self.editing_verse_order = !self.editing_verse_order; } Message::AddVerse((verse, lyric)) => { - todo!() + let verse_editor = + VerseEditor::new(verse.clone(), lyric.clone()); + if let Some(verses) = self.verses.as_mut() { + verses.push(verse_editor); + } + if let Some(mut song) = self.song.clone() { + song.add_verse(verse, lyric); + return self.update_song(song); + } } Message::RemoveVerse(index) => { if let Some(mut song) = self.song.clone() { @@ -899,7 +907,7 @@ impl SongEditor { }) }, )) - .spacing(space_l), + .spacing(space_m), ) } else { Element::from(horizontal_space()) @@ -912,15 +920,31 @@ impl SongEditor { .height(Length::Fill) .direction(Direction::Vertical(Scrollbar::new())); - column![ - title_input, - author_input, - verse_order, - verse_scroller + let verse_add_message = self.song.as_ref().map_or_else( + || Message::None, + |song| { + Message::AddVerse(( + song.get_next_verse_name(), + "".to_string(), + )) + }, + ); + let verse_toolbar = column![ + row![ + text::heading("Verses").width(Length::Fill), + button::icon(icon::from_name("add")) + .on_press(verse_add_message) + ], + verse_scroller.height(Length::Fill) ] - .spacing(space_m) - .width(Length::FillPortion(2)) - .into() + .apply(container) + .padding(space_s) + .class(theme::Container::Card); + + column![title_input, author_input, verse_order, verse_toolbar] + .spacing(space_m) + .width(Length::FillPortion(2)) + .into() } fn toolbar(&self) -> Element {