Some checks failed
Build / build-gentoo (push) Failing after 14s
Build / download-system-deps (push) Successful in 3m28s
Build / get-source-code (push) Successful in 9m18s
Build / build-deb (push) Failing after 3m41s
Build / build-appimage (push) Successful in 4m12s
Build / build-android (push) Failing after 2m47s
Build / build-windows (push) Failing after 7m10s
- Remove unused OpenMP from playback backend - Fix update_assets on macOS - Add support for Objective C++ on macOS - Add macOS-specific code into the Dear ImGui backend - Add macOS .app packaging - Add support for global menus, and include support for macOS global menu into the Dear ImGui backend
103 lines
4 KiB
Text
103 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;
|
|
}
|
|
}
|