Refactor Editor Windows layout serialization of splitter values to prevent invalid state when loading windows

This commit is contained in:
Wojciech Figat
2022-12-27 13:54:53 +01:00
parent c53bf2b7e3
commit 3e8e839cd1
17 changed files with 75 additions and 83 deletions

View File

@@ -1,6 +1,7 @@
// Copyright (c) 2012-2022 Wojciech Figat. All rights reserved.
using System.Xml;
using System.Globalization;
using FlaxEngine;
using FlaxEngine.Assertions;
using FlaxEngine.GUI;
@@ -423,6 +424,29 @@ namespace FlaxEditor.GUI.Docking
{
}
/// <summary>
/// Serializes splitter panel value into the saved layout.
/// </summary>
/// <param name="writer">The Xml writer.</param>
/// <param name="name">The Xml attribute name to use for value.</param>
/// <param name="splitter">The splitter panel.</param>
protected void LayoutSerializeSplitter(XmlWriter writer, string name, SplitPanel splitter)
{
writer.WriteAttributeString(name, splitter.SplitterValue.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// Deserializes splitter panel value from the saved layout.
/// </summary>
/// <param name="node">The Xml document node.</param>
/// <param name="name">The Xml attribute name to use for value.</param>
/// <param name="splitter">The splitter panel.</param>
protected void LayoutDeserializeSplitter(XmlElement node, string name, SplitPanel splitter)
{
if (float.TryParse(node.GetAttribute(name), CultureInfo.InvariantCulture, out float value) && value > 0.01f && value < 0.99f)
splitter.SplitterValue = value;
}
/// <inheritdoc />
public override void OnDestroy()
{

View File

@@ -1000,18 +1000,15 @@ namespace FlaxEditor.Surface
/// <inheritdoc />
public override void OnLayoutSerialize(XmlWriter writer)
{
writer.WriteAttributeString("Split1", _split1.SplitterValue.ToString());
writer.WriteAttributeString("Split2", _split2.SplitterValue.ToString());
LayoutSerializeSplitter(writer, "Split1", _split1);
LayoutSerializeSplitter(writer, "Split2", _split2);
}
/// <inheritdoc />
public override void OnLayoutDeserialize(XmlElement node)
{
if (float.TryParse(node.GetAttribute("Split1"), out float value1))
_split1.SplitterValue = value1;
if (float.TryParse(node.GetAttribute("Split2"), out value1))
_split2.SplitterValue = value1;
LayoutDeserializeSplitter(node, "Split1", _split1);
LayoutDeserializeSplitter(node, "Split2", _split2);
}
/// <inheritdoc />

View File

@@ -1,6 +1,7 @@
// Copyright (c) 2012-2022 Wojciech Figat. All rights reserved.
using System;
using System.Globalization;
using System.Reflection;
using System.Xml;
using FlaxEditor.Content;
@@ -374,12 +375,12 @@ namespace FlaxEditor.Windows.Assets
/// <inheritdoc />
public override void OnLayoutSerialize(XmlWriter writer)
{
writer.WriteAttributeString("TimelineSplitter", _timeline.Splitter.SplitterValue.ToString());
LayoutSerializeSplitter(writer, "TimelineSplitter", _timeline.Splitter);
LayoutSerializeSplitter(writer, "Panel1Splitter", _panel1);
if (_panel2 != null)
LayoutSerializeSplitter(writer, "Panel2Splitter", _panel2);
writer.WriteAttributeString("TimeShowMode", _timeline.TimeShowMode.ToString());
writer.WriteAttributeString("ShowPreviewValues", _timeline.ShowPreviewValues.ToString());
writer.WriteAttributeString("Panel1Splitter", _panel1.SplitterValue.ToString());
if (_panel2 != null)
writer.WriteAttributeString("Panel2Splitter", _panel2.SplitterValue.ToString());
if (_properties.PreviewModel)
writer.WriteAttributeString("PreviewModel", _properties.PreviewModel.ID.ToString());
}
@@ -387,18 +388,16 @@ namespace FlaxEditor.Windows.Assets
/// <inheritdoc />
public override void OnLayoutDeserialize(XmlElement node)
{
if (Guid.TryParse(node.GetAttribute("PreviewModel"), out Guid value4))
_initialPreviewModel = FlaxEngine.Content.LoadAsync<SkinnedModel>(value4);
if (float.TryParse(node.GetAttribute("TimelineSplitter"), out float value1))
_timeline.Splitter.SplitterValue = value1;
if (float.TryParse(node.GetAttribute("Panel1Splitter"), out value1))
_panel1.SplitterValue = value1;
if (float.TryParse(node.GetAttribute("Panel2Splitter"), out value1))
LayoutDeserializeSplitter(node, "TimelineSplitter", _timeline.Splitter);
LayoutDeserializeSplitter(node, "Panel1Splitter", _panel1);
if (float.TryParse(node.GetAttribute("Panel2Splitter"), CultureInfo.InvariantCulture, out float value1) && value1 > 0.01f && value1 < 0.99f)
_initialPanel2Splitter = value1;
if (Enum.TryParse(node.GetAttribute("TimeShowMode"), out Timeline.TimeShowModes value2))
_timeline.TimeShowMode = value2;
if (bool.TryParse(node.GetAttribute("ShowPreviewValues"), out bool value3))
_timeline.ShowPreviewValues = value3;
if (Guid.TryParse(node.GetAttribute("PreviewModel"), out Guid value4))
_initialPreviewModel = FlaxEngine.Content.LoadAsync<SkinnedModel>(value4);
}
/// <inheritdoc />

View File

@@ -282,14 +282,13 @@ namespace FlaxEditor.Windows.Assets
/// <inheritdoc />
public override void OnLayoutSerialize(XmlWriter writer)
{
writer.WriteAttributeString("Split", _split.SplitterValue.ToString());
LayoutSerializeSplitter(writer, "Split", _split);
}
/// <inheritdoc />
public override void OnLayoutDeserialize(XmlElement node)
{
if (float.TryParse(node.GetAttribute("Split"), out float value1))
_split.SplitterValue = value1;
LayoutDeserializeSplitter(node, "Split", _split);
}
/// <inheritdoc />

View File

@@ -317,14 +317,13 @@ namespace FlaxEditor.Windows.Assets
/// <inheritdoc />
public override void OnLayoutSerialize(XmlWriter writer)
{
writer.WriteAttributeString("Split", _split.SplitterValue.ToString());
LayoutSerializeSplitter(writer, "Split", _split);
}
/// <inheritdoc />
public override void OnLayoutDeserialize(XmlElement node)
{
if (float.TryParse(node.GetAttribute("Split"), out float value1))
_split.SplitterValue = value1;
LayoutDeserializeSplitter(node, "Split", _split);
}
/// <inheritdoc />

View File

@@ -206,14 +206,13 @@ namespace FlaxEditor.Windows.Assets
/// <inheritdoc />
public override void OnLayoutSerialize(XmlWriter writer)
{
writer.WriteAttributeString("Split", _split.SplitterValue.ToString());
LayoutSerializeSplitter(writer, "Split", _split);
}
/// <inheritdoc />
public override void OnLayoutDeserialize(XmlElement node)
{
if (float.TryParse(node.GetAttribute("Split"), out float value1))
_split.SplitterValue = value1;
LayoutDeserializeSplitter(node, "Split", _split);
}
/// <inheritdoc />

View File

@@ -548,14 +548,13 @@ namespace FlaxEditor.Windows.Assets
/// <inheritdoc />
public override void OnLayoutSerialize(XmlWriter writer)
{
writer.WriteAttributeString("Split", _split.SplitterValue.ToString());
LayoutSerializeSplitter(writer, "Split", _split);
}
/// <inheritdoc />
public override void OnLayoutDeserialize(XmlElement node)
{
if (float.TryParse(node.GetAttribute("Split"), out float value1))
_split.SplitterValue = value1;
LayoutDeserializeSplitter(node, "Split", _split);
}
/// <inheritdoc />

View File

@@ -187,14 +187,13 @@ namespace FlaxEditor.Windows.Assets
/// <inheritdoc />
public override void OnLayoutSerialize(XmlWriter writer)
{
writer.WriteAttributeString("Split", _split.SplitterValue.ToString());
LayoutSerializeSplitter(writer, "Split", _split);
}
/// <inheritdoc />
public override void OnLayoutDeserialize(XmlElement node)
{
if (float.TryParse(node.GetAttribute("Split"), out float value1))
_split.SplitterValue = value1;
LayoutDeserializeSplitter(node, "Split", _split);
}
/// <inheritdoc />

View File

@@ -543,22 +543,17 @@ namespace FlaxEditor.Windows.Assets
/// <inheritdoc />
public override void OnLayoutSerialize(XmlWriter writer)
{
writer.WriteAttributeString("Split1", _split1.SplitterValue.ToString());
writer.WriteAttributeString("Split2", _split2.SplitterValue.ToString());
writer.WriteAttributeString("Split3", _timeline.Splitter.SplitterValue.ToString());
LayoutSerializeSplitter(writer, "Split1", _split1);
LayoutSerializeSplitter(writer, "Split2", _split2);
LayoutSerializeSplitter(writer, "Split3", _timeline.Splitter);
}
/// <inheritdoc />
public override void OnLayoutDeserialize(XmlElement node)
{
if (float.TryParse(node.GetAttribute("Split1"), out float value1))
_split1.SplitterValue = value1;
if (float.TryParse(node.GetAttribute("Split2"), out value1))
_split2.SplitterValue = value1;
if (float.TryParse(node.GetAttribute("Split3"), out value1))
_timeline.Splitter.SplitterValue = value1;
LayoutDeserializeSplitter(node, "Split1", _split1);
LayoutDeserializeSplitter(node, "Split2", _split2);
LayoutDeserializeSplitter(node, "Split3", _timeline.Splitter);
}
/// <inheritdoc />

View File

@@ -483,8 +483,8 @@ namespace FlaxEditor.Windows.Assets
/// <inheritdoc />
public override void OnLayoutSerialize(XmlWriter writer)
{
writer.WriteAttributeString("Split1", _split1.SplitterValue.ToString());
writer.WriteAttributeString("Split2", _split2.SplitterValue.ToString());
LayoutSerializeSplitter(writer, "Split1", _split1);
LayoutSerializeSplitter(writer, "Split2", _split2);
writer.WriteAttributeString("LiveReload", LiveReload.ToString());
writer.WriteAttributeString("GizmoMode", Viewport.TransformGizmo.ActiveMode.ToString());
}
@@ -492,15 +492,10 @@ namespace FlaxEditor.Windows.Assets
/// <inheritdoc />
public override void OnLayoutDeserialize(XmlElement node)
{
if (float.TryParse(node.GetAttribute("Split1"), out float value1))
_split1.SplitterValue = value1;
if (float.TryParse(node.GetAttribute("Split2"), out value1))
_split2.SplitterValue = value1;
LayoutDeserializeSplitter(node, "Split1", _split1);
LayoutDeserializeSplitter(node, "Split2", _split2);
if (bool.TryParse(node.GetAttribute("LiveReload"), out bool value2))
LiveReload = value2;
if (Enum.TryParse(node.GetAttribute("GizmoMode"), out TransformGizmoBase.Mode value3))
Viewport.TransformGizmo.ActiveMode = value3;
}

View File

@@ -989,7 +989,7 @@ namespace FlaxEditor.Windows.Assets
/// <inheritdoc />
public override void OnLayoutSerialize(XmlWriter writer)
{
writer.WriteAttributeString("TimelineSplitter", _timeline.Splitter.SplitterValue.ToString());
LayoutSerializeSplitter(writer, "TimelineSplitter", _timeline.Splitter);
writer.WriteAttributeString("TimeShowMode", _timeline.TimeShowMode.ToString());
var id = _previewButton.Checked ? Guid.Empty : (_timeline.Player?.ID ?? _cachedPlayerId);
writer.WriteAttributeString("SelectedPlayer", id.ToString());
@@ -1000,18 +1000,13 @@ namespace FlaxEditor.Windows.Assets
/// <inheritdoc />
public override void OnLayoutDeserialize(XmlElement node)
{
if (float.TryParse(node.GetAttribute("TimelineSplitter"), out float value1))
_timeline.Splitter.SplitterValue = value1;
LayoutDeserializeSplitter(node, "TimelineSplitter", _timeline.Splitter);
if (Guid.TryParse(node.GetAttribute("SelectedPlayer"), out Guid value2))
_cachedPlayerId = value2;
if (Enum.TryParse(node.GetAttribute("TimeShowMode"), out Timeline.TimeShowModes value3))
_timeline.TimeShowMode = value3;
if (bool.TryParse(node.GetAttribute("ShowPreviewValues"), out bool value4))
_timeline.ShowPreviewValues = value4;
if (bool.TryParse(node.GetAttribute("ShowSelected3dTrack"), out value4))
_timeline.ShowSelected3dTrack = value4;
}

View File

@@ -304,14 +304,13 @@ namespace FlaxEditor.Windows.Assets
/// <inheritdoc />
public override void OnLayoutSerialize(XmlWriter writer)
{
writer.WriteAttributeString("Split", _split.SplitterValue.ToString());
LayoutSerializeSplitter(writer, "Split", _split);
}
/// <inheritdoc />
public override void OnLayoutDeserialize(XmlElement node)
{
if (float.TryParse(node.GetAttribute("Split"), out float value1))
_split.SplitterValue = value1;
LayoutDeserializeSplitter(node, "Split", _split);
}
/// <inheritdoc />

View File

@@ -366,14 +366,13 @@ namespace FlaxEditor.Windows.Assets
/// <inheritdoc />
public override void OnLayoutSerialize(XmlWriter writer)
{
writer.WriteAttributeString("Split", _split.SplitterValue.ToString());
LayoutSerializeSplitter(writer, "Split", _split);
}
/// <inheritdoc />
public override void OnLayoutDeserialize(XmlElement node)
{
if (float.TryParse(node.GetAttribute("Split"), out float value1))
_split.SplitterValue = value1;
LayoutDeserializeSplitter(node, "Split", _split);
}
/// <inheritdoc />

View File

@@ -245,14 +245,13 @@ namespace FlaxEditor.Windows.Assets
/// <inheritdoc />
public override void OnLayoutSerialize(XmlWriter writer)
{
writer.WriteAttributeString("Split", _split.SplitterValue.ToString());
LayoutSerializeSplitter(writer, "Split", _split);
}
/// <inheritdoc />
public override void OnLayoutDeserialize(XmlElement node)
{
if (float.TryParse(node.GetAttribute("Split"), out float value1))
_split.SplitterValue = value1;
LayoutDeserializeSplitter(node, "Split", _split);
}
/// <inheritdoc />

View File

@@ -1367,14 +1367,13 @@ namespace FlaxEditor.Windows.Assets
/// <inheritdoc />
public override void OnLayoutSerialize(XmlWriter writer)
{
writer.WriteAttributeString("Split", _split.SplitterValue.ToString());
LayoutSerializeSplitter(writer, "Split", _split);
}
/// <inheritdoc />
public override void OnLayoutDeserialize(XmlElement node)
{
if (float.TryParse(node.GetAttribute("Split"), out float value1))
_split.SplitterValue = value1;
LayoutDeserializeSplitter(node, "Split", _split);
}
/// <inheritdoc />

View File

@@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Xml;
using FlaxEditor.Content;
@@ -952,8 +953,8 @@ namespace FlaxEditor.Windows
/// <inheritdoc />
public override void OnLayoutSerialize(XmlWriter writer)
{
writer.WriteAttributeString("Split", _split.SplitterValue.ToString());
writer.WriteAttributeString("Scale", _view.ViewScale.ToString());
LayoutSerializeSplitter(writer, "Split", _split);
writer.WriteAttributeString("Scale", _view.ViewScale.ToString(CultureInfo.InvariantCulture));
writer.WriteAttributeString("ShowFileExtensions", _view.ShowFileExtensions.ToString());
writer.WriteAttributeString("ViewType", _view.ViewType.ToString());
}
@@ -961,15 +962,11 @@ namespace FlaxEditor.Windows
/// <inheritdoc />
public override void OnLayoutDeserialize(XmlElement node)
{
if (float.TryParse(node.GetAttribute("Split"), out float value1))
_split.SplitterValue = value1;
if (float.TryParse(node.GetAttribute("Scale"), out value1))
LayoutDeserializeSplitter(node, "Split", _split);
if (float.TryParse(node.GetAttribute("Scale"), CultureInfo.InvariantCulture, out var value1))
_view.ViewScale = value1;
if (bool.TryParse(node.GetAttribute("ShowFileExtensions"), out bool value2))
_view.ShowFileExtensions = value2;
if (Enum.TryParse(node.GetAttribute("ViewType"), out ContentViewType viewType))
_view.ViewType = viewType;
}

View File

@@ -673,14 +673,13 @@ namespace FlaxEditor.Windows
/// <inheritdoc />
public override void OnLayoutSerialize(XmlWriter writer)
{
writer.WriteAttributeString("Split", _split.SplitterValue.ToString());
LayoutSerializeSplitter(writer, "Split", _split);
}
/// <inheritdoc />
public override void OnLayoutDeserialize(XmlElement node)
{
if (float.TryParse(node.GetAttribute("Split"), out float value1))
_split.SplitterValue = value1;
LayoutDeserializeSplitter(node, "Split", _split);
}
/// <inheritdoc />