From e10dfff1af26481ea392ff4b0bc65117b222128e Mon Sep 17 00:00:00 2001 From: jules Date: Sat, 30 Mar 2013 11:22:47 +0000 Subject: [PATCH] Cleaned up some FileChooser code, and added a new method showDialog() --- .../filebrowser/juce_FileBrowserComponent.h | 3 +- .../filebrowser/juce_FileChooser.cpp | 109 +++++++----------- .../filebrowser/juce_FileChooser.h | 23 ++-- .../native/juce_linux_FileChooser.cpp | 3 +- 4 files changed, 63 insertions(+), 75 deletions(-) diff --git a/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h b/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h index aa2aa3a33c..6850d2338c 100644 --- a/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h +++ b/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h @@ -68,7 +68,8 @@ public: conjuction with canSelectFiles). */ canSelectMultipleItems = 16, /**< specifies that the user can select multiple items. */ useTreeView = 32, /**< specifies that a tree-view should be shown instead of a file list. */ - filenameBoxIsReadOnly = 64 /**< specifies that the user can't type directly into the filename box. */ + filenameBoxIsReadOnly = 64, /**< specifies that the user can't type directly into the filename box. */ + warnAboutOverwriting = 128 /**< specifies that the dialog should warn about overwriting existing files (if possible). */ }; //============================================================================== diff --git a/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp b/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp index 64e531f13f..19e47f4f01 100644 --- a/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp +++ b/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp @@ -26,81 +26,88 @@ FileChooser::FileChooser (const String& chooserBoxTitle, const File& currentFileOrDirectory, const String& fileFilters, - const bool useNativeDialogBox_) + const bool useNativeBox) : title (chooserBoxTitle), filters (fileFilters), startingFile (currentFileOrDirectory), - useNativeDialogBox (useNativeDialogBox_) + useNativeDialogBox (useNativeBox && isPlatformDialogAvailable()) { - if (useNativeDialogBox) - { - static bool canUseNativeBox = isPlatformDialogAvailable(); - if (! canUseNativeBox) - useNativeDialogBox = false; - } - if (! fileFilters.containsNonWhitespaceChars()) filters = "*"; } -FileChooser::~FileChooser() -{ -} +FileChooser::~FileChooser() {} #if JUCE_MODAL_LOOPS_PERMITTED -bool FileChooser::browseForFileToOpen (FilePreviewComponent* previewComponent) +bool FileChooser::browseForFileToOpen (FilePreviewComponent* previewComp) { - return showDialog (false, true, false, false, false, previewComponent); + return showDialog (FileBrowserComponent::openMode + | FileBrowserComponent::canSelectFiles, + previewComp); } -bool FileChooser::browseForMultipleFilesToOpen (FilePreviewComponent* previewComponent) +bool FileChooser::browseForMultipleFilesToOpen (FilePreviewComponent* previewComp) { - return showDialog (false, true, false, false, true, previewComponent); + return showDialog (FileBrowserComponent::openMode + | FileBrowserComponent::canSelectFiles + | FileBrowserComponent::canSelectMultipleItems, + previewComp); } -bool FileChooser::browseForMultipleFilesOrDirectories (FilePreviewComponent* previewComponent) +bool FileChooser::browseForMultipleFilesOrDirectories (FilePreviewComponent* previewComp) { - return showDialog (true, true, false, false, true, previewComponent); + return showDialog (FileBrowserComponent::openMode + | FileBrowserComponent::canSelectFiles + | FileBrowserComponent::canSelectDirectories + | FileBrowserComponent::canSelectMultipleItems, + previewComp); } -bool FileChooser::browseForFileToSave (const bool warnAboutOverwritingExistingFiles) +bool FileChooser::browseForFileToSave (const bool warnAboutOverwrite) { - return showDialog (false, true, true, warnAboutOverwritingExistingFiles, false, nullptr); + return showDialog (FileBrowserComponent::saveMode + | FileBrowserComponent::canSelectFiles + | (warnAboutOverwrite ? FileBrowserComponent::warnAboutOverwriting : 0), + nullptr); } bool FileChooser::browseForDirectory() { - return showDialog (true, false, false, false, false, nullptr); + return showDialog (FileBrowserComponent::openMode + | FileBrowserComponent::canSelectDirectories, + nullptr); } -bool FileChooser::showDialog (const bool selectsDirectories, - const bool selectsFiles, - const bool isSave, - const bool warnAboutOverwritingExistingFiles, - const bool selectMultipleFiles, - FilePreviewComponent* const previewComponent) +bool FileChooser::showDialog (const int flags, FilePreviewComponent* const previewComp) { WeakReference previouslyFocused (Component::getCurrentlyFocusedComponent()); results.clear(); // the preview component needs to be the right size before you pass it in here.. - jassert (previewComponent == nullptr || (previewComponent->getWidth() > 10 - && previewComponent->getHeight() > 10)); + jassert (previewComp == nullptr || (previewComp->getWidth() > 10 + && previewComp->getHeight() > 10)); + + const bool selectsDirectories = (flags & FileBrowserComponent::canSelectDirectories) != 0; + const bool selectsFiles = (flags & FileBrowserComponent::canSelectFiles) != 0; + const bool isSave = (flags & FileBrowserComponent::saveMode) != 0; + const bool warnAboutOverwrite = (flags & FileBrowserComponent::warnAboutOverwriting) != 0; + const bool selectMultiple = (flags & FileBrowserComponent::canSelectMultipleItems) != 0; + + // You've set the flags for both saveMode and openMode! + jassert (! (isSave && (flags & FileBrowserComponent::openMode) != 0)); #if JUCE_WINDOWS if (useNativeDialogBox && ! (selectsFiles && selectsDirectories)) #elif JUCE_MAC || JUCE_LINUX - if (useNativeDialogBox && (previewComponent == nullptr)) + if (useNativeDialogBox && (previewComp == nullptr)) #else if (false) #endif { showPlatformDialog (results, title, startingFile, filters, selectsDirectories, selectsFiles, isSave, - warnAboutOverwritingExistingFiles, - selectMultipleFiles, - previewComponent); + warnAboutOverwrite, selectMultiple, previewComp); } else { @@ -108,28 +115,10 @@ bool FileChooser::showDialog (const bool selectsDirectories, selectsDirectories ? "*" : String::empty, String::empty); - int flags = isSave ? FileBrowserComponent::saveMode - : FileBrowserComponent::openMode; - - if (selectsFiles) - flags |= FileBrowserComponent::canSelectFiles; - - if (selectsDirectories) - { - flags |= FileBrowserComponent::canSelectDirectories; - - if (! isSave) - flags |= FileBrowserComponent::filenameBoxIsReadOnly; - } - - if (selectMultipleFiles) - flags |= FileBrowserComponent::canSelectMultipleItems; - - FileBrowserComponent browserComponent (flags, startingFile, &wildcard, previewComponent); + FileBrowserComponent browserComponent (flags, startingFile, &wildcard, previewComp); FileChooserDialogBox box (title, String::empty, - browserComponent, - warnAboutOverwritingExistingFiles, + browserComponent, warnAboutOverwrite, browserComponent.findColour (AlertWindow::backgroundColourId)); if (box.show()) @@ -155,16 +144,6 @@ File FileChooser::getResult() const return results.getFirst(); } -const Array& FileChooser::getResults() const -{ - return results; -} - //============================================================================== -FilePreviewComponent::FilePreviewComponent() -{ -} - -FilePreviewComponent::~FilePreviewComponent() -{ -} +FilePreviewComponent::FilePreviewComponent() {} +FilePreviewComponent::~FilePreviewComponent() {} diff --git a/modules/juce_gui_basics/filebrowser/juce_FileChooser.h b/modules/juce_gui_basics/filebrowser/juce_FileChooser.h index 4743607893..e1912919fa 100644 --- a/modules/juce_gui_basics/filebrowser/juce_FileChooser.h +++ b/modules/juce_gui_basics/filebrowser/juce_FileChooser.h @@ -143,6 +143,17 @@ public: */ bool browseForMultipleFilesOrDirectories (FilePreviewComponent* previewComponent = nullptr); + //============================================================================== + /** Runs a dialog box for the given set of option flags. + The flag values used are those in FileBrowserComponent::FileChooserFlags. + + @returns true if the user chose a directory and pressed 'ok', in which case, use + the getResult() method to find out what they chose. Returns false + if they cancelled instead. + @see FileBrowserComponent::FileChooserFlags + */ + bool showDialog (int flags, FilePreviewComponent* previewComponent); + //============================================================================== /** Returns the last file that was chosen by one of the browseFor methods. @@ -167,18 +178,14 @@ public: @see getResult */ - const Array& getResults() const; + const Array& getResults() const noexcept { return results; } private: //============================================================================== String title, filters; - File startingFile; + const File startingFile; Array results; - bool useNativeDialogBox; - - bool showDialog (bool selectsDirectories, bool selectsFiles, bool isSave, - bool warnAboutOverwritingExistingFiles, bool selectMultipleFiles, - FilePreviewComponent* previewComponent); + const bool useNativeDialogBox; static void showPlatformDialog (Array& results, const String& title, const File& file, const String& filters, bool selectsDirectories, bool selectsFiles, @@ -186,7 +193,7 @@ private: FilePreviewComponent* previewComponent); static bool isPlatformDialogAvailable(); - JUCE_LEAK_DETECTOR (FileChooser) + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FileChooser) }; diff --git a/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp b/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp index 5bd789a902..3c32e76267 100644 --- a/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp +++ b/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp @@ -35,7 +35,8 @@ static bool exeIsAvailable (const char* const executable) bool FileChooser::isPlatformDialogAvailable() { - return exeIsAvailable ("zenity") || exeIsAvailable ("kdialog"); + static bool canUseNativeBox = exeIsAvailable ("zenity") || exeIsAvailable ("kdialog"); + return canUseNativeBox; } void FileChooser::showPlatformDialog (Array& results,