diff --git a/src/core/songs.rs b/src/core/songs.rs index 6162613..5cd5994 100644 --- a/src/core/songs.rs +++ b/src/core/songs.rs @@ -55,6 +55,7 @@ pub enum VerseName { Outro { number: usize }, Instrumental { number: usize }, Other { number: usize }, + Blank, } impl VerseName { @@ -106,6 +107,7 @@ impl VerseName { string.push_str(&number.to_string()); string } + Self::Blank => "Blank".to_string(), } } } @@ -862,6 +864,7 @@ impl Song { VerseName::Other { number } => { format!("Other {number}") } + VerseName::Blank => "Blank".into(), }; new_lyrics.push_str(&verse_name); diff --git a/src/ui/song_editor.rs b/src/ui/song_editor.rs index 4d2f76a..4eefec0 100644 --- a/src/ui/song_editor.rs +++ b/src/ui/song_editor.rs @@ -44,7 +44,10 @@ use crate::{ presenter::slide_view, slide_editor::SlideEditor, text_svg, - widgets::verse_editor::{self, VerseEditor}, + widgets::{ + draggable, + verse_editor::{self, VerseEditor}, + }, }, }; @@ -113,6 +116,7 @@ pub enum Message { OpenStrokeColorPicker, ChipHovered(Option), ChipDropped((usize, Vec, String)), + ChipReorder(draggable::DragEvent), } impl SongEditor { @@ -434,6 +438,23 @@ impl SongEditor { } } } + Message::ChipReorder(event) => match event { + draggable::DragEvent::Picked { index } => (), + draggable::DragEvent::Dropped { + index, + target_index, + drop_position, + } => { + if let Some(mut song) = self.song.clone() + && let Some(verses) = song.verses.as_mut() + { + let verse = verses.remove(index); + verses.insert(target_index, verse); + self.update_song(song); + } + } + draggable::DragEvent::Canceled { index } => (), + }, Message::None => (), } Action::None @@ -606,15 +627,18 @@ impl SongEditor { }) .on_press(Message::EditVerseOrder); - let verse_options = - container(scrollable(row(verse_chips)).direction( - Direction::Horizontal( - Scrollbar::new().spacing(space_s), - ), - )) - .padding(space_s) - .width(Length::Fill) - .class(theme::Container::Primary); + let verse_options = container( + scrollable( + draggable::row(verse_chips) + .on_drag(|event| Message::ChipReorder(event)), + ) + .direction(Direction::Horizontal( + Scrollbar::new().spacing(space_s), + )), + ) + .padding(space_s) + .width(Length::Fill) + .class(theme::Container::Primary); let verse_order_items: Vec> = if let Some( song, @@ -1043,6 +1067,7 @@ fn verse_chip(verse: VerseName) -> Element<'static, ()> { todo!() } VerseName::Other { .. } => (other_color, dark_text), + VerseName::Blank => (other_color, dark_text), }; text(name)