From 008a2d65f1c885995d2e8cac8bff06ef7f09fee2 Mon Sep 17 00:00:00 2001 From: James Turner Date: Sat, 19 Jan 2013 16:23:05 +0000 Subject: [PATCH] Make it all work with existing FileSelector API. --- src/GUI/CocoaFileDialog.hxx | 4 ++-- src/GUI/CocoaFileDialog.mm | 33 ++++++++++++++++++--------- src/GUI/FileDialog.cxx | 45 +++++++++++++++++++++---------------- src/GUI/FileDialog.hxx | 13 ++++++++--- src/GUI/PUIFileDialog.cxx | 12 ++++++++-- src/GUI/PUIFileDialog.hxx | 4 ++-- 6 files changed, 73 insertions(+), 38 deletions(-) diff --git a/src/GUI/CocoaFileDialog.hxx b/src/GUI/CocoaFileDialog.hxx index 0f6fbc4ec..2636d0488 100644 --- a/src/GUI/CocoaFileDialog.hxx +++ b/src/GUI/CocoaFileDialog.hxx @@ -8,12 +8,12 @@ class CocoaFileDialog : public FGFileDialog { public: - CocoaFileDialog(const std::string& aTitle, FGFileDialog::Usage use); + CocoaFileDialog(FGFileDialog::Usage use); virtual ~CocoaFileDialog(); virtual void exec(); - + virtual void close(); private: class CocoaFileDialogPrivate; std::auto_ptr d; diff --git a/src/GUI/CocoaFileDialog.mm b/src/GUI/CocoaFileDialog.mm index d36ece185..9f15680e2 100644 --- a/src/GUI/CocoaFileDialog.mm +++ b/src/GUI/CocoaFileDialog.mm @@ -44,8 +44,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 +58,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() @@ -90,16 +92,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]; @@ -117,3 +124,9 @@ void CocoaFileDialog::exec() } }]; } + +void CocoaFileDialog::close() +{ + [d->panel close]; +} + diff --git a/src/GUI/FileDialog.cxx b/src/GUI/FileDialog.cxx index 8b59ae0c7..c6a1c321f 100644 --- a/src/GUI/FileDialog.cxx +++ b/src/GUI/FileDialog.cxx @@ -39,9 +39,8 @@ #include "CocoaFileDialog.hxx" #endif -FGFileDialog::FGFileDialog(const std::string& aTitle, Usage use) : +FGFileDialog::FGFileDialog(Usage use) : _usage(use), - _title(aTitle), _showHidden(false) { @@ -52,6 +51,11 @@ FGFileDialog::~FGFileDialog() // ensure this is concrete so callback gets cleaned up. } +void FGFileDialog::setTitle(const std::string& aText) +{ + _title = aText; +} + void FGFileDialog::setButton(const std::string& aText) { _buttonText = aText; @@ -88,6 +92,12 @@ naRef FGFileDialog::openFromNasal(const nasal::CallContext& ctx) return naNil(); } +naRef FGFileDialog::closeFromNasal(const nasal::CallContext& ctx) +{ + close(); + return naNil(); +} + class NasalCallback : public FGFileDialog::Callback { public: @@ -142,13 +152,12 @@ typedef nasal::Ghost NasalFileDialog; static naRef f_createFileDialog(naContext c, naRef me, int argc, naRef* args) { nasal::CallContext ctx(c, argc, args); - std::string title = ctx.requireArg(0); - FGFileDialog::Usage usage = (FGFileDialog::Usage) ctx.requireArg(1); - + FGFileDialog::Usage usage = (FGFileDialog::Usage) ctx.requireArg(0); + #ifdef SG_MAC - FileDialogPtr fd(new CocoaFileDialog(title, usage)); + FileDialogPtr fd(new CocoaFileDialog(usage)); #else - FileDialogPtr fd(new PUIFileDialog(title, usage)); + FileDialogPtr fd(new PUIFileDialog(usage)); #endif return NasalFileDialog::create(c, fd); @@ -156,23 +165,21 @@ static naRef f_createFileDialog(naContext c, naRef me, int argc, naRef* args) void postinitNasalGUI(naRef globals, naContext c) { - NasalFileDialog::init("gui.FileSelector") + NasalFileDialog::init("gui._FileDialog") + .member("title", &FGFileDialog::getTitle, &FGFileDialog::setTitle) .member("button", &FGFileDialog::getButton, &FGFileDialog::setButton) .member("directory", &FGFileDialog::getDirectory, &FGFileDialog::setDirectory) - .member("show-hidden", &FGFileDialog::showHidden, &FGFileDialog::setShowHidden) + .member("show_hidden", &FGFileDialog::showHidden, &FGFileDialog::setShowHidden) .member("placeholder", &FGFileDialog::getPlaceholder, &FGFileDialog::setPlaceholderName) .member("pattern", &FGFileDialog::filterPatterns, &FGFileDialog::setFilterPatterns) .method<&FGFileDialog::openFromNasal>("open") + .method<&FGFileDialog::closeFromNasal>("close") .method<&FGFileDialog::setCallbackFromNasal>("setCallback"); + + nasal::Hash guiModule = nasal::Hash(globals, c).get("gui"); - naRef guiModule = naHash_cget(globals, (char*) "gui"); - if (naIsNil(guiModule)) { - SG_LOG(SG_GENERAL, SG_WARN, "postinitNasalGUI: gui.nas not loaded"); - return; - } - - nasal::Hash globals_module(globals, c), - gui_module = globals_module.get("gui"); - - gui_module.set("_newFileDialog", f_createFileDialog); + guiModule.set("FILE_DIALOG_OPEN_FILE", (int) FGFileDialog::USE_OPEN_FILE); + guiModule.set("FILE_DIALOG_SAVE_FILE", (int) FGFileDialog::USE_SAVE_FILE); + guiModule.set("FILE_DIALOG_CHOOSE_DIR", (int) FGFileDialog::USE_CHOOSE_DIR); + guiModule.set("_createFileDialog", f_createFileDialog); } diff --git a/src/GUI/FileDialog.hxx b/src/GUI/FileDialog.hxx index 703b1aabc..57fd89103 100644 --- a/src/GUI/FileDialog.hxx +++ b/src/GUI/FileDialog.hxx @@ -17,11 +17,16 @@ class FGFileDialog { public: typedef enum { - USE_OPEN_FILE, + USE_OPEN_FILE = 0, USE_SAVE_FILE, USE_CHOOSE_DIR } Usage; + std::string getTitle() const + { return _title; } + + void setTitle(const std::string& aTitle); + std::string getButton() const { return _buttonText; } @@ -53,7 +58,8 @@ public: virtual ~FGFileDialog (); virtual void exec() = 0; - + virtual void close() = 0; + class Callback { public: @@ -64,9 +70,10 @@ public: virtual void setCallback(Callback* aCB); naRef openFromNasal(const nasal::CallContext& ctx); + naRef closeFromNasal(const nasal::CallContext& ctx); naRef setCallbackFromNasal(const nasal::CallContext& ctx); protected: - FGFileDialog(const std::string& aTitle, Usage use); + FGFileDialog(Usage use); const Usage _usage; std::string _title, _buttonText; diff --git a/src/GUI/PUIFileDialog.cxx b/src/GUI/PUIFileDialog.cxx index e76d1a87e..fe6a15110 100644 --- a/src/GUI/PUIFileDialog.cxx +++ b/src/GUI/PUIFileDialog.cxx @@ -27,8 +27,8 @@ private: PUIFileDialog* _dialog; }; -PUIFileDialog::PUIFileDialog(const std::string& aTitle, Usage use) : - FGFileDialog(aTitle, use), +PUIFileDialog::PUIFileDialog(Usage use) : + FGFileDialog(use), _listener(NULL) { SG_LOG(SG_GENERAL, SG_INFO, "created PUIFileDialog"); @@ -39,6 +39,7 @@ PUIFileDialog::~PUIFileDialog() if (_listener) { SGPropertyNode_ptr path = _dialogRoot->getNode("path"); path->removeChangeListener(_listener); + delete _listener; } } @@ -79,6 +80,13 @@ void PUIFileDialog::exec() gui->showDialog(name); } +void PUIFileDialog::close() +{ + NewGUI* gui = static_cast(globals->get_subsystem("gui")); + std::string name("native-file-0"); + gui->closeDialog(name); +} + void PUIFileDialog::pathChanged(const SGPath& aPath) { _callback->onFileDialogDone(this, aPath); diff --git a/src/GUI/PUIFileDialog.hxx b/src/GUI/PUIFileDialog.hxx index 34745668e..39657d450 100644 --- a/src/GUI/PUIFileDialog.hxx +++ b/src/GUI/PUIFileDialog.hxx @@ -9,12 +9,12 @@ class PUIFileDialog : public FGFileDialog { public: - PUIFileDialog(const std::string& aTitle, FGFileDialog::Usage use); + PUIFileDialog(FGFileDialog::Usage use); virtual ~PUIFileDialog(); virtual void exec(); - + virtual void close(); private: class PathListener; friend class PathListener; -- 2.39.5