WIP

Nathan Sobo created

Change summary

crates/storybook/src/gpui3/app.rs           | 11 +++
crates/storybook/src/gpui3/geometry.rs      |  4 
crates/storybook/src/gpui3/mod.rs           |  1 
crates/storybook/src/gpui3/platform.rs      | 58 +++++++++++++++++++++++
crates/storybook/src/gpui3/platform/test.rs |  0 
crates/storybook/src/gpui3/window.rs        | 10 +++
6 files changed, 79 insertions(+), 5 deletions(-)

Detailed changes

crates/storybook/src/gpui3/app.rs 🔗

@@ -1,13 +1,15 @@
 use anyhow::{anyhow, Result};
 use slotmap::SlotMap;
-use std::{any::Any, marker::PhantomData};
+use std::{any::Any, marker::PhantomData, rc::Rc};
 
 use super::{
+    platform::Platform,
     window::{Window, WindowHandle, WindowId},
     Context, LayoutId, Reference, View, WindowContext,
 };
 
 pub struct AppContext {
+    platform: Rc<dyn Platform>,
     pub(crate) entities: SlotMap<EntityId, Option<Box<dyn Any>>>,
     pub(crate) windows: SlotMap<WindowId, Option<Window>>,
     // We recycle this memory across layout requests.
@@ -15,14 +17,19 @@ pub struct AppContext {
 }
 
 impl AppContext {
-    pub fn new() -> Self {
+    pub fn new(platform: Rc<dyn Platform>) -> Self {
         AppContext {
+            platform,
             entities: SlotMap::with_key(),
             windows: SlotMap::with_key(),
             layout_id_buffer: Default::default(),
         }
     }
 
+    pub fn test() -> Self {
+        Self::new(TestPlatform::new())
+    }
+
     pub fn open_window<S: 'static>(
         &mut self,
         build_root_view: impl FnOnce(&mut WindowContext) -> View<S>,

crates/storybook/src/gpui3/geometry.rs 🔗

@@ -31,7 +31,7 @@ unsafe impl<T: Clone + Debug + Zeroable + Pod> Zeroable for Point<T> {}
 
 unsafe impl<T: Clone + Debug + Zeroable + Pod> Pod for Point<T> {}
 
-#[derive(Refineable, Default, Clone, Copy, Debug)]
+#[derive(Refineable, Default, Clone, Copy, Debug, PartialEq)]
 #[refineable(debug)]
 pub struct Size<T: Clone + Debug> {
     pub width: T,
@@ -65,7 +65,7 @@ impl Size<Length> {
     }
 }
 
-#[derive(Refineable, Clone, Default, Debug)]
+#[derive(Refineable, Clone, Default, Debug, PartialEq)]
 #[refineable(debug)]
 pub struct Bounds<T: Clone + Debug> {
     pub origin: Point<T>,

crates/storybook/src/gpui3/platform.rs 🔗

@@ -0,0 +1,58 @@
+mod test;
+use super::{AnyWindowHandle, Bounds, Point};
+use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle};
+
+pub trait Platform {
+    fn open_window(
+        &self,
+        handle: AnyWindowHandle,
+        options: WindowOptions,
+    ) -> Box<dyn PlatformWindow>;
+}
+
+pub trait PlatformWindow: HasRawWindowHandle + HasRawDisplayHandle {}
+
+#[derive(Debug)]
+pub struct WindowOptions<'a> {
+    pub bounds: WindowBounds,
+    pub titlebar: Option<TitlebarOptions<'a>>,
+    pub center: bool,
+    pub focus: bool,
+    pub show: bool,
+    pub kind: WindowKind,
+    pub is_movable: bool,
+}
+
+#[derive(Debug, Default)]
+pub struct TitlebarOptions<'a> {
+    pub title: Option<&'a str>,
+    pub appears_transparent: bool,
+    pub traffic_light_position: Option<Point<f32>>,
+}
+
+#[derive(Copy, Clone, Debug)]
+pub enum Appearance {
+    Light,
+    VibrantLight,
+    Dark,
+    VibrantDark,
+}
+
+impl Default for Appearance {
+    fn default() -> Self {
+        Self::Light
+    }
+}
+
+#[derive(Copy, Clone, Debug, PartialEq, Eq)]
+pub enum WindowKind {
+    Normal,
+    PopUp,
+}
+
+#[derive(Copy, Clone, Debug, PartialEq)]
+pub enum WindowBounds {
+    Fullscreen,
+    Maximized,
+    Fixed(Bounds<f32>),
+}

crates/storybook/src/gpui3/window.rs 🔗

@@ -5,7 +5,10 @@ use super::{
 use anyhow::Result;
 use derive_more::{Deref, DerefMut};
 use gpui2::Reference;
-use std::{any::Any, marker::PhantomData};
+use std::{
+    any::{Any, TypeId},
+    marker::PhantomData,
+};
 
 pub struct AnyWindow {}
 
@@ -216,6 +219,11 @@ impl<S> WindowHandle<S> {
     }
 }
 
+pub struct AnyWindowHandle {
+    id: WindowId,
+    state_type: TypeId,
+}
+
 #[derive(Clone)]
 pub struct Layout {
     pub order: u32,