From 660c0660e24e9e4c4864799e8b7f49ced3233669 Mon Sep 17 00:00:00 2001 From: Ari Vuollet Date: Sat, 14 Oct 2023 20:52:56 +0300 Subject: [PATCH] Delay compiler and project generation after large file operations --- Source/Editor/Modules/SourceCodeEditing/CodeEditingModule.cs | 4 +++- Source/Editor/Scripting/ScriptsBuilder.cpp | 4 ++-- Source/Editor/Scripting/ScriptsBuilder.h | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Source/Editor/Modules/SourceCodeEditing/CodeEditingModule.cs b/Source/Editor/Modules/SourceCodeEditing/CodeEditingModule.cs index e9ff4c5b5..4d970d9b1 100644 --- a/Source/Editor/Modules/SourceCodeEditing/CodeEditingModule.cs +++ b/Source/Editor/Modules/SourceCodeEditing/CodeEditingModule.cs @@ -412,7 +412,9 @@ namespace FlaxEditor.Modules.SourceCodeEditing // Automatic project files generation after workspace modifications if (_autoGenerateScriptsProjectFiles && ScriptsBuilder.IsSourceWorkspaceDirty) { - Editor.ProgressReporting.GenerateScriptsProjectFiles.RunAsync(); + // Try to delay generation when a lot of files are added at once + if (ScriptsBuilder.IsSourceDirtyFor(TimeSpan.FromMilliseconds(150))) + Editor.ProgressReporting.GenerateScriptsProjectFiles.RunAsync(); } } diff --git a/Source/Editor/Scripting/ScriptsBuilder.cpp b/Source/Editor/Scripting/ScriptsBuilder.cpp index 8807379cf..20cb36660 100644 --- a/Source/Editor/Scripting/ScriptsBuilder.cpp +++ b/Source/Editor/Scripting/ScriptsBuilder.cpp @@ -170,7 +170,7 @@ bool ScriptsBuilder::IsSourceWorkspaceDirty() bool ScriptsBuilder::IsSourceDirtyFor(const TimeSpan& timeout) { ScopeLock scopeLock(_locker); - return _lastSourceCodeEdited > (_lastCompileAction + timeout); + return _lastSourceCodeEdited > _lastCompileAction && DateTime::Now() > _lastSourceCodeEdited + timeout; } bool ScriptsBuilder::IsCompiling() @@ -669,7 +669,7 @@ void ScriptsBuilderService::Update() } // Check if compile code (if has been edited) - const TimeSpan timeToCallCompileIfDirty = TimeSpan::FromMilliseconds(50); + const TimeSpan timeToCallCompileIfDirty = TimeSpan::FromMilliseconds(150); auto mainWindow = Engine::MainWindow; if (ScriptsBuilder::IsSourceDirtyFor(timeToCallCompileIfDirty) && mainWindow && mainWindow->IsFocused()) { diff --git a/Source/Editor/Scripting/ScriptsBuilder.h b/Source/Editor/Scripting/ScriptsBuilder.h index f954b0fd0..0a11bd9b7 100644 --- a/Source/Editor/Scripting/ScriptsBuilder.h +++ b/Source/Editor/Scripting/ScriptsBuilder.h @@ -68,7 +68,7 @@ public: /// /// Time to use for checking. /// True if source code is dirty, otherwise false. - static bool IsSourceDirtyFor(const TimeSpan& timeout); + API_FUNCTION() static bool IsSourceDirtyFor(const TimeSpan& timeout); /// /// Returns true if scripts are being now compiled/reloaded.