53 lines
1.3 KiB
Rust
53 lines
1.3 KiB
Rust
use gpui::AppContext;
|
|
use gpui::BorrowAppContext;
|
|
|
|
use crate::api;
|
|
use crate::query;
|
|
use crate::theme;
|
|
|
|
pub struct Global {
|
|
pub safe_area: gpui::Bounds<gpui::Pixels>,
|
|
pub theme_family: theme::ThemeFamily,
|
|
pub current_theme: theme::Theme,
|
|
pub rng: rand::prelude::ThreadRng,
|
|
}
|
|
|
|
impl gpui::Global for Global {}
|
|
|
|
pub fn current_theme(cx: &gpui::App) -> &theme::Theme {
|
|
&cx.global::<Global>().current_theme
|
|
}
|
|
|
|
pub fn rng(cx: &mut gpui::App) -> &mut rand::prelude::ThreadRng {
|
|
&mut cx.global_mut::<Global>().rng
|
|
}
|
|
|
|
pub fn query_store(cx: &gpui::App) -> &query::Store<api::QueryContext> {
|
|
cx.global::<query::Store<api::QueryContext>>()
|
|
}
|
|
|
|
pub fn open_window<V>(
|
|
cx: &mut gpui::App,
|
|
options: gpui::WindowOptions,
|
|
screen: impl FnOnce(&mut gpui::Window, &mut gpui::Context<V>) -> V,
|
|
) -> anyhow::Result<()>
|
|
where
|
|
V: gpui::Render,
|
|
{
|
|
cx.open_window(options, |window, cx| {
|
|
cx.new(|cx| {
|
|
cx.observe_window_appearance(window, |_, window, cx| {
|
|
cx.update_global::<Global, ()>(|global, cx| {
|
|
global.current_theme = global
|
|
.theme_family
|
|
.theme_for_appearance(window.appearance());
|
|
cx.notify();
|
|
});
|
|
})
|
|
.detach();
|
|
screen(window, cx)
|
|
})
|
|
})
|
|
.map(|_| ())
|
|
}
|