// Copyright 2022 System76 // SPDX-License-Identifier: MPL-2.0 use crate::{ theme::{self, THEME}, Element, Renderer, }; use iced::widget; /// A button widget with COSMIC styling #[must_use] pub const fn button(style: theme::Button) -> Button { Button { style, message: None, } } /// A button widget with COSMIC styling pub struct Button { style: theme::Button, message: Option, } impl Button { /// The message to emit on button press. #[must_use] pub fn on_press(mut self, message: Message) -> Self { self.message = Some(message); self } /// A button with an icon. pub fn icon( self, style: theme::Svg, icon: &str, size: u16, ) -> widget::Button { self.custom(vec![super::icon(icon, size).style(style).into()]) } /// A button with text. pub fn text(self, text: &str) -> widget::Button { self.custom(vec![text.into()]) } /// A custom button that has the desired default spacing and padding. pub fn custom(self, children: Vec>) -> widget::Button { let theme = THEME.with(|t| t.borrow().clone()); let theme = theme.cosmic(); let button = widget::button(widget::row(children).spacing(8)) .style(self.style) .padding([theme.space_xxs(), theme.space_s()]); if let Some(message) = self.message { button.on_press(message) } else { button } } }