use crate::align::Alignment;
use embedded_graphics::primitives::Rectangle;
pub trait ElementSpacing: Copy + Clone {
fn align(
&self,
alignment: impl Alignment,
view: Rectangle,
reference: Rectangle,
n: usize,
objects: usize,
total_size: u32,
) -> i32;
}
#[derive(Copy, Clone)]
pub struct Tight;
impl ElementSpacing for Tight {
#[inline]
fn align(
&self,
alignment: impl Alignment,
view: Rectangle,
reference: Rectangle,
_n: usize,
_objects: usize,
_total_size: u32,
) -> i32 {
alignment.align_with_offset(view, reference, 0)
}
}
#[derive(Copy, Clone)]
pub struct FixedMargin(pub i32);
impl ElementSpacing for FixedMargin {
#[inline]
fn align(
&self,
alignment: impl Alignment,
view: Rectangle,
reference: Rectangle,
n: usize,
_objects: usize,
_total_size: u32,
) -> i32 {
let offset = if n == 0 { 0 } else { self.0 };
alignment.align_with_offset(view, reference, offset)
}
}
#[derive(Copy, Clone)]
pub struct DistributeFill(pub u32);
impl ElementSpacing for DistributeFill {
#[inline]
fn align(
&self,
alignment: impl Alignment,
view: Rectangle,
reference: Rectangle,
n: usize,
objects: usize,
total_size: u32,
) -> i32 {
let empty_space = self.0 as i32 - total_size as i32;
if objects <= 1 {
return alignment.align_with_offset(view, reference, empty_space / 2);
}
let base = empty_space / (objects - 1) as i32;
let remainder = empty_space % (objects - 1) as i32;
let offset = if n == 0 {
0
} else if n as i32 <= remainder {
base + 1
} else {
base
};
alignment.align_with_offset(view, reference, offset)
}
}