use iced::{Element, widget::{button, text}};
use snora_design::Tokens;
use super::style;
fn make_button<'a, Message: Clone + 'a>(
tokens: &Tokens,
label: impl Into<String>,
on_press: Option<Message>,
style_fn: fn(&Tokens, button::Status) -> button::Style,
) -> Element<'a, Message> {
let t = tokens.clone();
button(text(label.into()).size(super::style::text::label_size(tokens)))
.on_press_maybe(on_press)
.style(move |_theme, status| style_fn(&t, status))
.into()
}
#[must_use]
pub fn primary<'a, Message: Clone + 'a>(
tokens: &Tokens,
label: impl Into<String>,
on_press: Message,
) -> Element<'a, Message> {
make_button(tokens, label, Some(on_press), style::button::primary)
}
#[must_use]
pub fn primary_maybe<'a, Message: Clone + 'a>(
tokens: &Tokens,
label: impl Into<String>,
on_press: Option<Message>,
) -> Element<'a, Message> {
make_button(tokens, label, on_press, style::button::primary)
}
#[must_use]
pub fn secondary<'a, Message: Clone + 'a>(
tokens: &Tokens,
label: impl Into<String>,
on_press: Message,
) -> Element<'a, Message> {
make_button(tokens, label, Some(on_press), style::button::secondary)
}
#[must_use]
pub fn secondary_maybe<'a, Message: Clone + 'a>(
tokens: &Tokens,
label: impl Into<String>,
on_press: Option<Message>,
) -> Element<'a, Message> {
make_button(tokens, label, on_press, style::button::secondary)
}
#[must_use]
pub fn ghost<'a, Message: Clone + 'a>(
tokens: &Tokens,
label: impl Into<String>,
on_press: Message,
) -> Element<'a, Message> {
make_button(tokens, label, Some(on_press), style::button::ghost)
}
#[must_use]
pub fn ghost_maybe<'a, Message: Clone + 'a>(
tokens: &Tokens,
label: impl Into<String>,
on_press: Option<Message>,
) -> Element<'a, Message> {
make_button(tokens, label, on_press, style::button::ghost)
}
#[must_use]
pub fn danger<'a, Message: Clone + 'a>(
tokens: &Tokens,
label: impl Into<String>,
on_press: Message,
) -> Element<'a, Message> {
make_button(tokens, label, Some(on_press), style::button::danger)
}
#[must_use]
pub fn danger_maybe<'a, Message: Clone + 'a>(
tokens: &Tokens,
label: impl Into<String>,
on_press: Option<Message>,
) -> Element<'a, Message> {
make_button(tokens, label, on_press, style::button::danger)
}