Files
novem/src/app.rs

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(|_| ())
}