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/tooltip.rs | 43 +++++++------------------------------------ 1 file changed, 7 insertions(+), 36 deletions(-) (limited to 'native/src/widget/tooltip.rs') diff --git a/native/src/widget/tooltip.rs b/native/src/widget/tooltip.rs index 276afd41..83d04675 100644 --- a/native/src/widget/tooltip.rs +++ b/native/src/widget/tooltip.rs @@ -136,25 +136,13 @@ where fn draw( &self, - renderer: &mut Renderer, - defaults: &Renderer::Defaults, - layout: Layout<'_>, - cursor_position: Point, - viewport: &Rectangle, - ) -> Renderer::Output { - self::Renderer::draw( - renderer, - defaults, - cursor_position, - layout, - viewport, - &self.content, - &self.tooltip, - self.position, - &self.style, - self.gap, - self.padding, - ) + _renderer: &mut Renderer, + _defaults: &Renderer::Defaults, + _layout: Layout<'_>, + _cursor_position: Point, + _viewport: &Rectangle, + ) { + // TODO } fn hash_layout(&self, state: &mut Hasher) { @@ -177,23 +165,6 @@ pub trait Renderer: { /// The default padding of a [`Tooltip`] drawn by this renderer. const DEFAULT_PADDING: u16; - - /// Draws a [`Tooltip`]. - /// - /// [`Tooltip`]: struct.Tooltip.html - fn draw( - &mut self, - defaults: &Self::Defaults, - cursor_position: Point, - content_layout: Layout<'_>, - viewport: &Rectangle, - content: &Element<'_, Message, Self>, - tooltip: &Text, - position: Position, - style: &::Style, - gap: u16, - padding: u16, - ) -> Self::Output; } impl<'a, Message, Renderer> 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/tooltip.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'native/src/widget/tooltip.rs') diff --git a/native/src/widget/tooltip.rs b/native/src/widget/tooltip.rs index 83d04675..496cd41e 100644 --- a/native/src/widget/tooltip.rs +++ b/native/src/widget/tooltip.rs @@ -3,12 +3,12 @@ use std::hash::Hash; use iced_core::Rectangle; +use crate::event; +use crate::layout; +use crate::renderer; use crate::widget::container; use crate::widget::text::{self, Text}; -use crate::{ - event, layout, Clipboard, Element, Event, Hasher, Layout, Length, Point, - Widget, -}; +use crate::{Clipboard, Element, Event, Hasher, Layout, Length, Point, Widget}; /// An element to display a widget over another. #[allow(missing_debug_implementations)] @@ -137,7 +137,7 @@ where fn draw( &self, _renderer: &mut Renderer, - _defaults: &Renderer::Defaults, + style: &renderer::Style, _layout: Layout<'_>, _cursor_position: Point, _viewport: &Rectangle, -- cgit From d61cb58d92b6fcd520f665deb093f3747ffd5e5c Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Mon, 18 Oct 2021 15:36:32 +0700 Subject: Wire up `container` styling to `iced_native` --- native/src/widget/tooltip.rs | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) (limited to 'native/src/widget/tooltip.rs') diff --git a/native/src/widget/tooltip.rs b/native/src/widget/tooltip.rs index 496cd41e..4e8483ad 100644 --- a/native/src/widget/tooltip.rs +++ b/native/src/widget/tooltip.rs @@ -16,7 +16,7 @@ pub struct Tooltip<'a, Message, Renderer: self::Renderer> { content: Element<'a, Message, Renderer>, tooltip: Text, position: Position, - style: ::Style, + style: &'a dyn container::StyleSheet, gap: u16, padding: u16, } @@ -70,11 +70,11 @@ where } /// Sets the style of the [`Tooltip`]. - pub fn style( - mut self, - style: impl Into<::Style>, - ) -> Self { - self.style = style.into(); + pub fn style<'b>(mut self, style: &'b dyn container::StyleSheet) -> Self + where + 'b: 'a, + { + self.style = style; self } } @@ -160,9 +160,7 @@ where /// /// [`Tooltip`]: struct.Tooltip.html /// [renderer]: ../../renderer/index.html -pub trait Renderer: - crate::Renderer + text::Renderer + container::Renderer -{ +pub trait Renderer: crate::Renderer + text::Renderer { /// The default padding of a [`Tooltip`] drawn by this renderer. const DEFAULT_PADDING: u16; } -- 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/tooltip.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'native/src/widget/tooltip.rs') diff --git a/native/src/widget/tooltip.rs b/native/src/widget/tooltip.rs index 4e8483ad..c2bc8af0 100644 --- a/native/src/widget/tooltip.rs +++ b/native/src/widget/tooltip.rs @@ -7,7 +7,7 @@ use crate::event; use crate::layout; use crate::renderer; use crate::widget::container; -use crate::widget::text::{self, Text}; +use crate::widget::text::Text; use crate::{Clipboard, Element, Event, Hasher, Layout, Length, Point, Widget}; /// An element to display a widget over another. @@ -160,7 +160,7 @@ where /// /// [`Tooltip`]: struct.Tooltip.html /// [renderer]: ../../renderer/index.html -pub trait Renderer: crate::Renderer + text::Renderer { +pub trait Renderer: renderer::Text { /// The default padding of a [`Tooltip`] drawn by this renderer. const DEFAULT_PADDING: u16; } -- cgit From 5fee1e33d4a873c5e37e6c158257bcf54fd17452 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 28 Oct 2021 20:30:25 +0700 Subject: Implement `Widget::draw` for `Tooltip` --- native/src/widget/tooltip.rs | 154 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 123 insertions(+), 31 deletions(-) (limited to 'native/src/widget/tooltip.rs') diff --git a/native/src/widget/tooltip.rs b/native/src/widget/tooltip.rs index c2bc8af0..a00158f6 100644 --- a/native/src/widget/tooltip.rs +++ b/native/src/widget/tooltip.rs @@ -8,23 +8,29 @@ use crate::layout; use crate::renderer; use crate::widget::container; use crate::widget::text::Text; -use crate::{Clipboard, Element, Event, Hasher, Layout, Length, Point, Widget}; +use crate::{ + Clipboard, Element, Event, Hasher, Layout, Length, Padding, Point, Size, + Vector, Widget, +}; /// An element to display a widget over another. #[allow(missing_debug_implementations)] -pub struct Tooltip<'a, Message, Renderer: self::Renderer> { +pub struct Tooltip<'a, Message, Renderer: renderer::Text> { content: Element<'a, Message, Renderer>, tooltip: Text, position: Position, - style: &'a dyn container::StyleSheet, + style_sheet: &'a dyn container::StyleSheet, gap: u16, padding: u16, } impl<'a, Message, Renderer> Tooltip<'a, Message, Renderer> where - Renderer: self::Renderer, + Renderer: renderer::Text, { + /// The default padding of a [`Tooltip`] drawn by this renderer. + const DEFAULT_PADDING: u16 = 5; + /// Creates an empty [`Tooltip`]. /// /// [`Tooltip`]: struct.Tooltip.html @@ -37,9 +43,9 @@ where content: content.into(), tooltip: Text::new(tooltip.to_string()), position, - style: Default::default(), + style_sheet: Default::default(), gap: 0, - padding: Renderer::DEFAULT_PADDING, + padding: Self::DEFAULT_PADDING, } } @@ -70,11 +76,8 @@ where } /// Sets the style of the [`Tooltip`]. - pub fn style<'b>(mut self, style: &'b dyn container::StyleSheet) -> Self - where - 'b: 'a, - { - self.style = style; + pub fn style(mut self, style_sheet: &'a dyn container::StyleSheet) -> Self { + self.style_sheet = style_sheet; self } } @@ -97,7 +100,7 @@ pub enum Position { impl<'a, Message, Renderer> Widget for Tooltip<'a, Message, Renderer> where - Renderer: self::Renderer, + Renderer: renderer::Text, { fn width(&self) -> Length { self.content.width() @@ -136,13 +139,114 @@ where fn draw( &self, - _renderer: &mut Renderer, - style: &renderer::Style, - _layout: Layout<'_>, - _cursor_position: Point, - _viewport: &Rectangle, + renderer: &mut Renderer, + inherited_style: &renderer::Style, + layout: Layout<'_>, + cursor_position: Point, + viewport: &Rectangle, ) { - // TODO + self.content.draw( + renderer, + inherited_style, + layout, + cursor_position, + viewport, + ); + + let bounds = layout.bounds(); + + if bounds.contains(cursor_position) { + let gap = f32::from(self.gap); + let style = self.style_sheet.style(); + + let defaults = renderer::Style { + text_color: style + .text_color + .unwrap_or(inherited_style.text_color), + }; + + let text_layout = Widget::<(), Renderer>::layout( + &self.tooltip, + renderer, + &layout::Limits::new(Size::ZERO, viewport.size()) + .pad(Padding::new(self.padding)), + ); + + let padding = f32::from(self.padding); + let text_bounds = text_layout.bounds(); + let x_center = bounds.x + (bounds.width - text_bounds.width) / 2.0; + let y_center = + bounds.y + (bounds.height - text_bounds.height) / 2.0; + + let mut tooltip_bounds = { + let offset = match self.position { + Position::Top => Vector::new( + x_center, + bounds.y - text_bounds.height - gap - padding, + ), + Position::Bottom => Vector::new( + x_center, + bounds.y + bounds.height + gap + padding, + ), + Position::Left => Vector::new( + bounds.x - text_bounds.width - gap - padding, + y_center, + ), + Position::Right => Vector::new( + bounds.x + bounds.width + gap + padding, + y_center, + ), + Position::FollowCursor => Vector::new( + cursor_position.x, + cursor_position.y - text_bounds.height, + ), + }; + + Rectangle { + x: offset.x - padding, + y: offset.y - padding, + width: text_bounds.width + padding * 2.0, + height: text_bounds.height + padding * 2.0, + } + }; + + if tooltip_bounds.x < viewport.x { + tooltip_bounds.x = viewport.x; + } else if viewport.x + viewport.width + < tooltip_bounds.x + tooltip_bounds.width + { + tooltip_bounds.x = + viewport.x + viewport.width - tooltip_bounds.width; + } + + if tooltip_bounds.y < viewport.y { + tooltip_bounds.y = viewport.y; + } else if viewport.y + viewport.height + < tooltip_bounds.y + tooltip_bounds.height + { + tooltip_bounds.y = + viewport.y + viewport.height - tooltip_bounds.height; + } + + renderer.with_layer(*viewport, |renderer| { + container::draw_background(renderer, &style, tooltip_bounds); + + Widget::<(), Renderer>::draw( + &self.tooltip, + renderer, + &defaults, + Layout::with_offset( + Vector::new( + tooltip_bounds.x + padding, + tooltip_bounds.y + padding, + ), + &text_layout, + ), + cursor_position, + viewport, + ); + }); + } } fn hash_layout(&self, state: &mut Hasher) { @@ -153,22 +257,10 @@ where } } -/// The renderer of a [`Tooltip`]. -/// -/// Your [renderer] will need to implement this trait before being -/// able to use a [`Tooltip`] in your user interface. -/// -/// [`Tooltip`]: struct.Tooltip.html -/// [renderer]: ../../renderer/index.html -pub trait Renderer: renderer::Text { - /// The default padding of a [`Tooltip`] drawn by this renderer. - const DEFAULT_PADDING: u16; -} - impl<'a, Message, Renderer> From> for Element<'a, Message, Renderer> where - Renderer: 'a + self::Renderer, + Renderer: 'a + renderer::Text, Message: 'a, { fn from( -- 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/tooltip.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'native/src/widget/tooltip.rs') diff --git a/native/src/widget/tooltip.rs b/native/src/widget/tooltip.rs index a00158f6..a7f3a042 100644 --- a/native/src/widget/tooltip.rs +++ b/native/src/widget/tooltip.rs @@ -6,6 +6,7 @@ use iced_core::Rectangle; use crate::event; use crate::layout; use crate::renderer; +use crate::text; use crate::widget::container; use crate::widget::text::Text; use crate::{ @@ -15,7 +16,7 @@ use crate::{ /// An element to display a widget over another. #[allow(missing_debug_implementations)] -pub struct Tooltip<'a, Message, Renderer: renderer::Text> { +pub struct Tooltip<'a, Message, Renderer: text::Renderer> { content: Element<'a, Message, Renderer>, tooltip: Text, position: Position, @@ -26,7 +27,7 @@ pub struct Tooltip<'a, Message, Renderer: renderer::Text> { impl<'a, Message, Renderer> Tooltip<'a, Message, Renderer> where - Renderer: renderer::Text, + Renderer: text::Renderer, { /// The default padding of a [`Tooltip`] drawn by this renderer. const DEFAULT_PADDING: u16 = 5; @@ -100,7 +101,7 @@ pub enum Position { impl<'a, Message, Renderer> Widget for Tooltip<'a, Message, Renderer> where - Renderer: renderer::Text, + Renderer: text::Renderer, { fn width(&self) -> Length { self.content.width() @@ -260,7 +261,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 40a5de581144886571504b762719f057dbb2e871 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sun, 31 Oct 2021 17:02:59 +0700 Subject: Reintroduce `Box` for `style_sheet` in `Container` --- native/src/widget/tooltip.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'native/src/widget/tooltip.rs') diff --git a/native/src/widget/tooltip.rs b/native/src/widget/tooltip.rs index a7f3a042..5a6cd923 100644 --- a/native/src/widget/tooltip.rs +++ b/native/src/widget/tooltip.rs @@ -20,7 +20,7 @@ pub struct Tooltip<'a, Message, Renderer: text::Renderer> { content: Element<'a, Message, Renderer>, tooltip: Text, position: Position, - style_sheet: &'a dyn container::StyleSheet, + style_sheet: Box, gap: u16, padding: u16, } @@ -77,8 +77,11 @@ where } /// Sets the style of the [`Tooltip`]. - pub fn style(mut self, style_sheet: &'a dyn container::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/tooltip.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'native/src/widget/tooltip.rs') diff --git a/native/src/widget/tooltip.rs b/native/src/widget/tooltip.rs index 5a6cd923..c35005e0 100644 --- a/native/src/widget/tooltip.rs +++ b/native/src/widget/tooltip.rs @@ -5,6 +5,7 @@ use iced_core::Rectangle; use crate::event; use crate::layout; +use crate::mouse; use crate::renderer; use crate::text; use crate::widget::container; @@ -141,6 +142,16 @@ where ) } + fn mouse_interaction( + &self, + layout: Layout<'_>, + cursor_position: Point, + viewport: &Rectangle, + ) -> mouse::Interaction { + self.content + .mouse_interaction(layout, cursor_position, viewport) + } + fn draw( &self, renderer: &mut Renderer, -- cgit