diff options
author | 2021-10-20 19:06:53 +0700 | |
---|---|---|
committer | 2021-10-20 19:18:40 +0700 | |
commit | d39ad717ed0ab85acbe935d7ab883166b36e7bc7 (patch) | |
tree | 2be868e8d040a1cfa8c6d5bae7c16b1c3ee88fec | |
parent | cc560aca181202e827bfdc9afb6fc9fbe42f54d6 (diff) | |
download | iced-d39ad717ed0ab85acbe935d7ab883166b36e7bc7.tar.gz iced-d39ad717ed0ab85acbe935d7ab883166b36e7bc7.tar.bz2 iced-d39ad717ed0ab85acbe935d7ab883166b36e7bc7.zip |
Wire up styling to `Radio` in `iced_native`
-rw-r--r-- | examples/scrollable/src/main.rs | 2 | ||||
-rw-r--r-- | examples/scrollable/src/style.rs | 4 | ||||
-rw-r--r-- | examples/styling/src/main.rs | 6 | ||||
-rw-r--r-- | glow/src/widget/radio.rs | 2 | ||||
-rw-r--r-- | graphics/src/widget/radio.rs | 17 | ||||
-rw-r--r-- | native/src/renderer/null.rs | 7 | ||||
-rw-r--r-- | native/src/widget/radio.rs | 89 | ||||
-rw-r--r-- | native/src/widget/text.rs | 72 | ||||
-rw-r--r-- | style/src/radio.rs | 13 | ||||
-rw-r--r-- | web/src/widget/radio.rs | 18 | ||||
-rw-r--r-- | wgpu/src/widget/radio.rs | 2 |
11 files changed, 97 insertions, 135 deletions
diff --git a/examples/scrollable/src/main.rs b/examples/scrollable/src/main.rs index bc20d428..2f1c5676 100644 --- a/examples/scrollable/src/main.rs +++ b/examples/scrollable/src/main.rs @@ -76,7 +76,7 @@ impl Sandbox for ScrollableDemo { Some(*theme), Message::ThemeChanged, ) - .style(*theme), + .style(theme.clone().into()), ) }, ); diff --git a/examples/scrollable/src/style.rs b/examples/scrollable/src/style.rs index 66f3b9d3..d7d64374 100644 --- a/examples/scrollable/src/style.rs +++ b/examples/scrollable/src/style.rs @@ -25,11 +25,11 @@ impl From<Theme> for &'static dyn container::StyleSheet { } } -impl From<Theme> for Box<dyn radio::StyleSheet> { +impl From<Theme> for &'static dyn radio::StyleSheet { fn from(theme: Theme) -> Self { match theme { Theme::Light => Default::default(), - Theme::Dark => dark::Radio.into(), + Theme::Dark => &dark::Radio, } } } diff --git a/examples/styling/src/main.rs b/examples/styling/src/main.rs index cca94c8f..7e9b01ab 100644 --- a/examples/styling/src/main.rs +++ b/examples/styling/src/main.rs @@ -64,7 +64,7 @@ impl Sandbox for Styling { Some(self.theme), Message::ThemeChanged, ) - .style(self.theme), + .style(self.theme.into()), ) }, ); @@ -185,11 +185,11 @@ mod style { } } - impl From<Theme> for Box<dyn radio::StyleSheet> { + impl From<Theme> for &'static dyn radio::StyleSheet { fn from(theme: Theme) -> Self { match theme { Theme::Light => Default::default(), - Theme::Dark => dark::Radio.into(), + Theme::Dark => &dark::Radio, } } } diff --git a/glow/src/widget/radio.rs b/glow/src/widget/radio.rs index 0b843d1f..c200f1a8 100644 --- a/glow/src/widget/radio.rs +++ b/glow/src/widget/radio.rs @@ -7,4 +7,4 @@ pub use iced_graphics::radio::{Style, StyleSheet}; /// /// This is an alias of an `iced_native` radio button with an /// `iced_wgpu::Renderer`. -pub type Radio<Message> = iced_native::Radio<Message, Renderer>; +pub type Radio<'a, Message> = iced_native::Radio<'a, Message, Renderer>; diff --git a/graphics/src/widget/radio.rs b/graphics/src/widget/radio.rs index cd83f2ff..4185bd61 100644 --- a/graphics/src/widget/radio.rs +++ b/graphics/src/widget/radio.rs @@ -1,6 +1,5 @@ //! Create choices using radio buttons. -use crate::{Backend, Renderer}; -use iced_native::radio; +use crate::Renderer; pub use iced_style::radio::{Style, StyleSheet}; @@ -8,15 +7,5 @@ pub use iced_style::radio::{Style, StyleSheet}; /// /// This is an alias of an `iced_native` radio button with an /// `iced_wgpu::Renderer`. -pub type Radio<Message, Backend> = - iced_native::Radio<Message, Renderer<Backend>>; - -impl<B> radio::Renderer for Renderer<B> -where - B: Backend, -{ - type Style = Box<dyn StyleSheet>; - - const DEFAULT_SIZE: u16 = 28; - const DEFAULT_SPACING: u16 = 15; -} +pub type Radio<'a, Message, Backend> = + iced_native::Radio<'a, Message, Renderer<Backend>>; diff --git a/native/src/renderer/null.rs b/native/src/renderer/null.rs index 084b8d6f..40fd5995 100644 --- a/native/src/renderer/null.rs +++ b/native/src/renderer/null.rs @@ -66,13 +66,6 @@ impl renderer::Text for Null { fn fill_text(&mut self, _text: renderer::text::Section<'_, Self::Font>) {} } -impl radio::Renderer for Null { - type Style = (); - - const DEFAULT_SIZE: u16 = 20; - const DEFAULT_SPACING: u16 = 15; -} - impl checkbox::Renderer for Null { type Style = (); diff --git a/native/src/widget/radio.rs b/native/src/widget/radio.rs index 3d6d22cc..0e1023b5 100644 --- a/native/src/widget/radio.rs +++ b/native/src/widget/radio.rs @@ -11,12 +11,14 @@ use crate::{ Rectangle, Row, Text, Widget, }; +pub use iced_style::radio::{Style, StyleSheet}; + /// A circular button representing a choice. /// /// # Example /// ``` -/// # type Radio<Message> = -/// # iced_native::Radio<Message, iced_native::renderer::Null>; +/// # type Radio<'a, Message> = +/// # iced_native::Radio<'a, Message, iced_native::renderer::Null>; /// # /// #[derive(Debug, Clone, Copy, PartialEq, Eq)] /// pub enum Choice { @@ -38,7 +40,7 @@ use crate::{ /// ///  #[allow(missing_debug_implementations)] -pub struct Radio<Message, Renderer: self::Renderer + renderer::Text> { +pub struct Radio<'a, Message, Renderer: renderer::Text> { is_selected: bool, on_click: Message, label: String, @@ -48,14 +50,19 @@ pub struct Radio<Message, Renderer: self::Renderer + renderer::Text> { text_size: Option<u16>, text_color: Option<Color>, font: Renderer::Font, - style: Renderer::Style, + style_sheet: &'a dyn StyleSheet, } -impl<Message, Renderer: self::Renderer + renderer::Text> - Radio<Message, Renderer> +impl<'a, Message, Renderer: renderer::Text> Radio<'a, Message, Renderer> where Message: Clone, { + /// The default size of a [`Radio`] button. + pub const DEFAULT_SIZE: u16 = 28; + + /// The default spacing of a [`Radio`] button. + pub const DEFAULT_SPACING: u16 = 15; + /// Creates a new [`Radio`] button. /// /// It expects: @@ -79,12 +86,12 @@ where on_click: f(value), label: label.into(), width: Length::Shrink, - size: <Renderer as self::Renderer>::DEFAULT_SIZE, - spacing: Renderer::DEFAULT_SPACING, //15 + size: Self::DEFAULT_SIZE, + spacing: Self::DEFAULT_SPACING, //15 text_size: None, text_color: None, font: Default::default(), - style: Renderer::Style::default(), + style_sheet: Default::default(), } } @@ -125,16 +132,17 @@ where } /// Sets the style of the [`Radio`] button. - pub fn style(mut self, style: impl Into<Renderer::Style>) -> Self { - self.style = style.into(); + pub fn style(mut self, style_sheet: &'a dyn StyleSheet) -> Self { + self.style_sheet = style_sheet; self } } -impl<Message, Renderer> Widget<Message, Renderer> for Radio<Message, Renderer> +impl<'a, Message, Renderer> Widget<Message, Renderer> + for Radio<'a, Message, Renderer> where Message: Clone, - Renderer: self::Renderer + renderer::Text, + Renderer: renderer::Text, { fn width(&self) -> Length { self.width @@ -198,36 +206,6 @@ where cursor_position: Point, _viewport: &Rectangle, ) { - // TODO - // let bounds = layout.bounds(); - // let mut children = layout.children(); - - // let radio_layout = children.next().unwrap(); - // let label_layout = children.next().unwrap(); - // let radio_bounds = radio_layout.bounds(); - - // let label = text::Renderer::draw( - // renderer, - // defaults, - // label_layout.bounds(), - // &self.label, - // self.text_size.unwrap_or(renderer.default_size()), - // self.font, - // self.text_color, - // alignment::Horizontal::Left, - // alignment::Vertical::Center, - // ); - - // let is_mouse_over = bounds.contains(cursor_position); - - // self::Renderer::draw( - // renderer, - // radio_bounds, - // self.is_selected, - // is_mouse_over, - // label, - // &self.style, - // ) } fn hash_layout(&self, state: &mut Hasher) { @@ -238,30 +216,15 @@ where } } -/// 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. -/// -/// [renderer]: crate::renderer -pub trait Renderer: crate::Renderer { - /// The style supported by this renderer. - type Style: Default; - - /// The default size of a [`Radio`] button. - const DEFAULT_SIZE: u16; - - /// The default spacing of a [`Radio`] button. - const DEFAULT_SPACING: u16; -} - -impl<'a, Message, Renderer> From<Radio<Message, Renderer>> +impl<'a, Message, Renderer> From<Radio<'a, Message, Renderer>> for Element<'a, Message, Renderer> where Message: 'a + Clone, - Renderer: 'a + self::Renderer + renderer::Text, + Renderer: 'a + renderer::Text, { - fn from(radio: Radio<Message, Renderer>) -> Element<'a, Message, Renderer> { + fn from( + radio: Radio<'a, Message, Renderer>, + ) -> Element<'a, Message, Renderer> { Element::new(radio) } } diff --git a/native/src/widget/text.rs b/native/src/widget/text.rs index 78bfa4e2..2432dbc8 100644 --- a/native/src/widget/text.rs +++ b/native/src/widget/text.rs @@ -140,29 +140,17 @@ where _cursor_position: Point, _viewport: &Rectangle, ) { - let bounds = layout.bounds(); - - let x = match self.horizontal_alignment { - alignment::Horizontal::Left => bounds.x, - alignment::Horizontal::Center => bounds.center_x(), - alignment::Horizontal::Right => bounds.x + bounds.width, - }; - - let y = match self.vertical_alignment { - alignment::Vertical::Top => bounds.y, - alignment::Vertical::Center => bounds.center_y(), - alignment::Vertical::Bottom => bounds.y + bounds.height, - }; - - renderer.fill_text(renderer::text::Section { - content: &self.content, - size: f32::from(self.size.unwrap_or(renderer.default_size())), - bounds: Rectangle { x, y, ..bounds }, - color: self.color.unwrap_or(style.text_color), - font: self.font, - horizontal_alignment: self.horizontal_alignment, - vertical_alignment: self.vertical_alignment, - }); + draw( + renderer, + style, + layout, + &self.content, + self.font, + self.size, + self.color, + self.horizontal_alignment, + self.vertical_alignment, + ); } fn hash_layout(&self, state: &mut Hasher) { @@ -176,6 +164,44 @@ where } } +pub fn draw<Renderer>( + renderer: &mut Renderer, + style: &renderer::Style, + layout: Layout<'_>, + content: &str, + font: Renderer::Font, + size: Option<u16>, + color: Option<Color>, + horizontal_alignment: alignment::Horizontal, + vertical_alignment: alignment::Vertical, +) where + Renderer: renderer::Text, +{ + let bounds = layout.bounds(); + + let x = match horizontal_alignment { + alignment::Horizontal::Left => bounds.x, + alignment::Horizontal::Center => bounds.center_x(), + alignment::Horizontal::Right => bounds.x + bounds.width, + }; + + let y = match vertical_alignment { + alignment::Vertical::Top => bounds.y, + alignment::Vertical::Center => bounds.center_y(), + alignment::Vertical::Bottom => bounds.y + bounds.height, + }; + + renderer.fill_text(renderer::text::Section { + content, + size: f32::from(size.unwrap_or(renderer.default_size())), + bounds: Rectangle { x, y, ..bounds }, + color: color.unwrap_or(style.text_color), + font, + horizontal_alignment, + vertical_alignment, + }); +} + impl<'a, Message, Renderer> From<Text<Renderer>> for Element<'a, Message, Renderer> where diff --git a/style/src/radio.rs b/style/src/radio.rs index c41b70c0..add12754 100644 --- a/style/src/radio.rs +++ b/style/src/radio.rs @@ -37,17 +37,8 @@ impl StyleSheet for Default { } } -impl std::default::Default for Box<dyn StyleSheet> { +impl std::default::Default for &'static dyn StyleSheet { fn default() -> Self { - Box::new(Default) - } -} - -impl<T> From<T> for Box<dyn StyleSheet> -where - T: 'static + StyleSheet, -{ - fn from(style: T) -> Self { - Box::new(style) + &Default } } diff --git a/web/src/widget/radio.rs b/web/src/widget/radio.rs index fbc88d29..5e9eaa3f 100644 --- a/web/src/widget/radio.rs +++ b/web/src/widget/radio.rs @@ -31,17 +31,17 @@ use dodrio::bumpalo; /// ///  #[allow(missing_debug_implementations)] -pub struct Radio<Message> { +pub struct Radio<'a, Message> { is_selected: bool, on_click: Message, label: String, id: Option<String>, name: Option<String>, #[allow(dead_code)] - style: Box<dyn StyleSheet>, + style_sheet: &'a dyn StyleSheet, } -impl<Message> Radio<Message> { +impl<'a, Message> Radio<'a, Message> { /// Creates a new [`Radio`] button. /// /// It expects: @@ -66,13 +66,13 @@ impl<Message> Radio<Message> { label: label.into(), id: None, name: None, - style: Default::default(), + style_sheet: Default::default(), } } /// Sets the style of the [`Radio`] button. - pub fn style(mut self, style: impl Into<Box<dyn StyleSheet>>) -> Self { - self.style = style.into(); + pub fn style(mut self, style_sheet: &'a dyn StyleSheet) -> Self { + self.style_sheet = style_sheet; self } @@ -89,7 +89,7 @@ impl<Message> Radio<Message> { } } -impl<Message> Widget<Message> for Radio<Message> +impl<'a, Message> Widget<Message> for Radio<'a, Message> where Message: 'static + Clone, { @@ -142,11 +142,11 @@ where } } -impl<'a, Message> From<Radio<Message>> for Element<'a, Message> +impl<'a, Message> From<Radio<'a, Message>> for Element<'a, Message> where Message: 'static + Clone, { - fn from(radio: Radio<Message>) -> Element<'a, Message> { + fn from(radio: Radio<'a, Message>) -> Element<'a, Message> { Element::new(radio) } } diff --git a/wgpu/src/widget/radio.rs b/wgpu/src/widget/radio.rs index 0b843d1f..c200f1a8 100644 --- a/wgpu/src/widget/radio.rs +++ b/wgpu/src/widget/radio.rs @@ -7,4 +7,4 @@ pub use iced_graphics::radio::{Style, StyleSheet}; /// /// This is an alias of an `iced_native` radio button with an /// `iced_wgpu::Renderer`. -pub type Radio<Message> = iced_native::Radio<Message, Renderer>; +pub type Radio<'a, Message> = iced_native::Radio<'a, Message, Renderer>; |