verse editing and slide creation is more streamlined
This commit is contained in:
parent
bb4f402803
commit
c3de2aced4
3 changed files with 39 additions and 45 deletions
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue