Implement theme styling for Radio
This commit is contained in:
parent
d988d813d7
commit
28d09bfff1
10 changed files with 86 additions and 157 deletions
|
|
@ -12,14 +12,14 @@ use crate::{
|
|||
Shell, Widget,
|
||||
};
|
||||
|
||||
pub use iced_style::radio::{Style, StyleSheet};
|
||||
pub use iced_style::radio::{Appearance, StyleSheet};
|
||||
|
||||
/// A circular button representing a choice.
|
||||
///
|
||||
/// # Example
|
||||
/// ```
|
||||
/// # type Radio<'a, Message> =
|
||||
/// # iced_native::widget::Radio<'a, Message, iced_native::renderer::Null>;
|
||||
/// # type Radio<Message> =
|
||||
/// # iced_native::widget::Radio<Message, iced_native::renderer::Null>;
|
||||
/// #
|
||||
/// #[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
/// pub enum Choice {
|
||||
|
|
@ -41,7 +41,11 @@ pub use iced_style::radio::{Style, StyleSheet};
|
|||
///
|
||||
/// 
|
||||
#[allow(missing_debug_implementations)]
|
||||
pub struct Radio<'a, Message, Renderer: text::Renderer> {
|
||||
pub struct Radio<Message, Renderer>
|
||||
where
|
||||
Renderer: text::Renderer,
|
||||
Renderer::Theme: StyleSheet,
|
||||
{
|
||||
is_selected: bool,
|
||||
on_click: Message,
|
||||
label: String,
|
||||
|
|
@ -50,12 +54,14 @@ pub struct Radio<'a, Message, Renderer: text::Renderer> {
|
|||
spacing: u16,
|
||||
text_size: Option<u16>,
|
||||
font: Renderer::Font,
|
||||
style_sheet: Box<dyn StyleSheet + 'a>,
|
||||
style: <Renderer::Theme as StyleSheet>::Style,
|
||||
}
|
||||
|
||||
impl<'a, Message, Renderer: text::Renderer> Radio<'a, Message, Renderer>
|
||||
impl<Message, Renderer> Radio<Message, Renderer>
|
||||
where
|
||||
Message: Clone,
|
||||
Renderer: text::Renderer,
|
||||
Renderer::Theme: StyleSheet,
|
||||
{
|
||||
/// The default size of a [`Radio`] button.
|
||||
pub const DEFAULT_SIZE: u16 = 28;
|
||||
|
|
@ -90,7 +96,7 @@ where
|
|||
spacing: Self::DEFAULT_SPACING, //15
|
||||
text_size: None,
|
||||
font: Default::default(),
|
||||
style_sheet: Default::default(),
|
||||
style: Default::default(),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -127,18 +133,18 @@ where
|
|||
/// Sets the style of the [`Radio`] button.
|
||||
pub fn style(
|
||||
mut self,
|
||||
style_sheet: impl Into<Box<dyn StyleSheet + 'a>>,
|
||||
style: impl Into<<Renderer::Theme as StyleSheet>::Style>,
|
||||
) -> Self {
|
||||
self.style_sheet = style_sheet.into();
|
||||
self.style = style.into();
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, Message, Renderer> Widget<Message, Renderer>
|
||||
for Radio<'a, Message, Renderer>
|
||||
impl<Message, Renderer> Widget<Message, Renderer> for Radio<Message, Renderer>
|
||||
where
|
||||
Message: Clone,
|
||||
Renderer: text::Renderer,
|
||||
Renderer::Theme: StyleSheet,
|
||||
{
|
||||
fn width(&self) -> Length {
|
||||
self.width
|
||||
|
|
@ -223,9 +229,9 @@ where
|
|||
let mut children = layout.children();
|
||||
|
||||
let custom_style = if is_mouse_over {
|
||||
self.style_sheet.hovered()
|
||||
theme.hovered(self.style)
|
||||
} else {
|
||||
self.style_sheet.active()
|
||||
theme.active(self.style)
|
||||
};
|
||||
|
||||
{
|
||||
|
|
@ -281,15 +287,14 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a, Message, Renderer> From<Radio<'a, Message, Renderer>>
|
||||
impl<'a, Message, Renderer> From<Radio<Message, Renderer>>
|
||||
for Element<'a, Message, Renderer>
|
||||
where
|
||||
Message: 'a + Clone,
|
||||
Renderer: 'a + text::Renderer,
|
||||
Renderer::Theme: StyleSheet,
|
||||
{
|
||||
fn from(
|
||||
radio: Radio<'a, Message, Renderer>,
|
||||
) -> Element<'a, Message, Renderer> {
|
||||
fn from(radio: Radio<Message, Renderer>) -> Element<'a, Message, Renderer> {
|
||||
Element::new(radio)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue