forked from linebender/xilem
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpadding.rs
66 lines (57 loc) · 1.93 KB
/
padding.rs
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
use glazier::kurbo::{Affine, Size, Vec2};
use vello::{SceneBuilder, SceneFragment};
use crate::{
widget::{BoxConstraints, Event},
Widget,
};
pub struct PaddingWidget<W: Widget> {
pub(crate) widget: W,
pub width: f64,
}
impl<W: Widget> PaddingWidget<W> {
pub fn new(widget: W, width: f64) -> Self {
Self { widget, width }
}
}
impl<W: Widget> Widget for PaddingWidget<W> {
fn event(&mut self, cx: &mut crate::widget::EventCx, event: &Event) {
let mut new = event.clone();
match new {
Event::MouseDown(ref mut mouse)
| Event::MouseUp(ref mut mouse)
| Event::MouseMove(ref mut mouse)
| Event::MouseWheel(ref mut mouse) => {
mouse.pos -= Vec2::new(self.width, self.width);
}
_ => {}
}
self.widget.event(cx, &new)
}
fn lifecycle(
&mut self,
cx: &mut crate::widget::contexts::LifeCycleCx,
event: &crate::widget::LifeCycle,
) {
self.widget.lifecycle(cx, event)
}
fn update(&mut self, cx: &mut crate::widget::UpdateCx) {
cx.request_layout();
self.widget.update(cx)
}
fn layout(&mut self, cx: &mut crate::widget::LayoutCx, bc: &BoxConstraints) -> Size {
let padding_size = Size::new(self.width * 2., self.width * 2.);
let bc = bc.shrink(padding_size);
let result = self.widget.layout(cx, &bc) + padding_size;
result
}
fn paint(&mut self, cx: &mut crate::widget::PaintCx, builder: &mut SceneBuilder) {
let mut fragment = SceneFragment::new();
let mut sub_builder = SceneBuilder::for_fragment(&mut fragment);
self.widget.paint(cx, &mut sub_builder);
sub_builder.finish();
builder.append(&fragment, Some(Affine::translate((self.width, self.width))));
}
fn accessibility(&mut self, cx: &mut crate::widget::AccessCx) {
self.widget.accessibility(cx)
}
}