cranpose_services/
accessibility_state.rs1use std::cell::Cell;
6
7use cranpose_core::{CompositionLocal, CompositionLocalProvider, compositionLocalOf};
8use cranpose_macros::composable;
9
10#[derive(Clone, Copy, Debug, PartialEq, Eq, Default)]
12pub struct AccessibilityState {
13 pub screen_reader_on: bool,
17}
18
19thread_local! {
20 static PLATFORM_ACCESSIBILITY_STATE: Cell<AccessibilityState> =
21 const { Cell::new(AccessibilityState { screen_reader_on: false }) };
22}
23
24pub fn set_platform_accessibility_state(state: AccessibilityState) -> bool {
28 PLATFORM_ACCESSIBILITY_STATE.with(|cell| {
29 let changed = cell.get() != state;
30 cell.set(state);
31 changed
32 })
33}
34
35pub fn platform_accessibility_state() -> AccessibilityState {
37 PLATFORM_ACCESSIBILITY_STATE.with(Cell::get)
38}
39
40pub fn local_accessibility_state() -> CompositionLocal<AccessibilityState> {
43 crate::composition_locals::cached_local(
44 |locals| &locals.accessibility_state,
45 || compositionLocalOf(platform_accessibility_state),
46 )
47}
48
49#[composable]
52pub fn ProvideAccessibilityState(state: AccessibilityState, content: impl FnOnce()) {
53 let local = local_accessibility_state();
54 CompositionLocalProvider([local.provides(state)], move || {
55 content();
56 });
57}
58
59#[cfg(test)]
60#[path = "tests/accessibility_state_tests.rs"]
61mod tests;