#include #include #include #include "../../log.hpp" #include using namespace LooperUI; @interface MenuHelper : NSObject { std::map menuItems; } - (void)menuItemClicked:(id)sender; - (void)addMenuItem:(id)menuItem :(MenuItem*)looperItem; @end @implementation MenuHelper - (void)addMenuItem:(id)menuItem :(MenuItem*)looperItem { menuItems[menuItem] = looperItem; } - (void)menuItemClicked:(id)sender { if (!menuItems.contains(sender)) { NSLog(@"Failed to find menu item!"); return; } MenuItem *looper_item = menuItems[sender]; looper_item->RunAction(); } @end MenuHelper *menuHelper; NSMenuItem *windowItem; extern "C++" { struct PublishMenuCallbacks : public MenuIteratorCallbacks { std::stack menu_stack; void print_spaces() { for (size_t i = 1; i < menu_stack.size(); i++) { DEBUG.writes(" "); } } void Init(Menu *root) { menuHelper = [[[MenuHelper alloc] init] autorelease]; NSMenu *osx_root = [[[NSMenu alloc] init] autorelease]; [NSApp setMainMenu:osx_root]; menu_stack.push(osx_root); } void Finalize() { } void AddNormalItem(MenuItem *item) { NSMenuItem *osx_item = [[[NSMenuItem alloc] initWithTitle:[NSString stringWithUTF8String:item->title.c_str()] action:@selector(menuItemClicked:) keyEquivalent:[NSString stringWithUTF8String:item->keybindString.c_str()]] autorelease]; [osx_item setHidden:!item->visible]; [osx_item setEnabled:item->enabled]; [osx_item setTarget:menuHelper]; [menuHelper addMenuItem:osx_item:item]; [menu_stack.top() addItem:osx_item]; print_spaces(); DEBUG.writefln("[Item] %s", item->title.c_str()); } void BeginSubmenu(Menu *menu) { print_spaces(); NSMenu *submenu; NSMenuItem *menuItem; if (menu->type == MenuType_Window && windowItem != nullptr) { menuItem = windowItem; submenu = [windowItem submenu]; [[menuItem menu] removeItem:menuItem]; } else { submenu = [[[NSMenu alloc] initWithTitle:[NSString stringWithUTF8String:menu->title.c_str()]] autorelease]; menuItem = [[[NSMenuItem alloc] initWithTitle:[NSString stringWithUTF8String:menu->title.c_str()] action:nil keyEquivalent:@""] autorelease]; } [menuItem setHidden:!menu->visible]; [menuItem setEnabled:menu->enabled]; [menuItem setSubmenu:submenu]; [menu_stack.top() addItem:menuItem]; if (menu->type == MenuType_Services) { [NSApp setServicesMenu:submenu]; DEBUG.writefln("[Services] %s", menu->title.c_str()); } else if (menu->type == MenuType_Window) { if (windowItem == nullptr) { [NSApp setWindowsMenu:submenu]; windowItem = menuItem; } DEBUG.writefln("[Window] %s", menu->title.c_str()); } else if (menu->type == MenuType_Help) { [NSApp setHelpMenu:submenu]; DEBUG.writefln("[Help] %s", menu->title.c_str()); } else if (menu->type == MenuType_Application) { DEBUG.writefln("[Application] %s", menu->title.c_str()); } else { DEBUG.writefln("[Submenu] %s", menu->title.c_str()); } menu_stack.push(submenu); } void EndSubmenu() { menu_stack.pop(); } void AddSeparator() { print_spaces(); DEBUG.writeln("[Separator]"); [menu_stack.top() addItem:[[NSMenuItem separatorItem] autorelease]]; } }; bool LooperUI::PublishMenu(Menu *menu, PlatformData*) { PublishMenuCallbacks callbacks; IterateMenu(menu, callbacks); return true; } }