A class to asynchronously scan for details about the files in a directory. More...
#include <juce_DirectoryContentsList.h>
Classes | |
struct | FileInfo |
Contains cached information about one of the files in a DirectoryContentsList. More... | |
Public Member Functions | |
DirectoryContentsList (const FileFilter *fileFilter, TimeSliceThread &threadToUse) | |
Creates a directory list. More... | |
~DirectoryContentsList () override | |
Destructor. More... | |
void | addChangeListener (ChangeListener *listener) |
Registers a listener to receive change callbacks from this broadcaster. More... | |
void | clear () |
Clears the list, and stops the thread scanning for files. More... | |
bool | contains (const File &) const |
Returns true if the list contains the specified file. More... | |
void | dispatchPendingMessages () |
If a change message has been sent but not yet dispatched, this will call sendSynchronousChangeMessage() to make the callback immediately. More... | |
const File & | getDirectory () const noexcept |
Returns the directory that's currently being used. More... | |
File | getFile (int index) const |
Returns one of the files in the list. More... | |
bool | getFileInfo (int index, FileInfo &resultInfo) const |
Returns the cached information about one of the files in the list. More... | |
const FileFilter * | getFilter () const noexcept |
Returns the file filter being used. More... | |
int | getNumFiles () const noexcept |
Returns the number of files currently available in the list. More... | |
TimeSliceThread & | getTimeSliceThread () const noexcept |
bool | ignoresHiddenFiles () const |
Returns true if hidden files are ignored. More... | |
bool | isFindingDirectories () const noexcept |
Returns true if this list contains directories. More... | |
bool | isFindingFiles () const noexcept |
Returns true if this list contains files. More... | |
bool | isStillLoading () const |
True if the background thread hasn't yet finished scanning for files. More... | |
void | refresh () |
Clears the list and restarts scanning the directory for files. More... | |
void | removeAllChangeListeners () |
Removes all listeners from the list. More... | |
void | removeChangeListener (ChangeListener *listener) |
Unregisters a listener from the list. More... | |
void | sendChangeMessage () |
Causes an asynchronous change message to be sent to all the registered listeners. More... | |
void | sendSynchronousChangeMessage () |
Sends a synchronous change message to all the registered listeners. More... | |
void | setDirectory (const File &directory, bool includeDirectories, bool includeFiles) |
Sets the directory to look in for files. More... | |
void | setFileFilter (const FileFilter *newFileFilter) |
Replaces the current FileFilter. More... | |
void | setIgnoresHiddenFiles (bool shouldIgnoreHiddenFiles) |
Tells the list whether or not to ignore hidden files. More... | |
Private Member Functions | |
bool | addFile (const File &, bool isDir, int64 fileSize, Time modTime, Time creationTime, bool isReadOnly) |
void | callListeners () |
void | changed () |
bool | checkNextFile (bool &hasChanged) |
void | setTypeFlags (int) |
void | stopSearching () |
int | useTimeSlice () override |
Called back by a TimeSliceThread. More... | |
Private Attributes | |
std::atomic< bool > | anyListeners { false } |
ChangeBroadcasterCallback | broadcastCallback |
ListenerList< ChangeListener > | changeListeners |
const FileFilter * | fileFilter = nullptr |
std::unique_ptr< RangedDirectoryIterator > | fileFindHandle |
CriticalSection | fileListLock |
OwnedArray< FileInfo > | files |
int | fileTypeFlags = File::ignoreHiddenFiles | File::findFiles |
bool | isSearching = false |
Time | nextCallTime |
File | root |
std::atomic< bool > | shouldStop { true } |
TimeSliceThread & | thread |
bool | wasEmpty = true |
A class to asynchronously scan for details about the files in a directory.
This keeps a list of files and some information about them, using a background thread to scan for more files. As files are found, it broadcasts change messages to tell any listeners.
@tags{GUI}
juce::DirectoryContentsList::DirectoryContentsList | ( | const FileFilter * | fileFilter, |
TimeSliceThread & | threadToUse | ||
) |
Creates a directory list.
To set the directory it should point to, use setDirectory(), which will also start it scanning for files on the background thread.
When the background thread finds and adds new files to this list, the ChangeBroadcaster class will send a change message, so you can register listeners and update them when the list changes.
fileFilter | an optional filter to select which files are included in the list. If this is nullptr, then all files and directories are included. Make sure that the filter doesn't get deleted during the lifetime of this object |
threadToUse | a thread object that this list can use to scan for files as a background task. Make sure that the thread you give it has been started, or you won't get any files! |
|
override |
Destructor.
|
inherited |
Registers a listener to receive change callbacks from this broadcaster.
Trying to add a listener that's already on the list will have no effect.
|
private |
|
privateinherited |
|
private |
void juce::DirectoryContentsList::clear | ( | ) |
Clears the list, and stops the thread scanning for files.
Returns true if the list contains the specified file.
|
inherited |
If a change message has been sent but not yet dispatched, this will call sendSynchronousChangeMessage() to make the callback immediately.
For thread-safety reasons, you must only call this method on the main message thread.
|
inlinenoexcept |
Returns the directory that's currently being used.
Returns one of the files in the list.
index | should be less than getNumFiles(). If this is out-of-range, the return value will be a default File() object |
Returns the cached information about one of the files in the list.
If the index is in-range, this will return true and will copy the file's details to the structure that is passed-in.
If it returns false, then the index wasn't in range, and the structure won't be affected.
|
inlinenoexcept |
Returns the file filter being used.
The filter is specified in the constructor.
|
noexcept |
Returns the number of files currently available in the list.
The info about one of these files can be retrieved with getFileInfo() or getFile().
Obviously as the background thread runs and scans the directory for files, this number will change.
|
inlinenoexcept |
bool juce::DirectoryContentsList::ignoresHiddenFiles | ( | ) | const |
Returns true if hidden files are ignored.
|
inlinenoexcept |
Returns true if this list contains directories.
References juce::File::findDirectories.
|
inlinenoexcept |
bool juce::DirectoryContentsList::isStillLoading | ( | ) | const |
True if the background thread hasn't yet finished scanning for files.
void juce::DirectoryContentsList::refresh | ( | ) |
Clears the list and restarts scanning the directory for files.
|
inherited |
Removes all listeners from the list.
|
inherited |
Unregisters a listener from the list.
If the listener isn't on the list, this won't have any effect.
|
inherited |
Causes an asynchronous change message to be sent to all the registered listeners.
The message will be delivered asynchronously by the main message thread, so this method will return immediately. To call the listeners synchronously use sendSynchronousChangeMessage().
Referenced by juce::SelectedItemSet< SelectableItemType >::changed().
|
inherited |
Sends a synchronous change message to all the registered listeners.
This will immediately call all the listeners that are registered. For thread-safety reasons, you must only call this method on the main message thread.
Referenced by juce::SelectedItemSet< SelectableItemType >::changed().
void juce::DirectoryContentsList::setDirectory | ( | const File & | directory, |
bool | includeDirectories, | ||
bool | includeFiles | ||
) |
Sets the directory to look in for files.
If the directory that's passed in is different to the current one, this will also start the background thread scanning it for files.
void juce::DirectoryContentsList::setFileFilter | ( | const FileFilter * | newFileFilter | ) |
Replaces the current FileFilter.
This can be nullptr to have no filter. The DirectoryContentList does not take ownership of this object - it just keeps a pointer to it, so you must manage its lifetime. Note that this only replaces the filter, it doesn't refresh the list - you'll probably want to call refresh() after calling this.
void juce::DirectoryContentsList::setIgnoresHiddenFiles | ( | bool | shouldIgnoreHiddenFiles | ) |
Tells the list whether or not to ignore hidden files.
By default these are ignored.
|
private |
|
private |
|
overrideprivatevirtual |
Called back by a TimeSliceThread.
When you register this class with it, a TimeSliceThread will repeatedly call this method.
The implementation of this method should use its time-slice to do something that's quick - never block for longer than absolutely necessary.
Implements juce::TimeSliceClient.
|
privateinherited |
|
privateinherited |
|
privateinherited |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
privateinherited |
|
private |
|
private |
|
private |
|
private |