use std::cell::RefCell;
use cranpose_core::{compositionLocalOf, CompositionLocal};
use cranpose_ui_graphics::EdgeInsets;
pub fn local_safe_area_insets() -> CompositionLocal<EdgeInsets> {
thread_local! {
static LOCAL: RefCell<Option<CompositionLocal<EdgeInsets>>> = const { RefCell::new(None) };
}
LOCAL.with(|cell| {
cell.borrow_mut()
.get_or_insert_with(|| compositionLocalOf(EdgeInsets::default))
.clone()
})
}
pub fn local_ime_insets() -> CompositionLocal<EdgeInsets> {
thread_local! {
static LOCAL: RefCell<Option<CompositionLocal<EdgeInsets>>> = const { RefCell::new(None) };
}
LOCAL.with(|cell| {
cell.borrow_mut()
.get_or_insert_with(|| compositionLocalOf(EdgeInsets::default))
.clone()
})
}
#[cfg(test)]
mod tests {
use super::{local_ime_insets, local_safe_area_insets};
use cranpose_ui_graphics::EdgeInsets;
#[test]
fn defaults_to_zero_insets() {
assert_eq!(
local_safe_area_insets().default_value(),
EdgeInsets::default()
);
}
#[test]
fn ime_insets_default_to_zero() {
assert_eq!(local_ime_insets().default_value(), EdgeInsets::default());
}
#[test]
fn returns_one_shared_local_per_thread() {
assert!(local_safe_area_insets() == local_safe_area_insets());
assert!(local_ime_insets() == local_ime_insets());
assert!(local_ime_insets() != local_safe_area_insets());
}
}