#![cfg_attr(target_family = "wasm", no_main)] #[path = "example_support/fonts.rs"] mod example_support; use gpui::{ App, Bounds, Context, FocusHandle, Window, WindowBounds, WindowOptions, div, prelude::*, px, rgb, size, }; use gpui::{SharedString, TitlebarOptions}; use gpui_platform::application; struct ExampleWindow { label: SharedString, focus_handle: FocusHandle, } impl Render for ExampleWindow { fn render(&mut self, _window: &mut Window, _cx: &mut Context) -> impl IntoElement { div() .track_focus(&self.focus_handle) .flex() .flex_col() .gap_3() .bg(rgb(0x2e2e2e)) .size_full() .justify_center() .items_center() .p_8() .text_lg() .text_color(rgb(0xffffff)) .child(self.label.clone()) .child( div() .text_sm() .text_color(rgb(0xb0b0b0)) .child("Try to drag the titlebar, and check the Window menu."), ) } } fn open_test_window( cx: &mut App, bounds: Bounds, label: &str, is_movable: bool, appears_transparent: bool, app_owns_titlebar_drag: bool, ) { let label = SharedString::from(format!( "{label}\nis_movable: {is_movable}\n\ appears_transparent: {appears_transparent}\n\ app_owns_titlebar_drag: {app_owns_titlebar_drag}" )); cx.open_window( WindowOptions { window_bounds: Some(WindowBounds::Windowed(bounds)), is_movable, app_owns_titlebar_drag, titlebar: Some(TitlebarOptions { title: Some(label.clone()), appears_transparent, ..Default::default() }), ..Default::default() }, |window, cx| { cx.new(|cx| { let focus_handle = cx.focus_handle(); focus_handle.focus(window, cx); ExampleWindow { label, focus_handle, } }) }, ) .unwrap(); } fn run_example() { application().run(|cx: &mut App| { if !example_support::load_fonts(cx) { return; } let window_size = size(px(420.), px(280.0)); let base = Bounds::centered(None, window_size, cx); // (label, is_movable, appears_transparent, app_owns_titlebar_drag, col, row) let windows = [ ("Native titlebar, movable", true, false, false, 0.0, 0.0), ( "Native titlebar, NOT movable", false, false, false, 1.0, 0.0, ), ("Custom titlebar, movable", true, true, false, 0.0, 1.0), ("Custom titlebar, NOT movable", false, true, false, 1.0, 1.0), ]; for (label, is_movable, appears_transparent, app_owns_titlebar_drag, col, row) in windows { let mut bounds = base; bounds.origin.x += window_size.width * col; bounds.origin.y += window_size.height * row; open_test_window( cx, bounds, label, is_movable, appears_transparent, app_owns_titlebar_drag, ); } }); } #[cfg(not(target_family = "wasm"))] fn main() { run_example(); } #[cfg(target_family = "wasm")] #[wasm_bindgen::prelude::wasm_bindgen(start)] pub fn start() { gpui_platform::web_init(); run_example(); }