updating verse_editor to be able to make verse changes betterrererer
Some checks are pending
/ test (push) Waiting to run

This commit is contained in:
Chris Cochrun 2026-02-05 15:25:33 -06:00
parent 2d2a0d3673
commit 6d8a24ea38
3 changed files with 52 additions and 6 deletions

View file

@ -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)]

View file

@ -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 {

View file

@ -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<Message>),
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",