#include #import NAMESPACE_BEGIN(nanogui) std::vector file_dialog(const std::vector> &filetypes, bool save, bool multiple) { if (save && multiple) { throw std::invalid_argument("save and multiple must not both be true."); } std::vector 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)