ferroui_native/
embeddable_top_level_impl.rs1use crate::helpers::ComResultExt;
2use crate::interop::*;
3use crate::popup_impl::PopupImpl;
4use crate::top_level_impl::{
5 impl_top_level_contract, MacOSTopLevelHandle, TopLevelEvents, TopLevelImpl, TopLevelParent,
6};
7use ferroui_controls::platform::{IPopupImpl, ITopLevelImpl};
8use ferroui_microcom::ComPtr;
9use std::rc::{Rc, Weak};
10
11pub struct EmbeddableTopLevelImpl {
13 weak_self: Weak<EmbeddableTopLevelImpl>,
14 base: Rc<TopLevelImpl>,
15}
16
17impl EmbeddableTopLevelImpl {
18 pub(crate) fn new(factory: ComPtr<IFerroNativeFactory>) -> Rc<EmbeddableTopLevelImpl> {
19 let this = Rc::new_cyclic(|weak_self| EmbeddableTopLevelImpl {
20 weak_self: weak_self.clone(),
21 base: TopLevelImpl::new(factory.clone()),
22 });
23
24 let e = IFrnTopLevelEvents::from_impl(TopLevelEvents(this.clone()));
25 let native = factory.create_top_level(Some(&e)).check().expect("the native top-level");
26 this.base.init(MacOSTopLevelHandle::from_top_level(native));
27 this
28 }
29}
30
31impl TopLevelParent for EmbeddableTopLevelImpl {
32 fn top_level(&self) -> &Rc<TopLevelImpl> {
33 &self.base
34 }
35
36 fn create_popup_core(&self) -> Option<Rc<dyn IPopupImpl>> {
37 let this: Rc<dyn ITopLevelImpl> = self.weak_self.upgrade()?;
38 Some(PopupImpl::new(self.base.factory().clone(), this))
39 }
40}
41
42impl_top_level_contract!(EmbeddableTopLevelImpl {});