use callback_helpers::{from_void_ptr, to_heap_ptr};
use controls::Window;
use std::ffi::CString;
use std::os::raw::{c_int, c_void};
use libui_ffi::{self, uiMenu, uiMenuItem, uiWindow};
#[derive(Clone)]
pub struct MenuItem {
ui_menu_item: *mut uiMenuItem,
}
#[derive(Clone)]
pub struct Menu {
ui_menu: *mut uiMenu,
}
impl MenuItem {
pub fn enable(&self) {
unsafe { libui_ffi::uiMenuItemEnable(self.ui_menu_item) }
}
pub fn disable(&self) {
unsafe { libui_ffi::uiMenuItemDisable(self.ui_menu_item) }
}
pub fn checked(&self) -> bool {
unsafe { libui_ffi::uiMenuItemChecked(self.ui_menu_item) != 0 }
}
pub fn set_checked(&self, checked: bool) {
unsafe { libui_ffi::uiMenuItemSetChecked(self.ui_menu_item, checked as c_int) }
}
pub fn on_clicked<'ctx, F>(&self, callback: F)
where
F: FnMut(&MenuItem, &Window) + 'static,
{
extern "C" fn c_callback<G: FnMut(&MenuItem, &Window)>(
menu_item: *mut uiMenuItem,
window: *mut uiWindow,
data: *mut c_void,
) {
let menu_item = unsafe { MenuItem::from_raw(menu_item) };
let window = unsafe { Window::from_raw(window) };
unsafe {
from_void_ptr::<G>(data)(&menu_item, &window);
}
}
unsafe {
libui_ffi::uiMenuItemOnClicked(
self.ui_menu_item,
Some(c_callback::<F>),
to_heap_ptr(callback),
);
}
}
pub unsafe fn from_raw(raw: *mut uiMenuItem) -> Self {
MenuItem { ui_menu_item: raw }
}
}
impl Menu {
pub fn new(name: &str) -> Menu {
unsafe {
let c_string = CString::new(name.as_bytes().to_vec()).unwrap();
Menu {
ui_menu: libui_ffi::uiNewMenu(c_string.as_ptr()),
}
}
}
pub fn append_item(&self, name: &str) -> MenuItem {
unsafe {
let c_string = CString::new(name.as_bytes().to_vec()).unwrap();
MenuItem {
ui_menu_item: libui_ffi::uiMenuAppendItem(self.ui_menu, c_string.as_ptr()),
}
}
}
pub fn append_check_item(&self, name: &str) -> MenuItem {
unsafe {
let c_string = CString::new(name.as_bytes().to_vec()).unwrap();
MenuItem {
ui_menu_item: libui_ffi::uiMenuAppendCheckItem(self.ui_menu, c_string.as_ptr()),
}
}
}
pub fn append_separator(&self) {
unsafe { libui_ffi::uiMenuAppendSeparator(self.ui_menu) }
}
pub fn append_about_item(&self) -> MenuItem {
unsafe {
MenuItem {
ui_menu_item: libui_ffi::uiMenuAppendAboutItem(self.ui_menu),
}
}
}
pub fn append_quit_item(&self) -> MenuItem {
unsafe {
MenuItem {
ui_menu_item: libui_ffi::uiMenuAppendQuitItem(self.ui_menu),
}
}
}
pub fn append_preferences_item(&self) -> MenuItem {
unsafe {
MenuItem {
ui_menu_item: libui_ffi::uiMenuAppendPreferencesItem(self.ui_menu),
}
}
}
}