use std::sync::Mutex;
use alchemy_styles::{Appearance, Layout};
use alchemy_lifecycle::ComponentKey;
use alchemy_lifecycle::error::Error;
use alchemy_lifecycle::rsx::RSX;
use alchemy_lifecycle::traits::{Component, Props, PlatformSpecificNodeType};
use crate::components::Fragment;
#[cfg(feature = "cocoa")]
use alchemy_cocoa::view::{View as PlatformViewBridge};
pub struct ViewProps;
pub struct View {
bridge: Mutex<PlatformViewBridge>
}
impl Default for View {
fn default() -> View {
View {
bridge: Mutex::new(PlatformViewBridge::new())
}
}
}
impl View {
pub fn default_props() -> ViewProps {
ViewProps {}
}
}
impl Props for View {
fn set_props(&mut self, _: &mut std::any::Any) {}
}
impl Component for View {
fn new(_: ComponentKey) -> View {
View::default()
}
fn has_native_backing_node(&self) -> bool { true }
fn borrow_native_backing_node(&self) -> Option<PlatformSpecificNodeType> {
let bridge = self.bridge.lock().unwrap();
Some(bridge.borrow_native_backing_node())
}
fn append_child_node(&self, node: PlatformSpecificNodeType) {
let mut bridge = self.bridge.lock().unwrap();
bridge.append_child(node);
}
fn apply_styles(&self, appearance: &Appearance, layout: &Layout) {
let mut bridge = self.bridge.lock().unwrap();
bridge.apply_styles(appearance, layout);
}
fn render(&self, children: Vec<RSX>) -> Result<RSX, Error> {
Ok(RSX::node("Fragment", "".into(), |key| {
Box::new(<Fragment as Component>::new(key))
}, Box::new(ViewProps {}), children))
}
}