geng_ui/layout_widgets/
padding.rs

1use super::*;
2
3pub struct Padding<T> {
4    top: f64,
5    right: f64,
6    bottom: f64,
7    left: f64,
8    child: T,
9}
10
11impl<T, R: AsRef<T>> AsRef<T> for Padding<R> {
12    fn as_ref(&self) -> &T {
13        self.child.as_ref()
14    }
15}
16
17impl<T, R: AsMut<T>> AsMut<T> for Padding<R> {
18    fn as_mut(&mut self) -> &mut T {
19        self.child.as_mut()
20    }
21}
22
23mod ext {
24    use super::*;
25
26    pub trait WidgetExt: Widget + Sized {
27        fn padding(self, top: f64, right: f64, bottom: f64, left: f64) -> Padding<Self> {
28            Padding {
29                top,
30                right,
31                bottom,
32                left,
33                child: self,
34            }
35        }
36        fn uniform_padding(self, padding: f64) -> Padding<Self> {
37            self.padding(padding, padding, padding, padding)
38        }
39        fn padding_top(self, padding: f64) -> Padding<Self> {
40            self.padding(padding, 0.0, 0.0, 0.0)
41        }
42        fn padding_right(self, padding: f64) -> Padding<Self> {
43            self.padding(0.0, padding, 0.0, 0.0)
44        }
45        fn padding_bottom(self, padding: f64) -> Padding<Self> {
46            self.padding(0.0, 0.0, padding, 0.0)
47        }
48        fn padding_left(self, padding: f64) -> Padding<Self> {
49            self.padding(0.0, 0.0, 0.0, padding)
50        }
51        fn padding_horizontal(self, padding: f64) -> Padding<Self> {
52            self.padding(0.0, padding, 0.0, padding)
53        }
54        fn padding_vertical(self, padding: f64) -> Padding<Self> {
55            self.padding(padding, 0.0, padding, 0.0)
56        }
57    }
58
59    impl<T: Widget> WidgetExt for T {}
60}
61
62pub use ext::WidgetExt as _;
63
64impl<T: Widget> Widget for Padding<T> {
65    fn calc_constraints(&mut self, children: &ConstraintsContext) -> Constraints {
66        let mut result = children.get_constraints(&self.child);
67        result.min_size += vec2(self.left + self.right, self.bottom + self.top);
68        result
69    }
70    fn layout_children(&mut self, cx: &mut LayoutContext) {
71        cx.set_position(
72            &self.child,
73            cx.position
74                .extend_left(-self.left)
75                .extend_right(-self.right)
76                .extend_down(-self.bottom)
77                .extend_up(-self.top),
78        )
79    }
80    fn walk_children_mut<'a>(&mut self, f: &mut dyn FnMut(&mut dyn Widget)) {
81        f(&mut self.child);
82    }
83}