Skip to main content

polyhorn_ios/raw/
platform.rs

1use polyhorn_core::EventLoop;
2use polyhorn_ui::layout::LayoutTree;
3
4use super::{
5    CommandBuffer, Compositor, ContainerID, Environment, OpaqueComponent, OpaqueContainer,
6};
7
8/// Non-constructable type that implements the platform trait for iOS.
9pub enum Platform {}
10
11impl polyhorn_core::Platform for Platform {
12    type CommandBuffer = CommandBuffer;
13    type Component = OpaqueComponent;
14    type Compositor = Compositor;
15    type Container = OpaqueContainer;
16    type ContainerID = ContainerID;
17    type Environment = Environment;
18
19    fn with_compositor<F>(container: Self::Container, task: F) -> polyhorn_core::Disposable
20    where
21        F: FnOnce(Self::ContainerID, Self::Compositor, EventLoop) -> polyhorn_core::Disposable
22            + Send
23            + 'static,
24    {
25        use std::sync::{Arc, RwLock};
26
27        let layout_tree = Arc::new(RwLock::new(LayoutTree::new()));
28        let mut compositor = Compositor::new(layout_tree);
29        let id = compositor.track(container);
30
31        std::thread::Builder::new()
32            .name("com.glacyr.Polyhorn".to_owned())
33            .spawn(move || {
34                let mut runtime = tokio::runtime::Runtime::new().unwrap();
35                runtime.block_on(async move {
36                    let (evloop, handler) = EventLoop::new();
37                    let _compositor = compositor.clone();
38                    let _result = task(id, compositor, evloop);
39
40                    handler.main().await;
41                })
42            })
43            .unwrap();
44
45        struct Abc;
46
47        impl Drop for Abc {
48            fn drop(&mut self) {}
49        }
50
51        polyhorn_core::Disposable::new(Abc)
52    }
53}