cranpose-ui 0.9.10

Composable widgets, text, layouts and input for Cranpose apps
Documentation
use std::cell::OnceCell;

use cranpose_core::{CompositionLocal, OwnedMutableState, StaticCompositionLocal};

pub(crate) struct EnvironmentLocals {
    pub(crate) density: OnceCell<CompositionLocal<crate::Density>>,
    pub(crate) direction: OnceCell<CompositionLocal<crate::LayoutDirection>>,
    pub(crate) safe_area: OnceCell<CompositionLocal<crate::EdgeInsets>>,
    pub(crate) ime: OnceCell<CompositionLocal<crate::EdgeInsets>>,
    pub(crate) clipboard: OnceCell<CompositionLocal<crate::clipboard_session::ClipboardManager>>,
    pub(crate) focus_manager: OnceCell<CompositionLocal<crate::FocusManager>>,
    pub(crate) announcer: OnceCell<CompositionLocal<crate::Announcer>>,
    pub(crate) modal_depth: OnceCell<CompositionLocal<usize>>,
    pub(crate) lazy_item_key: OnceCell<CompositionLocal<Option<u64>>>,
    pub(crate) bring_into_view: OnceCell<CompositionLocal<Option<crate::BringIntoViewResponder>>>,
    pub(crate) selection_registrar:
        OnceCell<CompositionLocal<Option<crate::selection_container::SelectionRegistrar>>>,
    pub(crate) on_light_surface: OnceCell<CompositionLocal<bool>>,
    pub(crate) popup_registry: OnceCell<StaticCompositionLocal<crate::widgets::PopupRegistry>>,
    pub(crate) popup_viewport:
        OnceCell<StaticCompositionLocal<OwnedMutableState<cranpose_ui_graphics::Size>>>,
    #[cfg(feature = "localization")]
    pub(crate) translator: OnceCell<CompositionLocal<Option<crate::localization::Translator>>>,
    #[cfg(feature = "localization")]
    pub(crate) text_locales: OnceCell<CompositionLocal<Option<crate::text::LocaleList>>>,
    #[cfg(feature = "localization")]
    pub(crate) localization_controller:
        OnceCell<CompositionLocal<Option<crate::LocalizationController>>>,
}

thread_local! {
    pub(crate) static ENVIRONMENT_LOCALS: EnvironmentLocals = const { EnvironmentLocals {
        density: OnceCell::new(),
        direction: OnceCell::new(),
        safe_area: OnceCell::new(),
        ime: OnceCell::new(),
        clipboard: OnceCell::new(),
        focus_manager: OnceCell::new(),
        announcer: OnceCell::new(),
        modal_depth: OnceCell::new(),
        lazy_item_key: OnceCell::new(),
        bring_into_view: OnceCell::new(),
        selection_registrar: OnceCell::new(),
        on_light_surface: OnceCell::new(),
        popup_registry: OnceCell::new(),
        popup_viewport: OnceCell::new(),
        #[cfg(feature = "localization")]
        translator: OnceCell::new(),
        #[cfg(feature = "localization")]
        text_locales: OnceCell::new(),
        #[cfg(feature = "localization")]
        localization_controller: OnceCell::new(),
    } };
}

pub(crate) fn cached_local<T: Clone>(
    cell: impl FnOnce(&EnvironmentLocals) -> &OnceCell<T>,
    initialize: impl FnOnce() -> T,
) -> T {
    ENVIRONMENT_LOCALS.with(|locals| cell(locals).get_or_init(initialize).clone())
}