From 6d8a24ea3862cf3a96d86f43a321760d40e414ff Mon Sep 17 00:00:00 2001 From: Chris Cochrun Date: Thu, 5 Feb 2026 15:25:33 -0600 Subject: [PATCH] updating verse_editor to be able to make verse changes betterrererer --- src/core/songs.rs | 22 ++++++++++++++++++++++ src/ui/song_editor.rs | 31 ++++++++++++++++++++++++++----- src/ui/widgets/verse_editor.rs | 5 ++++- 3 files changed, 52 insertions(+), 6 deletions(-) diff --git a/src/core/songs.rs b/src/core/songs.rs index d04d242..14945f3 100644 --- a/src/core/songs.rs +++ b/src/core/songs.rs @@ -981,6 +981,19 @@ impl Song { } } + pub fn update_verse_name( + &mut self, + verse: VerseName, + old_verse: &VerseName, + ) { + if let Some(verse_map) = self.verse_map.as_mut() + && let Some(lyric) = verse_map.remove(old_verse) + { + verse_map.insert(verse, lyric); + } + todo!("need to finish update the versename in the vec") + } + // TODO update_verse needs to also change the lyrics for the song such that // the song can be sent to the db and it's lyrics will actually change. Or we // could have the update_song_in_db function recreate the lyrics from the new @@ -1159,6 +1172,15 @@ impl Song { VerseName::from_string(verse_name) } } + + pub(crate) fn delete_verse(&mut self, verse: VerseName) { + if let Some(verses) = self.verses.as_mut() { + verses.retain(|inner| inner != &verse); + } + if let Some(map) = self.verse_map.as_mut() { + let _ = map.remove(&verse); + } + } } #[cfg(test)] diff --git a/src/ui/song_editor.rs b/src/ui/song_editor.rs index d3a6168..9772e66 100644 --- a/src/ui/song_editor.rs +++ b/src/ui/song_editor.rs @@ -446,30 +446,40 @@ impl SongEditor { ) => { if let Some(mut song) = self.song.clone() { + let old_verse_name = verse.verse_name.clone(); let verse_name = song .verse_name_from_str( verse_name, - verse.verse_name.clone(), + old_verse_name, ); let lyric = verse.lyric.clone(); - song.update_verse( + song.update_verse_name( index, verse_name, lyric, ); return self.update_song(song); } } - verse_editor::Action::UpdateVerse(verse) => { + verse_editor::Action::UpdateVerse(( + verse, + lyric, + )) => { if let Some(mut song) = self.song.clone() { - let (verse, lyric) = verse; song.update_verse( index, verse, lyric, ); return self.update_song(song); } } + verse_editor::Action::DeleteVerse(verse) => { + if let Some(mut song) = self.song.clone() + { + song.delete_verse(verse); + return self.update_song(song); + }; + } verse_editor::Action::None => (), } } @@ -679,6 +689,9 @@ impl SongEditor { .on_input(Message::ChangeAuthor) .label("Song Author"); + let top_input_row = + row![title_input, author_input].spacing(space_m); + // let verse_input = text_input( // "Verse // order", @@ -962,7 +975,7 @@ impl SongEditor { .padding(space_s) .class(theme::Container::Card); - column![title_input, author_input, verse_order, verse_toolbar] + column![top_input_row, verse_order, verse_toolbar] .spacing(space_m) .width(Length::FillPortion(2)) .into() @@ -1193,6 +1206,14 @@ impl SongEditor { // I think this implementation is faster + self.verses = song.verse_map.as_ref().map(|map| { + map.into_iter() + .sorted() + .map(|(verse_name, lyric)| { + VerseEditor::new(*verse_name, lyric.to_string()) + }) + .collect() + }); let mut tasks = Vec::with_capacity(2); if let Ok(slides) = song.to_slides() { if let Some(handle) = &self.update_slide_handle { diff --git a/src/ui/widgets/verse_editor.rs b/src/ui/widgets/verse_editor.rs index 25eff45..789dfab 100644 --- a/src/ui/widgets/verse_editor.rs +++ b/src/ui/widgets/verse_editor.rs @@ -26,6 +26,7 @@ pub enum Message { UpdateLyric(text_editor::Action), UpdateVerseName(String), EditVerseName, + DeleteVerse(VerseName), None, } @@ -33,6 +34,7 @@ pub enum Action { Task(Task), UpdateVerse((VerseName, String)), UpdateVerseName(String), + DeleteVerse(VerseName), None, } @@ -65,6 +67,7 @@ impl VerseEditor { self.editing_verse_name = !self.editing_verse_name; Action::None } + Message::DeleteVerse(verse) => Action::DeleteVerse(verse), Message::None => Action::None, } } @@ -80,7 +83,7 @@ impl VerseEditor { let delete_button = button::text("Delete") .trailing_icon(icon::from_name("view-close")) .class(theme::Button::Destructive) - .on_press(Message::None); + .on_press(Message::DeleteVerse(self.verse_name)); let combo = combo_box( &self.verse_name_combo, "Verse 1",