pub mod painter;
pub use painter::*;
use sdl2::render::Canvas;
use sdl2::video::Window;
pub struct EguiCanvas {
run_output: crate::EguiRunOutput,
pub ctx: egui::Context,
pub state: crate::State,
pub painter: Painter,
}
impl EguiCanvas {
pub fn new(canvas: &Canvas<Window>) -> Self {
let ctx = egui::Context::default();
let state = crate::State::new(canvas.window(), ctx.clone(), egui::ViewportId::ROOT);
let run_output = crate::EguiRunOutput::default();
let painter = Painter::new(canvas);
Self {
ctx,
painter,
state,
run_output,
}
}
#[inline]
pub fn on_event(
&mut self,
canvas: &Canvas<Window>,
event: &sdl2::event::Event,
) -> crate::EventResponse {
self.state.on_event(canvas.window(), event)
}
#[inline]
pub fn run(&mut self, run_ui: impl FnMut(&egui::Context)) {
self.run_output.update(&self.ctx, &mut self.state, run_ui);
}
#[inline]
pub fn run_ui(&mut self, run_ui: impl FnMut(&mut egui::Ui)) {
self.run_output
.update_ui(&self.ctx, &mut self.state, run_ui);
}
#[inline]
pub fn repaint_delay(&self) -> std::time::Duration {
self.run_output.repaint_delay
}
pub fn paint(&mut self, canvas: &mut Canvas<Window>) {
let pixels_per_point = self.run_output.pixels_per_point;
let (textures_delta, shapes) = self.run_output.take();
let clipped_primitives = self.ctx.tessellate(shapes, pixels_per_point);
if let Err(e) = self.painter.paint_and_update_textures(
canvas,
pixels_per_point,
&textures_delta,
clipped_primitives,
) {
log::error!("Failed to paint: {e}");
}
}
pub fn destroy(&mut self) {
self.painter.destroy();
}
}