1pub mod platform;
2pub mod renderer;
3pub mod utils;
4
5use crate::platform::Platform;
6use crate::renderer::UiRenderer;
7use fyrox_ui::UiUpdateSwitches;
8use fyrox_ui::{UserInterface, core::algebra::Vector2, message::UiMessage};
9use sdl3::gpu::*;
10
11pub struct FyroxUiSdl {
12 pub ui: UserInterface,
13 pub renderer: UiRenderer,
14 pub platform: Platform,
15
16 pub width: f32,
17 pub height: f32,
18}
19
20impl FyroxUiSdl {
21 pub fn new(device: &sdl3::gpu::Device, window: &sdl3::video::Window) -> Self {
22 let ui = UserInterface::new(Vector2::new(window.size().0 as f32, window.size().1 as f32));
23
24 let renderer = UiRenderer::new(device, window);
25 let platform = Platform::new();
26
27 Self {
28 ui,
29 renderer,
30 platform,
31 width: window.size().0 as f32,
32 height: window.size().1 as f32,
33 }
34 }
35
36 pub fn handle_event<T>(&mut self, event: &sdl3::event::Event, mut event_callback: T)
37 where
38 T: FnMut(UiMessage),
39 {
40 self.platform.handle_event(&mut self.ui, event);
41
42 while let Some(message) = self.ui.poll_message() {
43 event_callback(message);
44 }
45 }
46
47 pub fn resize(&mut self, width: f32, height: f32) {
49 self.width = width;
50 self.height = height;
51 self.ui.set_screen_size(Vector2::new(width, height));
52 }
53
54 pub fn update(&mut self, dt: f32) {
56 self.ui.update(
57 Vector2::new(self.width, self.height),
58 dt,
59 &UiUpdateSwitches { node_overrides: None },
60 );
61 }
62
63 pub fn send_message(&mut self, message: UiMessage) {
65 self.ui.send_message(message);
66 }
67
68 pub fn render(
69 &mut self,
70 device: &sdl3::gpu::Device,
71 window: &sdl3::video::Window,
72 command_buffer: &mut CommandBuffer,
73 color_targets: &[ColorTargetInfo],
74 ) -> Result<(), Box<dyn std::error::Error>> {
75 let draw_ctx = self.ui.draw();
76 self.renderer
77 .render(device, window, command_buffer, color_targets, draw_ctx)
78 }
79}