From ebcaf242e94c02e6abab49bd0f650b25328f6793 Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Mon, 2 Oct 2023 08:27:00 -0400 Subject: [PATCH] fix(color-picker): tooltip --- src/widget/color_picker/mod.rs | 11 ++++++ src/widget/text_input/input.rs | 69 ++++++++++++++++++++++++++++++++-- 2 files changed, 77 insertions(+), 3 deletions(-) diff --git a/src/widget/color_picker/mod.rs b/src/widget/color_picker/mod.rs index 0a60596c..1d06af36 100644 --- a/src/widget/color_picker/mod.rs +++ b/src/widget/color_picker/mod.rs @@ -617,6 +617,17 @@ where ); } + fn overlay<'b>( + &'b mut self, + state: &'b mut Tree, + layout: Layout<'_>, + renderer: &crate::Renderer, + ) -> Option> { + self.inner + .as_widget_mut() + .overlay(&mut state.children[0], layout, renderer) + } + fn on_event( &mut self, tree: &mut Tree, diff --git a/src/widget/text_input/input.rs b/src/widget/text_input/input.rs index 09eb8b92..4cb94894 100644 --- a/src/widget/text_input/input.rs +++ b/src/widget/text_input/input.rs @@ -17,8 +17,8 @@ use apply::Apply; use iced::Limits; use iced_core::event::{self, Event}; use iced_core::keyboard; -use iced_core::layout; use iced_core::mouse::{self, click}; +use iced_core::overlay::Group; use iced_core::renderer::{self, Renderer as CoreRenderer}; use iced_core::text::{self, Renderer, Text}; use iced_core::time::{Duration, Instant}; @@ -28,6 +28,7 @@ use iced_core::widget::tree::{self, Tree}; use iced_core::widget::Id; use iced_core::window; use iced_core::{alignment, Background}; +use iced_core::{layout, overlay}; use iced_core::{ Clipboard, Color, Element, Layout, Length, Padding, Pixels, Point, Rectangle, Shell, Size, Vector, Widget, @@ -556,6 +557,40 @@ where operation.text_input(state, self.id.as_ref()); } + fn overlay<'b>( + &'b mut self, + tree: &'b mut Tree, + layout: Layout<'_>, + renderer: &crate::Renderer, + ) -> Option> { + let mut layout_ = Vec::with_capacity(2); + if self.leading_icon.is_some() { + let mut children = self.text_layout(layout).children(); + children.next(); + layout_.push(children.next().unwrap()); + } + if self.trailing_icon.is_some() { + let mut children = self.text_layout(layout).children(); + children.next(); + if self.leading_icon.is_some() { + children.next(); + } + layout_.push(children.next().unwrap()); + }; + let children = self + .leading_icon + .iter_mut() + .chain(self.trailing_icon.iter_mut()) + .zip(&mut tree.children) + .zip(layout_) + .filter_map(|((child, state), layout)| { + child.as_widget_mut().overlay(state, layout, renderer) + }) + .collect::>(); + + (!children.is_empty()).then(|| Group::with_children(children).overlay()) + } + fn on_event( &mut self, tree: &mut Tree, @@ -580,7 +615,21 @@ where return leading_icon.as_widget_mut().on_event( tree, event.clone(), - layout, + leading_icon_layout, + cursor_position, + renderer, + clipboard, + shell, + viewport, + ); + } else if matches!( + event, + Event::Mouse(mouse::Event::CursorMoved { .. } | mouse::Event::CursorLeft) + ) { + leading_icon.as_widget_mut().on_event( + tree, + event.clone(), + leading_icon_layout, cursor_position, renderer, clipboard, @@ -604,7 +653,21 @@ where return trailing_icon.as_widget_mut().on_event( tree, event.clone(), - layout, + trailing_icon_layout, + cursor_position, + renderer, + clipboard, + shell, + viewport, + ); + } else if matches!( + event, + Event::Mouse(mouse::Event::CursorMoved { .. } | mouse::Event::CursorLeft) + ) { + trailing_icon.as_widget_mut().on_event( + tree, + event.clone(), + trailing_icon_layout, cursor_position, renderer, clipboard,