azul_layout/solver3/
geometry.rs1use azul_core::{
4 geom::{LogicalPosition, LogicalRect, LogicalSize},
5 ui_solver::ResolvedOffsets,
6};
7use azul_css::props::layout::LayoutWritingMode;
8
9#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
11pub enum BoxSizing {
12 #[default]
13 ContentBox,
14 BorderBox,
15}
16
17#[derive(Debug, Clone, PartialEq, PartialOrd)]
18pub struct PositionedRectangle {
19 pub bounds: LogicalRect,
21 pub margin: ResolvedOffsets,
23 pub border: ResolvedOffsets,
25 pub padding: ResolvedOffsets,
27}
28
29#[derive(Debug, Clone, Copy, Default)]
31pub struct EdgeSizes {
32 pub top: f32,
33 pub right: f32,
34 pub bottom: f32,
35 pub left: f32,
36}
37
38impl EdgeSizes {
39 pub fn main_start(&self, wm: LayoutWritingMode) -> f32 {
41 match wm {
42 LayoutWritingMode::HorizontalTb => self.top,
43 LayoutWritingMode::VerticalRl | LayoutWritingMode::VerticalLr => self.left,
44 }
45 }
46
47 pub fn main_end(&self, wm: LayoutWritingMode) -> f32 {
49 match wm {
50 LayoutWritingMode::HorizontalTb => self.bottom,
51 LayoutWritingMode::VerticalRl | LayoutWritingMode::VerticalLr => self.right,
52 }
53 }
54
55 pub fn main_sum(&self, wm: LayoutWritingMode) -> f32 {
57 self.main_start(wm) + self.main_end(wm)
58 }
59
60 pub fn cross_start(&self, wm: LayoutWritingMode) -> f32 {
62 match wm {
63 LayoutWritingMode::HorizontalTb => self.left,
64 LayoutWritingMode::VerticalRl | LayoutWritingMode::VerticalLr => self.top,
65 }
66 }
67
68 pub fn cross_end(&self, wm: LayoutWritingMode) -> f32 {
70 match wm {
71 LayoutWritingMode::HorizontalTb => self.right,
72 LayoutWritingMode::VerticalRl | LayoutWritingMode::VerticalLr => self.bottom,
73 }
74 }
75
76 pub fn cross_sum(&self, wm: LayoutWritingMode) -> f32 {
78 self.cross_start(wm) + self.cross_end(wm)
79 }
80}
81
82#[derive(Debug, Clone, Copy, Default)]
84pub struct BoxProps {
85 pub margin: EdgeSizes,
86 pub padding: EdgeSizes,
87 pub border: EdgeSizes,
88}
89
90impl BoxProps {
91 pub fn inner_size(&self, outer_size: LogicalSize, wm: LayoutWritingMode) -> LogicalSize {
94 let outer_main = outer_size.main(wm);
95 let outer_cross = outer_size.cross(wm);
96
97 let cross_axis_spacing = self.padding.cross_sum(wm) + self.border.cross_sum(wm);
99
100 let main_axis_spacing = self.padding.main_sum(wm) + self.border.main_sum(wm);
102
103 let inner_main = (outer_main - main_axis_spacing).max(0.0);
104 let inner_cross = (outer_cross - cross_axis_spacing).max(0.0);
105
106 LogicalSize::from_main_cross(inner_main, inner_cross, wm)
107 }
108}
109
110pub use azul_css::props::layout::{LayoutClear, LayoutFloat};
112
113#[derive(Debug, Clone, Copy, Default)]
116pub struct IntrinsicSizes {
117 pub min_content_width: f32,
119 pub max_content_width: f32,
121 pub preferred_width: Option<f32>,
123 pub min_content_height: f32,
125 pub max_content_height: f32,
127 pub preferred_height: Option<f32>,
129}
130
131impl IntrinsicSizes {
132 pub fn zero() -> Self {
134 Self::default()
135 }
136}