use gpui::Pixels;
pub fn inner_corner_radius(
parent_radius: Pixels,
parent_border: Pixels,
parent_padding: Pixels,
self_border: Pixels,
) -> Pixels {
(parent_radius - parent_border - parent_padding + self_border).max(Pixels::ZERO)
}
pub struct CornerSolver {
root_radius: Pixels,
root_border: Pixels,
root_padding: Pixels,
children: Vec<(Pixels, Pixels)>, }
impl CornerSolver {
pub fn new(root_radius: Pixels, root_border: Pixels, root_padding: Pixels) -> Self {
Self {
root_radius,
root_border,
root_padding,
children: Vec::new(),
}
}
pub fn add_child(mut self, border: Pixels, padding: Pixels) -> Self {
self.children.push((border, padding));
self
}
pub fn corner_radius(&self, level: usize) -> Pixels {
if level == 0 {
return (self.root_radius - self.root_border - self.root_padding).max(Pixels::ZERO);
}
if level >= self.children.len() {
return Pixels::ZERO;
}
let mut r = (self.root_radius - self.root_border - self.root_padding).max(Pixels::ZERO);
for i in 0..level {
let (b, p) = self.children[i];
r = (r - b - p).max(Pixels::ZERO);
}
r
}
}