Skip to main content

ferroui_native/
embeddable_top_level_impl.rs

1use 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
11/// A top-level without a window of its own: a view that a host embeds.
12pub 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 {});