use std::collections::HashMap;
use std::sync::Arc;
use platform_core::{EventHandler, MultiSurfacePlatform, PlatformError, SurfaceId};
use services_core::AppPathsProvider;
use crate::app::App;
use crate::app_config::AppConfig;
use crate::config;
use crate::prefs::UserPrefs;
use super::handler::build_app_handler;
pub fn run_multi_with_platform<P, A, PF, AF>(
platform: P,
surfaces: Vec<(SurfaceId, AppConfig)>,
paths_factory: PF,
app_factory: AF,
app_name: &str,
) -> Result<(), PlatformError>
where
P: MultiSurfacePlatform,
P::Window: super::host::SurfaceWindow,
A: App + 'static,
PF: Fn(SurfaceId) -> Arc<dyn AppPathsProvider> + 'static,
AF: Fn(SurfaceId) -> A + 'static,
{
let mut window_configs = Vec::with_capacity(surfaces.len());
let mut fonts: HashMap<SurfaceId, (Vec<std::path::PathBuf>, Vec<Vec<u8>>)> = HashMap::new();
for (id, cfg) in surfaces {
let AppConfig {
window,
font_paths,
font_data,
} = cfg;
window_configs.push((id, window));
fonts.insert(id, (font_paths, font_data));
}
let fonts = Arc::new(fonts);
let app_name = app_name.to_owned();
platform.run_surfaces(window_configs, move |id| {
let app = app_factory(id);
let paths = paths_factory(id);
let prefs = UserPrefs::load(&app_name, paths.as_ref());
let backend = prefs.backend.unwrap_or_else(config::compile_time_backend);
let (font_paths, font_data) = fonts.get(&id).cloned().unwrap_or_default();
let mut handler = build_app_handler::<P::Window, ()>(
Box::new(app),
paths,
font_paths,
font_data,
backend,
prefs,
app_name.clone(),
super::host::SurfaceRenderer::builtin(),
);
handler.surface = Some(ui_core::Surface::new());
handler
})
}
pub fn build_surface_handler<W, A>(
app: A,
paths: Arc<dyn AppPathsProvider>,
app_name: &str,
) -> Box<dyn EventHandler<W>>
where
W: super::host::SurfaceWindow,
A: App + 'static,
{
let prefs = UserPrefs::load(app_name, paths.as_ref());
let backend = prefs.backend.unwrap_or_else(config::compile_time_backend);
let mut handler = build_app_handler::<W, ()>(
Box::new(app),
paths,
Vec::new(),
Vec::new(),
backend,
prefs,
app_name.to_string(),
super::host::SurfaceRenderer::builtin(),
);
handler.surface = Some(ui_core::Surface::new());
Box::new(handler)
}