geng_ui/layout_widgets/
padding.rs1use 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}