mirror of
https://github.com/eliasstepanik/imgui-rs.git
synced 2026-01-15 07:28:28 +00:00
121 lines
3.6 KiB
Rust
121 lines
3.6 KiB
Rust
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<F: FnOnce()>(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() };
|
|
}
|
|
}
|
|
}
|