summaryrefslogtreecommitdiffstats
path: root/web/src/widget/radio.rs
diff options
context:
space:
mode:
Diffstat (limited to 'web/src/widget/radio.rs')
-rw-r--r--web/src/widget/radio.rs67
1 files changed, 65 insertions, 2 deletions
diff --git a/web/src/widget/radio.rs b/web/src/widget/radio.rs
index d249ad26..a0b8fc43 100644
--- a/web/src/widget/radio.rs
+++ b/web/src/widget/radio.rs
@@ -1,8 +1,71 @@
-use crate::{Bus, Element, Widget};
+use crate::{Bus, Color, Element, Widget};
use dodrio::bumpalo;
-pub use iced_core::Radio;
+/// A circular button representing a choice.
+///
+/// # Example
+/// ```
+/// # use iced_web::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<Message> {
+ is_selected: bool,
+ on_click: Message,
+ label: String,
+ label_color: Option<Color>,
+}
+
+impl<Message> Radio<Message> {
+ /// 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<F, V>(value: V, label: &str, selected: Option<V>, 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<C: Into<Color>>(mut self, color: C) -> Self {
+ self.label_color = Some(color.into());
+ self
+ }
+}
impl<Message> Widget<Message> for Radio<Message>
where