looper/liblooperui/backends/osx_backend.mm

104 lines
4 KiB
Text
Raw Normal View History

#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;
}
}