LMMS
Loading...
Searching...
No Matches
juce_FilenameComponent.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
30 const File& currentFile,
31 bool canEditFilename,
32 bool isDirectory,
33 bool isForSaving,
34 const String& fileBrowserWildcard,
35 const String& suffix,
36 const String& textWhenNothingSelected)
37 : Component (name),
38 isDir (isDirectory),
39 isSaving (isForSaving),
40 wildcard (fileBrowserWildcard),
41 enforcedSuffix (suffix)
42{
44 filenameBox.setEditableText (canEditFilename);
45 filenameBox.setTextWhenNothingSelected (textWhenNothingSelected);
46 filenameBox.setTextWhenNoChoicesAvailable (TRANS ("(no recently selected files)"));
47 filenameBox.onChange = [this] { setCurrentFile (getCurrentFile(), true); };
48
49 setBrowseButtonText ("...");
50
51 setCurrentFile (currentFile, true, dontSendNotification);
52}
53
57
58//==============================================================================
60{
62 {
63 g.setColour (Colours::red.withAlpha (0.2f));
64 g.drawRect (getLocalBounds(), 3);
65 }
66}
67
69{
70 getLookAndFeel().layoutFilenameComponent (*this, &filenameBox, browseButton.get());
71}
72
73std::unique_ptr<ComponentTraverser> FilenameComponent::createKeyboardFocusTraverser()
74{
75 // This prevents the sub-components from grabbing focus if the
76 // FilenameComponent has been set to refuse focus.
78}
79
80void FilenameComponent::setBrowseButtonText (const String& newBrowseButtonText)
81{
82 browseButtonText = newBrowseButtonText;
84}
85
87{
88 browseButton.reset();
89 browseButton.reset (getLookAndFeel().createFilenameComponentBrowseButton (browseButtonText));
91 browseButton->setConnectedEdges (Button::ConnectedOnLeft);
92 browseButton->onClick = [this] { showChooser(); };
93 resized();
94}
95
96void FilenameComponent::setTooltip (const String& newTooltip)
97{
99 filenameBox.setTooltip (newTooltip);
100}
101
102void FilenameComponent::setDefaultBrowseTarget (const File& newDefaultDirectory)
103{
104 defaultBrowseFile = newDefaultDirectory;
105}
106
108{
109 if (lastFilename.isEmpty() && defaultBrowseFile != File())
110 return defaultBrowseFile;
111
112 return getCurrentFile();
113}
114
116{
117 chooser = std::make_unique<FileChooser> (isDir ? TRANS ("Choose a new directory")
118 : TRANS ("Choose a new file"),
120 wildcard);
121
125
126 chooser->launchAsync (chooserFlags, [this] (const FileChooser&)
127 {
128 if (chooser->getResult() == File{})
129 return;
130
131 setCurrentFile (chooser->getResult(), true);
132 });
133}
134
136{
137 return true;
138}
139
140void FilenameComponent::filesDropped (const StringArray& filenames, int, int)
141{
142 isFileDragOver = false;
143 repaint();
144
145 const File f (filenames[0]);
146
147 if (f.exists() && (f.isDirectory() == isDir))
148 setCurrentFile (f, true);
149}
150
152{
153 isFileDragOver = true;
154 repaint();
155}
156
158{
159 isFileDragOver = false;
160 repaint();
161}
162
163//==============================================================================
165{
166 return filenameBox.getText();
167}
168
170{
172
173 if (enforcedSuffix.isNotEmpty())
174 f = f.withFileExtension (enforcedSuffix);
175
176 return f;
177}
178
180 const bool addToRecentlyUsedList,
181 NotificationType notification)
182{
183 if (enforcedSuffix.isNotEmpty())
184 newFile = newFile.withFileExtension (enforcedSuffix);
185
186 if (newFile.getFullPathName() != lastFilename)
187 {
188 lastFilename = newFile.getFullPathName();
189
190 if (addToRecentlyUsedList)
191 addRecentlyUsedFile (newFile);
192
194
195 if (notification != dontSendNotification)
196 {
198
199 if (notification == sendNotificationSync)
201 }
202 }
203}
204
205void FilenameComponent::setFilenameIsEditable (const bool shouldBeEditable)
206{
207 filenameBox.setEditableText (shouldBeEditable);
208}
209
211{
212 StringArray names;
213
214 for (int i = 0; i < filenameBox.getNumItems(); ++i)
215 names.add (filenameBox.getItemText (i));
216
217 return names;
218}
219
221{
222 if (filenames != getRecentlyUsedFilenames())
223 {
224 filenameBox.clear();
225
226 for (int i = 0; i < jmin (filenames.size(), maxRecentFiles); ++i)
227 filenameBox.addItem (filenames[i], i + 1);
228 }
229}
230
232{
233 maxRecentFiles = jmax (1, newMaximum);
234
236}
237
239{
241
242 if (file.getFullPathName().isNotEmpty())
243 {
244 files.removeString (file.getFullPathName(), true);
245 files.insert (0, file.getFullPathName());
246
248 }
249}
250
251//==============================================================================
253{
254 listeners.add (listener);
255}
256
258{
259 listeners.remove (listener);
260}
261
263{
264 Component::BailOutChecker checker (this);
265 listeners.callChecked (checker, [this] (FilenameComponentListener& l) { l.filenameComponentChanged (this); });
266}
267
268} // namespace juce
Type jmin(const Type a, const Type b)
Definition MathsFunctions.h:60
Type jmax(const Type a, const Type b)
Definition MathsFunctions.h:48
static File getCurrentWorkingDirectory()
Definition File.cpp:1395
void handleUpdateNowIfNeeded()
Definition juce_AsyncUpdater.cpp:79
void triggerAsyncUpdate()
Definition juce_AsyncUpdater.cpp:62
@ ConnectedOnLeft
Definition juce_Button.h:322
Definition juce_Component.h:2331
virtual std::unique_ptr< ComponentTraverser > createKeyboardFocusTraverser()
Definition juce_Component.cpp:2924
void addAndMakeVisible(Component *child, int zOrder=-1)
Definition juce_Component.cpp:1554
void repaint()
Definition juce_Component.cpp:1917
Component() noexcept
Definition juce_Component.cpp:517
bool getWantsKeyboardFocus() const noexcept
Definition juce_Component.cpp:2857
LookAndFeel & getLookAndFeel() const noexcept
Definition juce_Component.cpp:2173
Rectangle< int > getLocalBounds() const noexcept
Definition juce_Component.cpp:2283
@ 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.h:56
Definition juce_File.h:45
const String & getFullPathName() const noexcept
Definition juce_File.h:153
File withFileExtension(StringRef newExtension) const
Definition juce_File.cpp:699
void addRecentlyUsedFile(const File &file)
Definition juce_FilenameComponent.cpp:238
void showChooser()
Definition juce_FilenameComponent.cpp:115
void lookAndFeelChanged() override
Definition juce_FilenameComponent.cpp:86
File getCurrentFile() const
Definition juce_FilenameComponent.cpp:169
void setRecentlyUsedFilenames(const StringArray &filenames)
Definition juce_FilenameComponent.cpp:220
bool isInterestedInFileDrag(const StringArray &) override
Definition juce_FilenameComponent.cpp:135
String browseButtonText
Definition juce_FilenameComponent.h:228
int maxRecentFiles
Definition juce_FilenameComponent.h:226
String getCurrentFileText() const
Definition juce_FilenameComponent.cpp:164
String enforcedSuffix
Definition juce_FilenameComponent.h:228
void setDefaultBrowseTarget(const File &newDefaultDirectory)
Definition juce_FilenameComponent.cpp:102
void removeListener(FilenameComponentListener *listener)
Definition juce_FilenameComponent.cpp:257
ComboBox filenameBox
Definition juce_FilenameComponent.h:223
void setFilenameIsEditable(bool shouldBeEditable)
Definition juce_FilenameComponent.cpp:205
void fileDragExit(const StringArray &) override
Definition juce_FilenameComponent.cpp:157
void paintOverChildren(Graphics &) override
Definition juce_FilenameComponent.cpp:59
~FilenameComponent() override
Definition juce_FilenameComponent.cpp:54
void fileDragEnter(const StringArray &, int, int) override
Definition juce_FilenameComponent.cpp:151
void setBrowseButtonText(const String &browseButtonText)
Definition juce_FilenameComponent.cpp:80
std::unique_ptr< ComponentTraverser > createKeyboardFocusTraverser() override
Definition juce_FilenameComponent.cpp:73
String lastFilename
Definition juce_FilenameComponent.h:224
StringArray getRecentlyUsedFilenames() const
Definition juce_FilenameComponent.cpp:210
String wildcard
Definition juce_FilenameComponent.h:228
virtual File getLocationToBrowse()
Definition juce_FilenameComponent.cpp:107
bool isSaving
Definition juce_FilenameComponent.h:227
void handleAsyncUpdate() override
Definition juce_FilenameComponent.cpp:262
FilenameComponent(const String &name, const File &currentFile, bool canEditFilename, bool isDirectory, bool isForSaving, const String &fileBrowserWildcard, const String &enforcedSuffix, const String &textWhenNothingSelected)
Definition juce_FilenameComponent.cpp:29
ListenerList< FilenameComponentListener > listeners
Definition juce_FilenameComponent.h:229
bool isFileDragOver
Definition juce_FilenameComponent.h:227
std::unique_ptr< Button > browseButton
Definition juce_FilenameComponent.h:225
void setMaxNumberOfRecentFiles(int newMaximum)
Definition juce_FilenameComponent.cpp:231
void filesDropped(const StringArray &, int, int) override
Definition juce_FilenameComponent.cpp:140
bool isDir
Definition juce_FilenameComponent.h:227
void resized() override
Definition juce_FilenameComponent.cpp:68
std::unique_ptr< FileChooser > chooser
Definition juce_FilenameComponent.h:231
File defaultBrowseFile
Definition juce_FilenameComponent.h:230
void addListener(FilenameComponentListener *listener)
Definition juce_FilenameComponent.cpp:252
void setCurrentFile(File newFile, bool addToRecentlyUsedList, NotificationType notification=sendNotificationAsync)
Definition juce_FilenameComponent.cpp:179
void setTooltip(const String &newTooltip) override
Definition juce_FilenameComponent.cpp:96
Definition juce_FilenameComponent.h:41
Definition juce_GraphicsContext.h:45
virtual void setTooltip(const String &newTooltip)
Definition juce_TooltipClient.h:76
Definition juce_StringArray.h:35
int size() const noexcept
Definition juce_StringArray.h:136
void add(String stringToAdd)
Definition juce_StringArray.cpp:136
Definition juce_String.h:53
File getChildFile(StringRef relativeOrAbsolutePath) const
Definition File.cpp:418
int * l
Definition inflate.c:1579
int g
Definition inflate.c:1573
register unsigned i
Definition inflate.c:1575
unsigned f
Definition inflate.c:1572
static const char * name
Definition pugl.h:1582
#define TRANS(stringLiteral)
Definition juce_LocalisedStrings.h:208
static char ** files
Definition misc.c:28
const Colour red
Definition juce_Colours.h:157
Definition carla_juce.cpp:31
NotificationType
Definition juce_NotificationType.h:32
@ sendNotificationSync
Definition juce_NotificationType.h:35
@ dontSendNotification
Definition juce_NotificationType.h:33
struct zdirent * file
Definition win32.c:1500