Save the dock state of custom editor windows between script reloads.

This commit is contained in:
MineBill
2023-12-30 18:30:26 +02:00
parent b275ffc146
commit 343d7b4973
4 changed files with 54 additions and 13 deletions

View File

@@ -1,9 +1,9 @@
// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
using FlaxEditor.CustomEditors; using FlaxEditor.CustomEditors;
using FlaxEditor.GUI.Docking;
using FlaxEditor.Windows; using FlaxEditor.Windows;
using FlaxEngine.GUI; using FlaxEngine.GUI;
using DockState = FlaxEditor.GUI.Docking.DockState;
namespace FlaxEditor namespace FlaxEditor
{ {
@@ -97,9 +97,12 @@ namespace FlaxEditor
/// Shows the window. /// Shows the window.
/// </summary> /// </summary>
/// <param name="state">Initial window state.</param> /// <param name="state">Initial window state.</param>
public void Show(DockState state = DockState.Float) /// <param name="toDock">The panel to dock to, if any.</param>
/// <param name="autoSelect">Only used if <paramref name="toDock"/> is set. If true the window will be selected after docking it.</param>
/// <param name="splitterValue">The splitter value to use if toDock is not null. If not specified, a default value will be used.</param>
public void Show(DockState state = DockState.Float, DockPanel toDock = null, bool autoSelect = true, float? splitterValue = null)
{ {
_win.Show(state); _win.Show(state, toDock, autoSelect, splitterValue);
} }
} }
} }

View File

@@ -518,9 +518,9 @@ namespace FlaxEditor.GUI.Docking
} }
} }
internal virtual void DockWindowInternal(DockState state, DockWindow window) internal virtual void DockWindowInternal(DockState state, DockWindow window, bool autoSelect = true, float? splitterValue = null)
{ {
DockWindow(state, window); DockWindow(state, window, autoSelect, splitterValue);
} }
/// <summary> /// <summary>
@@ -528,7 +528,9 @@ namespace FlaxEditor.GUI.Docking
/// </summary> /// </summary>
/// <param name="state">The state.</param> /// <param name="state">The state.</param>
/// <param name="window">The window.</param> /// <param name="window">The window.</param>
protected virtual void DockWindow(DockState state, DockWindow window) /// <param name="autoSelect">Whether or not to automatically select the window after docking it.</param>
/// <param name="splitterValue">The splitter value to use when docking to window.</param>
protected virtual void DockWindow(DockState state, DockWindow window, bool autoSelect = true, float? splitterValue = null)
{ {
CreateTabsProxy(); CreateTabsProxy();
@@ -536,12 +538,12 @@ namespace FlaxEditor.GUI.Docking
if (state == DockState.DockFill) if (state == DockState.DockFill)
{ {
// Add tab // Add tab
AddTab(window); AddTab(window, autoSelect);
} }
else else
{ {
// Create child panel // Create child panel
var dockPanel = CreateChildPanel(state, DefaultSplitterValue); var dockPanel = CreateChildPanel(state, splitterValue ?? DefaultSplitterValue);
// Dock window as a tab in a child panel // Dock window as a tab in a child panel
dockPanel.DockWindow(DockState.DockFill, window); dockPanel.DockWindow(DockState.DockFill, window);

View File

@@ -214,7 +214,9 @@ namespace FlaxEditor.GUI.Docking
/// </summary> /// </summary>
/// <param name="state">Initial window state.</param> /// <param name="state">Initial window state.</param>
/// <param name="toDock">Panel to dock to it.</param> /// <param name="toDock">Panel to dock to it.</param>
public void Show(DockState state = DockState.Float, DockPanel toDock = null) /// <param name="autoSelect">Only used if <paramref name="toDock"/> is set. If true the window will be selected after docking it.</param>
/// <param name="splitterValue">Only used if <paramref name="toDock"/> is set. The splitter value to use. If not specified, a default value will be used.</param>
public void Show(DockState state = DockState.Float, DockPanel toDock = null, bool autoSelect = true, float? splitterValue = null)
{ {
if (state == DockState.Hidden) if (state == DockState.Hidden)
{ {
@@ -232,7 +234,7 @@ namespace FlaxEditor.GUI.Docking
Undock(); Undock();
// Then dock // Then dock
(toDock ?? _masterPanel).DockWindowInternal(state, this); (toDock ?? _masterPanel).DockWindowInternal(state, this, autoSelect, splitterValue);
OnShow(); OnShow();
PerformLayout(); PerformLayout();
} }

View File

@@ -36,6 +36,17 @@ namespace FlaxEditor.Modules
{ {
public string AssemblyName; public string AssemblyName;
public string TypeName; public string TypeName;
public DockState DockState;
public DockPanel DockedTo;
public float? SplitterValue = null;
public bool SelectOnShow = false;
// Constructor, to allow for default values
public WindowRestoreData()
{
}
} }
private readonly List<WindowRestoreData> _restoreWindows = new List<WindowRestoreData>(); private readonly List<WindowRestoreData> _restoreWindows = new List<WindowRestoreData>();
@@ -802,10 +813,33 @@ namespace FlaxEditor.Modules
if (constructor == null || type.IsGenericType) if (constructor == null || type.IsGenericType)
return; return;
WindowRestoreData winData; var winData = new WindowRestoreData();
var panel = win.Window.ParentDockPanel;
// Ensure that this window is only selected following recompilation
// if it was the active tab in its dock panel. Otherwise, there is a
// risk of interrupting the user's workflow by potentially selecting
// background tabs.
winData.SelectOnShow = panel.SelectedTab == win.Window;
if (panel is FloatWindowDockPanel)
{
winData.DockState = DockState.Float;
}
else
{
if (panel.TabsCount > 1)
{
winData.DockState = DockState.DockFill;
winData.DockedTo = panel;
}else
{
winData.DockState = panel.TryGetDockState(out var splitterValue);
winData.DockedTo = panel.ParentDockPanel;
winData.SplitterValue = splitterValue;
}
}
winData.AssemblyName = type.Assembly.GetName().Name; winData.AssemblyName = type.Assembly.GetName().Name;
winData.TypeName = type.FullName; winData.TypeName = type.FullName;
// TODO: cache and restore docking info
_restoreWindows.Add(winData); _restoreWindows.Add(winData);
} }
@@ -824,7 +858,7 @@ namespace FlaxEditor.Modules
if (type != null) if (type != null)
{ {
var win = (CustomEditorWindow)Activator.CreateInstance(type); var win = (CustomEditorWindow)Activator.CreateInstance(type);
win.Show(); win.Show(winData.DockState, winData.DockedTo, winData.SelectOnShow, winData.SplitterValue);
} }
} }
} }