use std::marker::PhantomData; use std::ptr; use crate::sys; use crate::window::WindowFlags; use crate::{ImStr, Ui}; /// Created by call to [`Ui::popup_modal`]. #[must_use] pub struct PopupModal<'ui, 'p> { label: &'p ImStr, opened: Option<&'p mut bool>, flags: WindowFlags, _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: WindowFlags::empty(), _phantom: PhantomData, } } /// Pass a mutable boolean which will be updated to refer to the current /// "open" state of the modal. pub fn opened(mut self, opened: &'p mut bool) -> Self { self.opened = Some(opened); self } pub fn flags(mut self, flags: WindowFlags) -> Self { self.flags = flags; self } pub fn title_bar(mut self, value: bool) -> Self { self.flags.set(WindowFlags::NO_TITLE_BAR, !value); self } pub fn resizable(mut self, value: bool) -> Self { self.flags.set(WindowFlags::NO_RESIZE, !value); self } pub fn movable(mut self, value: bool) -> Self { self.flags.set(WindowFlags::NO_MOVE, !value); self } pub fn scroll_bar(mut self, value: bool) -> Self { self.flags.set(WindowFlags::NO_SCROLLBAR, !value); self } pub fn scrollable(mut self, value: bool) -> Self { self.flags.set(WindowFlags::NO_SCROLL_WITH_MOUSE, !value); self } pub fn collapsible(mut self, value: bool) -> Self { self.flags.set(WindowFlags::NO_COLLAPSE, !value); self } pub fn always_auto_resize(mut self, value: bool) -> Self { self.flags.set(WindowFlags::ALWAYS_AUTO_RESIZE, value); self } pub fn save_settings(mut self, value: bool) -> Self { self.flags.set(WindowFlags::NO_SAVED_SETTINGS, !value); self } pub fn inputs(mut self, value: bool) -> Self { self.flags.set(WindowFlags::NO_INPUTS, !value); self } pub fn menu_bar(mut self, value: bool) -> Self { self.flags.set(WindowFlags::MENU_BAR, value); self } pub fn horizontal_scrollbar(mut self, value: bool) -> Self { self.flags.set(WindowFlags::HORIZONTAL_SCROLLBAR, value); self } pub fn no_focus_on_appearing(mut self, value: bool) -> Self { self.flags.set(WindowFlags::NO_FOCUS_ON_APPEARING, value); self } pub fn no_bring_to_front_on_focus(mut self, value: bool) -> Self { self.flags .set(WindowFlags::NO_BRING_TO_FRONT_ON_FOCUS, value); self } pub fn always_vertical_scrollbar(mut self, value: bool) -> Self { self.flags .set(WindowFlags::ALWAYS_VERTICAL_SCROLLBAR, value); self } pub fn always_horizontal_scrollbar(mut self, value: bool) -> Self { self.flags .set(WindowFlags::ALWAYS_HORIZONTAL_SCROLLBAR, value); self } pub fn always_use_window_padding(mut self, value: bool) -> Self { self.flags .set(WindowFlags::ALWAYS_USE_WINDOW_PADDING, value); self } /// Consume and draw the PopupModal. 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.bits() as i32, ) }; if render { f(); unsafe { sys::igEndPopup() }; } } }