diff options
| author | 2019-09-24 15:39:33 +0200 | |
|---|---|---|
| committer | 2019-09-24 15:39:33 +0200 | |
| commit | 68c4752e998dca1d618380ce4e7d8ac52b710056 (patch) | |
| tree | 35e386030b072c189509bb2ed3adeaec5b0fd4d1 /native/src/widget/radio.rs | |
| parent | bb5cac49d028eb53c259ae58e3a007ebfb736fd4 (diff) | |
| parent | 05c7c39ecb8910c75b82dc4052a7720fb2d42b4a (diff) | |
| download | iced-68c4752e998dca1d618380ce4e7d8ac52b710056.tar.gz iced-68c4752e998dca1d618380ce4e7d8ac52b710056.tar.bz2 iced-68c4752e998dca1d618380ce4e7d8ac52b710056.zip  | |
Merge pull request #17 from hecrj/web
Basic web support (core, native, and web crates)
Diffstat (limited to 'native/src/widget/radio.rs')
| -rw-r--r-- | native/src/widget/radio.rs | 92 | 
1 files changed, 92 insertions, 0 deletions
diff --git a/native/src/widget/radio.rs b/native/src/widget/radio.rs new file mode 100644 index 00000000..33d42e61 --- /dev/null +++ b/native/src/widget/radio.rs @@ -0,0 +1,92 @@ +//! Create choices using radio buttons. +use crate::input::{mouse, ButtonState}; +use crate::{Element, Event, Hasher, Layout, MouseCursor, Node, Point, Widget}; + +use std::hash::Hash; + +pub use iced_core::Radio; + +impl<Message, Renderer> Widget<Message, Renderer> for Radio<Message> +where +    Renderer: self::Renderer, +    Message: Copy + std::fmt::Debug, +{ +    fn node(&self, renderer: &mut Renderer) -> Node { +        renderer.node(&self) +    } + +    fn on_event( +        &mut self, +        event: Event, +        layout: Layout<'_>, +        cursor_position: Point, +        messages: &mut Vec<Message>, +    ) { +        match event { +            Event::Mouse(mouse::Event::Input { +                button: mouse::Button::Left, +                state: ButtonState::Pressed, +            }) => { +                if layout.bounds().contains(cursor_position) { +                    messages.push(self.on_click); +                } +            } +            _ => {} +        } +    } + +    fn draw( +        &self, +        renderer: &mut Renderer, +        layout: Layout<'_>, +        cursor_position: Point, +    ) -> MouseCursor { +        renderer.draw(&self, layout, cursor_position) +    } + +    fn hash_layout(&self, state: &mut Hasher) { +        self.label.hash(state); +    } +} + +/// The renderer of a [`Radio`] button. +/// +/// Your [renderer] will need to implement this trait before being +/// able to use a [`Radio`] button in your user interface. +/// +/// [`Radio`]: struct.Radio.html +/// [renderer]: ../../renderer/index.html +pub trait Renderer { +    /// Creates a [`Node`] for the provided [`Radio`]. +    /// +    /// [`Node`]: ../../struct.Node.html +    /// [`Radio`]: struct.Radio.html +    fn node<Message>(&mut self, radio: &Radio<Message>) -> Node; + +    /// Draws a [`Radio`] button. +    /// +    /// It receives: +    ///   * the current cursor position +    ///   * the bounds of the [`Radio`] +    ///   * the bounds of the label of the [`Radio`] +    ///   * whether the [`Radio`] is selected or not +    /// +    /// [`Radio`]: struct.Radio.html +    fn draw<Message>( +        &mut self, +        radio: &Radio<Message>, +        layout: Layout<'_>, +        cursor_position: Point, +    ) -> MouseCursor; +} + +impl<'a, Message, Renderer> From<Radio<Message>> +    for Element<'a, Message, Renderer> +where +    Renderer: self::Renderer, +    Message: 'static + Copy + std::fmt::Debug, +{ +    fn from(checkbox: Radio<Message>) -> Element<'a, Message, Renderer> { +        Element::new(checkbox) +    } +}  | 
