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/toggler.rs | 88 ++++++++++++++++---------------------------- 1 file changed, 31 insertions(+), 57 deletions(-) (limited to 'native/src/widget/toggler.rs') diff --git a/native/src/widget/toggler.rs b/native/src/widget/toggler.rs index c624be4c..4a1f1f5d 100644 --- a/native/src/widget/toggler.rs +++ b/native/src/widget/toggler.rs @@ -5,7 +5,6 @@ use crate::alignment; use crate::event; use crate::layout; use crate::mouse; -use crate::row; use crate::text; use crate::{ Alignment, Clipboard, Element, Event, Hasher, Layout, Length, Point, @@ -119,7 +118,7 @@ impl impl Widget for Toggler where - Renderer: self::Renderer + text::Renderer + row::Renderer, + Renderer: self::Renderer + text::Renderer, { fn width(&self) -> Length { self.width @@ -190,43 +189,35 @@ where layout: Layout<'_>, cursor_position: Point, _viewport: &Rectangle, - ) -> Renderer::Output { - let bounds = layout.bounds(); - let mut children = layout.children(); - - let label = match &self.label { - Some(label) => { - let label_layout = children.next().unwrap(); - - Some(text::Renderer::draw( - renderer, - defaults, - label_layout.bounds(), - &label, - self.text_size.unwrap_or(renderer.default_size()), - self.font, - None, - self.text_alignment, - alignment::Vertical::Center, - )) - } - - None => None, - }; - - let toggler_layout = children.next().unwrap(); - let toggler_bounds = toggler_layout.bounds(); - - let is_mouse_over = bounds.contains(cursor_position); - - self::Renderer::draw( - renderer, - toggler_bounds, - self.is_active, - is_mouse_over, - label, - &self.style, - ) + ) { + // TODO + // let bounds = layout.bounds(); + // let mut children = layout.children(); + + // let label = match &self.label { + // Some(label) => { + // let label_layout = children.next().unwrap(); + + // Some(text::Renderer::draw( + // renderer, + // defaults, + // label_layout.bounds(), + // &label, + // self.text_size.unwrap_or(renderer.default_size()), + // self.font, + // None, + // self.text_alignment, + // alignment::Vertical::Center, + // )) + // } + + // None => None, + // }; + + // let toggler_layout = children.next().unwrap(); + // let toggler_bounds = toggler_layout.bounds(); + + // let is_mouse_over = bounds.contains(cursor_position); } fn hash_layout(&self, state: &mut Hasher) { @@ -249,29 +240,12 @@ pub trait Renderer: crate::Renderer { /// The default size of a [`Toggler`]. const DEFAULT_SIZE: u16; - - /// Draws a [`Toggler`]. - /// - /// It receives: - /// * the bounds of the [`Toggler`] - /// * whether the [`Toggler`] is activated or not - /// * whether the mouse is over the [`Toggler`] or not - /// * the drawn label of the [`Toggler`] - /// * the style of the [`Toggler`] - fn draw( - &mut self, - bounds: Rectangle, - is_active: bool, - is_mouse_over: bool, - label: Option, - style: &Self::Style, - ) -> Self::Output; } impl<'a, Message, Renderer> From> for Element<'a, Message, Renderer> where - Renderer: 'a + self::Renderer + text::Renderer + row::Renderer, + Renderer: 'a + self::Renderer + text::Renderer, Message: 'a, { fn from( -- 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/toggler.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'native/src/widget/toggler.rs') diff --git a/native/src/widget/toggler.rs b/native/src/widget/toggler.rs index 4a1f1f5d..6c7fa97b 100644 --- a/native/src/widget/toggler.rs +++ b/native/src/widget/toggler.rs @@ -5,6 +5,7 @@ use crate::alignment; use crate::event; use crate::layout; use crate::mouse; +use crate::renderer; use crate::text; use crate::{ Alignment, Clipboard, Element, Event, Hasher, Layout, Length, Point, @@ -185,7 +186,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/toggler.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'native/src/widget/toggler.rs') diff --git a/native/src/widget/toggler.rs b/native/src/widget/toggler.rs index 6c7fa97b..46a9850b 100644 --- a/native/src/widget/toggler.rs +++ b/native/src/widget/toggler.rs @@ -6,7 +6,6 @@ use crate::event; use crate::layout; use crate::mouse; use crate::renderer; -use crate::text; use crate::{ Alignment, Clipboard, Element, Event, Hasher, Layout, Length, Point, Rectangle, Row, Text, Widget, @@ -28,7 +27,7 @@ use crate::{ /// Toggler::new(is_active, String::from("Toggle me!"), |b| Message::TogglerToggled(b)); /// ``` #[allow(missing_debug_implementations)] -pub struct Toggler { +pub struct Toggler { is_active: bool, on_toggle: Box Message>, label: Option, @@ -41,7 +40,7 @@ pub struct Toggler { style: Renderer::Style, } -impl +impl Toggler { /// Creates a new [`Toggler`]. @@ -119,7 +118,7 @@ impl impl Widget for Toggler where - Renderer: self::Renderer + text::Renderer, + Renderer: self::Renderer + renderer::Text, { fn width(&self) -> Length { self.width @@ -246,7 +245,7 @@ pub trait Renderer: crate::Renderer { impl<'a, Message, Renderer> From> for Element<'a, Message, Renderer> where - Renderer: 'a + self::Renderer + text::Renderer, + Renderer: 'a + self::Renderer + renderer::Text, Message: 'a, { fn from( -- cgit From 1c2792c0a0dc565f9dd9183ca8948331ec467590 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 28 Oct 2021 18:17:47 +0700 Subject: Implement `Widget::draw` for `Toggler` --- native/src/widget/toggler.rs | 144 +++++++++++++++++++++++++++---------------- 1 file changed, 91 insertions(+), 53 deletions(-) (limited to 'native/src/widget/toggler.rs') diff --git a/native/src/widget/toggler.rs b/native/src/widget/toggler.rs index 46a9850b..25ed95ca 100644 --- a/native/src/widget/toggler.rs +++ b/native/src/widget/toggler.rs @@ -6,11 +6,14 @@ use crate::event; use crate::layout; use crate::mouse; use crate::renderer; +use crate::widget::text; use crate::{ Alignment, Clipboard, Element, Event, Hasher, Layout, Length, Point, Rectangle, Row, Text, Widget, }; +pub use iced_style::toggler::{Style, StyleSheet}; + /// A toggler widget /// /// # Example @@ -27,7 +30,7 @@ use crate::{ /// Toggler::new(is_active, String::from("Toggle me!"), |b| Message::TogglerToggled(b)); /// ``` #[allow(missing_debug_implementations)] -pub struct Toggler { +pub struct Toggler { is_active: bool, on_toggle: Box Message>, label: Option, @@ -37,12 +40,13 @@ pub struct Toggler { text_alignment: alignment::Horizontal, spacing: u16, font: Renderer::Font, - style: Renderer::Style, + style_sheet: Box, } -impl - Toggler -{ +impl Toggler { + /// The default size of a [`Toggler`]. + pub const DEFAULT_SIZE: u16 = 20; + /// Creates a new [`Toggler`]. /// /// It expects: @@ -64,12 +68,12 @@ impl on_toggle: Box::new(f), label: label.into(), width: Length::Fill, - size: ::DEFAULT_SIZE, + size: Self::DEFAULT_SIZE, text_size: None, text_alignment: alignment::Horizontal::Left, spacing: 0, font: Renderer::Font::default(), - style: Renderer::Style::default(), + style_sheet: Default::default(), } } @@ -110,15 +114,18 @@ impl } /// Sets the style of the [`Toggler`]. - pub fn style(mut self, style: impl Into) -> Self { - self.style = style.into(); + pub fn style( + mut self, + style_sheet: impl Into>, + ) -> Self { + self.style_sheet = style_sheet.into(); self } } impl Widget for Toggler where - Renderer: self::Renderer + renderer::Text, + Renderer: renderer::Text, { fn width(&self) -> Length { self.width @@ -190,34 +197,79 @@ where cursor_position: Point, _viewport: &Rectangle, ) { - // TODO - // let bounds = layout.bounds(); - // let mut children = layout.children(); - - // let label = match &self.label { - // Some(label) => { - // let label_layout = children.next().unwrap(); - - // Some(text::Renderer::draw( - // renderer, - // defaults, - // label_layout.bounds(), - // &label, - // self.text_size.unwrap_or(renderer.default_size()), - // self.font, - // None, - // self.text_alignment, - // alignment::Vertical::Center, - // )) - // } - - // None => None, - // }; - - // let toggler_layout = children.next().unwrap(); - // let toggler_bounds = toggler_layout.bounds(); - - // let is_mouse_over = bounds.contains(cursor_position); + /// Makes sure that the border radius of the toggler looks good at every size. + const BORDER_RADIUS_RATIO: f32 = 32.0 / 13.0; + + /// The space ratio between the background Quad and the Toggler bounds, and + /// between the background Quad and foreground Quad. + const SPACE_RATIO: f32 = 0.05; + + let mut children = layout.children(); + + if let Some(label) = &self.label { + let label_layout = children.next().unwrap(); + + text::draw( + renderer, + style, + label_layout, + &label, + self.font, + self.text_size, + None, + self.text_alignment, + alignment::Vertical::Center, + ); + } + + let toggler_layout = children.next().unwrap(); + let bounds = toggler_layout.bounds(); + + let is_mouse_over = bounds.contains(cursor_position); + + let style = if is_mouse_over { + self.style_sheet.hovered(self.is_active) + } else { + self.style_sheet.active(self.is_active) + }; + + let border_radius = bounds.height as f32 / BORDER_RADIUS_RATIO; + let space = SPACE_RATIO * bounds.height as f32; + + let toggler_background_bounds = Rectangle { + x: bounds.x + space, + y: bounds.y + space, + width: bounds.width - (2.0 * space), + height: bounds.height - (2.0 * space), + }; + + renderer.fill_rectangle(renderer::Quad { + bounds: toggler_background_bounds, + background: style.background.into(), + border_radius, + border_width: 1.0, + border_color: style.background_border.unwrap_or(style.background), + }); + + let toggler_foreground_bounds = Rectangle { + x: bounds.x + + if self.is_active { + bounds.width - 2.0 * space - (bounds.height - (4.0 * space)) + } else { + 2.0 * space + }, + y: bounds.y + (2.0 * space), + width: bounds.height - (4.0 * space), + height: bounds.height - (4.0 * space), + }; + + renderer.fill_rectangle(renderer::Quad { + bounds: toggler_foreground_bounds, + background: style.foreground.into(), + border_radius, + border_width: 1.0, + border_color: style.foreground_border.unwrap_or(style.foreground), + }); } fn hash_layout(&self, state: &mut Hasher) { @@ -228,24 +280,10 @@ where } } -/// The renderer of a [`Toggler`]. -/// -/// Your [renderer] will need to implement this trait before being -/// able to use a [`Toggler`] in your user interface. -/// -/// [renderer]: ../../renderer/index.html -pub trait Renderer: crate::Renderer { - /// The style supported by this renderer. - type Style: Default; - - /// The default size of a [`Toggler`]. - const DEFAULT_SIZE: u16; -} - impl<'a, Message, Renderer> From> for Element<'a, Message, Renderer> where - Renderer: 'a + self::Renderer + renderer::Text, + Renderer: 'a + renderer::Text, Message: 'a, { fn from( -- cgit From 5cd744f9862c62ca441d4a4b3962d91e4360afbf Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 28 Oct 2021 18:19:19 +0700 Subject: Implement `Widget::mouse_interaction` for `Toggler` --- native/src/widget/toggler.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'native/src/widget/toggler.rs') diff --git a/native/src/widget/toggler.rs b/native/src/widget/toggler.rs index 25ed95ca..a11d0307 100644 --- a/native/src/widget/toggler.rs +++ b/native/src/widget/toggler.rs @@ -189,6 +189,19 @@ where } } + 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/toggler.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'native/src/widget/toggler.rs') diff --git a/native/src/widget/toggler.rs b/native/src/widget/toggler.rs index a11d0307..20cfea74 100644 --- a/native/src/widget/toggler.rs +++ b/native/src/widget/toggler.rs @@ -7,9 +7,10 @@ use crate::layout; use crate::mouse; use crate::renderer; use crate::widget::text; +use crate::widget::{Row, Text}; use crate::{ Alignment, Clipboard, Element, Event, Hasher, Layout, Length, Point, - Rectangle, Row, Text, Widget, + Rectangle, Widget, }; pub use iced_style::toggler::{Style, StyleSheet}; @@ -19,7 +20,7 @@ pub use iced_style::toggler::{Style, StyleSheet}; /// # Example /// /// ``` -/// # type Toggler = iced_native::Toggler; +/// # type Toggler = iced_native::widget::Toggler; /// # /// pub enum Message { /// TogglerToggled(bool), -- 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/toggler.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'native/src/widget/toggler.rs') diff --git a/native/src/widget/toggler.rs b/native/src/widget/toggler.rs index 20cfea74..e5229d52 100644 --- a/native/src/widget/toggler.rs +++ b/native/src/widget/toggler.rs @@ -6,7 +6,7 @@ use crate::event; use crate::layout; use crate::mouse; use crate::renderer; -use crate::widget::text; +use crate::text; use crate::widget::{Row, Text}; use crate::{ Alignment, Clipboard, Element, Event, Hasher, Layout, Length, Point, @@ -31,7 +31,7 @@ pub use iced_style::toggler::{Style, StyleSheet}; /// Toggler::new(is_active, String::from("Toggle me!"), |b| Message::TogglerToggled(b)); /// ``` #[allow(missing_debug_implementations)] -pub struct Toggler { +pub struct Toggler { is_active: bool, on_toggle: Box Message>, label: Option, @@ -44,7 +44,7 @@ pub struct Toggler { style_sheet: Box, } -impl Toggler { +impl Toggler { /// The default size of a [`Toggler`]. pub const DEFAULT_SIZE: u16 = 20; @@ -126,7 +126,7 @@ impl Toggler { impl Widget for Toggler where - Renderer: renderer::Text, + Renderer: text::Renderer, { fn width(&self) -> Length { self.width @@ -223,7 +223,7 @@ where if let Some(label) = &self.label { let label_layout = children.next().unwrap(); - text::draw( + crate::widget::text::draw( renderer, style, label_layout, @@ -297,7 +297,7 @@ where impl<'a, Message, Renderer> From> for Element<'a, Message, Renderer> where - Renderer: 'a + renderer::Text, + Renderer: 'a + text::Renderer, Message: 'a, { fn from( -- cgit From c9ed15782c3a62fcbfe56a141837b384ada82aaa Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sun, 31 Oct 2021 17:48:23 +0700 Subject: Introduce state lifetime for `style_sheet` in `Toggler` --- native/src/widget/toggler.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'native/src/widget/toggler.rs') diff --git a/native/src/widget/toggler.rs b/native/src/widget/toggler.rs index e5229d52..961d2936 100644 --- a/native/src/widget/toggler.rs +++ b/native/src/widget/toggler.rs @@ -31,7 +31,7 @@ pub use iced_style::toggler::{Style, StyleSheet}; /// Toggler::new(is_active, String::from("Toggle me!"), |b| Message::TogglerToggled(b)); /// ``` #[allow(missing_debug_implementations)] -pub struct Toggler { +pub struct Toggler<'a, Message, Renderer: text::Renderer> { is_active: bool, on_toggle: Box Message>, label: Option, @@ -41,10 +41,10 @@ pub struct Toggler { text_alignment: alignment::Horizontal, spacing: u16, font: Renderer::Font, - style_sheet: Box, + style_sheet: Box, } -impl Toggler { +impl<'a, Message, Renderer: text::Renderer> Toggler<'a, Message, Renderer> { /// The default size of a [`Toggler`]. pub const DEFAULT_SIZE: u16 = 20; @@ -117,14 +117,15 @@ impl Toggler { /// Sets the style of the [`Toggler`]. pub fn style( mut self, - style_sheet: impl Into>, + style_sheet: impl Into>, ) -> Self { self.style_sheet = style_sheet.into(); self } } -impl Widget for Toggler +impl<'a, Message, Renderer> Widget + for Toggler<'a, Message, Renderer> where Renderer: text::Renderer, { @@ -294,14 +295,14 @@ where } } -impl<'a, Message, Renderer> From> +impl<'a, Message, Renderer> From> for Element<'a, Message, Renderer> where Renderer: 'a + text::Renderer, Message: 'a, { fn from( - toggler: Toggler, + toggler: Toggler<'a, Message, Renderer>, ) -> Element<'a, Message, Renderer> { Element::new(toggler) } -- cgit From e50bb1dd2c65677f6fce77ca9d7d5e001729c162 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Mon, 1 Nov 2021 14:58:50 +0700 Subject: Fix missing lifetime in doc example for `Toggler` --- native/src/widget/toggler.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'native/src/widget/toggler.rs') diff --git a/native/src/widget/toggler.rs b/native/src/widget/toggler.rs index 961d2936..fb7d2642 100644 --- a/native/src/widget/toggler.rs +++ b/native/src/widget/toggler.rs @@ -20,7 +20,7 @@ pub use iced_style::toggler::{Style, StyleSheet}; /// # Example /// /// ``` -/// # type Toggler = iced_native::widget::Toggler; +/// # type Toggler<'a, Message> = iced_native::widget::Toggler<'a, Message, iced_native::renderer::Null>; /// # /// pub enum Message { /// TogglerToggled(bool), -- 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/toggler.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'native/src/widget/toggler.rs') diff --git a/native/src/widget/toggler.rs b/native/src/widget/toggler.rs index fb7d2642..78e3d5ef 100644 --- a/native/src/widget/toggler.rs +++ b/native/src/widget/toggler.rs @@ -194,8 +194,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/toggler.rs | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) (limited to 'native/src/widget/toggler.rs') diff --git a/native/src/widget/toggler.rs b/native/src/widget/toggler.rs index 78e3d5ef..2dcc3ffe 100644 --- a/native/src/widget/toggler.rs +++ b/native/src/widget/toggler.rs @@ -258,13 +258,17 @@ where height: bounds.height - (2.0 * space), }; - renderer.fill_rectangle(renderer::Quad { - bounds: toggler_background_bounds, - background: style.background.into(), - border_radius, - border_width: 1.0, - border_color: style.background_border.unwrap_or(style.background), - }); + renderer.fill_quad( + renderer::Quad { + bounds: toggler_background_bounds, + border_radius, + border_width: 1.0, + border_color: style + .background_border + .unwrap_or(style.background), + }, + style.background, + ); let toggler_foreground_bounds = Rectangle { x: bounds.x @@ -278,13 +282,17 @@ where height: bounds.height - (4.0 * space), }; - renderer.fill_rectangle(renderer::Quad { - bounds: toggler_foreground_bounds, - background: style.foreground.into(), - border_radius, - border_width: 1.0, - border_color: style.foreground_border.unwrap_or(style.foreground), - }); + renderer.fill_quad( + renderer::Quad { + bounds: toggler_foreground_bounds, + border_radius, + border_width: 1.0, + border_color: style + .foreground_border + .unwrap_or(style.foreground), + }, + style.foreground, + ); } fn hash_layout(&self, state: &mut Hasher) { -- cgit