Save the dock state of custom editor windows between script reloads.
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user