//! Create choices using radio buttons. use crate::{Backend, Primitive, Renderer}; use iced_native::mouse; use iced_native::radio; use iced_native::{Background, Color, Rectangle}; pub use iced_style::radio::{Style, StyleSheet}; /// A circular button representing a choice. /// /// This is an alias of an `iced_native` radio button with an /// `iced_wgpu::Renderer`. pub type Radio = iced_native::Radio>; const SIZE: f32 = 28.0; const DOT_SIZE: f32 = SIZE / 2.0; impl radio::Renderer for Renderer where B: Backend, { type Style = Box; const DEFAULT_SIZE: u16 = SIZE as u16; const DEFAULT_SPACING: u16 = 15; fn draw( &mut self, bounds: Rectangle, is_selected: bool, is_mouse_over: bool, (label, _): Self::Output, style_sheet: &Self::Style, ) -> Self::Output { let style = if is_mouse_over { style_sheet.hovered() } else { style_sheet.active() }; let radio = Primitive::Quad { bounds, background: style.background, border_radius: (SIZE / 2.0) as u16, border_width: style.border_width, border_color: style.border_color, }; ( Primitive::Group { primitives: if is_selected { let radio_circle = Primitive::Quad { bounds: Rectangle { x: bounds.x + DOT_SIZE / 2.0, y: bounds.y + DOT_SIZE / 2.0, width: bounds.width - DOT_SIZE, height: bounds.height - DOT_SIZE, }, background: Background::Color(style.dot_color), border_radius: (DOT_SIZE / 2.0) as u16, border_width: 0, border_color: Color::TRANSPARENT, }; vec![radio, radio_circle, label] } else { vec![radio, label] }, }, if is_mouse_over { mouse::Interaction::Pointer } else { mouse::Interaction::default() }, ) } }