1use gpui::{
2 App, Application, Bounds, Context, FocusHandle, KeyBinding, Window, WindowBounds,
3 WindowOptions, actions, div, prelude::*, px, rgb, size,
4};
5
6actions!(example, [CloseWindow]);
7
8struct ExampleWindow {
9 focus_handle: FocusHandle,
10}
11
12impl Render for ExampleWindow {
13 fn render(&mut self, _window: &mut Window, _cx: &mut Context<Self>) -> impl IntoElement {
14 div()
15 .on_action(|_: &CloseWindow, window, _| {
16 window.remove_window();
17 })
18 .track_focus(&self.focus_handle)
19 .flex()
20 .flex_col()
21 .gap_3()
22 .bg(rgb(0x505050))
23 .size(px(500.0))
24 .justify_center()
25 .items_center()
26 .shadow_lg()
27 .border_1()
28 .border_color(rgb(0x0000ff))
29 .text_xl()
30 .text_color(rgb(0xffffff))
31 .child(
32 "Closing this window with cmd-w or the traffic lights should quit the application!",
33 )
34 }
35}
36
37fn main() {
38 Application::new().run(|cx: &mut App| {
39 let mut bounds = Bounds::centered(None, size(px(500.), px(500.0)), cx);
40
41 cx.bind_keys([KeyBinding::new("cmd-w", CloseWindow, None)]);
42 cx.on_window_closed(|cx| {
43 if cx.windows().is_empty() {
44 cx.quit();
45 }
46 })
47 .detach();
48
49 cx.open_window(
50 WindowOptions {
51 window_bounds: Some(WindowBounds::Windowed(bounds)),
52 ..Default::default()
53 },
54 |window, cx| {
55 cx.activate(false);
56 cx.new(|cx| {
57 let focus_handle = cx.focus_handle();
58 focus_handle.focus(window);
59 ExampleWindow { focus_handle }
60 })
61 },
62 )
63 .unwrap();
64
65 bounds.origin.x += bounds.size.width;
66
67 cx.open_window(
68 WindowOptions {
69 window_bounds: Some(WindowBounds::Windowed(bounds)),
70 ..Default::default()
71 },
72 |window, cx| {
73 cx.new(|cx| {
74 let focus_handle = cx.focus_handle();
75 focus_handle.focus(window);
76 ExampleWindow { focus_handle }
77 })
78 },
79 )
80 .unwrap();
81 });
82}