Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add get_contents method to Directory class #40547

Merged
merged 1 commit into from
Dec 10, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 54 additions & 7 deletions core/core_bind.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1470,20 +1470,16 @@ bool Directory::is_open() const {
return d && dir_open;
}

Error Directory::list_dir_begin(bool p_show_navigational, bool p_show_hidden) {
Error Directory::list_dir_begin() {
ERR_FAIL_COND_V_MSG(!is_open(), ERR_UNCONFIGURED, "Directory must be opened before use.");

_list_skip_navigational = !p_show_navigational;
_list_skip_hidden = !p_show_hidden;

return d->list_dir_begin();
}

String Directory::get_next() {
ERR_FAIL_COND_V_MSG(!is_open(), "", "Directory must be opened before use.");

String next = d->get_next();
while (!next.is_empty() && ((_list_skip_navigational && (next == "." || next == "..")) || (_list_skip_hidden && d->current_is_hidden()))) {
while (!next.is_empty() && ((!include_navigational && (next == "." || next == "..")) || (!include_hidden && d->current_is_hidden()))) {
next = d->get_next();
}
return next;
Expand All @@ -1499,6 +1495,47 @@ void Directory::list_dir_end() {
d->list_dir_end();
}

PackedStringArray Directory::get_files() {
return _get_contents(false);
}

PackedStringArray Directory::get_directories() {
return _get_contents(true);
}

PackedStringArray Directory::_get_contents(bool p_directories) {
PackedStringArray ret;
ERR_FAIL_COND_V_MSG(!is_open(), ret, "Directory must be opened before use.");

list_dir_begin();
String s = get_next();
while (!s.is_empty()) {
if (current_is_dir() == p_directories) {
ret.append(s);
}
s = get_next();
}

ret.sort();
return ret;
}

void Directory::set_include_navigational(bool p_enable) {
include_navigational = p_enable;
}

bool Directory::get_include_navigational() const {
return include_navigational;
}

void Directory::set_include_hidden(bool p_enable) {
include_hidden = p_enable;
}

bool Directory::get_include_hidden() const {
return include_hidden;
}

int Directory::get_drive_count() {
ERR_FAIL_COND_V_MSG(!is_open(), 0, "Directory must be opened before use.");
return d->get_drive_count();
Expand Down Expand Up @@ -1614,10 +1651,12 @@ Error Directory::remove(String p_name) {

void Directory::_bind_methods() {
ClassDB::bind_method(D_METHOD("open", "path"), &Directory::open);
ClassDB::bind_method(D_METHOD("list_dir_begin", "show_navigational", "show_hidden"), &Directory::list_dir_begin, DEFVAL(false), DEFVAL(false));
ClassDB::bind_method(D_METHOD("list_dir_begin"), &Directory::list_dir_begin, DEFVAL(false), DEFVAL(false));
ClassDB::bind_method(D_METHOD("get_next"), &Directory::get_next);
ClassDB::bind_method(D_METHOD("current_is_dir"), &Directory::current_is_dir);
ClassDB::bind_method(D_METHOD("list_dir_end"), &Directory::list_dir_end);
ClassDB::bind_method(D_METHOD("get_files"), &Directory::get_files);
ClassDB::bind_method(D_METHOD("get_directories"), &Directory::get_directories);
ClassDB::bind_method(D_METHOD("get_drive_count"), &Directory::get_drive_count);
ClassDB::bind_method(D_METHOD("get_drive", "idx"), &Directory::get_drive);
ClassDB::bind_method(D_METHOD("get_current_drive"), &Directory::get_current_drive);
Expand All @@ -1632,6 +1671,14 @@ void Directory::_bind_methods() {
ClassDB::bind_method(D_METHOD("copy", "from", "to"), &Directory::copy);
ClassDB::bind_method(D_METHOD("rename", "from", "to"), &Directory::rename);
ClassDB::bind_method(D_METHOD("remove", "path"), &Directory::remove);

ClassDB::bind_method(D_METHOD("set_include_navigational"), &Directory::set_include_navigational);
ClassDB::bind_method(D_METHOD("get_include_navigational"), &Directory::get_include_navigational);
ClassDB::bind_method(D_METHOD("set_include_hidden"), &Directory::set_include_hidden);
ClassDB::bind_method(D_METHOD("get_include_hidden"), &Directory::get_include_hidden);

ADD_PROPERTY(PropertyInfo(Variant::BOOL, "include_navigational"), "set_include_navigational", "get_include_navigational");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "include_hidden"), "set_include_hidden", "get_include_hidden");
}

Directory::Directory() {
Expand Down
19 changes: 13 additions & 6 deletions core/core_bind.h
Original file line number Diff line number Diff line change
Expand Up @@ -444,7 +444,10 @@ class File : public RefCounted {
class Directory : public RefCounted {
GDCLASS(Directory, RefCounted);
DirAccess *d;

bool dir_open = false;
bool include_navigational = false;
bool include_hidden = false;

protected:
static void _bind_methods();
Expand All @@ -454,12 +457,20 @@ class Directory : public RefCounted {

bool is_open() const;

Error list_dir_begin(bool p_show_navigational = false, bool p_show_hidden = false); // This starts dir listing.
Error list_dir_begin();
String get_next();
bool current_is_dir() const;

void list_dir_end();

PackedStringArray get_files();
PackedStringArray get_directories();
PackedStringArray _get_contents(bool p_directories);

void set_include_navigational(bool p_enable);
bool get_include_navigational() const;
void set_include_hidden(bool p_enable);
bool get_include_hidden() const;

int get_drive_count();
String get_drive(int p_drive);
int get_current_drive();
Expand All @@ -481,10 +492,6 @@ class Directory : public RefCounted {

Directory();
virtual ~Directory();

private:
bool _list_skip_navigational = false;
bool _list_skip_hidden = false;
};

class Marshalls : public Object {
Expand Down
30 changes: 26 additions & 4 deletions doc/classes/Directory.xml
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,13 @@
Returns the currently opened directory's drive index. See [method get_drive] to convert returned index to the name of the drive.
</description>
</method>
<method name="get_directories">
<return type="PackedStringArray" />
<description>
Returns a [PackedStringArray] containing filenames of the directory contents, excluding files. The array is sorted alphabetically.
Affected by [member include_hidden] and [member include_navigational].
</description>
</method>
<method name="get_drive">
<return type="String" />
<argument index="0" name="idx" type="int" />
Expand All @@ -121,6 +128,13 @@
On Windows, returns the number of drives (partitions) mounted on the current filesystem. On other platforms, the method returns 0.
</description>
</method>
<method name="get_files">
<return type="PackedStringArray" />
<description>
Returns a [PackedStringArray] containing filenames of the directory contents, excluding directories. The array is sorted alphabetically.
Affected by [member include_hidden].
</description>
</method>
<method name="get_next">
<return type="String" />
<description>
Expand All @@ -136,12 +150,10 @@
</method>
<method name="list_dir_begin">
<return type="int" enum="Error" />
<argument index="0" name="show_navigational" type="bool" default="false" />
<argument index="1" name="show_hidden" type="bool" default="false" />
<description>
Initializes the stream used to list all files and directories using the [method get_next] function, closing the currently opened stream if needed. Once the stream has been processed, it should typically be closed with [method list_dir_end].
If [code]show_navigational[/code] is [code]true[/code], [code].[/code] and [code]..[/code] are included too.
If [code]show_hidden[/code] is [code]true[/code], hidden files are included too.
Affected by [member include_hidden] and [member include_navigational].
[b]Note:[/b] The order of files and directories returned by this method is not deterministic, and can vary between operating systems. If you want a list of all files or folders sorted alphabetically, use [method get_files] or [method get_directories].
</description>
</method>
<method name="list_dir_end">
Expand Down Expand Up @@ -192,4 +204,14 @@
</description>
</method>
</methods>
<members>
<member name="include_hidden" type="bool" setter="set_include_hidden" getter="get_include_hidden" default="false">
If [code]true[/code], hidden files are included when the navigating directory.
Affects [method list_dir_begin], [method get_directories] and [method get_files].
</member>
<member name="include_navigational" type="bool" setter="set_include_navigational" getter="get_include_navigational" default="false">
If [code]true[/code], [code].[/code] and [code]..[/code] are included when navigating the directory.
Affects [method list_dir_begin] and [method get_directories].
</member>
</members>
</class>