use std::collections::HashMap; use ely_gpui_component::primitives::Measure; use gpui::{ AnyWindowHandle, App, Bounds, Div, Global, IntoElement, ParentElement, Pixels, Styled, div, }; /// Window bounds of named demo elements, for scripted capture. #[derive(Default)] pub struct Probes(HashMap<&'static str, Bounds>); impl Global for Probes {} impl Probes { pub fn get(key: &str, cx: &App) -> Option> { cx.try_global::() .and_then(|probes| probes.0.get(key).copied()) } } /// Wraps `element`, sized to it, so scripts can find it by `key`. pub fn probe(key: &'static str, element: impl IntoElement) -> Div { div().flex().child( Measure::new(key, move |bounds, _, cx| { cx.default_global::().0.insert(key, bounds); }) .child(element), ) } /// Windows the demos opened, by key, for scripted capture. #[derive(Default)] pub struct Opened(HashMap<&'static str, AnyWindowHandle>); impl Global for Opened {} impl Opened { pub fn insert(key: &'static str, handle: AnyWindowHandle, cx: &mut App) { cx.default_global::().0.insert(key, handle); } pub fn take(key: &str, cx: &mut App) -> Option { cx.default_global::().0.remove(key) } pub fn get(key: &str, cx: &App) -> Option { cx.try_global::() .and_then(|opened| opened.0.get(key).copied()) } }