diff --git a/uidev/.editorconfig b/uidev/.editorconfig new file mode 100644 index 0000000..f5834b7 --- /dev/null +++ b/uidev/.editorconfig @@ -0,0 +1,8 @@ +root = true + +[*.rs] +indent_style = tab +indent_size = 2 +charset = utf-8 +trim_trailing_whitespace = false +insert_final_newline = false \ No newline at end of file diff --git a/uidev/rustfmt.toml b/uidev/rustfmt.toml new file mode 100644 index 0000000..39694dc --- /dev/null +++ b/uidev/rustfmt.toml @@ -0,0 +1,2 @@ +tab_spaces = 2 +hard_tabs = true \ No newline at end of file diff --git a/uidev/src/main.rs b/uidev/src/main.rs index 2334f79..7675175 100644 --- a/uidev/src/main.rs +++ b/uidev/src/main.rs @@ -8,28 +8,27 @@ use tracing_subscriber::layer::SubscriberExt; use tracing_subscriber::util::SubscriberInitExt; use vulkan::init_window; use vulkano::{ - Validated, VulkanError, - command_buffer::CommandBufferUsage, - format::Format, - image::{ImageUsage, view::ImageView}, - swapchain::{ - Surface, SurfaceInfo, Swapchain, SwapchainCreateInfo, SwapchainPresentInfo, - acquire_next_image, - }, - sync::GpuFuture, + Validated, VulkanError, + command_buffer::CommandBufferUsage, + format::Format, + image::{ImageUsage, view::ImageView}, + swapchain::{ + Surface, SurfaceInfo, Swapchain, SwapchainCreateInfo, SwapchainPresentInfo, acquire_next_image, + }, + sync::GpuFuture, }; use wgui::{ - event::{ - EventListenerCollection, MouseButtonIndex, MouseDownEvent, MouseMotionEvent, MouseUpEvent, - MouseWheelEvent, - }, - gfx::WGfx, - renderer_vk::{self}, + event::{ + EventListenerCollection, MouseButtonIndex, MouseDownEvent, MouseMotionEvent, MouseUpEvent, + MouseWheelEvent, + }, + gfx::WGfx, + renderer_vk::{self}, }; use winit::{ - event::{ElementState, Event, MouseScrollDelta, WindowEvent}, - event_loop::ControlFlow, - keyboard::{KeyCode, PhysicalKey}, + event::{ElementState, Event, MouseScrollDelta, WindowEvent}, + event_loop::ControlFlow, + keyboard::{KeyCode, PhysicalKey}, }; use crate::testbed::{testbed_dashboard::TestbedDashboard, testbed_generic::TestbedGeneric}; @@ -41,332 +40,324 @@ mod timestep; mod vulkan; fn init_logging() { - tracing_subscriber::registry() - .with( - tracing_subscriber::fmt::layer() - .pretty() - .with_writer(std::io::stderr), - ) - .with( - /* read RUST_LOG env var */ - EnvFilter::builder() - .with_default_directive(LevelFilter::DEBUG.into()) - .from_env_lossy(), - ) - .init(); + tracing_subscriber::registry() + .with( + tracing_subscriber::fmt::layer() + .pretty() + .with_writer(std::io::stderr), + ) + .with( + /* read RUST_LOG env var */ + EnvFilter::builder() + .with_default_directive(LevelFilter::DEBUG.into()) + .from_env_lossy(), + ) + .init(); } fn load_testbed( - listeners: &mut EventListenerCollection<(), ()>, + listeners: &mut EventListenerCollection<(), ()>, ) -> anyhow::Result> { - let name = std::env::var("TESTBED").unwrap_or_default(); - Ok(match name.as_str() { - "dashboard" => Box::new(TestbedDashboard::new(listeners)?), - "" => Box::new(TestbedGeneric::new(listeners)?), - _ => Box::new(TestbedAny::new(&name, listeners)?), - }) + let name = std::env::var("TESTBED").unwrap_or_default(); + Ok(match name.as_str() { + "dashboard" => Box::new(TestbedDashboard::new(listeners)?), + "" => Box::new(TestbedGeneric::new(listeners)?), + _ => Box::new(TestbedAny::new(&name, listeners)?), + }) } fn main() -> Result<(), Box> { - init_logging(); + init_logging(); - let (gfx, event_loop, window, surface) = init_window()?; - let inner_size = window.inner_size(); - let mut swapchain_size = [inner_size.width, inner_size.height]; + let (gfx, event_loop, window, surface) = init_window()?; + let inner_size = window.inner_size(); + let mut swapchain_size = [inner_size.width, inner_size.height]; - let mut swapchain_create_info = - swapchain_create_info(&gfx, gfx.surface_format, surface.clone(), swapchain_size); + let mut swapchain_create_info = + swapchain_create_info(&gfx, gfx.surface_format, surface.clone(), swapchain_size); - let (mut swapchain, mut images) = { - let (swapchain, images) = Swapchain::new( - gfx.device.clone(), - surface.clone(), - swapchain_create_info.clone(), - )?; + let (mut swapchain, mut images) = { + let (swapchain, images) = Swapchain::new( + gfx.device.clone(), + surface.clone(), + swapchain_create_info.clone(), + )?; - let image_views = images - .into_iter() - .map(|image| ImageView::new_default(image).unwrap()) - .collect::>(); + let image_views = images + .into_iter() + .map(|image| ImageView::new_default(image).unwrap()) + .collect::>(); - (swapchain, image_views) - }; + (swapchain, image_views) + }; - let mut recreate = false; + let mut recreate = false; - let mut scale = window.scale_factor() as f32; + let mut scale = window.scale_factor() as f32; - let mut listeners = EventListenerCollection::default(); + let mut listeners = EventListenerCollection::default(); - let mut testbed = load_testbed(&mut listeners)?; + let mut testbed = load_testbed(&mut listeners)?; - let mut mouse = Vec2::ZERO; + let mut mouse = Vec2::ZERO; - let mut shared_context = renderer_vk::context::SharedContext::new(gfx.clone())?; - let mut render_context = renderer_vk::context::Context::new(&mut shared_context, scale)?; + let mut shared_context = renderer_vk::context::SharedContext::new(gfx.clone())?; + let mut render_context = renderer_vk::context::Context::new(&mut shared_context, scale)?; - render_context.update_viewport(&mut shared_context, swapchain_size, scale)?; - println!("new swapchain_size: {swapchain_size:?}"); + render_context.update_viewport(&mut shared_context, swapchain_size, scale)?; + println!("new swapchain_size: {swapchain_size:?}"); - let mut profiler = profiler::Profiler::new(1000); - let mut frame_index: u64 = 0; + let mut profiler = profiler::Profiler::new(1000); + let mut frame_index: u64 = 0; - let mut timestep = Timestep::new(); - timestep.set_tps(60.0); + let mut timestep = Timestep::new(); + timestep.set_tps(60.0); - #[allow(deprecated)] - event_loop.run(move |event, elwt| { - elwt.set_control_flow(ControlFlow::Poll); + #[allow(deprecated)] + event_loop.run(move |event, elwt| { + elwt.set_control_flow(ControlFlow::Poll); - match event { - Event::WindowEvent { - event: WindowEvent::MouseWheel { delta, .. }, - .. - } => match delta { - MouseScrollDelta::LineDelta(x, y) => testbed - .layout() - .push_event( - &mut listeners, - &wgui::event::Event::MouseWheel(MouseWheelEvent { - shift: Vec2::new(x, y), - pos: mouse / scale, - device: 0, - }), - (&mut (), &mut ()), - ) - .unwrap(), - MouseScrollDelta::PixelDelta(pos) => testbed - .layout() - .push_event( - &mut listeners, - &wgui::event::Event::MouseWheel(MouseWheelEvent { - shift: Vec2::new(pos.x as f32 / 5.0, pos.y as f32 / 5.0), - pos: mouse / scale, - device: 0, - }), - (&mut (), &mut ()), - ) - .unwrap(), - }, - Event::WindowEvent { - event: WindowEvent::MouseInput { state, button, .. }, - .. - } => { - if matches!(button, winit::event::MouseButton::Left) { - if matches!(state, winit::event::ElementState::Pressed) { - testbed - .layout() - .push_event( - &mut listeners, - &wgui::event::Event::MouseDown(MouseDownEvent { - pos: mouse / scale, - index: MouseButtonIndex::Left, - device: 0, - }), - (&mut (), &mut ()), - ) - .unwrap(); - } else { - testbed - .layout() - .push_event( - &mut listeners, - &wgui::event::Event::MouseUp(MouseUpEvent { - pos: mouse / scale, - index: MouseButtonIndex::Left, - device: 0, - }), - (&mut (), &mut ()), - ) - .unwrap(); - } - } - } - Event::WindowEvent { - event: WindowEvent::CursorMoved { position, .. }, - .. - } => { - mouse = vec2(position.x as _, position.y as _); - testbed - .layout() - .push_event( - &mut listeners, - &wgui::event::Event::MouseMotion(MouseMotionEvent { - pos: mouse / scale, - device: 0, - }), - (&mut (), &mut ()), - ) - .unwrap(); - } - Event::WindowEvent { - event: WindowEvent::KeyboardInput { event, .. }, - .. - } => { - if event.state == ElementState::Pressed { - if event.physical_key == PhysicalKey::Code(KeyCode::Equal) { - scale *= 1.25; - render_context - .update_viewport(&mut shared_context, swapchain_size, scale) - .unwrap(); - } + match event { + Event::WindowEvent { + event: WindowEvent::MouseWheel { delta, .. }, + .. + } => match delta { + MouseScrollDelta::LineDelta(x, y) => testbed + .layout() + .push_event( + &mut listeners, + &wgui::event::Event::MouseWheel(MouseWheelEvent { + shift: Vec2::new(x, y), + pos: mouse / scale, + device: 0, + }), + (&mut (), &mut ()), + ) + .unwrap(), + MouseScrollDelta::PixelDelta(pos) => testbed + .layout() + .push_event( + &mut listeners, + &wgui::event::Event::MouseWheel(MouseWheelEvent { + shift: Vec2::new(pos.x as f32 / 5.0, pos.y as f32 / 5.0), + pos: mouse / scale, + device: 0, + }), + (&mut (), &mut ()), + ) + .unwrap(), + }, + Event::WindowEvent { + event: WindowEvent::MouseInput { state, button, .. }, + .. + } => { + if matches!(button, winit::event::MouseButton::Left) { + if matches!(state, winit::event::ElementState::Pressed) { + testbed + .layout() + .push_event( + &mut listeners, + &wgui::event::Event::MouseDown(MouseDownEvent { + pos: mouse / scale, + index: MouseButtonIndex::Left, + device: 0, + }), + (&mut (), &mut ()), + ) + .unwrap(); + } else { + testbed + .layout() + .push_event( + &mut listeners, + &wgui::event::Event::MouseUp(MouseUpEvent { + pos: mouse / scale, + index: MouseButtonIndex::Left, + device: 0, + }), + (&mut (), &mut ()), + ) + .unwrap(); + } + } + } + Event::WindowEvent { + event: WindowEvent::CursorMoved { position, .. }, + .. + } => { + mouse = vec2(position.x as _, position.y as _); + testbed + .layout() + .push_event( + &mut listeners, + &wgui::event::Event::MouseMotion(MouseMotionEvent { + pos: mouse / scale, + device: 0, + }), + (&mut (), &mut ()), + ) + .unwrap(); + } + Event::WindowEvent { + event: WindowEvent::KeyboardInput { event, .. }, + .. + } => { + if event.state == ElementState::Pressed { + if event.physical_key == PhysicalKey::Code(KeyCode::Equal) { + scale *= 1.25; + render_context + .update_viewport(&mut shared_context, swapchain_size, scale) + .unwrap(); + } - if event.physical_key == PhysicalKey::Code(KeyCode::Minus) { - scale *= 0.75; - render_context - .update_viewport(&mut shared_context, swapchain_size, scale) - .unwrap(); - } - } - } - Event::WindowEvent { - event: WindowEvent::CloseRequested, - .. - } => { - elwt.exit(); - } - Event::WindowEvent { - event: WindowEvent::Resized(_), - .. - } => { - recreate = true; - } - Event::WindowEvent { - event: WindowEvent::RedrawRequested, - .. - } => { - if recreate { - let inner_size = window.inner_size(); - swapchain_size = [inner_size.width, inner_size.height]; + if event.physical_key == PhysicalKey::Code(KeyCode::Minus) { + scale *= 0.75; + render_context + .update_viewport(&mut shared_context, swapchain_size, scale) + .unwrap(); + } + } + } + Event::WindowEvent { + event: WindowEvent::CloseRequested, + .. + } => { + elwt.exit(); + } + Event::WindowEvent { + event: WindowEvent::Resized(_), + .. + } => { + recreate = true; + } + Event::WindowEvent { + event: WindowEvent::RedrawRequested, + .. + } => { + if recreate { + let inner_size = window.inner_size(); + swapchain_size = [inner_size.width, inner_size.height]; - swapchain_create_info.image_extent = swapchain_size; + swapchain_create_info.image_extent = swapchain_size; - (swapchain, images) = { - let (swapchain, images) = - swapchain.recreate(swapchain_create_info.clone()).unwrap(); + (swapchain, images) = { + let (swapchain, images) = swapchain.recreate(swapchain_create_info.clone()).unwrap(); - let image_views = images - .into_iter() - .map(|image| ImageView::new_default(image).unwrap()) - .collect::>(); + let image_views = images + .into_iter() + .map(|image| ImageView::new_default(image).unwrap()) + .collect::>(); - (swapchain, image_views) - }; + (swapchain, image_views) + }; - render_context - .update_viewport(&mut shared_context, swapchain_size, scale) - .unwrap(); + render_context + .update_viewport(&mut shared_context, swapchain_size, scale) + .unwrap(); - println!("new swapchain_size: {swapchain_size:?}"); - recreate = false; - window.request_redraw(); - } + println!("new swapchain_size: {swapchain_size:?}"); + recreate = false; + window.request_redraw(); + } - while timestep.on_tick() { - testbed.layout().tick().unwrap(); - } + while timestep.on_tick() { + testbed.layout().tick().unwrap(); + } - testbed - .update( - (swapchain_size[0] as f32 / scale) as _, - (swapchain_size[1] as f32 / scale) as _, - timestep.alpha, - ) - .unwrap(); + testbed + .update( + (swapchain_size[0] as f32 / scale) as _, + (swapchain_size[1] as f32 / scale) as _, + timestep.alpha, + ) + .unwrap(); - if !render_context.dirty && !testbed.layout().check_toggle_needs_redraw() { - // no need to redraw - std::thread::sleep(std::time::Duration::from_millis(5)); // dirty fix to prevent cpu burning precious cycles doing a busy loop - return; - } + if !render_context.dirty && !testbed.layout().check_toggle_needs_redraw() { + // no need to redraw + std::thread::sleep(std::time::Duration::from_millis(5)); // dirty fix to prevent cpu burning precious cycles doing a busy loop + return; + } - log::trace!("drawing frame {frame_index}"); - frame_index += 1; + log::trace!("drawing frame {frame_index}"); + frame_index += 1; - profiler.start(); + profiler.start(); - { - let (image_index, _, acquire_future) = match acquire_next_image( - swapchain.clone(), - None, - ) - .map_err(Validated::unwrap) - { - Ok(r) => r, - Err(VulkanError::OutOfDate) => { - recreate = true; - return; - } - Err(e) => panic!("failed to acquire next image: {e}"), - }; + { + let (image_index, _, acquire_future) = + match acquire_next_image(swapchain.clone(), None).map_err(Validated::unwrap) { + Ok(r) => r, + Err(VulkanError::OutOfDate) => { + recreate = true; + return; + } + Err(e) => panic!("failed to acquire next image: {e}"), + }; - let tgt = images[image_index as usize].clone(); + let tgt = images[image_index as usize].clone(); - let mut cmd_buf = gfx - .create_gfx_command_buffer(CommandBufferUsage::OneTimeSubmit) - .unwrap(); - cmd_buf.begin_rendering(tgt).unwrap(); + let mut cmd_buf = gfx + .create_gfx_command_buffer(CommandBufferUsage::OneTimeSubmit) + .unwrap(); + cmd_buf.begin_rendering(tgt).unwrap(); - let primitives = wgui::drawing::draw(testbed.layout()).unwrap(); - render_context - .draw(&mut shared_context, &mut cmd_buf, &primitives) - .unwrap(); + let primitives = wgui::drawing::draw(testbed.layout()).unwrap(); + render_context + .draw(&mut shared_context, &mut cmd_buf, &primitives) + .unwrap(); - cmd_buf.end_rendering().unwrap(); + cmd_buf.end_rendering().unwrap(); - let cmd_buf = cmd_buf.build().unwrap(); + let cmd_buf = cmd_buf.build().unwrap(); - acquire_future - .then_execute(gfx.queue_gfx.clone(), cmd_buf) - .unwrap() - .then_swapchain_present( - gfx.queue_gfx.clone(), - SwapchainPresentInfo::swapchain_image_index( - swapchain.clone(), - image_index, - ), - ) - .then_signal_fence_and_flush() - .unwrap() - .wait(None) - .unwrap(); - } + acquire_future + .then_execute(gfx.queue_gfx.clone(), cmd_buf) + .unwrap() + .then_swapchain_present( + gfx.queue_gfx.clone(), + SwapchainPresentInfo::swapchain_image_index(swapchain.clone(), image_index), + ) + .then_signal_fence_and_flush() + .unwrap() + .wait(None) + .unwrap(); + } - profiler.end(); - } - Event::AboutToWait => { - // should be limited to vsync - window.request_redraw(); - } - _ => (), - } - })?; + profiler.end(); + } + Event::AboutToWait => { + // should be limited to vsync + window.request_redraw(); + } + _ => (), + } + })?; - Ok(()) + Ok(()) } fn swapchain_create_info( - graphics: &WGfx, - format: Format, - surface: Arc, - extent: [u32; 2], + graphics: &WGfx, + format: Format, + surface: Arc, + extent: [u32; 2], ) -> SwapchainCreateInfo { - let surface_capabilities = graphics - .device - .physical_device() - .surface_capabilities(&surface, SurfaceInfo::default()) - .unwrap(); // want panic + let surface_capabilities = graphics + .device + .physical_device() + .surface_capabilities(&surface, SurfaceInfo::default()) + .unwrap(); // want panic - SwapchainCreateInfo { - min_image_count: surface_capabilities.min_image_count.max(2), - image_format: format, - image_extent: extent, - image_usage: ImageUsage::COLOR_ATTACHMENT, - composite_alpha: surface_capabilities - .supported_composite_alpha - .into_iter() - .next() - .unwrap(), // want panic - ..Default::default() - } + SwapchainCreateInfo { + min_image_count: surface_capabilities.min_image_count.max(2), + image_format: format, + image_extent: extent, + image_usage: ImageUsage::COLOR_ATTACHMENT, + composite_alpha: surface_capabilities + .supported_composite_alpha + .into_iter() + .next() + .unwrap(), // want panic + ..Default::default() + } } diff --git a/uidev/src/testbed/mod.rs b/uidev/src/testbed/mod.rs index a4742a4..cdf6c23 100644 --- a/uidev/src/testbed/mod.rs +++ b/uidev/src/testbed/mod.rs @@ -5,6 +5,6 @@ pub mod testbed_dashboard; pub mod testbed_generic; pub trait Testbed { - fn update(&mut self, width: f32, height: f32, timestep_alpha: f32) -> anyhow::Result<()>; - fn layout(&mut self) -> &mut Layout; + fn update(&mut self, width: f32, height: f32, timestep_alpha: f32) -> anyhow::Result<()>; + fn layout(&mut self) -> &mut Layout; } diff --git a/uidev/src/testbed/testbed_any.rs b/uidev/src/testbed/testbed_any.rs index 6bea26f..2d35e7b 100644 --- a/uidev/src/testbed/testbed_any.rs +++ b/uidev/src/testbed/testbed_any.rs @@ -1,48 +1,46 @@ use crate::{assets, testbed::Testbed}; use glam::Vec2; use wgui::{ - event::EventListenerCollection, - globals::WguiGlobals, - layout::Layout, - parser::{ParseDocumentParams, ParserState}, + event::EventListenerCollection, + globals::WguiGlobals, + layout::Layout, + parser::{ParseDocumentParams, ParserState}, }; pub struct TestbedAny { - pub layout: Layout, + pub layout: Layout, - #[allow(dead_code)] - state: ParserState, + #[allow(dead_code)] + state: ParserState, } impl TestbedAny { - pub fn new( - name: &str, - listeners: &mut EventListenerCollection<(), ()>, - ) -> anyhow::Result { - let path = format!("gui/{name}.xml"); + pub fn new(name: &str, listeners: &mut EventListenerCollection<(), ()>) -> anyhow::Result { + let path = format!("gui/{name}.xml"); - let globals = WguiGlobals::new(Box::new(assets::Asset {}))?; + let globals = WguiGlobals::new(Box::new(assets::Asset {}))?; - let (layout, state) = wgui::parser::new_layout_from_assets( - listeners, - &ParseDocumentParams { - globals, - path: &path, - extra: Default::default(), - }, - )?; - Ok(Self { layout, state }) - } + let (layout, state) = wgui::parser::new_layout_from_assets( + listeners, + &ParseDocumentParams { + globals, + path: &path, + extra: Default::default(), + }, + )?; + Ok(Self { layout, state }) + } } impl Testbed for TestbedAny { - fn update(&mut self, width: f32, height: f32, timestep_alpha: f32) -> anyhow::Result<()> { - self.layout - .update(Vec2::new(width, height), timestep_alpha)?; - Ok(()) - } + fn update(&mut self, width: f32, height: f32, timestep_alpha: f32) -> anyhow::Result<()> { + self + .layout + .update(Vec2::new(width, height), timestep_alpha)?; + Ok(()) + } - fn layout(&mut self) -> &mut Layout { - &mut self.layout - } + fn layout(&mut self) -> &mut Layout { + &mut self.layout + } } diff --git a/uidev/src/testbed/testbed_dashboard.rs b/uidev/src/testbed/testbed_dashboard.rs index b67cada..014af1f 100644 --- a/uidev/src/testbed/testbed_dashboard.rs +++ b/uidev/src/testbed/testbed_dashboard.rs @@ -2,24 +2,24 @@ use crate::testbed::Testbed; use wgui::{event::EventListenerCollection, layout::Layout}; pub struct TestbedDashboard { - frontend: dash_frontend::Frontend, + frontend: dash_frontend::Frontend, } impl TestbedDashboard { - pub fn new(listeners: &mut EventListenerCollection<(), ()>) -> anyhow::Result { - Ok(Self { - frontend: dash_frontend::Frontend::new(dash_frontend::FrontendParams { listeners })?, - }) - } + pub fn new(listeners: &mut EventListenerCollection<(), ()>) -> anyhow::Result { + Ok(Self { + frontend: dash_frontend::Frontend::new(dash_frontend::FrontendParams { listeners })?, + }) + } } impl Testbed for TestbedDashboard { - fn update(&mut self, width: f32, height: f32, timestep_alpha: f32) -> anyhow::Result<()> { - self.frontend.update(width, height, timestep_alpha)?; - Ok(()) - } + fn update(&mut self, width: f32, height: f32, timestep_alpha: f32) -> anyhow::Result<()> { + self.frontend.update(width, height, timestep_alpha)?; + Ok(()) + } - fn layout(&mut self) -> &mut Layout { - self.frontend.get_layout() - } + fn layout(&mut self) -> &mut Layout { + self.frontend.get_layout() + } } diff --git a/uidev/src/testbed/testbed_generic.rs b/uidev/src/testbed/testbed_generic.rs index 9280e6c..c481827 100644 --- a/uidev/src/testbed/testbed_generic.rs +++ b/uidev/src/testbed/testbed_generic.rs @@ -3,130 +3,131 @@ use std::rc::Rc; use crate::{assets, testbed::Testbed}; use glam::Vec2; use wgui::{ - components::{ - Component, - button::{ButtonClickCallback, ComponentButton}, - checkbox::ComponentCheckbox, - }, - drawing::Color, - event::EventListenerCollection, - globals::WguiGlobals, - i18n::Translation, - layout::{Layout, Widget}, - parser::{ParseDocumentExtra, ParseDocumentParams, ParserState}, - widget::{label::WidgetLabel, rectangle::WidgetRectangle}, + components::{ + Component, + button::{ButtonClickCallback, ComponentButton}, + checkbox::ComponentCheckbox, + }, + drawing::Color, + event::EventListenerCollection, + globals::WguiGlobals, + i18n::Translation, + layout::{Layout, Widget}, + parser::{ParseDocumentExtra, ParseDocumentParams, ParserState}, + widget::{label::WidgetLabel, rectangle::WidgetRectangle}, }; pub struct TestbedGeneric { - pub layout: Layout, + pub layout: Layout, - #[allow(dead_code)] - state: ParserState, + #[allow(dead_code)] + state: ParserState, } fn button_click_callback( - button: Component, - label: Widget, - text: &'static str, + button: Component, + label: Widget, + text: &'static str, ) -> ButtonClickCallback { - Box::new(move |e| { - label.get_as_mut::().set_text( - &mut e.state.globals.i18n(), - Translation::from_raw_text(text), - ); + Box::new(move |e| { + label.get_as_mut::().set_text( + &mut e.state.globals.i18n(), + Translation::from_raw_text(text), + ); - button.try_cast::()?.set_text( - e.state, - e.alterables, - Translation::from_raw_text("this button has been clicked"), - ); + button.try_cast::()?.set_text( + e.state, + e.alterables, + Translation::from_raw_text("this button has been clicked"), + ); - Ok(()) - }) + Ok(()) + }) } fn handle_button_click(button: Rc, label: Widget, text: &'static str) { - button.on_click(button_click_callback( - Component(button.clone()), - label, - text, - )); + button.on_click(button_click_callback( + Component(button.clone()), + label, + text, + )); } impl TestbedGeneric { - pub fn new(listeners: &mut EventListenerCollection<(), ()>) -> anyhow::Result { - const XML_PATH: &str = "gui/various_widgets.xml"; + pub fn new(listeners: &mut EventListenerCollection<(), ()>) -> anyhow::Result { + const XML_PATH: &str = "gui/various_widgets.xml"; - let globals = WguiGlobals::new(Box::new(assets::Asset {}))?; + let globals = WguiGlobals::new(Box::new(assets::Asset {}))?; - let extra = ParseDocumentExtra { - on_custom_attrib: Some(Box::new(move |par| { - if par.attrib == "my_custom" { - let mut rect = par.get_widget_as::().unwrap(); - rect.params.color = match par.value { - "red" => Color::new(1.0, 0.0, 0.0, 1.0), - "green" => Color::new(0.0, 1.0, 0.0, 1.0), - "blue" => Color::new(0.0, 0.0, 1.0, 1.0), - _ => Color::new(1.0, 1.0, 1.0, 1.0), - } - } - })), - dev_mode: false, - }; + let extra = ParseDocumentExtra { + on_custom_attrib: Some(Box::new(move |par| { + if par.attrib == "my_custom" { + let mut rect = par.get_widget_as::().unwrap(); + rect.params.color = match par.value { + "red" => Color::new(1.0, 0.0, 0.0, 1.0), + "green" => Color::new(0.0, 1.0, 0.0, 1.0), + "blue" => Color::new(0.0, 0.0, 1.0, 1.0), + _ => Color::new(1.0, 1.0, 1.0, 1.0), + } + } + })), + dev_mode: false, + }; - let (layout, state) = wgui::parser::new_layout_from_assets( - listeners, - &ParseDocumentParams { - globals, - path: XML_PATH, - extra, - }, - )?; + let (layout, state) = wgui::parser::new_layout_from_assets( + listeners, + &ParseDocumentParams { + globals, + path: XML_PATH, + extra, + }, + )?; - let label_cur_option = state.fetch_widget(&layout.state, "label_current_option")?; + let label_cur_option = state.fetch_widget(&layout.state, "label_current_option")?; - let button_click_me = state.fetch_component_as::("button_click_me")?; - let button = button_click_me.clone(); - button_click_me.on_click(Box::new(move |e| { - button.set_text( - e.state, - e.alterables, - Translation::from_raw_text("congrats!"), - ); - Ok(()) - })); + let button_click_me = state.fetch_component_as::("button_click_me")?; + let button = button_click_me.clone(); + button_click_me.on_click(Box::new(move |e| { + button.set_text( + e.state, + e.alterables, + Translation::from_raw_text("congrats!"), + ); + Ok(()) + })); - let button_red = state.fetch_component_as::("button_red")?; - let button_aqua = state.fetch_component_as::("button_aqua")?; - let button_yellow = state.fetch_component_as::("button_yellow")?; + let button_red = state.fetch_component_as::("button_red")?; + let button_aqua = state.fetch_component_as::("button_aqua")?; + let button_yellow = state.fetch_component_as::("button_yellow")?; - handle_button_click(button_red, label_cur_option.clone(), "Clicked red"); - handle_button_click(button_aqua, label_cur_option.clone(), "Clicked aqua"); - handle_button_click(button_yellow, label_cur_option.clone(), "Clicked yellow"); + handle_button_click(button_red, label_cur_option.clone(), "Clicked red"); + handle_button_click(button_aqua, label_cur_option.clone(), "Clicked aqua"); + handle_button_click(button_yellow, label_cur_option.clone(), "Clicked yellow"); - let cb_first = state.fetch_component_as::("cb_first")?; - let label = label_cur_option.clone(); - cb_first.on_toggle(Box::new(move |e| { - let mut widget = label.get_as_mut::(); - widget.set_text( - &mut e.state.globals.i18n(), - Translation::from_raw_text(&format!("checkbox toggle: {}", e.checked)), - ); - Ok(()) - })); + let cb_first = state.fetch_component_as::("cb_first")?; + let label = label_cur_option.clone(); + cb_first.on_toggle(Box::new(move |e| { + let mut widget = label.get_as_mut::(); + widget.set_text( + &mut e.state.globals.i18n(), + Translation::from_raw_text(&format!("checkbox toggle: {}", e.checked)), + ); + Ok(()) + })); - Ok(Self { layout, state }) - } + Ok(Self { layout, state }) + } } impl Testbed for TestbedGeneric { - fn update(&mut self, width: f32, height: f32, timestep_alpha: f32) -> anyhow::Result<()> { - self.layout - .update(Vec2::new(width, height), timestep_alpha)?; - Ok(()) - } + fn update(&mut self, width: f32, height: f32, timestep_alpha: f32) -> anyhow::Result<()> { + self + .layout + .update(Vec2::new(width, height), timestep_alpha)?; + Ok(()) + } - fn layout(&mut self) -> &mut Layout { - &mut self.layout - } + fn layout(&mut self) -> &mut Layout { + &mut self.layout + } }