Change Tooltip to support Text only for now
This commit is contained in:
parent
a19f89d3a6
commit
81c75c1524
15 changed files with 171 additions and 302 deletions
|
|
@ -1,7 +1,10 @@
|
|||
//! Decorate content and apply alignment.
|
||||
use crate::backend::{self, Backend};
|
||||
use crate::defaults::Defaults;
|
||||
use crate::{Backend, Renderer};
|
||||
use iced_native::{Element, Layout, Point, Rectangle};
|
||||
use crate::{Primitive, Renderer, Vector};
|
||||
|
||||
use iced_native::layout::{self, Layout};
|
||||
use iced_native::{Element, Point, Rectangle, Size, Text};
|
||||
|
||||
/// An element decorating some content.
|
||||
///
|
||||
|
|
@ -10,9 +13,11 @@ use iced_native::{Element, Layout, Point, Rectangle};
|
|||
pub type Tooltip<'a, Message, Backend> =
|
||||
iced_native::Tooltip<'a, Message, Renderer<Backend>>;
|
||||
|
||||
pub use iced_native::tooltip::Position;
|
||||
|
||||
impl<B> iced_native::tooltip::Renderer for Renderer<B>
|
||||
where
|
||||
B: Backend,
|
||||
B: Backend + backend::Text,
|
||||
{
|
||||
type Style = ();
|
||||
|
||||
|
|
@ -20,10 +25,14 @@ where
|
|||
&mut self,
|
||||
defaults: &Defaults,
|
||||
cursor_position: Point,
|
||||
content: &Element<'_, Message, Self>,
|
||||
content_layout: Layout<'_>,
|
||||
viewport: &Rectangle,
|
||||
content: &Element<'_, Message, Self>,
|
||||
tooltip: &Text<Self>,
|
||||
position: Position,
|
||||
) -> Self::Output {
|
||||
let bounds = content_layout.bounds();
|
||||
|
||||
let (content, mouse_interaction) = content.draw(
|
||||
self,
|
||||
&defaults,
|
||||
|
|
@ -32,6 +41,63 @@ where
|
|||
viewport,
|
||||
);
|
||||
|
||||
(content, mouse_interaction)
|
||||
if bounds.contains(cursor_position) {
|
||||
use iced_native::Widget;
|
||||
|
||||
let tooltip_layout = Widget::<(), Self>::layout(
|
||||
tooltip,
|
||||
self,
|
||||
&layout::Limits::new(Size::ZERO, viewport.size()),
|
||||
);
|
||||
|
||||
let tooltip_bounds = tooltip_layout.bounds();
|
||||
|
||||
let x_center =
|
||||
bounds.x + (bounds.width - tooltip_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)
|
||||
}
|
||||
Position::Bottom => {
|
||||
Vector::new(x_center, bounds.y + bounds.height)
|
||||
}
|
||||
Position::Left => {
|
||||
Vector::new(bounds.x - tooltip_bounds.width, y_center)
|
||||
}
|
||||
Position::Right => {
|
||||
Vector::new(bounds.x + bounds.width, y_center)
|
||||
}
|
||||
Position::FollowCursor => Vector::new(
|
||||
cursor_position.x,
|
||||
cursor_position.y - tooltip_bounds.height,
|
||||
),
|
||||
};
|
||||
|
||||
let (tooltip, _) = Widget::<(), Self>::draw(
|
||||
tooltip,
|
||||
self,
|
||||
defaults,
|
||||
Layout::with_offset(offset, &tooltip_layout),
|
||||
cursor_position,
|
||||
viewport,
|
||||
);
|
||||
|
||||
(
|
||||
Primitive::Clip {
|
||||
bounds: *viewport,
|
||||
offset: Vector::new(0, 0),
|
||||
content: Box::new(Primitive::Group {
|
||||
primitives: vec![content, tooltip],
|
||||
}),
|
||||
},
|
||||
mouse_interaction,
|
||||
)
|
||||
} else {
|
||||
(content, mouse_interaction)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue