use crate::{ApplicationDefaults, EdgeInsets, LocaleResolver, TextDirection};
use icu_locale::Locale;
use incular_core::Size;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum Brightness {
#[default]
Light,
Dark,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum ContentSensitivity {
#[default]
NotSensitive,
AutoSensitive,
Sensitive,
}
impl ContentSensitivity {
#[must_use]
pub const fn max(self, other: Self) -> Self {
if self as u8 >= other as u8 {
self
} else {
other
}
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct InputCapabilities {
pub mouse: bool,
pub touch: bool,
pub keyboard: bool,
pub stylus: bool,
pub trackpad: bool,
}
#[derive(Clone, Debug, PartialEq)]
pub struct RuntimeEnvironment {
pub viewport: Size,
pub physical_width: u32,
pub physical_height: u32,
pub scale_factor: f64,
pub brightness: Brightness,
pub text_scale: f32,
pub safe_insets: EdgeInsets,
pub view_padding: EdgeInsets,
pub view_insets: EdgeInsets,
pub locales: Vec<Locale>,
pub text_direction: TextDirection,
pub reduced_motion: bool,
pub high_contrast: bool,
pub input: InputCapabilities,
pub window_focused: bool,
pub window_occluded: bool,
}
impl Default for RuntimeEnvironment {
fn default() -> Self {
let defaults = ApplicationDefaults::DEFAULT;
Self {
viewport: Size::ZERO,
physical_width: 0,
physical_height: 0,
scale_factor: defaults.scale_factor,
brightness: defaults.brightness,
text_scale: defaults.text_scale,
safe_insets: EdgeInsets::ZERO,
view_padding: EdgeInsets::ZERO,
view_insets: EdgeInsets::ZERO,
locales: Vec::new(),
text_direction: defaults.text_direction,
reduced_motion: defaults.reduced_motion,
high_contrast: false,
input: InputCapabilities::default(),
window_focused: false,
window_occluded: false,
}
}
}
impl RuntimeEnvironment {
#[must_use]
pub fn normalized(mut self) -> Self {
self.scale_factor = if self.scale_factor.is_finite() && self.scale_factor > 0.0 {
self.scale_factor
} else {
1.0
};
self.text_scale = if self.text_scale.is_finite() && self.text_scale > 0.0 {
self.text_scale
} else {
1.0
};
self.safe_insets = self.safe_insets.normalized();
self.view_padding = self.view_padding.normalized();
self.view_insets = self.view_insets.normalized();
if let Some(locale) = self.primary_locale() {
self.text_direction = LocaleResolver::text_direction(locale);
}
self
}
#[must_use]
pub fn primary_locale(&self) -> Option<&Locale> {
self.locales.first()
}
#[must_use]
pub fn resolve_locale(&self, supported: &[Locale]) -> Option<Locale> {
LocaleResolver::resolve(&self.locales, supported)
}
}