#[allow(unused)] use super::Stretch; use crate::dir::Directional;
use crate::geom::{Rect, Size};
pub use crate::text::Align;
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Hash)]
pub struct AlignHints {
pub horiz: Option<Align>,
pub vert: Option<Align>,
}
impl AlignHints {
pub const NONE: AlignHints = AlignHints::new(None, None);
pub const CENTER: AlignHints = AlignHints::new(Some(Align::Center), Some(Align::Center));
pub const STRETCH: AlignHints = AlignHints::new(Some(Align::Stretch), Some(Align::Stretch));
pub const fn new(horiz: Option<Align>, vert: Option<Align>) -> Self {
Self { horiz, vert }
}
#[inline]
pub fn extract(self, dir: impl Directional) -> Option<Align> {
match dir.is_vertical() {
false => self.horiz,
true => self.vert,
}
}
#[inline]
pub fn set_component<D: Directional>(&mut self, dir: D, align: Option<Align>) {
match dir.is_vertical() {
false => self.horiz = align,
true => self.vert = align,
}
}
#[must_use = "method does not modify self but returns a new value"]
pub fn combine(self, rhs: AlignHints) -> Self {
Self {
horiz: self.horiz.or(rhs.horiz),
vert: self.vert.or(rhs.vert),
}
}
pub fn unwrap_or(self, horiz: Align, vert: Align) -> (Align, Align) {
(self.horiz.unwrap_or(horiz), self.vert.unwrap_or(vert))
}
pub fn complete(&self, horiz: Align, vert: Align) -> AlignPair {
AlignPair::new(self.horiz.unwrap_or(horiz), self.vert.unwrap_or(vert))
}
}
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Hash)]
pub struct AlignPair {
pub horiz: Align,
pub vert: Align,
}
impl AlignPair {
pub const DEFAULT: AlignPair = AlignPair::new(Align::Default, Align::Default);
pub const CENTER: AlignPair = AlignPair::new(Align::Center, Align::Center);
pub const STRETCH: AlignPair = AlignPair::new(Align::Stretch, Align::Stretch);
pub const fn new(horiz: Align, vert: Align) -> Self {
Self { horiz, vert }
}
#[inline]
pub fn extract<D: Directional>(self, dir: D) -> Align {
match dir.is_vertical() {
false => self.horiz,
true => self.vert,
}
}
#[inline]
pub fn set_component<D: Directional>(&mut self, dir: D, align: Align) {
match dir.is_vertical() {
false => self.horiz = align,
true => self.vert = align,
}
}
pub fn aligned_rect(&self, ideal: Size, rect: Rect) -> Rect {
let mut pos = rect.pos;
let mut size = rect.size;
if ideal.0 < size.0 && self.horiz != Align::Stretch {
pos.0 += match self.horiz {
Align::Center => (size.0 - ideal.0) / 2,
Align::BR => size.0 - ideal.0,
Align::Default | Align::TL | Align::Stretch => 0,
};
size.0 = ideal.0;
}
if ideal.1 < size.1 && self.vert != Align::Stretch {
pos.1 += match self.vert {
Align::Center => (size.1 - ideal.1) / 2,
Align::BR => size.1 - ideal.1,
Align::Default | Align::TL | Align::Stretch => 0,
};
size.1 = ideal.1;
}
Rect { pos, size }
}
}
impl From<(Align, Align)> for AlignPair {
#[inline]
fn from(p: (Align, Align)) -> Self {
AlignPair::new(p.0, p.1)
}
}
impl From<AlignPair> for (Align, Align) {
#[inline]
fn from(p: AlignPair) -> Self {
(p.horiz, p.vert)
}
}