reactphysics3d/testbed/nanogui/src/darwin.mm

54 lines
1.8 KiB
Plaintext

#include <nanogui/nanogui.h>
#import <Cocoa/Cocoa.h>
NAMESPACE_BEGIN(nanogui)
std::vector<std::string> file_dialog(const std::vector<std::pair<std::string, std::string>> &filetypes, bool save, bool multiple) {
if (save && multiple) {
throw std::invalid_argument("save and multiple must not both be true.");
}
std::vector<std::string> result;
if (save) {
NSSavePanel *saveDlg = [NSSavePanel savePanel];
NSMutableArray *types = [NSMutableArray new];
for (size_t idx = 0; idx < filetypes.size(); ++idx)
[types addObject: [NSString stringWithUTF8String: filetypes[idx].first.c_str()]];
[saveDlg setAllowedFileTypes: types];
if ([saveDlg runModal] == NSModalResponseOK)
result.emplace_back([[[saveDlg URL] path] UTF8String]);
} else {
NSOpenPanel *openDlg = [NSOpenPanel openPanel];
[openDlg setCanChooseFiles:YES];
[openDlg setCanChooseDirectories:NO];
[openDlg setAllowsMultipleSelection:multiple];
NSMutableArray *types = [NSMutableArray new];
for (size_t idx = 0; idx < filetypes.size(); ++idx)
[types addObject: [NSString stringWithUTF8String: filetypes[idx].first.c_str()]];
[openDlg setAllowedFileTypes: types];
if ([openDlg runModal] == NSModalResponseOK) {
for (NSURL* url in [openDlg URLs]) {
result.emplace_back((char*) [[url path] UTF8String]);
}
}
}
return result;
}
void chdir_to_bundle_parent() {
NSString *path = [[[NSBundle mainBundle] bundlePath] stringByDeletingLastPathComponent];
chdir([path fileSystemRepresentation]);
}
void disable_saved_application_state_osx() {
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"NSQuitAlwaysKeepsWindows"];
}
NAMESPACE_END(nanogui)