diff options
author | 2021-02-27 03:47:13 +0100 | |
---|---|---|
committer | 2021-02-27 03:47:13 +0100 | |
commit | c51b771519c5da5a4d5cd39eaadfe763c1e60978 (patch) | |
tree | 509a1a3877ecf4de935fe5753097c90d2aff019a /graphics | |
parent | f52f8c1337f42cf9483abb40784129f4effbe48e (diff) | |
download | iced-c51b771519c5da5a4d5cd39eaadfe763c1e60978.tar.gz iced-c51b771519c5da5a4d5cd39eaadfe763c1e60978.tar.bz2 iced-c51b771519c5da5a4d5cd39eaadfe763c1e60978.zip |
Reposition `Tooltip` inside `viewport` bounds
... only when out of bounds.
Diffstat (limited to 'graphics')
-rw-r--r-- | graphics/src/widget/tooltip.rs | 97 |
1 files changed, 60 insertions, 37 deletions
diff --git a/graphics/src/widget/tooltip.rs b/graphics/src/widget/tooltip.rs index 51b465a5..1a1b5352 100644 --- a/graphics/src/widget/tooltip.rs +++ b/graphics/src/widget/tooltip.rs @@ -58,60 +58,83 @@ where }, }; - let tooltip_layout = Widget::<(), Self>::layout( + let text_layout = Widget::<(), Self>::layout( tooltip, self, &layout::Limits::new(Size::ZERO, viewport.size()) .pad(f32::from(padding)), ); - let tooltip_bounds = tooltip_layout.bounds(); - - let x_center = - bounds.x + (bounds.width - tooltip_bounds.width) / 2.0; - + 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 - tooltip_bounds.height) / 2.0; - - let offset = match position { - Position::Top => Vector::new( - x_center, - bounds.y - tooltip_bounds.height - gap - padding, - ), - Position::Bottom => Vector::new( - x_center, - bounds.y + bounds.height + gap + padding, - ), - Position::Left => Vector::new( - bounds.x - tooltip_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 - tooltip_bounds.height, - ), + bounds.y + (bounds.height - text_bounds.height) / 2.0; + + let mut tooltip_bounds = { + let offset = match 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; + } + let (tooltip, _) = Widget::<(), Self>::draw( tooltip, self, &defaults, - Layout::with_offset(offset, &tooltip_layout), + Layout::with_offset( + Vector::new( + tooltip_bounds.x + padding, + tooltip_bounds.y + padding, + ), + &text_layout, + ), cursor_position, viewport, ); - let tooltip_bounds = Rectangle { - x: offset.x - padding, - y: offset.y - padding, - width: tooltip_bounds.width + padding * 2.0, - height: tooltip_bounds.height + padding * 2.0, - }; - ( Primitive::Group { primitives: vec![ |