1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
use crate::*;
pub fn show_tooltip(ctx: &CtxRef, add_contents: impl FnOnce(&mut Ui)) {
let tooltip_rect = ctx.frame_state().tooltip_rect;
let window_pos = if let Some(tooltip_rect) = tooltip_rect {
tooltip_rect.left_bottom()
} else if let Some(mouse_pos) = ctx.input().mouse.pos {
let expected_size = vec2(ctx.style().spacing.tooltip_width, 32.0);
let position = mouse_pos + vec2(16.0, 16.0);
let position = position.min(ctx.input().screen_rect().right_bottom() - expected_size);
let position = position.max(ctx.input().screen_rect().left_top());
position
} else if ctx.memory().everything_is_visible() {
Pos2::default()
} else {
return;
};
let id = Id::tooltip();
let response = show_popup(ctx, id, window_pos, add_contents);
let tooltip_rect = tooltip_rect.unwrap_or_else(Rect::nothing);
ctx.frame_state().tooltip_rect = Some(tooltip_rect.union(response.rect));
}
pub fn show_tooltip_text(ctx: &CtxRef, text: impl Into<String>) {
show_tooltip(ctx, |ui| {
ui.add(crate::widgets::Label::new(text));
})
}
fn show_popup(
ctx: &CtxRef,
id: Id,
window_pos: Pos2,
add_contents: impl FnOnce(&mut Ui),
) -> Response {
use containers::*;
Area::new(id)
.order(Order::Tooltip)
.fixed_pos(window_pos)
.interactable(false)
.show(ctx, |ui| {
Frame::popup(&ctx.style()).show(ui, |ui| {
ui.set_max_width(ui.style().spacing.tooltip_width);
add_contents(ui);
})
})
}