From 31b126e63766adbd9c5c5279205b2a6f2d45bd34 Mon Sep 17 00:00:00 2001 From: Ari Vuollet Date: Sun, 28 Apr 2024 22:28:34 +0300 Subject: [PATCH] Fix custom content and importers blocking scripting reload --- .../CustomEditors/Editors/GenericEditor.cs | 1 + .../Editor/Modules/ContentDatabaseModule.cs | 44 ++++++++++++++++++ .../Editor/Modules/ContentImportingModule.cs | 15 +++++++ Source/Editor/Modules/WindowsModule.cs | 1 - Source/Editor/Windows/ContentWindow.cs | 45 ++++++++++++++++--- Source/Editor/Windows/ToolboxWindow.cs | 16 +++++++ Source/Engine/Scripting/Scripting.cs | 21 +++++++++ 7 files changed, 135 insertions(+), 8 deletions(-) diff --git a/Source/Editor/CustomEditors/Editors/GenericEditor.cs b/Source/Editor/CustomEditors/Editors/GenericEditor.cs index 7eead4cc59..5193a54702 100644 --- a/Source/Editor/CustomEditors/Editors/GenericEditor.cs +++ b/Source/Editor/CustomEditors/Editors/GenericEditor.cs @@ -833,6 +833,7 @@ public override void Initialize(LayoutElementsContainer layout) OnGroupsEnd(); } + /// protected override void Deinitialize() { _visibleIfCaches = null; diff --git a/Source/Editor/Modules/ContentDatabaseModule.cs b/Source/Editor/Modules/ContentDatabaseModule.cs index 0e4e96d307..61797676e9 100644 --- a/Source/Editor/Modules/ContentDatabaseModule.cs +++ b/Source/Editor/Modules/ContentDatabaseModule.cs @@ -88,6 +88,8 @@ internal ContentDatabaseModule(Editor editor) // Register AssetItems serialization helper (serialize ref ID only) FlaxEngine.Json.JsonSerializer.Settings.Converters.Add(new AssetItemConverter()); + + ScriptsBuilder.ScriptsReloadBegin += OnScriptsReloadBegin; } private void OnContentAssetDisposing(Asset asset) @@ -1260,6 +1262,47 @@ internal void OnDirectoryEvent(MainContentTreeNode node, FileSystemEventArgs e) } } + private void OnScriptsReloadBegin() + { + var enabledEvents = _enableEvents; + _enableEvents = false; + _isDuringFastSetup = true; + var startItems = _itemsCreated; + foreach (var project in Projects) + { + if (project.Content != null) + { + //Dispose(project.Content.Folder); + for (int i = 0; i < project.Content.Folder.Children.Count; i++) + { + Dispose(project.Content.Folder.Children[i]); + i--; + } + } + if (project.Source != null) + { + //Dispose(project.Source.Folder); + for (int i = 0; i < project.Source.Folder.Children.Count; i++) + { + Dispose(project.Source.Folder.Children[i]); + i--; + } + } + } + + List removeProxies = new List(); + foreach (var proxy in Editor.Instance.ContentDatabase.Proxy) + { + if (proxy.GetType().IsCollectible) + removeProxies.Add(proxy); + } + foreach (var proxy in removeProxies) + RemoveProxy(proxy, false); + + _isDuringFastSetup = false; + _enableEvents = enabledEvents; + } + /// public override void OnUpdate() { @@ -1285,6 +1328,7 @@ public override void OnUpdate() public override void OnExit() { FlaxEngine.Content.AssetDisposing -= OnContentAssetDisposing; + ScriptsBuilder.ScriptsReloadBegin -= OnScriptsReloadBegin; // Disable events _enableEvents = false; diff --git a/Source/Editor/Modules/ContentImportingModule.cs b/Source/Editor/Modules/ContentImportingModule.cs index 65821cd436..d235a792e7 100644 --- a/Source/Editor/Modules/ContentImportingModule.cs +++ b/Source/Editor/Modules/ContentImportingModule.cs @@ -391,6 +391,20 @@ private void EndWorker() public override void OnInit() { ImportFileEntry.RegisterDefaultTypes(); + ScriptsBuilder.ScriptsReloadBegin += OnScriptsReloadBegin; + } + + private void OnScriptsReloadBegin() + { + // Remove import file types from scripting assemblies + List removeFileTypes = new List(); + foreach (var pair in ImportFileEntry.FileTypes) + { + if (pair.Value.Method.IsCollectible || (pair.Value.Target != null && pair.Value.Target.GetType().IsCollectible)) + removeFileTypes.Add(pair.Key); + } + foreach (var fileType in removeFileTypes) + ImportFileEntry.FileTypes.Remove(fileType); } /// @@ -451,6 +465,7 @@ public override void OnUpdate() /// public override void OnExit() { + ScriptsBuilder.ScriptsReloadBegin -= OnScriptsReloadBegin; EndWorker(); } } diff --git a/Source/Editor/Modules/WindowsModule.cs b/Source/Editor/Modules/WindowsModule.cs index 44460bc8f9..c6f7fe1d33 100644 --- a/Source/Editor/Modules/WindowsModule.cs +++ b/Source/Editor/Modules/WindowsModule.cs @@ -52,7 +52,6 @@ private struct WindowRestoreData public Float2 FloatPosition; public AssetItem Item; - public AssetItem Item2; // Constructor, to allow for default values public WindowRestoreData() diff --git a/Source/Editor/Windows/ContentWindow.cs b/Source/Editor/Windows/ContentWindow.cs index 7806522927..384c28047a 100644 --- a/Source/Editor/Windows/ContentWindow.cs +++ b/Source/Editor/Windows/ContentWindow.cs @@ -29,6 +29,7 @@ public sealed partial class ContentWindow : EditorWindow private const string ProjectDataLastViewedFolder = "LastViewedFolder"; private bool _isWorkspaceDirty; private string _workspaceRebuildLocation; + private string _lastViewedFolderBeforeReload; private SplitPanel _split; private Panel _contentViewPanel; private Panel _contentTreePanel; @@ -1031,6 +1032,41 @@ public override void OnInit() ShowRoot(); }; + Refresh(); + + // Load last viewed folder + if (Editor.ProjectCache.TryGetCustomData(ProjectDataLastViewedFolder, out string lastViewedFolder)) + { + if (Editor.ContentDatabase.Find(lastViewedFolder) is ContentFolder folder) + _tree.Select(folder.Node); + } + + ScriptsBuilder.ScriptsReloadBegin += OnScriptsReloadBegin; + ScriptsBuilder.ScriptsReloadEnd += OnScriptsReloadEnd; + } + + private void OnScriptsReloadBegin() + { + var lastViewedFolder = _tree.Selection.Count == 1 ? _tree.SelectedNode as ContentTreeNode : null; + _lastViewedFolderBeforeReload = lastViewedFolder?.Path ?? string.Empty; + + _tree.RemoveChild(_root); + _root = null; + } + + private void OnScriptsReloadEnd() + { + Refresh(); + + if (!string.IsNullOrEmpty(_lastViewedFolderBeforeReload)) + { + if (Editor.ContentDatabase.Find(_lastViewedFolderBeforeReload) is ContentFolder folder) + _tree.Select(folder.Node); + } + } + + private void Refresh() + { // Setup content root node _root = new RootContentTreeNode { @@ -1066,13 +1102,6 @@ public override void OnInit() // Update UI layout _isLayoutLocked = false; PerformLayout(); - - // Load last viewed folder - if (Editor.ProjectCache.TryGetCustomData(ProjectDataLastViewedFolder, out string lastViewedFolder)) - { - if (Editor.ContentDatabase.Find(lastViewedFolder) is ContentFolder folder) - _tree.Select(folder.Node); - } } /// @@ -1220,6 +1249,8 @@ public override void OnDestroy() _viewDropdown = null; Editor.Options.OptionsChanged -= OnOptionsChanged; + ScriptsBuilder.ScriptsReloadBegin -= OnScriptsReloadBegin; + ScriptsBuilder.ScriptsReloadEnd -= OnScriptsReloadEnd; base.OnDestroy(); } diff --git a/Source/Editor/Windows/ToolboxWindow.cs b/Source/Editor/Windows/ToolboxWindow.cs index 4b347ea83e..dd550b0f18 100644 --- a/Source/Editor/Windows/ToolboxWindow.cs +++ b/Source/Editor/Windows/ToolboxWindow.cs @@ -150,6 +150,22 @@ private void OnScriptsReload() _searchBox.Clear(); _groupSearch.DisposeChildren(); _groupSearch.PerformLayout(); + + // Remove tabs + var tabs = new List(); + foreach (var child in _actorGroups.Children) + { + if (child is Tab tab) + { + if (tab.Text != "Search") + tabs.Add(tab); + } + } + foreach (var tab in tabs) + { + var group = _actorGroups.Children.Find(T => T == tab); + group.Dispose(); + } } private void OnScriptsReloadEnd() diff --git a/Source/Engine/Scripting/Scripting.cs b/Source/Engine/Scripting/Scripting.cs index 66a34faf0f..33aea8a260 100644 --- a/Source/Engine/Scripting/Scripting.cs +++ b/Source/Engine/Scripting/Scripting.cs @@ -170,6 +170,10 @@ internal static void Init() AppDomain.CurrentDomain.UnhandledException += OnUnhandledException; TaskScheduler.UnobservedTaskException += OnUnobservedTaskException; Localization.LocalizationChanged += OnLocalizationChanged; +#if FLAX_EDITOR + FlaxEditor.ScriptsBuilder.ScriptsReloadBegin += OnScriptsReloadBegin; + FlaxEditor.ScriptsBuilder.ScriptsReloadEnd += OnScriptsReloadEnd; +#endif OnLocalizationChanged(); if (!Engine.IsEditor) @@ -178,6 +182,19 @@ internal static void Init() } } +#if FLAX_EDITOR + private static void OnScriptsReloadBegin() + { + // Tooltip might hold references to scripting assemblies + Style.Current.SharedTooltip = null; + } + + private static void OnScriptsReloadEnd() + { + Style.Current.SharedTooltip = new Tooltip(); + } +#endif + private static void OnLocalizationChanged() { // Invariant-globalization only (see InitHostfxr with Mono) @@ -359,6 +376,10 @@ internal static void Internal_Exit() MainThreadTaskScheduler.Dispose(); Json.JsonSerializer.Dispose(); +#if FLAX_EDITOR + FlaxEditor.ScriptsBuilder.ScriptsReloadBegin -= OnScriptsReloadBegin; + FlaxEditor.ScriptsBuilder.ScriptsReloadEnd -= OnScriptsReloadEnd; +#endif } ///