From c3de2aced43e5e4eb55f2ddb6c772300cf5d2c61 Mon Sep 17 00:00:00 2001 From: Chris Cochrun Date: Fri, 6 Feb 2026 07:05:20 -0600 Subject: [PATCH] verse editing and slide creation is more streamlined --- src/core/songs.rs | 34 ++++++++++----------------------- src/ui/song_editor.rs | 35 ++++++++++++++++------------------ src/ui/widgets/verse_editor.rs | 15 +++++++++++++-- 3 files changed, 39 insertions(+), 45 deletions(-) diff --git a/src/core/songs.rs b/src/core/songs.rs index dd5909b..58861fd 100644 --- a/src/core/songs.rs +++ b/src/core/songs.rs @@ -264,32 +264,18 @@ impl ServiceTrait for Song { fn to_slides(&self) -> Result> { // let lyrics = self.get_lyrics()?; - let lyrics: Vec = if let Some(verses) = - self.verses.as_ref() - && let Some(map) = self.verse_map.as_ref() - { - verses - .iter() - .filter_map(|verse| { - map.get(verse).map(|lyric| { - let lyric = - lyric.to_owned().trim().to_string(); - let multi_lyric = lyric.split("\n\n"); - let lyric: Vec = multi_lyric - .map(|lyric| lyric.trim().to_string()) - .collect(); - lyric - }) - }) - .flatten() - .collect() - } else { - vec![] - }; + let lyrics: Vec = self + .verses + .as_ref() + .ok_or(miette!("There are no verses assigned yet."))? + .iter() + .filter_map(|verse| self.get_lyric(verse)) + .collect(); + debug!(?lyrics); let slides: Vec = lyrics .iter() - .map(|l| { + .filter_map(|l| { SlideBuilder::new() .background( self.background.clone().unwrap_or_default(), @@ -305,7 +291,7 @@ impl ServiceTrait for Song { .video_end_time(0.0) .text(l) .build() - .unwrap_or_default() + .ok() }) .collect(); diff --git a/src/ui/song_editor.rs b/src/ui/song_editor.rs index 6b6da86..3f3979d 100644 --- a/src/ui/song_editor.rs +++ b/src/ui/song_editor.rs @@ -454,6 +454,8 @@ impl SongEditor { old_verse_name, ); + verse.verse_name = verse_name; + song.update_verse_name( verse_name, &old_verse_name, @@ -468,9 +470,10 @@ impl SongEditor { )) => { if let Some(mut song) = self.song.clone() { - song.update_verse( - index, verse, lyric, - ); + song.set_lyrics(&verse, lyric); + // song.update_verse( + // index, verse, lyric, + // ); return self.update_song(song); } } @@ -1144,13 +1147,16 @@ impl SongEditor { stroke_color_button.popup(stroke_color_picker); } - let background_selector = button::icon( - icon::from_name("folder-pictures-symbolic").scale(2), - ) - .label("Background") - .tooltip("Select an image or video background") - .on_press(Message::PickBackground) - .padding(space_s); + let background_selector = tooltip( + button::icon( + icon::from_name("folder-pictures-symbolic").scale(2), + ) + .label("Background") + .on_press(Message::PickBackground) + .padding(space_s), + "Select an image or video background", + tooltip::Position::Bottom, + ); // let stroke_size_selector = tooltip( // stroke_popup, @@ -1211,15 +1217,6 @@ 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 8633e96..29016dd 100644 --- a/src/ui/widgets/verse_editor.rs +++ b/src/ui/widgets/verse_editor.rs @@ -1,7 +1,7 @@ use cosmic::{ Element, Task, cosmic_theme::palette::WithAlpha, - iced::{Background, Border, Color}, + iced::{Background, Border, Color, Point}, iced_widget::{column, row}, theme, widget::{ @@ -86,7 +86,9 @@ impl VerseEditor { } = theme::spacing(); let delete_button = button::text("Delete") - .trailing_icon(icon::from_name("view-close")) + .trailing_icon( + icon::from_name("view-close").symbolic(true), + ) .class(theme::Button::Destructive) .on_press(Message::DeleteVerse(self.verse_name)); let combo = combo_box( @@ -163,4 +165,13 @@ impl VerseEditor { .class(theme::Container::Card) .into() } + + // TODO not done yet. This doesn't work, need to find a way to either reset the + // cursor position or not make new widgets + pub fn set_cursor_position(&mut self, position: (usize, usize)) { + self.content.perform(text_editor::Action::Click(Point::new( + position.0 as f32, + position.1 as f32, + ))); + } }