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
use crate::draw::Primitive;
use crate::layout::{Rectangle, Size};
use crate::stylesheet::Stylesheet;
use crate::widget::*;
pub struct Frame<'a, T> {
content: Node<'a, T>,
}
impl<'a, T: 'a> Frame<'a, T> {
pub fn new(content: impl IntoNode<'a, T>) -> Self {
Self {
content: content.into_node(),
}
}
}
impl<'a, T: 'a> Widget<'a, T> for Frame<'a, T> {
fn widget(&self) -> &'static str {
"frame"
}
fn len(&self) -> usize {
1
}
fn visit_children(&mut self, visitor: &mut dyn FnMut(&mut Node<'a, T>)) {
visitor(&mut self.content);
}
fn size(&self, style: &Stylesheet) -> (Size, Size) {
style
.background
.resolve_size((style.width, style.height), self.content.size(), style.padding)
}
fn event(
&mut self,
layout: Rectangle,
clip: Rectangle,
style: &Stylesheet,
event: Event,
context: &mut Context<T>,
) {
self.content.event(
style.background.content_rect(layout, style.padding),
clip,
event,
context,
);
}
fn draw(&mut self, layout: Rectangle, clip: Rectangle, style: &Stylesheet) -> Vec<Primitive<'a>> {
let content_rect = style.background.content_rect(layout, style.padding);
style
.background
.render(layout)
.into_iter()
.chain(self.content.draw(content_rect, clip).into_iter())
.collect()
}
}
impl<'a, T: 'a> IntoNode<'a, T> for Frame<'a, T> {
fn into_node(self) -> Node<'a, T> {
Node::new(self)
}
}