1
0
Fork 0

Cocoa: use a window-sheet, and fire the callback.

This commit is contained in:
James Turner 2012-12-28 17:27:38 +00:00 committed by James Turner
parent 2e1fb7972e
commit 9f8c66fbf9

View file

@ -7,11 +7,15 @@
#include <boost/foreach.hpp> #include <boost/foreach.hpp>
#include <osgViewer/Viewer>
#include <osgViewer/api/Cocoa/GraphicsWindowCocoa>
#include <simgear/debug/logstream.hxx> #include <simgear/debug/logstream.hxx>
#include <simgear/misc/strutils.hxx> #include <simgear/misc/strutils.hxx>
#include <Main/globals.hxx> #include <Main/globals.hxx>
#include <Main/fg_props.hxx> #include <Main/fg_props.hxx>
#include <Viewer/renderer.hxx>
static NSString* stdStringToCocoa(const std::string& s) static NSString* stdStringToCocoa(const std::string& s)
{ {
@ -47,12 +51,13 @@ CocoaFileDialog::CocoaFileDialog(const std::string& aTitle, FGFileDialog::Usage
if (use == USE_SAVE_FILE) { if (use == USE_SAVE_FILE) {
d->panel = [NSSavePanel savePanel]; d->panel = [NSSavePanel savePanel];
} else { } else {
d->panel = [NSOpenPanel openPanel]; NSOpenPanel* openPanel = [NSOpenPanel openPanel];
} d->panel = openPanel;
if (use == USE_CHOOSE_DIR) { if (use == USE_CHOOSE_DIR) {
[d->panel setCanChooseDirectories:YES]; [openPanel setCanChooseDirectories:YES];
} }
} // of USE_OPEN_FILE or USE_CHOOSE_DIR -> building NSOpenPanel
} }
CocoaFileDialog::~CocoaFileDialog() CocoaFileDialog::~CocoaFileDialog()
@ -62,6 +67,25 @@ CocoaFileDialog::~CocoaFileDialog()
void CocoaFileDialog::exec() 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<osgViewer::GraphicsWindow*> 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<osgViewer::GraphicsWindowCocoa*>(gw);
cocoaWindow = (NSWindow*) gwCocoa->getWindow();
break;
}
// setup the panel fields now we have collected all the data
if (_usage == USE_SAVE_FILE) { if (_usage == USE_SAVE_FILE) {
[d->panel setNameFieldStringValue:stdStringToCocoa(_placeholder)]; [d->panel setNameFieldStringValue:stdStringToCocoa(_placeholder)];
} }
@ -83,13 +107,13 @@ void CocoaFileDialog::exec()
[d->panel setDirectoryURL: pathToNSURL(_initialPath)]; [d->panel setDirectoryURL: pathToNSURL(_initialPath)];
[d->panel beginWithCompletionHandler:^(NSInteger result) [d->panel beginSheetModalForWindow:cocoaWindow completionHandler:^(NSInteger result)
{ {
if (result == NSFileHandlingPanelOKButton) { if (result == NSFileHandlingPanelOKButton) {
NSURL* theDoc = [d->panel URL]; NSString* path = [[d->panel URL] path];
NSLog(@"the URL is: %@", theDoc); //NSLog(@"the URL is: %@", d->panel URL]);
// Open the document. SGPath sgpath([path UTF8String]);
_callback->onFileDialogDone(this, sgpath);
} }
}]; }];
} }