use crate::{ContentFn, EguiFrameHook, HookFn, Plugin};
pub struct OxiEguiApp {
pub content: Option<ContentFn>,
pub on_init: Vec<HookFn>,
pub on_frame: Vec<HookFn>,
pub plugins: Vec<Box<dyn Plugin>>,
pub initialised: bool,
pub frame_skip: bool,
pub egui_frame_hooks: Vec<EguiFrameHook>,
}
impl eframe::App for OxiEguiApp {
fn ui(&mut self, ui: &mut egui::Ui, _frame: &mut eframe::Frame) {
let egui_ctx = ui.ctx().clone();
let mut ctx_bridge = oxiui_egui::EguiUiCtx::new(ui);
if !self.initialised {
self.initialised = true;
for hook in self.on_init.iter_mut() {
hook(&mut ctx_bridge);
}
for plugin in self.plugins.iter_mut() {
plugin.init(&mut ctx_bridge);
}
}
if let Some(ref mut f) = self.content {
f(&mut ctx_bridge);
}
for hook in self.on_frame.iter_mut() {
hook(&mut ctx_bridge);
}
for plugin in self.plugins.iter_mut() {
plugin.update(&mut ctx_bridge);
}
for hook in &mut self.egui_frame_hooks {
hook(&egui_ctx);
}
if self.frame_skip && egui_ctx.input(|i| i.events.is_empty()) {
egui_ctx.request_repaint_after(std::time::Duration::from_secs(1));
}
}
}