use std::ptr;
use std::thread;
use crate::context::Context;
use crate::string::ImStr;
use crate::sys;
use crate::Ui;
impl<'ui> Ui<'ui> {
#[must_use]
pub fn begin_main_menu_bar(&self) -> Option<MainMenuBarToken> {
if unsafe { sys::igBeginMainMenuBar() } {
Some(MainMenuBarToken { ctx: self.ctx })
} else {
None
}
}
pub fn main_menu_bar<F: FnOnce()>(&self, f: F) {
if let Some(menu_bar) = self.begin_main_menu_bar() {
f();
menu_bar.end(self);
}
}
#[must_use]
pub fn begin_menu_bar(&self) -> Option<MenuBarToken> {
if unsafe { sys::igBeginMenuBar() } {
Some(MenuBarToken { ctx: self.ctx })
} else {
None
}
}
pub fn menu_bar<F: FnOnce()>(&self, f: F) {
if let Some(menu_bar) = self.begin_menu_bar() {
f();
menu_bar.end(self);
}
}
#[must_use]
pub fn begin_menu(&self, label: &ImStr, enabled: bool) -> Option<MenuToken> {
if unsafe { sys::igBeginMenu(label.as_ptr(), enabled) } {
Some(MenuToken { ctx: self.ctx })
} else {
None
}
}
pub fn menu<F: FnOnce()>(&self, label: &ImStr, enabled: bool, f: F) {
if let Some(menu) = self.begin_menu(label, enabled) {
f();
menu.end(self);
}
}
}
#[derive(Copy, Clone, Debug)]
#[must_use]
pub struct MenuItem<'a> {
label: &'a ImStr,
shortcut: Option<&'a ImStr>,
selected: bool,
enabled: bool,
}
impl<'a> MenuItem<'a> {
pub fn new(label: &ImStr) -> MenuItem {
MenuItem {
label,
shortcut: None,
selected: false,
enabled: true,
}
}
#[inline]
pub fn shortcut(mut self, shortcut: &'a ImStr) -> Self {
self.shortcut = Some(shortcut);
self
}
#[inline]
pub fn selected(mut self, selected: bool) -> Self {
self.selected = selected;
self
}
#[inline]
pub fn enabled(mut self, enabled: bool) -> Self {
self.enabled = enabled;
self
}
pub fn build(self, _: &Ui) -> bool {
unsafe {
sys::igMenuItemBool(
self.label.as_ptr(),
self.shortcut.map(ImStr::as_ptr).unwrap_or(ptr::null()),
self.selected,
self.enabled,
)
}
}
}
impl<'a> MenuItem<'a> {
pub fn build_with_ref(self, ui: &Ui, selected: &mut bool) -> bool {
if self.selected(*selected).build(ui) {
*selected = !*selected;
true
} else {
false
}
}
}
#[must_use]
pub struct MainMenuBarToken {
ctx: *const Context,
}
impl MainMenuBarToken {
pub fn end(mut self, _: &Ui) {
self.ctx = ptr::null();
unsafe { sys::igEndMainMenuBar() };
}
}
impl Drop for MainMenuBarToken {
fn drop(&mut self) {
if !self.ctx.is_null() && !thread::panicking() {
panic!("A MainMenuBarToken was leaked. Did you call .end()?");
}
}
}
#[must_use]
pub struct MenuBarToken {
ctx: *const Context,
}
impl MenuBarToken {
pub fn end(mut self, _: &Ui) {
self.ctx = ptr::null();
unsafe { sys::igEndMenuBar() };
}
}
impl Drop for MenuBarToken {
fn drop(&mut self) {
if !self.ctx.is_null() && !thread::panicking() {
panic!("A MenuBarToken was leaked. Did you call .end()?");
}
}
}
#[must_use]
pub struct MenuToken {
ctx: *const Context,
}
impl MenuToken {
pub fn end(mut self, _: &Ui) {
self.ctx = ptr::null();
unsafe { sys::igEndMenu() };
}
}
impl Drop for MenuToken {
fn drop(&mut self) {
if !self.ctx.is_null() && !thread::panicking() {
panic!("A MenuToken was leaked. Did you call .end()?");
}
}
}