//! Create choices using radio buttons. use crate::Color; /// A circular button representing a choice. /// /// # Example /// ``` /// use iced_core::Radio; /// /// #[derive(Debug, Clone, Copy, PartialEq, Eq)] /// pub enum Choice { /// A, /// B, /// } /// /// #[derive(Debug, Clone, Copy)] /// pub enum Message { /// RadioSelected(Choice), /// } /// /// let selected_choice = Some(Choice::A); /// /// Radio::new(Choice::A, "This is A", selected_choice, Message::RadioSelected); /// /// Radio::new(Choice::B, "This is B", selected_choice, Message::RadioSelected); /// ``` /// /// ![Radio buttons drawn by Coffee's renderer](https://github.com/hecrj/coffee/blob/bda9818f823dfcb8a7ad0ff4940b4d4b387b5208/images/ui/radio.png?raw=true) pub struct Radio { /// Whether the radio button is selected or not pub is_selected: bool, /// The message to produce when the radio button is clicked pub on_click: Message, /// The label of the radio button pub label: String, /// The color of the label pub label_color: Option, } impl std::fmt::Debug for Radio where Message: std::fmt::Debug, { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("Radio") .field("is_selected", &self.is_selected) .field("on_click", &self.on_click) .field("label", &self.label) .field("label_color", &self.label_color) .finish() } } impl Radio { /// Creates a new [`Radio`] button. /// /// It expects: /// * the value related to the [`Radio`] button /// * the label of the [`Radio`] button /// * the current selected value /// * a function that will be called when the [`Radio`] is selected. It /// receives the value of the radio and must produce a `Message`. /// /// [`Radio`]: struct.Radio.html pub fn new(value: V, label: &str, selected: Option, f: F) -> Self where V: Eq + Copy, F: 'static + Fn(V) -> Message, { Radio { is_selected: Some(value) == selected, on_click: f(value), label: String::from(label), label_color: None, } } /// Sets the `Color` of the label of the [`Radio`]. /// /// [`Radio`]: struct.Radio.html pub fn label_color>(mut self, color: C) -> Self { self.label_color = Some(color.into()); self } }