From 3382aabefe577a64fe8b5575caca68213ddc2956 Mon Sep 17 00:00:00 2001 From: Ari Vuollet Date: Wed, 31 Jul 2024 23:08:52 +0300 Subject: [PATCH] Close and restore AssetEditorWindows on scripting reload --- Source/Editor/Modules/ContentDatabaseModule.cs | 9 +++++---- Source/Editor/Modules/WindowsModule.cs | 18 ++++++++++-------- .../Editor/Windows/Assets/AssetEditorWindow.cs | 13 +++++++++++++ .../Windows/Assets/BehaviorTreeWindow.cs | 5 ++++- .../Editor/Windows/Assets/JsonAssetWindow.cs | 4 +++- Source/Editor/Windows/Assets/PrefabWindow.cs | 9 +++------ 6 files changed, 38 insertions(+), 20 deletions(-) diff --git a/Source/Editor/Modules/ContentDatabaseModule.cs b/Source/Editor/Modules/ContentDatabaseModule.cs index f5d7dfe61..2eee39221 100644 --- a/Source/Editor/Modules/ContentDatabaseModule.cs +++ b/Source/Editor/Modules/ContentDatabaseModule.cs @@ -61,7 +61,7 @@ namespace FlaxEditor.Modules public event Action WorkspaceModified; /// - /// Occurs when workspace has will be rebuilt. + /// Occurs when workspace will be rebuilt. /// public event Action WorkspaceRebuilding; @@ -89,7 +89,7 @@ namespace FlaxEditor.Modules // Register AssetItems serialization helper (serialize ref ID only) FlaxEngine.Json.JsonSerializer.Settings.Converters.Add(new AssetItemConverter()); - ScriptsBuilder.ScriptsReloadBegin += OnScriptsReloadBegin; + ScriptsBuilder.ScriptsReload += OnScriptsReload; ScriptsBuilder.ScriptsReloadEnd += OnScriptsReloadEnd; } @@ -1314,7 +1314,7 @@ namespace FlaxEditor.Modules } } - private void OnScriptsReloadBegin() + private void OnScriptsReload() { var enabledEvents = _enableEvents; _enableEvents = false; @@ -1387,7 +1387,8 @@ namespace FlaxEditor.Modules public override void OnExit() { FlaxEngine.Content.AssetDisposing -= OnContentAssetDisposing; - ScriptsBuilder.ScriptsReloadBegin -= OnScriptsReloadBegin; + ScriptsBuilder.ScriptsReload -= OnScriptsReload; + ScriptsBuilder.ScriptsReloadEnd -= OnScriptsReloadEnd; // Disable events _enableEvents = false; diff --git a/Source/Editor/Modules/WindowsModule.cs b/Source/Editor/Modules/WindowsModule.cs index f3c3b06e4..3a9778c85 100644 --- a/Source/Editor/Modules/WindowsModule.cs +++ b/Source/Editor/Modules/WindowsModule.cs @@ -51,7 +51,7 @@ namespace FlaxEditor.Modules public Float2 FloatSize; public Float2 FloatPosition; - public AssetItem Item; + public Guid AssetItemID; // Constructor, to allow for default values public WindowRestoreData() @@ -808,11 +808,11 @@ namespace FlaxEditor.Modules Level.SceneSaving += OnSceneSaving; Level.SceneUnloaded += OnSceneUnloaded; Level.SceneUnloading += OnSceneUnloading; - ScriptsBuilder.ScriptsReloadEnd += OnScriptsReloadEnd; + Editor.ContentDatabase.WorkspaceRebuilt += OnWorkspaceRebuilt; Editor.StateMachine.StateChanged += OnEditorStateChanged; } - internal void AddToRestore(PrefabWindow win) + internal void AddToRestore(AssetEditorWindow win) { var type = win.GetType(); var winData = new WindowRestoreData(); @@ -858,7 +858,7 @@ namespace FlaxEditor.Modules } winData.AssemblyName = type.Assembly.GetName().Name; winData.TypeName = type.FullName; - winData.Item = win.Item; + winData.AssetItemID = win.Item.ID; _restoreWindows.Add(winData); } @@ -907,7 +907,7 @@ namespace FlaxEditor.Modules _restoreWindows.Add(winData); } - private void OnScriptsReloadEnd() + private void OnWorkspaceRebuilt() { // Go in reverse order to create floating Prefab windows first before docked windows for (int i = _restoreWindows.Count - 1; i >= 0; i--) @@ -924,9 +924,11 @@ namespace FlaxEditor.Modules if (type == null) continue; - if (type == typeof(PrefabWindow)) + if (type.IsAssignableTo(typeof(AssetEditorWindow))) { - var win = new PrefabWindow(Editor.Instance, winData.Item); + var ctor = type.GetConstructor(new Type[] { typeof(Editor), typeof(AssetItem) }); + var assetItem = Editor.ContentDatabase.FindAsset(winData.AssetItemID); + var win = (AssetEditorWindow)ctor.Invoke(new object[] { Editor.Instance, assetItem }); win.Show(winData.DockState, winData.DockState != DockState.Float ? winData.DockedTo : null, winData.SelectOnShow, winData.SplitterValue); if (winData.DockState == DockState.Float) { @@ -1157,7 +1159,7 @@ namespace FlaxEditor.Modules Level.SceneSaving -= OnSceneSaving; Level.SceneUnloaded -= OnSceneUnloaded; Level.SceneUnloading -= OnSceneUnloading; - ScriptsBuilder.ScriptsReloadEnd -= OnScriptsReloadEnd; + Editor.ContentDatabase.WorkspaceRebuilt -= OnWorkspaceRebuilt; Editor.StateMachine.StateChanged -= OnEditorStateChanged; // Close main window diff --git a/Source/Editor/Windows/Assets/AssetEditorWindow.cs b/Source/Editor/Windows/Assets/AssetEditorWindow.cs index f781d49dc..e97cb7371 100644 --- a/Source/Editor/Windows/Assets/AssetEditorWindow.cs +++ b/Source/Editor/Windows/Assets/AssetEditorWindow.cs @@ -58,6 +58,8 @@ namespace FlaxEditor.Windows.Assets InputActions.Add(options => options.Save, Save); UpdateTitle(); + + ScriptsBuilder.ScriptsReloadBegin += OnScriptsReloadBegin; } /// @@ -151,6 +153,8 @@ namespace FlaxEditor.Windows.Assets /// public override void OnDestroy() { + ScriptsBuilder.ScriptsReloadBegin -= OnScriptsReloadBegin; + if (_item != null) { // Ensure to remove linkage to the item @@ -160,6 +164,15 @@ namespace FlaxEditor.Windows.Assets base.OnDestroy(); } + /// + protected virtual void OnScriptsReloadBegin() + { + if (!IsHidden) + { + Editor.Instance.Windows.AddToRestore(this); + } + } + #region IEditable Implementation private bool _isEdited; diff --git a/Source/Editor/Windows/Assets/BehaviorTreeWindow.cs b/Source/Editor/Windows/Assets/BehaviorTreeWindow.cs index 3d6399365..212e0c82f 100644 --- a/Source/Editor/Windows/Assets/BehaviorTreeWindow.cs +++ b/Source/Editor/Windows/Assets/BehaviorTreeWindow.cs @@ -268,8 +268,11 @@ namespace FlaxEditor.Windows.Assets UpdateKnowledge(); } - private void OnScriptsReloadBegin() + /// + protected override void OnScriptsReloadBegin() { + base.OnScriptsReloadBegin(); + // TODO: impl hot-reload for BT to nicely refresh state (save asset, clear undo/properties, reload surface) Close(); } diff --git a/Source/Editor/Windows/Assets/JsonAssetWindow.cs b/Source/Editor/Windows/Assets/JsonAssetWindow.cs index dc1e1e71f..fec7ccb63 100644 --- a/Source/Editor/Windows/Assets/JsonAssetWindow.cs +++ b/Source/Editor/Windows/Assets/JsonAssetWindow.cs @@ -124,8 +124,10 @@ namespace FlaxEditor.Windows.Assets UpdateToolstrip(); } - private void OnScriptsReloadBegin() + /// + protected override void OnScriptsReloadBegin() { + base.OnScriptsReloadBegin(); Close(); } diff --git a/Source/Editor/Windows/Assets/PrefabWindow.cs b/Source/Editor/Windows/Assets/PrefabWindow.cs index 120ffda57..f5d738880 100644 --- a/Source/Editor/Windows/Assets/PrefabWindow.cs +++ b/Source/Editor/Windows/Assets/PrefabWindow.cs @@ -286,8 +286,10 @@ namespace FlaxEditor.Windows.Assets return false; } - private void OnScriptsReloadBegin() + /// + protected override void OnScriptsReloadBegin() { + base.OnScriptsReloadBegin(); _isScriptsReloading = true; if (_asset == null || !_asset.IsLoaded) @@ -310,11 +312,6 @@ namespace FlaxEditor.Windows.Assets } } - if (!IsHidden) - { - Editor.Instance.Windows.AddToRestore(this); - } - // Cleanup Deselect(); Graph.MainActor = null;