1use egui::CtxRef;
2
3use crate::{
4 editor::Editor,
5 prelude::UpdateCtx,
6 renderer::{RenderCtx, Renderer},
7 state::State,
8 view::Views,
9};
10
11pub struct App<S: 'static> {
12 pub editor: Editor<S>,
13 pub renderer: Renderer<S>,
14}
15
16impl<S> App<S> {
17 #[inline]
18 pub fn new() -> Self {
19 Self {
20 editor: Default::default(),
21 renderer: Default::default(),
22 }
23 }
24}
25
26pub struct AppContainer<S: 'static> {
27 pub app: App<S>,
28 pub state: S,
29}
30
31pub trait AppTrait {
32 fn show_editor(&mut self, views: &Views, egui_ctx: &CtxRef, render_ctx: &RenderCtx);
33
34 fn update(&mut self, update_ctx: &mut UpdateCtx);
35
36 fn render(&mut self, views: &mut Views);
37
38 fn render_views(&mut self, ctx: &RenderCtx, views: &Views);
39}
40
41impl<S: State> AppTrait for AppContainer<S> {
42 fn show_editor(&mut self, views: &Views, egui_ctx: &CtxRef, render_ctx: &RenderCtx) {
43 self.app
44 .show_editor(views, egui_ctx, render_ctx, &mut self.state);
45 }
46
47 fn update(&mut self, update_ctx: &mut UpdateCtx) {
48 self.state.update(update_ctx);
49 }
50
51 fn render(&mut self, views: &mut Views) {
52 self.state.render(views);
53 }
54
55 fn render_views(&mut self, render_ctx: &RenderCtx, views: &Views) {
56 for view in views.views.values() {
57 self.app
58 .renderer
59 .render_view(render_ctx, view, &mut self.state);
60 }
61 }
62}