use glam::{vec2, Vec2};
#[derive(Clone, Copy, PartialEq, Eq, Debug, PartialOrd, Ord, Default)]
pub enum WrapBehavior {
Disable = 0,
#[default]
Allow = 1,
Enable = 2,
}
impl From<bool> for WrapBehavior {
#[inline]
fn from(value: bool) -> Self {
match value {
true => Self::Enable,
false => Self::Disable,
}
}
}
impl WrapBehavior {
#[inline]
pub fn is_allowed(&self) -> bool {
*self != Self::Disable
}
#[inline]
pub fn is_enabled(&self) -> bool {
*self == Self::Enable
}
}
#[derive(Clone, Copy, PartialEq, Eq, Debug, Default, PartialOrd, Ord)]
pub enum Alignment {
#[default]
Begin = 0,
Center = 1,
End = 2,
}
#[derive(Clone, Copy, PartialEq, Eq, Debug, Default, PartialOrd, Ord)]
pub struct Alignment2d {
pub horizontal: Alignment,
pub vertical: Alignment,
}
impl Alignment2d {
#[inline]
pub const fn all(alignment: Alignment) -> Self {
Self {
horizontal: alignment,
vertical: alignment,
}
}
}
impl From<(Alignment, Alignment)> for Alignment2d {
#[inline]
fn from((horizontal, vertical): (Alignment, Alignment)) -> Self {
Self { horizontal, vertical }
}
}
impl From<[Alignment; 2]> for Alignment2d {
#[inline]
fn from([horizontal, vertical]: [Alignment; 2]) -> Self {
Self { horizontal, vertical }
}
}
impl From<Alignment> for Alignment2d {
#[inline]
fn from(alignment: Alignment) -> Self {
Self::all(alignment)
}
}
#[derive(Default, Debug, Clone, Copy, PartialEq)]
pub enum Size {
#[default]
Auto,
Absolute(f32),
Relative(f32),
Remaining(f32),
}
impl From<f32> for Size {
#[inline]
fn from(value: f32) -> Self {
Self::Absolute(value)
}
}
#[derive(Default, Debug, Clone, Copy, PartialEq)]
pub struct Size2d {
pub width: Size,
pub height: Size,
}
impl From<(Size, Size)> for Size2d {
#[inline]
fn from((width, height): (Size, Size)) -> Self {
Self { width, height }
}
}
impl From<Size> for Size2d {
#[inline]
fn from(size: Size) -> Self {
Self {
width: size,
height: size,
}
}
}
#[derive(Default, Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub enum Direction {
#[default]
Vertical,
Horizontal,
}
pub struct LayoutInfo {
pub position: Vec2,
pub max_size: Vec2,
pub direction: Direction,
pub remaining_space: Option<f32>,
}
pub fn compute_size(layout: &LayoutInfo, size: Size2d, comfy_size: Vec2) -> Vec2 {
let width = match size.width {
Size::Auto => comfy_size.x,
Size::Relative(fraction) => layout.max_size.x * fraction,
Size::Absolute(size) => size,
Size::Remaining(fraction) => match layout.direction {
Direction::Horizontal => layout.remaining_space.unwrap_or(layout.max_size.x) * fraction,
Direction::Vertical => layout.max_size.x * fraction,
}
};
let height = match size.height {
Size::Auto => comfy_size.y,
Size::Relative(fraction) => layout.max_size.y * fraction,
Size::Absolute(size) => size,
Size::Remaining(fraction) => match layout.direction {
Direction::Horizontal => layout.max_size.y * fraction,
Direction::Vertical => layout.remaining_space.unwrap_or(layout.max_size.y) * fraction,
}
};
vec2(width, height)
}