use super::*;
use windows_core::*;
implement_decl! {
impl ReactorApplicationOverrides as pub ReactorApplicationOverrides_Impl:
[IApplicationOverrides, IXamlMetadataProvider]
}
pub struct ReactorApplicationOverrides {
controls_provider: RefCell<Option<XamlControlsXamlMetaDataProvider>>,
on_launched: RefCell<Option<Box<dyn FnOnce() -> Result<()>>>>,
}
impl ReactorApplicationOverrides {
fn new(on_launched: Box<dyn FnOnce() -> Result<()>>) -> Self {
Self {
controls_provider: RefCell::new(None),
on_launched: RefCell::new(Some(on_launched)),
}
}
fn provider(&self) -> Result<XamlControlsXamlMetaDataProvider> {
if let Some(provider) = self.controls_provider.borrow().as_ref() {
return Ok(provider.clone());
}
let provider = XamlControlsXamlMetaDataProvider::new()?;
*self.controls_provider.borrow_mut() = Some(provider.clone());
Ok(provider)
}
}
impl IApplicationOverrides_Impl for ReactorApplicationOverrides_Impl {
fn OnLaunched(&self, _args: Ref<LaunchActivatedEventArgs>) -> Result<()> {
if let Some(on_launched) = self.on_launched.borrow_mut().take() {
on_launched()?;
}
Ok(())
}
}
impl IXamlMetadataProvider_Impl for ReactorApplicationOverrides_Impl {
fn GetXamlType(&self, r#type: &TypeName) -> Result<IXamlType> {
self.provider()?.GetXamlType(r#type)
}
fn GetXamlTypeByFullName(&self, full_name: &HSTRING) -> Result<IXamlType> {
self.provider()?
.GetXamlTypeByFullName(&full_name.to_string_lossy())
}
fn GetXmlnsDefinitions(&self) -> Result<Array<XmlnsDefinition>> {
self.provider()?.GetXmlnsDefinitions()
}
}
pub fn create_application(on_launched: Box<dyn FnOnce() -> Result<()>>) -> Result<Application> {
Application::compose(ReactorApplicationOverrides::new(on_launched))
}
pub fn install_xaml_controls_resources(application: &Application) -> Result<()> {
let controls = XamlControlsResources::new()?;
let resources: ResourceDictionary = controls.cast()?;
application
.Resources()?
.MergedDictionaries()?
.Append(&resources)
}