From 03b34931383e701c39c653a7662a616fe21a0947 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 14 Oct 2021 16:07:22 +0700 Subject: Remove trait-specific draw logic in `iced_native` --- native/src/widget/radio.rs | 74 ++++++++++++++++++---------------------------- 1 file changed, 29 insertions(+), 45 deletions(-) (limited to 'native/src/widget/radio.rs') diff --git a/native/src/widget/radio.rs b/native/src/widget/radio.rs index 513b2fce..c6955079 100644 --- a/native/src/widget/radio.rs +++ b/native/src/widget/radio.rs @@ -5,7 +5,6 @@ use crate::alignment::{self, Alignment}; use crate::event::{self, Event}; use crate::layout; use crate::mouse; -use crate::row; use crate::text; use crate::touch; use crate::{ @@ -136,7 +135,7 @@ where impl Widget for Radio where Message: Clone, - Renderer: self::Renderer + text::Renderer + row::Renderer, + Renderer: self::Renderer + text::Renderer, { fn width(&self) -> Length { self.width @@ -199,36 +198,37 @@ where layout: Layout<'_>, cursor_position: Point, _viewport: &Rectangle, - ) -> Renderer::Output { - let bounds = layout.bounds(); - let mut children = layout.children(); + ) { + // 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 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 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); + // let is_mouse_over = bounds.contains(cursor_position); - self::Renderer::draw( - renderer, - radio_bounds, - self.is_selected, - is_mouse_over, - label, - &self.style, - ) + // self::Renderer::draw( + // renderer, + // radio_bounds, + // self.is_selected, + // is_mouse_over, + // label, + // &self.style, + // ) } fn hash_layout(&self, state: &mut Hasher) { @@ -254,29 +254,13 @@ pub trait Renderer: crate::Renderer { /// The default spacing of a [`Radio`] button. const DEFAULT_SPACING: u16; - - /// Draws a [`Radio`] button. - /// - /// It receives: - /// * the bounds of the [`Radio`] - /// * whether the [`Radio`] is selected or not - /// * whether the mouse is over the [`Radio`] or not - /// * the drawn label of the [`Radio`] - fn draw( - &mut self, - bounds: Rectangle, - is_selected: bool, - is_mouse_over: bool, - label: Self::Output, - style: &Self::Style, - ) -> Self::Output; } impl<'a, Message, Renderer> From> for Element<'a, Message, Renderer> where Message: 'a + Clone, - Renderer: 'a + self::Renderer + row::Renderer + text::Renderer, + Renderer: 'a + self::Renderer + text::Renderer, { fn from(radio: Radio) -> Element<'a, Message, Renderer> { Element::new(radio) -- cgit From edea093350e1b576e2b7db50c525e7fa5c3bea9f Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Mon, 18 Oct 2021 15:19:04 +0700 Subject: Move `Defaults` from `iced_graphics` to `iced_native` --- native/src/widget/radio.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'native/src/widget/radio.rs') diff --git a/native/src/widget/radio.rs b/native/src/widget/radio.rs index c6955079..ba9bd9aa 100644 --- a/native/src/widget/radio.rs +++ b/native/src/widget/radio.rs @@ -1,15 +1,15 @@ //! Create choices using radio buttons. use std::hash::Hash; -use crate::alignment::{self, Alignment}; use crate::event::{self, Event}; use crate::layout; use crate::mouse; +use crate::renderer; use crate::text; use crate::touch; use crate::{ - Clipboard, Color, Element, Hasher, Layout, Length, Point, Rectangle, Row, - Text, Widget, + Alignment, Clipboard, Color, Element, Hasher, Layout, Length, Point, + Rectangle, Row, Text, Widget, }; /// A circular button representing a choice. @@ -194,7 +194,7 @@ where fn draw( &self, renderer: &mut Renderer, - defaults: &Renderer::Defaults, + style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, _viewport: &Rectangle, -- cgit From e914888f57394e4b67b40e42f1ad9df4ae8147e6 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Wed, 20 Oct 2021 18:40:39 +0700 Subject: Implement `Widget::draw` for `TextInput` --- native/src/widget/radio.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'native/src/widget/radio.rs') diff --git a/native/src/widget/radio.rs b/native/src/widget/radio.rs index ba9bd9aa..3d6d22cc 100644 --- a/native/src/widget/radio.rs +++ b/native/src/widget/radio.rs @@ -5,7 +5,6 @@ use crate::event::{self, Event}; use crate::layout; use crate::mouse; use crate::renderer; -use crate::text; use crate::touch; use crate::{ Alignment, Clipboard, Color, Element, Hasher, Layout, Length, Point, @@ -39,7 +38,7 @@ use crate::{ /// /// ![Radio buttons drawn by `iced_wgpu`](https://github.com/hecrj/iced/blob/7760618fb112074bc40b148944521f312152012a/docs/images/radio.png?raw=true) #[allow(missing_debug_implementations)] -pub struct Radio { +pub struct Radio { is_selected: bool, on_click: Message, label: String, @@ -52,7 +51,7 @@ pub struct Radio { style: Renderer::Style, } -impl +impl Radio where Message: Clone, @@ -135,7 +134,7 @@ where impl Widget for Radio where Message: Clone, - Renderer: self::Renderer + text::Renderer, + Renderer: self::Renderer + renderer::Text, { fn width(&self) -> Length { self.width @@ -260,7 +259,7 @@ impl<'a, Message, Renderer> From> for Element<'a, Message, Renderer> where Message: 'a + Clone, - Renderer: 'a + self::Renderer + text::Renderer, + Renderer: 'a + self::Renderer + renderer::Text, { fn from(radio: Radio) -> Element<'a, Message, Renderer> { Element::new(radio) -- cgit From d39ad717ed0ab85acbe935d7ab883166b36e7bc7 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Wed, 20 Oct 2021 19:06:53 +0700 Subject: Wire up styling to `Radio` in `iced_native` --- native/src/widget/radio.rs | 89 ++++++++++++++-------------------------------- 1 file changed, 26 insertions(+), 63 deletions(-) (limited to 'native/src/widget/radio.rs') 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 = -/// # iced_native::Radio; +/// # 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::{ /// /// ![Radio buttons drawn by `iced_wgpu`](https://github.com/hecrj/iced/blob/7760618fb112074bc40b148944521f312152012a/docs/images/radio.png?raw=true) #[allow(missing_debug_implementations)] -pub struct Radio { +pub struct Radio<'a, Message, Renderer: renderer::Text> { is_selected: bool, on_click: Message, label: String, @@ -48,14 +50,19 @@ pub struct Radio { text_size: Option, text_color: Option, font: Renderer::Font, - style: Renderer::Style, + style_sheet: &'a dyn StyleSheet, } -impl - Radio +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: ::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) -> Self { - self.style = style.into(); + pub fn style(mut self, style_sheet: &'a dyn StyleSheet) -> Self { + self.style_sheet = style_sheet; self } } -impl Widget for Radio +impl<'a, Message, Renderer> Widget + 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> +impl<'a, Message, Renderer> From> for Element<'a, Message, Renderer> where Message: 'a + Clone, - Renderer: 'a + self::Renderer + renderer::Text, + Renderer: 'a + renderer::Text, { - fn from(radio: Radio) -> Element<'a, Message, Renderer> { + fn from( + radio: Radio<'a, Message, Renderer>, + ) -> Element<'a, Message, Renderer> { Element::new(radio) } } -- cgit From 47c8f6ceee801bd2896cd075097dcb075ff070d7 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Wed, 20 Oct 2021 19:07:09 +0700 Subject: Implement `Widget::draw` for `Radio` --- native/src/widget/radio.rs | 63 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 2 deletions(-) (limited to 'native/src/widget/radio.rs') diff --git a/native/src/widget/radio.rs b/native/src/widget/radio.rs index 0e1023b5..ebd14517 100644 --- a/native/src/widget/radio.rs +++ b/native/src/widget/radio.rs @@ -1,14 +1,16 @@ //! Create choices using radio buttons. use std::hash::Hash; +use crate::alignment; use crate::event::{self, Event}; use crate::layout; use crate::mouse; use crate::renderer; +use crate::text; use crate::touch; use crate::{ - Alignment, Clipboard, Color, Element, Hasher, Layout, Length, Point, - Rectangle, Row, Text, Widget, + Alignment, Background, Clipboard, Color, Element, Hasher, Layout, Length, + Point, Rectangle, Row, Text, Widget, }; pub use iced_style::radio::{Style, StyleSheet}; @@ -206,6 +208,63 @@ where cursor_position: Point, _viewport: &Rectangle, ) { + let bounds = layout.bounds(); + let is_mouse_over = bounds.contains(cursor_position); + + let mut children = layout.children(); + + { + let layout = children.next().unwrap(); + let bounds = layout.bounds(); + + let size = bounds.width; + let dot_size = size / 2.0; + + let style = if is_mouse_over { + self.style_sheet.hovered() + } else { + self.style_sheet.active() + }; + + renderer.fill_rectangle(renderer::Quad { + bounds, + background: style.background, + border_radius: size / 2.0, + border_width: style.border_width, + border_color: style.border_color, + }); + + if self.is_selected { + renderer.fill_rectangle(renderer::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, + border_width: 0.0, + border_color: Color::TRANSPARENT, + }); + } + } + + { + let label_layout = children.next().unwrap(); + + text::draw( + renderer, + style, + label_layout, + &self.label, + self.font, + self.text_size, + self.text_color, + alignment::Horizontal::Left, + alignment::Vertical::Center, + ); + } } fn hash_layout(&self, state: &mut Hasher) { -- cgit From b6ae87ae55301d6c15f56e6c7df077aabe6383de Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Wed, 20 Oct 2021 19:08:13 +0700 Subject: Implement `Widget::mouse_interaction` for `Radio` --- native/src/widget/radio.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'native/src/widget/radio.rs') diff --git a/native/src/widget/radio.rs b/native/src/widget/radio.rs index ebd14517..5601a597 100644 --- a/native/src/widget/radio.rs +++ b/native/src/widget/radio.rs @@ -200,6 +200,19 @@ where event::Status::Ignored } + fn mouse_interaction( + &self, + layout: Layout<'_>, + _viewport: &Rectangle, + cursor_position: Point, + ) -> mouse::Interaction { + if layout.bounds().contains(cursor_position) { + mouse::Interaction::Pointer + } else { + mouse::Interaction::default() + } + } + fn draw( &self, renderer: &mut Renderer, -- cgit From 0aafcde0ef1533c9eeba0379de8c0082e30c7504 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sun, 31 Oct 2021 15:35:12 +0700 Subject: Remove `widget` module re-exports in `iced_native` --- native/src/widget/radio.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'native/src/widget/radio.rs') diff --git a/native/src/widget/radio.rs b/native/src/widget/radio.rs index 5601a597..91de8be5 100644 --- a/native/src/widget/radio.rs +++ b/native/src/widget/radio.rs @@ -6,11 +6,12 @@ use crate::event::{self, Event}; use crate::layout; use crate::mouse; use crate::renderer; -use crate::text; use crate::touch; +use crate::widget::text; +use crate::widget::{Row, Text}; use crate::{ Alignment, Background, Clipboard, Color, Element, Hasher, Layout, Length, - Point, Rectangle, Row, Text, Widget, + Point, Rectangle, Widget, }; pub use iced_style::radio::{Style, StyleSheet}; @@ -20,7 +21,7 @@ pub use iced_style::radio::{Style, StyleSheet}; /// # Example /// ``` /// # type Radio<'a, Message> = -/// # iced_native::Radio<'a, Message, iced_native::renderer::Null>; +/// # iced_native::widget::Radio<'a, Message, iced_native::renderer::Null>; /// # /// #[derive(Debug, Clone, Copy, PartialEq, Eq)] /// pub enum Choice { -- cgit From b3a01973c6c726e6539be959659f4306ef3234c6 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sun, 31 Oct 2021 16:13:03 +0700 Subject: Introduce first-class `text` module in `iced_native` --- native/src/widget/radio.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'native/src/widget/radio.rs') diff --git a/native/src/widget/radio.rs b/native/src/widget/radio.rs index 91de8be5..afe85b76 100644 --- a/native/src/widget/radio.rs +++ b/native/src/widget/radio.rs @@ -6,9 +6,9 @@ use crate::event::{self, Event}; use crate::layout; use crate::mouse; use crate::renderer; +use crate::text; use crate::touch; -use crate::widget::text; -use crate::widget::{Row, Text}; +use crate::widget::{self, Row, Text}; use crate::{ Alignment, Background, Clipboard, Color, Element, Hasher, Layout, Length, Point, Rectangle, Widget, @@ -43,7 +43,7 @@ pub use iced_style::radio::{Style, StyleSheet}; /// /// ![Radio buttons drawn by `iced_wgpu`](https://github.com/hecrj/iced/blob/7760618fb112074bc40b148944521f312152012a/docs/images/radio.png?raw=true) #[allow(missing_debug_implementations)] -pub struct Radio<'a, Message, Renderer: renderer::Text> { +pub struct Radio<'a, Message, Renderer: text::Renderer> { is_selected: bool, on_click: Message, label: String, @@ -56,7 +56,7 @@ pub struct Radio<'a, Message, Renderer: renderer::Text> { style_sheet: &'a dyn StyleSheet, } -impl<'a, Message, Renderer: renderer::Text> Radio<'a, Message, Renderer> +impl<'a, Message, Renderer: text::Renderer> Radio<'a, Message, Renderer> where Message: Clone, { @@ -145,7 +145,7 @@ impl<'a, Message, Renderer> Widget for Radio<'a, Message, Renderer> where Message: Clone, - Renderer: renderer::Text, + Renderer: text::Renderer, { fn width(&self) -> Length { self.width @@ -267,7 +267,7 @@ where { let label_layout = children.next().unwrap(); - text::draw( + widget::text::draw( renderer, style, label_layout, @@ -293,7 +293,7 @@ impl<'a, Message, Renderer> From> for Element<'a, Message, Renderer> where Message: 'a + Clone, - Renderer: 'a + renderer::Text, + Renderer: 'a + text::Renderer, { fn from( radio: Radio<'a, Message, Renderer>, -- cgit From bd7b086ec1f9d428945f05fb12bda157f9e77dfd Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sun, 31 Oct 2021 17:14:10 +0700 Subject: Reintroduce `Box` for `style_sheet` in `Radio` --- native/src/widget/radio.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'native/src/widget/radio.rs') diff --git a/native/src/widget/radio.rs b/native/src/widget/radio.rs index afe85b76..eb732dc3 100644 --- a/native/src/widget/radio.rs +++ b/native/src/widget/radio.rs @@ -53,7 +53,7 @@ pub struct Radio<'a, Message, Renderer: text::Renderer> { text_size: Option, text_color: Option, font: Renderer::Font, - style_sheet: &'a dyn StyleSheet, + style_sheet: Box, } impl<'a, Message, Renderer: text::Renderer> Radio<'a, Message, Renderer> @@ -135,8 +135,11 @@ where } /// Sets the style of the [`Radio`] button. - pub fn style(mut self, style_sheet: &'a dyn StyleSheet) -> Self { - self.style_sheet = style_sheet; + pub fn style( + mut self, + style_sheet: impl Into>, + ) -> Self { + self.style_sheet = style_sheet.into(); self } } -- cgit From 631e95ee0be01dc7f5e5183e1429972aee37787f Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 2 Nov 2021 15:03:29 +0700 Subject: Move `viewport` argument to last position in `mouse_interaction` methods This keeps the order of the arguments consistent with `draw`. --- native/src/widget/radio.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'native/src/widget/radio.rs') diff --git a/native/src/widget/radio.rs b/native/src/widget/radio.rs index eb732dc3..7d39c526 100644 --- a/native/src/widget/radio.rs +++ b/native/src/widget/radio.rs @@ -207,8 +207,8 @@ where fn mouse_interaction( &self, layout: Layout<'_>, - _viewport: &Rectangle, cursor_position: Point, + _viewport: &Rectangle, ) -> mouse::Interaction { if layout.bounds().contains(cursor_position) { mouse::Interaction::Pointer -- cgit From 023aded2772f0cd6abd716fe5c8624d5d22e21fa Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 4 Nov 2021 19:22:29 +0700 Subject: Rename `fill_rectangle` to `fill_quad` in `Renderer` --- native/src/widget/radio.rs | 44 ++++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 20 deletions(-) (limited to 'native/src/widget/radio.rs') diff --git a/native/src/widget/radio.rs b/native/src/widget/radio.rs index 7d39c526..86ad4c4e 100644 --- a/native/src/widget/radio.rs +++ b/native/src/widget/radio.rs @@ -10,8 +10,8 @@ use crate::text; use crate::touch; use crate::widget::{self, Row, Text}; use crate::{ - Alignment, Background, Clipboard, Color, Element, Hasher, Layout, Length, - Point, Rectangle, Widget, + Alignment, Clipboard, Color, Element, Hasher, Layout, Length, Point, + Rectangle, Widget, }; pub use iced_style::radio::{Style, StyleSheet}; @@ -243,27 +243,31 @@ where self.style_sheet.active() }; - renderer.fill_rectangle(renderer::Quad { - bounds, - background: style.background, - border_radius: size / 2.0, - border_width: style.border_width, - border_color: style.border_color, - }); + renderer.fill_quad( + renderer::Quad { + bounds, + border_radius: size / 2.0, + border_width: style.border_width, + border_color: style.border_color, + }, + style.background, + ); if self.is_selected { - renderer.fill_rectangle(renderer::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, + renderer.fill_quad( + renderer::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, + }, + border_radius: dot_size / 2.0, + border_width: 0.0, + border_color: Color::TRANSPARENT, }, - background: Background::Color(style.dot_color), - border_radius: dot_size / 2.0, - border_width: 0.0, - border_color: Color::TRANSPARENT, - }); + style.dot_color, + ); } } -- cgit