use std::sync::{Arc, Mutex};
use objc::runtime::Object;
use objc::{class, msg_send, sel, sel_impl};
use objc_id::{Id, ShareId};
use crate::appkit::menu::item::MenuItem;
use crate::foundation::{id, NSInteger, NSString};
#[derive(Debug)]
pub struct Menu(pub Id<Object>);
impl Menu {
pub fn new(title: &str, items: Vec<MenuItem>) -> Self {
Menu(unsafe {
let cls = class!(NSMenu);
let alloc: id = msg_send![cls, alloc];
let title = NSString::new(title);
let menu: id = msg_send![alloc, initWithTitle:&*title];
for item in items.into_iter() {
let objc = item.to_objc();
let _: () = msg_send![menu, addItem:&*objc];
}
Id::from_retained_ptr(menu)
})
}
pub fn append(menu: id, items: Vec<MenuItem>) -> id {
unsafe {
let mut count: NSInteger = msg_send![menu, numberOfItems];
while count != 0 {
count -= 1;
let item: id = msg_send![menu, itemAtIndex: count];
let _: () = msg_send![menu, removeItemAtIndex: count];
let _: () = msg_send![item, release];
}
}
for item in items.into_iter() {
unsafe {
let objc = item.to_objc();
let _: () = msg_send![menu, addItem:&*objc];
}
}
menu
}
pub fn standard() -> Vec<Menu> {
vec![
Menu::new("", vec![
MenuItem::Services,
MenuItem::Separator,
MenuItem::Hide,
MenuItem::HideOthers,
MenuItem::ShowAll,
MenuItem::Separator,
MenuItem::Quit,
]),
Menu::new("File", vec![MenuItem::CloseWindow]),
Menu::new("Edit", vec![
MenuItem::Undo,
MenuItem::Redo,
MenuItem::Separator,
MenuItem::Cut,
MenuItem::Copy,
MenuItem::Paste,
MenuItem::Separator,
MenuItem::SelectAll,
]),
Menu::new("View", vec![MenuItem::EnterFullScreen]),
Menu::new("Window", vec![
MenuItem::Minimize,
MenuItem::Zoom,
MenuItem::Separator,
MenuItem::new("Bring All to Front"),
]),
]
}
}