@@ -2,63 +2,209 @@ use gpui::*;
struct WindowContent {
text: SharedString,
+ bounds: Bounds<Pixels>,
+ bg: Hsla,
}
impl Render for WindowContent {
- fn render(&mut self, _cx: &mut ViewContext<Self>) -> impl IntoElement {
+ fn render(&mut self, cx: &mut ViewContext<Self>) -> impl IntoElement {
+ let window_bounds = cx.bounds();
+
div()
.flex()
- .bg(rgb(0x1e2025))
+ .flex_col()
+ .bg(self.bg)
.size_full()
- .justify_center()
.items_center()
- .text_xl()
.text_color(rgb(0xffffff))
.child(self.text.clone())
+ .child(
+ div()
+ .flex()
+ .flex_col()
+ .text_sm()
+ .items_center()
+ .size_full()
+ .child(format!(
+ "origin: {}, {} size: {}, {}",
+ self.bounds.origin.x,
+ self.bounds.origin.y,
+ self.bounds.size.width,
+ self.bounds.size.height
+ ))
+ .child(format!(
+ "cx.bounds() origin: {}, {} size {}, {}",
+ window_bounds.origin.x,
+ window_bounds.origin.y,
+ window_bounds.size.width,
+ window_bounds.size.height
+ )),
+ )
+ }
+}
+
+fn build_window_options(display_id: DisplayId, bounds: Bounds<Pixels>) -> WindowOptions {
+ WindowOptions {
+ // Set the bounds of the window in screen coordinates
+ window_bounds: Some(WindowBounds::Windowed(bounds)),
+ // Specify the display_id to ensure the window is created on the correct screen
+ display_id: Some(display_id),
+ titlebar: None,
+ window_background: WindowBackgroundAppearance::Transparent,
+ focus: false,
+ show: true,
+ kind: WindowKind::PopUp,
+ is_movable: false,
+ app_id: None,
+ window_min_size: None,
+ window_decorations: None,
}
}
fn main() {
App::new().run(|cx: &mut AppContext| {
// Create several new windows, positioned in the top right corner of each screen
+ let size = Size {
+ width: px(350.),
+ height: px(75.),
+ };
+ let margin_offset = px(150.);
for screen in cx.displays() {
- let options = {
- let margin_right = px(16.);
- let margin_height = px(-48.);
-
- let size = Size {
- width: px(400.),
- height: px(72.),
- };
-
- let bounds = gpui::Bounds::<Pixels> {
- origin: screen.bounds().upper_right()
- - point(size.width + margin_right, margin_height),
- size,
- };
-
- WindowOptions {
- // Set the bounds of the window in screen coordinates
- window_bounds: Some(WindowBounds::Windowed(bounds)),
- // Specify the display_id to ensure the window is created on the correct screen
- display_id: Some(screen.id()),
-
- titlebar: None,
- window_background: WindowBackgroundAppearance::default(),
- focus: false,
- show: true,
- kind: WindowKind::PopUp,
- is_movable: false,
- app_id: None,
- window_min_size: None,
- window_decorations: None,
- }
+ let bounds = Bounds {
+ origin: point(margin_offset, margin_offset),
+ size,
+ };
+
+ cx.open_window(build_window_options(screen.id(), bounds), |cx| {
+ cx.new_view(|_| WindowContent {
+ text: format!("Top Left {:?}", screen.id()).into(),
+ bg: gpui::red(),
+ bounds,
+ })
+ })
+ .unwrap();
+
+ let bounds = Bounds {
+ origin: screen.bounds().upper_right()
+ - point(size.width + margin_offset, -margin_offset),
+ size,
+ };
+
+ cx.open_window(build_window_options(screen.id(), bounds), |cx| {
+ cx.new_view(|_| WindowContent {
+ text: format!("Top Right {:?}", screen.id()).into(),
+ bg: gpui::red(),
+ bounds,
+ })
+ })
+ .unwrap();
+
+ let bounds = Bounds {
+ origin: screen.bounds().lower_left()
+ - point(-margin_offset, size.height + margin_offset),
+ size,
+ };
+
+ cx.open_window(build_window_options(screen.id(), bounds), |cx| {
+ cx.new_view(|_| WindowContent {
+ text: format!("Bottom Left {:?}", screen.id()).into(),
+ bg: gpui::blue(),
+ bounds,
+ })
+ })
+ .unwrap();
+
+ let bounds = Bounds {
+ origin: screen.bounds().lower_right()
+ - point(size.width + margin_offset, size.height + margin_offset),
+ size,
+ };
+
+ cx.open_window(build_window_options(screen.id(), bounds), |cx| {
+ cx.new_view(|_| WindowContent {
+ text: format!("Bottom Right {:?}", screen.id()).into(),
+ bg: gpui::blue(),
+ bounds,
+ })
+ })
+ .unwrap();
+
+ let bounds = Bounds {
+ origin: point(screen.bounds().center().x - size.center().x, margin_offset),
+ size,
+ };
+
+ cx.open_window(build_window_options(screen.id(), bounds), |cx| {
+ cx.new_view(|_| WindowContent {
+ text: format!("Top Center {:?}", screen.id()).into(),
+ bg: gpui::black(),
+ bounds,
+ })
+ })
+ .unwrap();
+
+ let bounds = Bounds {
+ origin: point(margin_offset, screen.bounds().center().y - size.center().y),
+ size,
+ };
+
+ cx.open_window(build_window_options(screen.id(), bounds), |cx| {
+ cx.new_view(|_| WindowContent {
+ text: format!("Left Center {:?}", screen.id()).into(),
+ bg: gpui::black(),
+ bounds,
+ })
+ })
+ .unwrap();
+
+ let bounds = Bounds {
+ origin: point(
+ screen.bounds().center().x - size.center().x,
+ screen.bounds().center().y - size.center().y,
+ ),
+ size,
+ };
+
+ cx.open_window(build_window_options(screen.id(), bounds), |cx| {
+ cx.new_view(|_| WindowContent {
+ text: format!("Center {:?}", screen.id()).into(),
+ bg: gpui::black(),
+ bounds,
+ })
+ })
+ .unwrap();
+
+ let bounds = Bounds {
+ origin: point(
+ screen.bounds().size.width - size.width - margin_offset,
+ screen.bounds().center().y - size.center().y,
+ ),
+ size,
+ };
+
+ cx.open_window(build_window_options(screen.id(), bounds), |cx| {
+ cx.new_view(|_| WindowContent {
+ text: format!("Right Center {:?}", screen.id()).into(),
+ bg: gpui::black(),
+ bounds,
+ })
+ })
+ .unwrap();
+
+ let bounds = Bounds {
+ origin: point(
+ screen.bounds().center().x - size.center().x,
+ screen.bounds().size.height - size.height - margin_offset,
+ ),
+ size,
};
- cx.open_window(options, |cx| {
+ cx.open_window(build_window_options(screen.id(), bounds), |cx| {
cx.new_view(|_| WindowContent {
- text: format!("{:?}", screen.id()).into(),
+ text: format!("Bottom Center {:?}", screen.id()).into(),
+ bg: gpui::black(),
+ bounds,
})
})
.unwrap();