104 lines
4 KiB
Text
104 lines
4 KiB
Text
|
#include <menus.hpp>
|
||
|
#include <Foundation/Foundation.h>
|
||
|
#include <AppKit/AppKit.h>
|
||
|
#include "../../log.hpp"
|
||
|
#include <stack>
|
||
|
using namespace LooperUI;
|
||
|
@interface MenuHelper : NSObject {
|
||
|
std::map<id, MenuItem*> 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<NSMenu*> 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;
|
||
|
}
|
||
|
}
|