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

Fix folder scan replacing project list #90845

Merged
merged 1 commit into from
Apr 18, 2024
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
11 changes: 4 additions & 7 deletions editor/project_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1571,6 +1571,8 @@ ProjectManager::ProjectManager() {

// Initialize project list.
{
project_list->load_project_list();

Ref<DirAccess> dir_access = DirAccess::create(DirAccess::AccessType::ACCESS_FILESYSTEM);

String default_project_path = EDITOR_GET("filesystem/directories/default_project_path");
Expand All @@ -1581,24 +1583,19 @@ ProjectManager::ProjectManager() {
}
}

bool scanned_for_projects = false; // Scanning will update the list automatically.

String autoscan_path = EDITOR_GET("filesystem/directories/autoscan_project_path");
if (!autoscan_path.is_empty()) {
if (dir_access->dir_exists(autoscan_path)) {
project_list->find_projects(autoscan_path);
scanned_for_projects = true;
} else {
Error error = dir_access->make_dir_recursive(autoscan_path);
if (error != OK) {
ERR_PRINT("Could not create project autoscan directory at: " + autoscan_path);
}
}
}

if (!scanned_for_projects) {
project_list->update_project_list();
}
project_list->update_project_list();
initialized = true;
}

// Extend menu bar to window title.
Expand Down
2 changes: 2 additions & 0 deletions editor/project_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@ class ProjectManager : public Control {
void _update_list_placeholder();

ProjectList *project_list = nullptr;
bool initialized = false;

LineEdit *search_box = nullptr;
Label *loading_label = nullptr;
Expand Down Expand Up @@ -239,6 +240,7 @@ class ProjectManager : public Control {

// Project list.

bool is_initialized() const { return initialized; }
LineEdit *get_search_box();

// Project tag management.
Expand Down
42 changes: 26 additions & 16 deletions editor/project_manager/project_list.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -469,23 +469,19 @@ void ProjectList::update_project_list() {
// If you have 150 projects, it may read through 150 files on your disk at once + load 150 icons.
// FIXME: Does it really have to be a full, hard reload? Runtime updates should be made much cheaper.

// Clear whole list
for (int i = 0; i < _projects.size(); ++i) {
Item &project = _projects.write[i];
CRASH_COND(project.control == nullptr);
memdelete(project.control); // Why not queue_free()?
}
_projects.clear();
_last_clicked = "";
_selected_project_paths.clear();
if (ProjectManager::get_singleton()->is_initialized()) {
// Clear whole list
for (int i = 0; i < _projects.size(); ++i) {
Item &project = _projects.write[i];
CRASH_COND(project.control == nullptr);
memdelete(project.control); // Why not queue_free()?
}

List<String> sections;
_config.load(_config_path);
_config.get_sections(&sections);
_projects.clear();
_last_clicked = "";
_selected_project_paths.clear();

for (const String &path : sections) {
bool favorite = _config.get_value(path, "favorite", false);
_projects.push_back(load_project_data(path, favorite));
load_project_list();
}

// Create controls
Expand Down Expand Up @@ -590,7 +586,21 @@ void ProjectList::find_projects_multiple(const PackedStringArray &p_paths) {
}

save_config();
update_project_list();

if (ProjectManager::get_singleton()->is_initialized()) {
update_project_list();
}
}

void ProjectList::load_project_list() {
List<String> sections;
_config.load(_config_path);
_config.get_sections(&sections);

for (const String &path : sections) {
bool favorite = _config.get_value(path, "favorite", false);
_projects.push_back(load_project_data(path, favorite));
}
}

void ProjectList::_scan_folder_recursive(const String &p_path, List<String> *r_projects) {
Expand Down
1 change: 1 addition & 0 deletions editor/project_manager/project_list.h
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,7 @@ class ProjectList : public ScrollContainer {

// Project list updates.

void load_project_list();
void update_project_list();
void sort_projects();
int get_project_count() const;
Expand Down
Loading