LMMS
Loading...
Searching...
No Matches
juce_FileChooser.cpp
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2022 - Raw Material Software Limited
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 By using JUCE, you agree to the terms of both the JUCE 7 End-User License
11 Agreement and JUCE Privacy Policy.
12
13 End User License Agreement: www.juce.com/juce-7-licence
14 Privacy Policy: www.juce.com/juce-privacy-policy
15
16 Or: You may also use this code under the terms of the GPL v3 (see
17 www.gnu.org/licenses).
18
19 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
20 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
21 DISCLAIMED.
22
23 ==============================================================================
24*/
25
26namespace juce
27{
28
29//==============================================================================
30class FileChooser::NonNative : public std::enable_shared_from_this<NonNative>,
32{
33public:
34 NonNative (FileChooser& fileChooser, int flags, FilePreviewComponent* preview)
35 : owner (fileChooser),
36 selectsDirectories ((flags & FileBrowserComponent::canSelectDirectories) != 0),
37 selectsFiles ((flags & FileBrowserComponent::canSelectFiles) != 0),
38 warnAboutOverwrite ((flags & FileBrowserComponent::warnAboutOverwriting) != 0),
39
41 browserComponent (flags, owner.startingFile, &filter, preview),
42 dialogBox (owner.title, {}, browserComponent, warnAboutOverwrite,
43 browserComponent.findColour (AlertWindow::backgroundColourId), owner.parent)
44 {}
45
46 ~NonNative() override
47 {
48 dialogBox.exitModalState (0);
49 }
50
51 void launch() override
52 {
53 dialogBox.centreWithDefaultSize (nullptr);
54
55 const std::weak_ptr<NonNative> ref (shared_from_this());
56 auto* callback = ModalCallbackFunction::create ([ref] (int r)
57 {
58 if (auto locked = ref.lock())
59 locked->modalStateFinished (r);
60 });
61
62 dialogBox.enterModalState (true, callback, true);
63 }
64
65 void runModally() override
66 {
67 #if JUCE_MODAL_LOOPS_PERMITTED
68 modalStateFinished (dialogBox.show() ? 1 : 0);
69 #else
71 #endif
72 }
73
74private:
75 void modalStateFinished (int returnValue)
76 {
78
79 if (returnValue != 0)
80 {
81 for (int i = 0; i < browserComponent.getNumSelectedFiles(); ++i)
82 result.add (URL (browserComponent.getSelectedFile (i)));
83 }
84
85 owner.finished (result);
86 }
87
88 //==============================================================================
91
95
97};
98
99//==============================================================================
100FileChooser::FileChooser (const String& chooserBoxTitle,
101 const File& currentFileOrDirectory,
102 const String& fileFilters,
103 const bool useNativeBox,
104 const bool treatFilePackagesAsDirectories,
105 Component* parentComponentToUse)
106 : title (chooserBoxTitle),
107 filters (fileFilters),
108 startingFile (currentFileOrDirectory),
109 parent (parentComponentToUse),
111 treatFilePackagesAsDirs (treatFilePackagesAsDirectories)
112{
113 #ifndef JUCE_MAC
115 #endif
116
117 if (! fileFilters.containsNonWhitespaceChars())
118 filters = "*";
119}
120
122{
123 asyncCallback = nullptr;
124}
125
126#if JUCE_MODAL_LOOPS_PERMITTED
127bool FileChooser::browseForFileToOpen (FilePreviewComponent* previewComp)
128{
131 previewComp);
132}
133
134bool FileChooser::browseForMultipleFilesToOpen (FilePreviewComponent* previewComp)
135{
136 return showDialog (FileBrowserComponent::openMode
137 | FileBrowserComponent::canSelectFiles
138 | FileBrowserComponent::canSelectMultipleItems,
139 previewComp);
140}
141
142bool FileChooser::browseForMultipleFilesOrDirectories (FilePreviewComponent* previewComp)
143{
144 return showDialog (FileBrowserComponent::openMode
145 | FileBrowserComponent::canSelectFiles
146 | FileBrowserComponent::canSelectDirectories
147 | FileBrowserComponent::canSelectMultipleItems,
148 previewComp);
149}
150
151bool FileChooser::browseForFileToSave (const bool warnAboutOverwrite)
152{
153 return showDialog (FileBrowserComponent::saveMode
154 | FileBrowserComponent::canSelectFiles
155 | (warnAboutOverwrite ? FileBrowserComponent::warnAboutOverwriting : 0),
156 nullptr);
157}
158
159bool FileChooser::browseForDirectory()
160{
161 return showDialog (FileBrowserComponent::openMode
162 | FileBrowserComponent::canSelectDirectories,
163 nullptr);
164}
165
166bool FileChooser::showDialog (const int flags, FilePreviewComponent* const previewComp)
167{
168 FocusRestorer focusRestorer;
169
170 pimpl = createPimpl (flags, previewComp);
171 pimpl->runModally();
172
173 // ensure that the finished function was invoked
174 jassert (pimpl == nullptr);
175
176 return (results.size() > 0);
177}
178#endif
179
180void FileChooser::launchAsync (int flags, std::function<void (const FileChooser&)> callback,
181 FilePreviewComponent* previewComp)
182{
183 // You must specify a callback when using launchAsync
185
186 // you cannot run two file chooser dialog boxes at the same time
187 jassert (asyncCallback == nullptr);
188
189 asyncCallback = std::move (callback);
190
191 pimpl = createPimpl (flags, previewComp);
192 pimpl->launch();
193}
194
195std::shared_ptr<FileChooser::Pimpl> FileChooser::createPimpl (int flags, FilePreviewComponent* previewComp)
196{
197 results.clear();
198
199 // the preview component needs to be the right size before you pass it in here..
200 jassert (previewComp == nullptr || (previewComp->getWidth() > 10
201 && previewComp->getHeight() > 10));
202
203 if (pimpl != nullptr)
204 {
205 // you cannot run two file chooser dialog boxes at the same time
207 pimpl.reset();
208 }
209
210 // You've set the flags for both saveMode and openMode!
213
214 #if JUCE_WINDOWS
215 const bool selectsFiles = (flags & FileBrowserComponent::canSelectFiles) != 0;
216 const bool selectsDirectories = (flags & FileBrowserComponent::canSelectDirectories) != 0;
217
218 if (useNativeDialogBox && ! (selectsFiles && selectsDirectories))
219 #else
221 #endif
222 {
223 return showPlatformDialog (*this, flags, previewComp);
224 }
225
226 return std::make_unique<NonNative> (*this, flags, previewComp);
227}
228
230{
232
233 for (auto url : getURLResults())
234 if (url.isLocalFile())
235 files.add (url.getLocalFile());
236
237 return files;
238}
239
241{
242 auto fileResults = getResults();
243
244 // if you've used a multiple-file select, you should use the getResults() method
245 // to retrieve all the files that were chosen.
246 jassert (fileResults.size() <= 1);
247
248 return fileResults.getFirst();
249}
250
252{
253 // if you've used a multiple-file select, you should use the getResults() method
254 // to retrieve all the files that were chosen.
255 jassert (results.size() <= 1);
256
257 return results.getFirst();
258}
259
260void FileChooser::finished (const Array<URL>& asyncResults)
261{
262 std::function<void (const FileChooser&)> callback;
263 std::swap (callback, asyncCallback);
264
265 results = asyncResults;
266
267 pimpl.reset();
268
269 if (callback)
270 callback (*this);
271}
272
273//==============================================================================
276
277} // namespace juce
#define noexcept
Definition DistrhoDefines.h:72
@ backgroundColourId
Definition juce_AlertWindow.h:443
Definition juce_Array.h:56
Definition juce_Component.h:36
int getHeight() const noexcept
Definition juce_Component.h:274
int getWidth() const noexcept
Definition juce_Component.h:271
Definition juce_FileBrowserComponent.h:45
@ saveMode
Definition juce_FileBrowserComponent.h:56
@ canSelectFiles
Definition juce_FileBrowserComponent.h:58
@ canSelectDirectories
Definition juce_FileBrowserComponent.h:60
@ openMode
Definition juce_FileBrowserComponent.h:54
Definition juce_FileChooser.cpp:32
NonNative(FileChooser &fileChooser, int flags, FilePreviewComponent *preview)
Definition juce_FileChooser.cpp:34
FileChooserDialogBox dialogBox
Definition juce_FileChooser.cpp:94
bool selectsFiles
Definition juce_FileChooser.cpp:90
~NonNative() override
Definition juce_FileChooser.cpp:46
void modalStateFinished(int returnValue)
Definition juce_FileChooser.cpp:75
FileBrowserComponent browserComponent
Definition juce_FileChooser.cpp:93
void runModally() override
Definition juce_FileChooser.cpp:65
bool selectsDirectories
Definition juce_FileChooser.cpp:90
WildcardFileFilter filter
Definition juce_FileChooser.cpp:92
void launch() override
Definition juce_FileChooser.cpp:51
FileChooser & owner
Definition juce_FileChooser.cpp:89
bool warnAboutOverwrite
Definition juce_FileChooser.cpp:90
Definition juce_FileChooserDialogBox.h:73
const Array< URL > & getURLResults() const noexcept
Definition juce_FileChooser.h:284
Array< URL > results
Definition juce_FileChooser.h:306
Component * parent
Definition juce_FileChooser.h:305
const bool useNativeDialogBox
Definition juce_FileChooser.h:307
static bool isPlatformDialogAvailable()
Definition juce_linux_FileChooser.cpp:261
const bool treatFilePackagesAsDirs
Definition juce_FileChooser.h:308
String title
Definition juce_FileChooser.h:303
~FileChooser()
Definition juce_FileChooser.cpp:121
URL getURLResult() const
Definition juce_FileChooser.cpp:251
Array< File > getResults() const noexcept
Definition juce_FileChooser.cpp:229
void launchAsync(int flags, std::function< void(const FileChooser &)>, FilePreviewComponent *previewComponent=nullptr)
Definition juce_FileChooser.cpp:180
String filters
Definition juce_FileChooser.h:303
void finished(const Array< URL > &)
Definition juce_FileChooser.cpp:260
std::shared_ptr< Pimpl > createPimpl(int, FilePreviewComponent *)
Definition juce_FileChooser.cpp:195
static std::shared_ptr< Pimpl > showPlatformDialog(FileChooser &, int, FilePreviewComponent *)
Definition juce_linux_FileChooser.cpp:271
std::shared_ptr< Pimpl > pimpl
Definition juce_FileChooser.h:323
File startingFile
Definition juce_FileChooser.h:304
File getResult() const
Definition juce_FileChooser.cpp:240
FileChooser(const String &dialogBoxTitle, const File &initialFileOrDirectory=File(), const String &filePatternsAllowed=String(), bool useOSNativeDialogBox=true, bool treatFilePackagesAsDirectories=false, Component *parentComponent=nullptr)
Definition juce_FileChooser.cpp:100
std::function< void(const FileChooser &)> asyncCallback
Definition juce_FileChooser.h:309
Definition juce_File.h:45
Definition juce_FilePreviewComponent.h:44
~FilePreviewComponent() override
Definition juce_FileChooser.cpp:275
FilePreviewComponent()
Definition juce_FileChooser.cpp:274
static ModalComponentManager::Callback * create(CallbackFn &&fn)
Definition juce_ModalComponentManager.h:174
Definition juce_String.h:53
bool containsNonWhitespaceChars() const noexcept
Definition juce_String.cpp:1814
Definition juce_URL.h:38
Definition juce_WildcardFileFilter.h:38
register unsigned i
Definition inflate.c:1575
#define jassert(expression)
#define JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(className)
#define jassertfalse
static char ** files
Definition misc.c:28
Definition carla_juce.cpp:31
static int showDialog(const MessageBoxOptions &options, ModalComponentManager::Callback *callback, Async async)
Definition juce_linux_Windowing.cpp:815
void ignoreUnused(Types &&...) noexcept
Definition juce_MathsFunctions.h:333
jack_client_t client jack_client_t client jack_client_t client jack_client_t JackInfoShutdownCallback void arg jack_client_t jack_port_t port void func jack_client_t const char const char unsigned long flags
Definition juce_linux_JackAudio.cpp:69
Definition juce_FileChooser.h:316
RECT const char void(* callback)(const char *droppath))) SWELL_API_DEFINE(BOOL
Definition swell-functions.h:1004
int r
Definition crypt.c:458
int result
Definition process.c:1455
#define void
Definition unzip.h:396
#define const
Definition zconf.h:137