X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FGUI%2FCocoaFileDialog.mm;h=a16a7892f77c4440de099335529df7875a72da66;hb=a7e4f2a971acf2262cd1a5840c774a7d8a784a4b;hp=d36ece185b94fce4214df02cac9f9090770828f6;hpb=9f8c66fbf9c6c10be645ec282c52a6cbf9acea89;p=flightgear.git diff --git a/src/GUI/CocoaFileDialog.mm b/src/GUI/CocoaFileDialog.mm index d36ece185..a16a7892f 100644 --- a/src/GUI/CocoaFileDialog.mm +++ b/src/GUI/CocoaFileDialog.mm @@ -27,6 +27,11 @@ static NSURL* pathToNSURL(const SGPath& aPath) return [NSURL fileURLWithPath:stdStringToCocoa(aPath.str())]; } +// 10.6 compiler won't accept block-scoped locals in Objective-C++, +// so making these globals. +static NSString* completion_path = nil; +static SGPath completion_sgpath; + class CocoaFileDialog::CocoaFileDialogPrivate { public: @@ -44,8 +49,8 @@ public: NSSavePanel* panel; }; -CocoaFileDialog::CocoaFileDialog(const std::string& aTitle, FGFileDialog::Usage use) : - FGFileDialog(aTitle, use) +CocoaFileDialog::CocoaFileDialog(FGFileDialog::Usage use) : + FGFileDialog(use) { d.reset(new CocoaFileDialogPrivate); if (use == USE_SAVE_FILE) { @@ -58,6 +63,8 @@ CocoaFileDialog::CocoaFileDialog(const std::string& aTitle, FGFileDialog::Usage [openPanel setCanChooseDirectories:YES]; } } // of USE_OPEN_FILE or USE_CHOOSE_DIR -> building NSOpenPanel + + [d->panel retain]; } CocoaFileDialog::~CocoaFileDialog() @@ -72,6 +79,7 @@ void CocoaFileDialog::exec() 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 @@ -90,16 +98,21 @@ void CocoaFileDialog::exec() [d->panel setNameFieldStringValue:stdStringToCocoa(_placeholder)]; } - NSMutableArray* extensions = [NSMutableArray arrayWithCapacity:0]; - BOOST_FOREACH(std::string ext, _filterPatterns) { - if (!simgear::strutils::starts_with(ext, "*.")) { - SG_LOG(SG_GENERAL, SG_INFO, "can't use pattern on Cococa:" << ext); - continue; + if (_filterPatterns.empty()) { + [d->panel setAllowedFileTypes:nil]; + } else { + NSMutableArray* extensions = [NSMutableArray arrayWithCapacity:0]; + BOOST_FOREACH(std::string ext, _filterPatterns) { + if (!simgear::strutils::starts_with(ext, "*.")) { + SG_LOG(SG_GENERAL, SG_INFO, "can't use pattern on Cococa:" << ext); + continue; + } + [extensions addObject:stdStringToCocoa(ext.substr(2))]; } - [extensions addObject:stdStringToCocoa(ext.substr(2))]; - } - [d->panel setAllowedFileTypes:extensions]; + [d->panel setAllowedFileTypes:extensions]; + } + [d->panel setTitle:stdStringToCocoa(_title)]; if (_showHidden) { [d->panel setShowsHiddenFiles:YES]; @@ -110,10 +123,16 @@ void CocoaFileDialog::exec() [d->panel beginSheetModalForWindow:cocoaWindow completionHandler:^(NSInteger result) { if (result == NSFileHandlingPanelOKButton) { - NSString* path = [[d->panel URL] path]; + completion_path = [[d->panel URL] path]; //NSLog(@"the URL is: %@", d->panel URL]); - SGPath sgpath([path UTF8String]); - _callback->onFileDialogDone(this, sgpath); + completion_sgpath = ([completion_path UTF8String]); + _callback->onFileDialogDone(this, completion_sgpath); } }]; } + +void CocoaFileDialog::close() +{ + [d->panel close]; +} +