use crate::{
draw_2d::ImageTrait,
gui::{event::EvMenu, MenuTrait},
types::{GuiState, KeyCode, ModifierKey},
util::macros::callback,
};
use nappgui_sys::{
menuitem_OnClick, menuitem_create, menuitem_enabled, menuitem_image, menuitem_key,
menuitem_separator, menuitem_state, menuitem_submenu, menuitem_text, menuitem_visible,
};
pub trait MenuItemTrait {
fn as_ptr(&self) -> *mut nappgui_sys::MenuItem;
callback! {
on_click(EvMenu) => menuitem_OnClick
}
fn enabled(&self, enabled: bool) {
unsafe { menuitem_enabled(self.as_ptr(), enabled as _) };
}
fn visible(&self, visible: bool) {
unsafe { menuitem_visible(self.as_ptr(), visible as _) };
}
fn text(&self, text: &str) {
let text = std::ffi::CString::new(text).unwrap();
unsafe { menuitem_text(self.as_ptr(), text.as_ptr()) };
}
fn image<T>(&self, image: &T)
where
T: ImageTrait,
{
unsafe { menuitem_image(self.as_ptr(), image.as_ptr()) };
}
fn key(&self, key: KeyCode, modifiers: ModifierKey) {
unsafe { menuitem_key(self.as_ptr(), key as _, modifiers as _) };
}
fn submenu<T>(&self, menu: &mut T)
where
T: MenuTrait,
{
unsafe { menuitem_submenu(self.as_ptr(), &mut menu.as_ptr()) };
}
fn state(&self, state: GuiState) {
unsafe { menuitem_state(self.as_ptr(), state as _) };
}
}
#[repr(transparent)]
#[derive(Clone, Copy, Debug)]
pub struct MenuItem {
pub(crate) inner: *mut nappgui_sys::MenuItem,
}
impl MenuItem {
pub fn new() -> Self {
let menu_item = unsafe { menuitem_create() };
Self { inner: menu_item }
}
pub fn new_separator() -> Self {
let menu_item = unsafe { menuitem_separator() };
Self { inner: menu_item }
}
}