From 9f8c66fbf9c6c10be645ec282c52a6cbf9acea89 Mon Sep 17 00:00:00 2001 From: James Turner Date: Fri, 28 Dec 2012 17:27:38 +0000 Subject: [PATCH] Cocoa: use a window-sheet, and fire the callback. --- src/GUI/CocoaFileDialog.mm | 46 +++++++++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/src/GUI/CocoaFileDialog.mm b/src/GUI/CocoaFileDialog.mm index f802eea06..d36ece185 100644 --- a/src/GUI/CocoaFileDialog.mm +++ b/src/GUI/CocoaFileDialog.mm @@ -7,11 +7,15 @@ #include +#include +#include + #include #include #include
#include
+#include static NSString* stdStringToCocoa(const std::string& s) { @@ -47,12 +51,13 @@ CocoaFileDialog::CocoaFileDialog(const std::string& aTitle, FGFileDialog::Usage if (use == USE_SAVE_FILE) { d->panel = [NSSavePanel savePanel]; } else { - d->panel = [NSOpenPanel openPanel]; - } - - if (use == USE_CHOOSE_DIR) { - [d->panel setCanChooseDirectories:YES]; - } + NSOpenPanel* openPanel = [NSOpenPanel openPanel]; + d->panel = openPanel; + + if (use == USE_CHOOSE_DIR) { + [openPanel setCanChooseDirectories:YES]; + } + } // of USE_OPEN_FILE or USE_CHOOSE_DIR -> building NSOpenPanel } CocoaFileDialog::~CocoaFileDialog() @@ -62,6 +67,25 @@ CocoaFileDialog::~CocoaFileDialog() void CocoaFileDialog::exec() { +// find the native Cocoa NSWindow handle so we can parent the dialog and show +// it window-modal. + NSWindow* cocoaWindow = nil; + std::vector windows; + globals->get_renderer()->getViewer()->getWindows(windows); + BOOST_FOREACH(osgViewer::GraphicsWindow* gw, windows) { + // OSG doesn't use RTTI, so no dynamic cast. Let's check the class type + // using OSG's own system, before we blindly static_cast<> and break + // everything. + if (strcmp(gw->className(), "GraphicsWindowCocoa")) { + continue; + } + + osgViewer::GraphicsWindowCocoa* gwCocoa = static_cast(gw); + cocoaWindow = (NSWindow*) gwCocoa->getWindow(); + break; + } + +// setup the panel fields now we have collected all the data if (_usage == USE_SAVE_FILE) { [d->panel setNameFieldStringValue:stdStringToCocoa(_placeholder)]; } @@ -83,13 +107,13 @@ void CocoaFileDialog::exec() [d->panel setDirectoryURL: pathToNSURL(_initialPath)]; - [d->panel beginWithCompletionHandler:^(NSInteger result) + [d->panel beginSheetModalForWindow:cocoaWindow completionHandler:^(NSInteger result) { if (result == NSFileHandlingPanelOKButton) { - NSURL* theDoc = [d->panel URL]; - NSLog(@"the URL is: %@", theDoc); - // Open the document. + NSString* path = [[d->panel URL] path]; + //NSLog(@"the URL is: %@", d->panel URL]); + SGPath sgpath([path UTF8String]); + _callback->onFileDialogDone(this, sgpath); } - }]; }