verse editing and slide creation is more streamlined

This commit is contained in:
Chris Cochrun 2026-02-06 07:05:20 -06:00
parent bb4f402803
commit c3de2aced4
3 changed files with 39 additions and 45 deletions

View file

@ -264,32 +264,18 @@ impl ServiceTrait for Song {
fn to_slides(&self) -> Result<Vec<Slide>> {
// let lyrics = self.get_lyrics()?;
let lyrics: Vec<String> = 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<String> = multi_lyric
.map(|lyric| lyric.trim().to_string())
.collect();
lyric
})
})
.flatten()
.collect()
} else {
vec![]
};
let lyrics: Vec<String> = 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<Slide> = 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();

View file

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

View file

@ -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,
)));
}
}