chips working
Some checks failed
/ test (push) Has been cancelled

This commit is contained in:
Chris Cochrun 2026-01-16 16:59:01 -06:00
parent 6bd6e48574
commit 83164ce7f6
2 changed files with 93 additions and 69 deletions

View file

@ -218,6 +218,14 @@ impl FromRow<'_, SqliteRow> for Song {
.into(),
});
};
let verse_order: String = {
let str: &str = row.try_get(0)?;
str.split(' ')
.map(std::string::ToString::to_string)
.collect()
};
Ok(Self {
id: row.try_get(12)?,
title: row.try_get(5)?,

View file

@ -18,8 +18,9 @@ use cosmic::{
theme,
widget::{
RcElementWrapper, button, color_picker, combo_box, container,
dnd_source, dropdown, horizontal_space, icon, progress_bar,
scrollable, text, text_editor, text_input, tooltip,
dnd_destination, dnd_source, dropdown, horizontal_space,
icon, progress_bar, scrollable, text, text_editor,
text_input, tooltip,
},
};
use dirs::font_dir;
@ -479,20 +480,18 @@ order",
let verse_chips: Vec<Element<Message>> = if let Some(song) =
&self.song
{
if let Some(verses) = &song.verses {
verses
.iter()
if let Some(verse_map) = &song.verse_map {
verse_map
.keys()
.map(|verse| {
let verse = verse.clone();
let chip = verse_chip(verse.clone())
.map(|_| Message::None);
let chip =
verse_chip(verse).map(|_| Message::None);
let verse_chip_wrapped =
RcElementWrapper::<Message>::new(chip);
Element::from(
dnd_source::<Message, Box<VerseName>>(
RcElementWrapper::clone(
&verse_chip_wrapped,
),
verse_chip_wrapped.clone(),
)
.on_start(Some(Message::None))
.on_finish(Some(Message::None))
@ -509,9 +508,13 @@ order",
&verse_chip_wrapped
);
(
verse_chip(verse),
Element::from(
verse_chip_wrapped
.clone(),
)
.map(|_| ()),
state,
Vector::ZERO,
Vector::new(-5.0, -15.0),
)
},
),
@ -528,7 +531,70 @@ order",
let verse_options =
container(row(verse_chips).spacing(space_s))
.padding(space_m)
.class(theme::Container::Card);
.width(Length::Fill)
.class(theme::Container::Primary);
let verse_order_items: Vec<Element<Message>> =
if let Some(song) = &self.song {
if let Some(verses) = &song.verses {
verses
.iter()
.map(|verse| {
let verse = verse.clone();
let chip = verse_chip(verse)
.map(|_| Message::None);
let verse_chip_wrapped =
RcElementWrapper::<Message>::new(
chip,
);
Element::from(
dnd_destination(
verse_chip_wrapped.clone(),
vec!["application/verse".into()],
)
.on_enter(|x, y, mimes| {
debug!(x, y, ?mimes);
Message::None
})
.on_finish(
|mime, data, action, x, y| {
debug!(mime, ?data, ?action);
Message::None
},
),
)
})
.collect()
} else {
vec![]
}
} else {
vec![]
};
let verse_order =
container(row(verse_order_items).spacing(space_s))
.padding(space_m)
.width(Length::Fill)
.class(theme::Container::Primary);
let verse_order = container(
column![verse_order, verse_options].spacing(space_m),
)
.padding(space_s)
.class(theme::Container::Card);
let verse_order_text: Element<Message> =
if let Some(song) = &self.song {
if let Some(vo) = &song.verse_order {
text(vo.clone().into_iter().collect::<String>())
.into()
} else {
text("").into()
}
} else {
text("").into()
};
let lyric_title = text::heading("Lyrics");
let lyric_input = column![
@ -567,7 +633,8 @@ order",
title_input,
author_input,
verse_input,
verse_options,
verse_order_text,
verse_order,
verse_scroller
]
.spacing(25)
@ -637,59 +704,6 @@ order",
.spacing(3)
.align_y(Vertical::Center);
// let stroke_sizes = container(column![
// "1".apply(button::standard)
// .class(theme::Button::Icon)
// .on_press(Message::None)
// .width(35),
// "2".apply(button::standard)
// .class(theme::Button::Icon)
// .on_press(Message::None)
// .width(35),
// "3".apply(button::standard)
// .class(theme::Button::Icon)
// .on_press(Message::None)
// .width(35),
// "4".apply(button::standard)
// .class(theme::Button::Icon)
// .on_press(Message::None)
// .width(35),
// "5".apply(button::standard)
// .class(theme::Button::Icon)
// .on_press(Message::None)
// .width(35),
// "6".apply(button::standard)
// .class(theme::Button::Icon)
// .on_press(Message::None)
// .width(35),
// "7".apply(button::standard)
// .class(theme::Button::Icon)
// .on_press(Message::None)
// .width(35),
// "8".apply(button::standard)
// .class(theme::Button::Icon)
// .on_press(Message::None)
// .width(35),
// "9".apply(button::standard)
// .class(theme::Button::Icon)
// .on_press(Message::None)
// .width(35),
// "10".apply(button::standard)
// .class(theme::Button::Icon)
// .on_press(Message::None)
// .width(35),
// ])
// .padding(theme::spacing().space_xs)
// .class(theme::Container::Dropdown);
// let mut stroke_popup = popover(stroke_size_button)
// .modal(self.stroke_open)
// .position(popover::Position::Bottom)
// .on_close(Message::CloseStroke);
// if self.stroke_open {
// stroke_popup = stroke_popup.popup(stroke_sizes);
// };
let stroke_size_selector = tooltip(
stroke_size_row,
"Outline of the text",
@ -794,7 +808,7 @@ order",
fn verse_chip(verse: VerseName) -> Element<'static, ()> {
let cosmic::cosmic_theme::Spacing {
space_xs, space_m, ..
space_s, space_m, ..
} = theme::spacing();
let (
@ -836,7 +850,9 @@ fn verse_chip(verse: VerseName) -> Element<'static, ()> {
text(name)
.apply(container)
.padding(space_xs)
.padding(
Padding::new(space_s.into()).right(space_m).left(space_m),
)
.class(theme::Container::Custom(Box::new(move |t| {
container::Style::default()
.background(ContainerBackground::Color(