#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub enum SizeClass {
Compact,
Medium,
Expanded,
}
impl SizeClass {
pub const MEDIUM: f32 = 600.0;
pub const EXPANDED: f32 = 840.0;
pub fn from_width(width: f32) -> SizeClass {
if width >= Self::EXPANDED {
SizeClass::Expanded
} else if width >= Self::MEDIUM {
SizeClass::Medium
} else {
SizeClass::Compact
}
}
pub fn from_height(height: f32) -> SizeClass {
Self::from_width(height)
}
pub fn rank(self) -> u8 {
match self {
SizeClass::Compact => 0,
SizeClass::Medium => 1,
SizeClass::Expanded => 2,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Orientation {
Portrait,
Landscape,
}
impl Orientation {
pub fn from_size(width: f32, height: f32) -> Orientation {
if width > height {
Orientation::Landscape
} else {
Orientation::Portrait
}
}
pub fn is_portrait(self) -> bool {
self == Orientation::Portrait
}
pub fn is_landscape(self) -> bool {
self == Orientation::Landscape
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn thresholds() {
assert_eq!(SizeClass::from_width(0.0), SizeClass::Compact);
assert_eq!(SizeClass::from_width(599.0), SizeClass::Compact);
assert_eq!(SizeClass::from_width(600.0), SizeClass::Medium);
assert_eq!(SizeClass::from_width(839.0), SizeClass::Medium);
assert_eq!(SizeClass::from_width(840.0), SizeClass::Expanded);
assert_eq!(SizeClass::from_width(1920.0), SizeClass::Expanded);
}
#[test]
fn ordering_by_rank() {
assert!(SizeClass::Compact < SizeClass::Medium);
assert!(SizeClass::Medium < SizeClass::Expanded);
assert_eq!(SizeClass::Expanded.rank(), 2);
}
#[test]
fn height_uses_same_thresholds() {
assert_eq!(SizeClass::from_height(500.0), SizeClass::Compact);
assert_eq!(SizeClass::from_height(700.0), SizeClass::Medium);
assert_eq!(SizeClass::from_height(900.0), SizeClass::Expanded);
}
#[test]
fn orientation_from_size() {
assert_eq!(Orientation::from_size(400.0, 800.0), Orientation::Portrait);
assert_eq!(Orientation::from_size(800.0, 400.0), Orientation::Landscape);
assert_eq!(Orientation::from_size(500.0, 500.0), Orientation::Portrait);
assert!(Orientation::from_size(400.0, 800.0).is_portrait());
assert!(Orientation::from_size(800.0, 400.0).is_landscape());
}
}