mod button;
mod icon;
mod nav;
mod root;
mod scroll_area;
mod sidebar;
pub mod theme;
mod title_bar;
mod tooltip;
mod tooltip_host;
pub use button::{Button, ButtonSize, ButtonVariant};
pub use gpui_kit;
pub use icon::{Icon, IconSource};
pub use nav::{
NavButtons, NavMotion, NavOperation, NavPage, NavStack, NavStackEvent, NavStackExt,
NavStackState,
};
pub use root::Root;
pub use scroll_area::ScrollArea;
pub use sidebar::{
Sidebar, SidebarCollapsible, SidebarEvent, SidebarGroup, SidebarLayout, SidebarMenuButton,
SidebarMenuSize, SidebarMenuSkeleton, SidebarMenuSub, SidebarSeparator, SidebarSide,
SidebarState, SidebarTrigger,
};
pub use theme::{
ActiveTheme, MetricTokens, ReduceMotion, Theme, ThemeConfig, ThemeMode, ThemeTokens,
};
pub use title_bar::TitleBar;
pub use tooltip::{Tooltip, TooltipExt, TooltipTrigger};
pub use tooltip_host::TooltipHost;
use gpui_kit::{App, Global};
pub mod prelude {
pub use crate::{
ActiveTheme, Button, ButtonSize, ButtonVariant, Icon, NavButtons, NavMotion, NavStack,
NavStackExt, NavStackState, ReduceMotion, Root, ScrollArea, Sidebar, SidebarCollapsible,
SidebarGroup, SidebarLayout, SidebarMenuButton, SidebarMenuSub, SidebarSeparator,
SidebarSide, SidebarState, SidebarTrigger, Theme, ThemeMode, TitleBar, TooltipExt,
};
pub use gpui_kit::base::{Disableable, Placement, Selectable, StyledExt};
pub use gpui_kit::prelude::FluentBuilder;
}
struct Initialized;
impl Global for Initialized {}
pub fn init(cx: &mut App) {
if cx.has_global::<Initialized>() {
return;
}
assert!(
base_initialized(cx),
"gpui_cn::init needs gpui_base::init first; call gpui_kit::init(cx) before it"
);
theme::fonts::register(cx);
Theme::init(cx);
root::init(cx);
cx.set_global(Initialized);
}
fn base_initialized(cx: &App) -> bool {
cx.has_global::<gpui_kit::base::GlobalState>()
}
#[cfg(test)]
mod tests {
use gpui_kit::TestAppContext;
#[gpui_kit::test]
fn init_is_idempotent_and_skips_base_when_already_initialized(cx: &mut TestAppContext) {
cx.update(|cx| {
assert!(!super::base_initialized(cx));
gpui_kit::init(cx);
assert!(super::base_initialized(cx));
super::init(cx);
super::init(cx);
assert!(cx.has_global::<super::Initialized>());
});
}
#[gpui_kit::test]
#[should_panic(expected = "needs gpui_base::init first")]
fn init_refuses_to_run_before_base(cx: &mut TestAppContext) {
cx.update(super::init);
}
}