Skip to main content

cranpose_ui/modifier/
padding.rs

1use super::{inspector_metadata, EdgeInsets, InspectorMetadata, Modifier};
2use crate::modifier_nodes::PaddingElement;
3
4impl Modifier {
5    /// Add uniform padding to all sides.
6    ///
7    /// Example: `Modifier::empty().padding(16.0)`
8    pub fn padding(self, p: f32) -> Self {
9        let padding = EdgeInsets::uniform(p);
10        let modifier = Self::with_element(PaddingElement::new(padding))
11            .with_inspector_metadata(padding_metadata(padding));
12        self.then(modifier)
13    }
14
15    /// Add horizontal padding (left and right).
16    ///
17    /// Example: `Modifier::empty().padding_horizontal(16.0)`
18    pub fn padding_horizontal(self, horizontal: f32) -> Self {
19        let padding = EdgeInsets::horizontal(horizontal);
20        let modifier = Self::with_element(PaddingElement::new(padding))
21            .with_inspector_metadata(padding_metadata(padding));
22        self.then(modifier)
23    }
24
25    /// Add vertical padding (top and bottom).
26    ///
27    /// Example: `Modifier::empty().padding_vertical(8.0)`
28    pub fn padding_vertical(self, vertical: f32) -> Self {
29        let padding = EdgeInsets::vertical(vertical);
30        let modifier = Self::with_element(PaddingElement::new(padding))
31            .with_inspector_metadata(padding_metadata(padding));
32        self.then(modifier)
33    }
34
35    /// Add symmetric padding (horizontal and vertical).
36    ///
37    /// Example: `Modifier::empty().padding_symmetric(16.0, 8.0)`
38    pub fn padding_symmetric(self, horizontal: f32, vertical: f32) -> Self {
39        let padding = EdgeInsets::symmetric(horizontal, vertical);
40        let modifier = Self::with_element(PaddingElement::new(padding))
41            .with_inspector_metadata(padding_metadata(padding));
42        self.then(modifier)
43    }
44
45    /// Add padding to each side individually.
46    ///
47    /// Example: `Modifier::empty().padding_each(8.0, 4.0, 8.0, 4.0)`
48    pub fn padding_each(self, left: f32, top: f32, right: f32, bottom: f32) -> Self {
49        let padding = EdgeInsets::from_components(left, top, right, bottom);
50        let modifier = Self::with_element(PaddingElement::new(padding))
51            .with_inspector_metadata(padding_metadata(padding));
52        self.then(modifier)
53    }
54
55    /// Add padding in reading order: `start` is the left edge in a
56    /// left-to-right layout and the right edge in a right-to-left one.
57    ///
58    /// The direction comes from `crate::layout_direction`, so a screen that
59    /// reverses direction reverses this padding with it.
60    ///
61    /// Example: `Modifier::empty().padding_relative(16.0, 8.0, 4.0, 8.0)`
62    pub fn padding_relative(self, start: f32, top: f32, end: f32, bottom: f32) -> Self {
63        self.padding_relative_in(
64            crate::layout_direction::layout_direction(),
65            start,
66            top,
67            end,
68            bottom,
69        )
70    }
71
72    /// Add reading-order padding resolved against an explicit direction, for
73    /// callers that already know it — a layout that measured one, a test.
74    pub fn padding_relative_in(
75        self,
76        direction: crate::layout_direction::LayoutDirection,
77        start: f32,
78        top: f32,
79        end: f32,
80        bottom: f32,
81    ) -> Self {
82        let (left, right) = direction.resolve(start, end);
83        self.padding_each(left, top, right, bottom)
84    }
85}
86
87fn padding_metadata(padding: EdgeInsets) -> InspectorMetadata {
88    inspector_metadata("padding", |info| {
89        info.add_property("paddingLeft", padding.left.to_string());
90        info.add_property("paddingTop", padding.top.to_string());
91        info.add_property("paddingRight", padding.right.to_string());
92        info.add_property("paddingBottom", padding.bottom.to_string());
93    })
94}