1
0
mirror of https://github.com/godotengine/godot.git synced 2025-12-31 18:41:20 +00:00

Merge pull request #113608 from bruvzg/fd_prefix

[FileDialog] Filter drive list when root folder is set.
This commit is contained in:
Rémi Verschelde
2025-12-18 14:24:04 +01:00

View File

@@ -359,7 +359,13 @@ void FileDialog::update_dir() {
drives->set_item_disabled(-1, true); drives->set_item_disabled(-1, true);
drives->select(drives->get_item_count() - 1); drives->select(drives->get_item_count() - 1);
} else { } else {
drives->select(dir_access->get_current_drive()); int cur = dir_access->get_current_drive();
for (int i = 0; i < drives->get_item_count(); i++) {
if (drives->get_item_metadata(i).operator int() == cur) {
drives->select(i);
break;
}
}
} }
} }
@@ -1322,6 +1328,7 @@ void FileDialog::set_root_subfolder(const String &p_root) {
root_prefix = dir_access->get_current_dir(); root_prefix = dir_access->get_current_dir();
} }
invalidate(); invalidate();
_update_drives();
update_dir(); update_dir();
} }
@@ -1599,8 +1606,22 @@ void FileDialog::_change_dir(const String &p_new_dir) {
} }
void FileDialog::_update_drives(bool p_select) { void FileDialog::_update_drives(bool p_select) {
if (access != ACCESS_FILESYSTEM) {
drives->hide();
return;
}
HashMap<int, String> drive_map;
int dc = dir_access->get_drive_count(); int dc = dir_access->get_drive_count();
if (dc == 0 || access != ACCESS_FILESYSTEM) { int cur = dir_access->get_current_drive();
for (int i = 0; i < dc; i++) {
String drv = dir_access->get_drive(i);
if (!root_prefix.is_empty() && !drv.begins_with(root_prefix)) {
continue;
}
drive_map[i] = drv;
}
if (drive_map.size() == 0) {
drives->hide(); drives->hide();
} else { } else {
drives->clear(); drives->clear();
@@ -1612,12 +1633,12 @@ void FileDialog::_update_drives(bool p_select) {
dp->add_child(drives); dp->add_child(drives);
drives->show(); drives->show();
for (int i = 0; i < dir_access->get_drive_count(); i++) { for (const KeyValue<int, String> &drv : drive_map) {
drives->add_item(dir_access->get_drive(i)); drives->add_item(drv.value);
} drives->set_item_metadata(-1, drv.key);
if (p_select && drv.key == cur) {
if (p_select) { drives->select(drives->get_item_count() - 1);
drives->select(dir_access->get_current_drive()); }
} }
} }
} }