diff --git a/src/lib.rs b/src/lib.rs index 08d86bd..9a25353 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -25,6 +25,7 @@ pub use input::{ pub use menus::{Menu, MenuItem}; pub use plothistogram::PlotHistogram; pub use plotlines::PlotLines; +pub use popup_modal::PopupModal; pub use progressbar::ProgressBar; pub use sliders::{ SliderFloat, SliderFloat2, SliderFloat3, SliderFloat4, SliderInt, SliderInt2, SliderInt3, @@ -49,6 +50,7 @@ mod input; mod menus; mod plothistogram; mod plotlines; +mod popup_modal; mod progressbar; mod sliders; mod string; @@ -1204,6 +1206,9 @@ impl<'ui> Ui<'ui> { unsafe { sys::igEndPopup() }; } } + pub fn popup_modal<'p>(&self, str_id: &'p ImStr) -> PopupModal<'ui, 'p> { + PopupModal::new(self, str_id) + } pub fn close_current_popup(&self) { unsafe { sys::igCloseCurrentPopup() }; } diff --git a/src/popup_modal.rs b/src/popup_modal.rs new file mode 100644 index 0000000..339f9cf --- /dev/null +++ b/src/popup_modal.rs @@ -0,0 +1,44 @@ +use std::marker::PhantomData; +use std::ptr; + +use super::{ImGuiWindowFlags, ImStr, Ui}; + +use sys; + +#[must_use] +pub struct PopupModal<'ui, 'p> { + label: &'p ImStr, + opened: Option<&'p mut bool>, + flags: ImGuiWindowFlags, + _phantom: PhantomData<&'ui Ui<'ui>>, +} + +impl<'ui, 'p> PopupModal<'ui, 'p> { + pub fn new(_: &Ui<'ui>, label: &'p ImStr) -> Self { + PopupModal { + label, + opened: None, + flags: ImGuiWindowFlags::empty(), + _phantom: PhantomData, + } + } + pub fn opened(mut self, opened: &'p mut bool) -> Self { + self.opened = Some(opened); + self + } + pub fn build(self, f: F) { + let render = unsafe { + sys::igBeginPopupModal( + self.label.as_ptr(), + self.opened + .map(|x| x as *mut bool) + .unwrap_or(ptr::null_mut()), + self.flags, + ) + }; + if render { + f(); + unsafe { sys::igEndMenu() }; + } + } +}