Add custom asynchronous asset handlers

This commit is contained in:
Will Crichton committed 2023-12-15 11:16:25 -08:00
1 parent 5fdff4b7ed
commit d5ec22a26f
4 files changed
+194 -19

No files matched your search

+23
View File
@@ -1,11 +1,18 @@
use std::cell::RefCell;
use std::future::Future;
use std::path::Path;
use std::rc::Rc;
use std::rc::Weak;
use crate::create_new_window;
use crate::events::IpcMessage;
use crate::protocol::AssetFuture;
use crate::protocol::AssetHandlerId;
use crate::protocol::AssetHandlerRegistry;
use crate::protocol::AssetResponse;
use crate::query::QueryEngine;
use crate::shortcut::{HotKey, ShortcutId, ShortcutRegistry, ShortcutRegistryError};
use crate::AssetHandler;
use crate::Config;
use crate::WebviewHandler;
use dioxus_core::ScopeState;
@@ -64,6 +71,8 @@ pub struct DesktopService {
pub(crate) shortcut_manager: ShortcutRegistry,
pub(crate) asset_handlers: AssetHandlerRegistry,
#[cfg(target_os = "ios")]
pub(crate) views: Rc<RefCell<Vec<*mut objc::runtime::Object>>>,
}
@@ -88,6 +97,7 @@ impl DesktopService {
webviews: WebviewQueue,
event_handlers: WindowEventHandlers,
shortcut_manager: ShortcutRegistry,
asset_handlers: AssetHandlerRegistry,
) -> Self {
Self {
webview: Rc::new(webview),
@@ -97,6 +107,7 @@ impl DesktopService {
pending_windows: webviews,
event_handlers,
shortcut_manager,
asset_handlers,
#[cfg(target_os = "ios")]
views: Default::default(),
}
@@ -247,6 +258,18 @@ impl DesktopService {
self.shortcut_manager.remove_all()
}
/// Provide a callback to handle asset loading yourself.
///
/// See [`use_asset_handle`](crate::use_asset_handle) for a convenient hook.
pub async fn register_asset_handler<F: AssetFuture>(&self, f: impl AssetHandler<F>) {
self.asset_handlers.register_handler(f).await;
}
/// Removes an asset handler by its identifier.
pub async fn remove_asset_handler(&self, id: AssetHandlerId) {
self.asset_handlers.remove_handler(id).await;
}
/// Push an objc view to the window
#[cfg(target_os = "ios")]
pub fn push_view(&self, view: objc_id::ShareId<objc::runtime::Object>) {