use crate::sys;
use crate::ui::Ui;
use crate::window::{WindowFlags, validate_window_flags};
use super::context::PopupContextOptions;
use super::flags::{validate_popup_open_flags, validate_popup_query_flags};
use super::{ModalPopup, ModalPopupToken, PopupOpenFlags, PopupQueryFlags, PopupToken};
impl Ui {
#[doc(alias = "OpenPopup")]
pub fn open_popup(&self, str_id: impl AsRef<str>) {
let str_id_ptr = self.scratch_txt(str_id);
unsafe { sys::igOpenPopup_Str(str_id_ptr, PopupOpenFlags::NONE.raw()) }
}
#[doc(alias = "OpenPopup")]
pub fn open_popup_with_flags(&self, str_id: impl AsRef<str>, flags: PopupOpenFlags) {
validate_popup_open_flags("Ui::open_popup_with_flags()", flags);
let str_id_ptr = self.scratch_txt(str_id);
unsafe { sys::igOpenPopup_Str(str_id_ptr, flags.raw()) }
}
#[doc(alias = "OpenPopupOnItemClick")]
pub fn open_popup_on_item_click(&self, str_id: Option<&str>) {
self.open_popup_on_item_click_with_flags(str_id, PopupContextOptions::new());
}
#[doc(alias = "OpenPopupOnItemClick")]
pub fn open_popup_on_item_click_with_flags(
&self,
str_id: Option<&str>,
flags: impl Into<PopupContextOptions>,
) {
let options = flags.into();
options.validate("Ui::open_popup_on_item_click_with_flags()");
let str_id_ptr = str_id
.map(|s| self.scratch_txt(s))
.unwrap_or(std::ptr::null());
unsafe { sys::igOpenPopupOnItemClick(str_id_ptr, options.raw()) }
}
#[doc(alias = "BeginPopup")]
pub fn begin_popup(&self, str_id: impl AsRef<str>) -> Option<PopupToken<'_>> {
self.begin_popup_with_flags(str_id, WindowFlags::empty())
}
#[doc(alias = "BeginPopup")]
pub fn begin_popup_with_flags(
&self,
str_id: impl AsRef<str>,
flags: WindowFlags,
) -> Option<PopupToken<'_>> {
validate_window_flags("Ui::begin_popup_with_flags()", flags);
let str_id_ptr = self.scratch_txt(str_id);
let render = unsafe { sys::igBeginPopup(str_id_ptr, flags.bits()) };
if render {
Some(PopupToken::new(self))
} else {
None
}
}
#[doc(alias = "BeginPopup")]
pub fn popup<F>(&self, str_id: impl AsRef<str>, f: F)
where
F: FnOnce(),
{
if let Some(_token) = self.begin_popup(str_id) {
f();
}
}
#[doc(alias = "BeginPopupModal")]
pub fn begin_modal_popup(&self, name: impl AsRef<str>) -> Option<ModalPopupToken<'_>> {
let name_ptr = self.scratch_txt(name);
let render = unsafe {
sys::igBeginPopupModal(name_ptr, std::ptr::null_mut(), WindowFlags::empty().bits())
};
if render {
Some(ModalPopupToken::new(self))
} else {
None
}
}
#[doc(alias = "BeginPopupModal")]
pub fn begin_modal_popup_with_opened(
&self,
name: impl AsRef<str>,
opened: &mut bool,
) -> Option<ModalPopupToken<'_>> {
let name_ptr = self.scratch_txt(name);
let opened_ptr = opened as *mut bool;
let render =
unsafe { sys::igBeginPopupModal(name_ptr, opened_ptr, WindowFlags::empty().bits()) };
if render {
Some(ModalPopupToken::new(self))
} else {
None
}
}
pub fn begin_modal_popup_config<'a>(&'a self, name: &'a str) -> ModalPopup<'a> {
ModalPopup {
name,
opened: None,
flags: WindowFlags::empty(),
ui: self,
}
}
pub fn modal_popup<F, R>(&self, name: impl AsRef<str>, f: F) -> Option<R>
where
F: FnOnce() -> R,
{
self.begin_modal_popup(name).map(|_token| f())
}
pub fn modal_popup_with_opened<F, R>(
&self,
name: impl AsRef<str>,
opened: &mut bool,
f: F,
) -> Option<R>
where
F: FnOnce() -> R,
{
self.begin_modal_popup_with_opened(name, opened)
.map(|_token| f())
}
#[doc(alias = "CloseCurrentPopup")]
pub fn close_current_popup(&self) {
unsafe {
sys::igCloseCurrentPopup();
}
}
#[doc(alias = "IsPopupOpen")]
pub fn is_popup_open(&self, str_id: impl AsRef<str>) -> bool {
let str_id_ptr = self.scratch_txt(str_id);
unsafe { sys::igIsPopupOpen_Str(str_id_ptr, PopupQueryFlags::NONE.raw()) }
}
#[doc(alias = "IsPopupOpen")]
pub fn is_popup_open_with_flags(
&self,
str_id: impl AsRef<str>,
flags: PopupQueryFlags,
) -> bool {
validate_popup_query_flags("Ui::is_popup_open_with_flags()", flags);
let str_id_ptr = self.scratch_txt(str_id);
unsafe { sys::igIsPopupOpen_Str(str_id_ptr, flags.raw()) }
}
#[doc(alias = "BeginPopupContextItem")]
pub fn begin_popup_context_item(&self) -> Option<PopupToken<'_>> {
self.begin_popup_context_item_with_flags(None, PopupContextOptions::new())
}
#[doc(alias = "BeginPopupContextItem")]
pub fn begin_popup_context_item_with_label(
&self,
str_id: Option<&str>,
) -> Option<PopupToken<'_>> {
self.begin_popup_context_item_with_flags(str_id, PopupContextOptions::new())
}
#[doc(alias = "BeginPopupContextItem")]
pub fn begin_popup_context_item_with_flags(
&self,
str_id: Option<&str>,
flags: impl Into<PopupContextOptions>,
) -> Option<PopupToken<'_>> {
let options = flags.into();
options.validate("Ui::begin_popup_context_item_with_flags()");
let str_id_ptr = str_id
.map(|s| self.scratch_txt(s))
.unwrap_or(std::ptr::null());
let render = unsafe { sys::igBeginPopupContextItem(str_id_ptr, options.raw()) };
render.then(|| PopupToken::new(self))
}
#[doc(alias = "BeginPopupContextWindow")]
pub fn begin_popup_context_window(&self) -> Option<PopupToken<'_>> {
self.begin_popup_context_window_with_flags(None, PopupContextOptions::new())
}
#[doc(alias = "BeginPopupContextWindow")]
pub fn begin_popup_context_window_with_label(
&self,
str_id: Option<&str>,
) -> Option<PopupToken<'_>> {
self.begin_popup_context_window_with_flags(str_id, PopupContextOptions::new())
}
#[doc(alias = "BeginPopupContextWindow")]
pub fn begin_popup_context_window_with_flags(
&self,
str_id: Option<&str>,
flags: impl Into<PopupContextOptions>,
) -> Option<PopupToken<'_>> {
let options = flags.into();
options.validate("Ui::begin_popup_context_window_with_flags()");
let str_id_ptr = str_id
.map(|s| self.scratch_txt(s))
.unwrap_or(std::ptr::null());
let render = unsafe { sys::igBeginPopupContextWindow(str_id_ptr, options.raw()) };
render.then(|| PopupToken::new(self))
}
#[doc(alias = "BeginPopupContextVoid")]
pub fn begin_popup_context_void(&self) -> Option<PopupToken<'_>> {
self.begin_popup_context_void_with_flags(None, PopupContextOptions::new())
}
#[doc(alias = "BeginPopupContextVoid")]
pub fn begin_popup_context_void_with_label(
&self,
str_id: Option<&str>,
) -> Option<PopupToken<'_>> {
self.begin_popup_context_void_with_flags(str_id, PopupContextOptions::new())
}
#[doc(alias = "BeginPopupContextVoid")]
pub fn begin_popup_context_void_with_flags(
&self,
str_id: Option<&str>,
flags: impl Into<PopupContextOptions>,
) -> Option<PopupToken<'_>> {
let options = flags.into();
options.validate("Ui::begin_popup_context_void_with_flags()");
let str_id_ptr = str_id
.map(|s| self.scratch_txt(s))
.unwrap_or(std::ptr::null());
let render = unsafe { sys::igBeginPopupContextVoid(str_id_ptr, options.raw()) };
render.then(|| PopupToken::new(self))
}
}