feat: Simplify split function (#411)

This commit is contained in:
Dheepak Krishnamurthy 2023-08-18 10:43:03 -04:00 committed by GitHub
parent 56455e0fee
commit b090101b23
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -493,17 +493,11 @@ fn try_split(area: Rect, layout: &Layout) -> Result<Rc<[Rect]>, AddConstraintErr
let mut solver = Solver::new(); let mut solver = Solver::new();
let inner = area.inner(&layout.margin); let inner = area.inner(&layout.margin);
let (start, end) = match layout.direction { let (area_start, area_end) = match layout.direction {
Direction::Horizontal => (inner.x, inner.right()), Direction::Horizontal => (f64::from(inner.x), f64::from(inner.right())),
Direction::Vertical => (inner.y, inner.bottom()), Direction::Vertical => (f64::from(inner.y), f64::from(inner.bottom())),
}; };
let area_size = area_end - area_start;
// setup the bounds of the area
let area = Element::new();
solver.add_constraints(&[
area.start | EQ(REQUIRED) | f64::from(start),
area.end | EQ(REQUIRED) | f64::from(end),
])?;
// create an element for each constraint that needs to be applied. Each element defines the // create an element for each constraint that needs to be applied. Each element defines the
// variables that will be used to compute the layout. // variables that will be used to compute the layout.
@ -516,8 +510,8 @@ fn try_split(area: Rect, layout: &Layout) -> Result<Rc<[Rect]>, AddConstraintErr
// ensure that all the elements are inside the area // ensure that all the elements are inside the area
for element in &elements { for element in &elements {
solver.add_constraints(&[ solver.add_constraints(&[
element.start | GE(REQUIRED) | area.start, element.start | GE(REQUIRED) | area_start,
element.end | LE(REQUIRED) | area.end, element.end | LE(REQUIRED) | area_end,
element.start | LE(REQUIRED) | element.end, element.start | LE(REQUIRED) | element.end,
])?; ])?;
} }
@ -527,12 +521,12 @@ fn try_split(area: Rect, layout: &Layout) -> Result<Rc<[Rect]>, AddConstraintErr
} }
// ensure the first element touches the left/top edge of the area // ensure the first element touches the left/top edge of the area
if let Some(first) = elements.first() { if let Some(first) = elements.first() {
solver.add_constraint(first.start | EQ(REQUIRED) | area.start)?; solver.add_constraint(first.start | EQ(REQUIRED) | area_start)?;
} }
// ensure the last element touches the right/bottom edge of the area // ensure the last element touches the right/bottom edge of the area
if layout.expand_to_fill { if layout.expand_to_fill {
if let Some(last) = elements.last() { if let Some(last) = elements.last() {
solver.add_constraint(last.end | EQ(REQUIRED) | area.end)?; solver.add_constraint(last.end | EQ(REQUIRED) | area_end)?;
} }
} }
// apply the constraints // apply the constraints
@ -540,12 +534,12 @@ fn try_split(area: Rect, layout: &Layout) -> Result<Rc<[Rect]>, AddConstraintErr
match constraint { match constraint {
Constraint::Percentage(p) => { Constraint::Percentage(p) => {
let percent = f64::from(p) / 100.00; let percent = f64::from(p) / 100.00;
solver.add_constraint(element.size() | EQ(STRONG) | (area.size() * percent))?; solver.add_constraint(element.size() | EQ(STRONG) | (area_size * percent))?;
} }
Constraint::Ratio(n, d) => { Constraint::Ratio(n, d) => {
// avoid division by zero by using 1 when denominator is 0 // avoid division by zero by using 1 when denominator is 0
let ratio = f64::from(n) / f64::from(d.max(1)); let ratio = f64::from(n) / f64::from(d.max(1));
solver.add_constraint(element.size() | EQ(STRONG) | (area.size() * ratio))?; solver.add_constraint(element.size() | EQ(STRONG) | (area_size * ratio))?;
} }
Constraint::Length(l) => { Constraint::Length(l) => {
solver.add_constraint(element.size() | EQ(STRONG) | f64::from(l))? solver.add_constraint(element.size() | EQ(STRONG) | f64::from(l))?