use iced::{widget::Button, Element, Theme}; use crate::style::*; pub fn button<'a, Content, Message>( content: &'a Content, message: Message, focus: bool, ) -> Button<'a, Message> where Element<'a, Message>: From<&'a Content>, { iced::widget::button(content) .on_press(message) .style(move |theme, status| match (status, focus) { (iced::widget::button::Status::Hovered, _) => hovered_button_style(theme), (iced::widget::button::Status::Pressed, _) | (_, true) => focused_button_style(theme), (iced::widget::button::Status::Active, false) => base_button_style(theme), (iced::widget::button::Status::Disabled, false) => todo!(), }) .width(iced::Length::Fill) } fn hovered_button_style(theme: &Theme) -> iced::widget::button::Style { iced::widget::button::Style { background: Some(iced::Background::Color( theme.extended_palette().background.weak.color, )), text_color: theme.extended_palette().primary.base.text, ..base_button_style(theme) } } fn focused_button_style(theme: &Theme) -> iced::widget::button::Style { iced::widget::button::Style { background: Some(iced::Background::Color( theme.extended_palette().primary.base.text, )), text_color: theme.extended_palette().primary.base.color, ..base_button_style(theme) } } fn base_button_style(theme: &Theme) -> iced::widget::button::Style { iced::widget::button::Style { background: Some(iced::Background::Color( theme.extended_palette().primary.base.color, )), border: iced::Border { color: theme.extended_palette().primary.base.text, ..Default::default() }, text_color: theme.extended_palette().primary.base.text, ..Default::default() } } pub fn panel_button<'a, Content: Into>, Message>( content: Content, on_press: Message, ) -> Button<'a, Message> { iced::widget::button(content) .on_press(on_press) .style(|theme: &iced::Theme, _status| iced::widget::button::Style { background: None, border: iced::Border { color: theme.extended_palette().primary.base.text, radius: iced::border::Radius::new(0), width: 2.0, }, ..Default::default() }) .width(iced::Length::Fill) .padding(iced::Padding::new(SPACING_MD.into())) }