From 91eec219f6b9814c8065a1a33ca6ad3e088d4b58 Mon Sep 17 00:00:00 2001 From: Joonas Javanainen Date: Sun, 27 Sep 2015 15:57:08 +0300 Subject: [PATCH] Unsafe function to get the "current UI" out of thin air --- src/lib.rs | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index cdb1528..e466456 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -233,7 +233,12 @@ impl ImGui { io.display_size.y = height as c_float; io.delta_time = delta_time; } - unsafe { imgui_sys::igNewFrame() }; + unsafe { + imgui_sys::igNewFrame(); + CURRENT_UI = Some(Ui { + imgui: mem::transmute(self as &'a ImGui) + }); + } Ui { imgui: self } @@ -243,11 +248,14 @@ impl ImGui { impl Drop for ImGui { fn drop(&mut self) { unsafe { + CURRENT_UI = None; imgui_sys::igShutdown(); } } } +static mut CURRENT_UI: Option> = None; + #[cfg(feature = "sdl2")] impl ImGui { pub fn update_mouse(&mut self, mouse: &::sdl2::mouse::MouseUtil) { @@ -315,7 +323,7 @@ impl<'ui> Ui<'ui> { let mut im_draw_data = mem::zeroed(); RENDER_DRAW_LISTS_STATE.0 = &mut im_draw_data; imgui_sys::igRender(); - RENDER_DRAW_LISTS_STATE.0 = 0 as *mut imgui_sys::ImDrawData; + RENDER_DRAW_LISTS_STATE.0 = ptr::null_mut(); for &cmd_list in im_draw_data.cmd_lists() { let draw_list = @@ -326,6 +334,7 @@ impl<'ui> Ui<'ui> { }; try!(f(draw_list)); } + CURRENT_UI = None; } Ok(()) } @@ -350,6 +359,12 @@ impl<'ui> Ui<'ui> { } } +impl<'a> Ui<'a> { + pub unsafe fn current_ui() -> Option<&'a Ui<'a>> { + CURRENT_UI.as_ref() + } +} + // Window impl<'ui> Ui<'ui> { pub fn window<'p>(&self) -> Window<'ui, 'p> { Window::new() }