Files
LuaCsForBarotraumaEP/Barotrauma/BarotraumaShared/SharedSource/ContentManagement/ContentFile/UIStyleFile.cs
2022-02-26 02:43:01 +09:00

100 lines
3.8 KiB
C#

using System;
using Barotrauma.Extensions;
using System.Collections.Immutable;
using System.Linq;
using System.Reflection;
using System.Xml.Linq;
namespace Barotrauma
{
#if CLIENT
public sealed class UIStyleFile : HashlessFile
{
public UIStyleFile(ContentPackage contentPackage, ContentPath path) : base(contentPackage, path) { }
public void LoadFromXElement(ContentXElement parentElement, bool overriding)
{
Identifier elemName = parentElement.NameAsIdentifier();
Identifier elemNameWithFontSuffix = elemName.AppendIfMissing("Font");
if (parentElement.IsOverride())
{
foreach (var element in parentElement.Elements())
{
LoadFromXElement(element, true);
}
}
else if (GUIStyle.Fonts.ContainsKey(elemNameWithFontSuffix))
{
GUIFontPrefab prefab = new GUIFontPrefab(parentElement, this);
GUIStyle.Fonts[elemNameWithFontSuffix].Prefabs.Add(prefab, overriding);
}
else if (GUIStyle.Sprites.ContainsKey(elemName))
{
GUISpritePrefab prefab = new GUISpritePrefab(parentElement, this);
GUIStyle.Sprites[elemName].Prefabs.Add(prefab, overriding);
}
else if (GUIStyle.SpriteSheets.ContainsKey(elemName))
{
GUISpriteSheetPrefab prefab = new GUISpriteSheetPrefab(parentElement, this);
GUIStyle.SpriteSheets[elemName].Prefabs.Add(prefab, overriding);
}
else if (GUIStyle.Colors.ContainsKey(elemName))
{
GUIColorPrefab prefab = new GUIColorPrefab(parentElement, this);
GUIStyle.Colors[elemName].Prefabs.Add(prefab, overriding);
}
else if (elemName == "cursor")
{
GUICursorPrefab prefab = new GUICursorPrefab(parentElement, this);
GUIStyle.CursorSprite.Prefabs.Add(prefab, overriding);
}
else if (elemName == "style")
{
foreach (var element in parentElement.Elements())
{
LoadFromXElement(element, overriding);
}
}
else
{
GUIComponentStyle prefab = new GUIComponentStyle(parentElement, this);
GUIStyle.ComponentStyles.Add(prefab, overriding);
}
}
public override sealed void LoadFile()
{
XDocument doc = XMLExtensions.TryLoadXml(Path);
if (doc == null) { return; }
var rootElement = doc.Root.FromPackage(ContentPackage);
LoadFromXElement(rootElement, false);
}
public override sealed void UnloadFile()
{
GUIStyle.ComponentStyles.RemoveByFile(this);
GUIStyle.CursorSprite.Prefabs.RemoveByFile(this);
GUIStyle.Fonts.Values.ForEach(p => p.Prefabs.RemoveByFile(this));
GUIStyle.Sprites.Values.ForEach(p => p.Prefabs.RemoveByFile(this));
GUIStyle.SpriteSheets.Values.ForEach(p => p.Prefabs.RemoveByFile(this));
GUIStyle.Colors.Values.ForEach(p => p.Prefabs.RemoveByFile(this));
}
public override sealed void Sort()
{
GUIStyle.ComponentStyles.SortAll();
GUIStyle.CursorSprite.Prefabs.Sort();
GUIStyle.Fonts.Values.ForEach(p => p.Prefabs.Sort());
GUIStyle.Sprites.Values.ForEach(p => p.Prefabs.Sort());
GUIStyle.SpriteSheets.Values.ForEach(p => p.Prefabs.Sort());
GUIStyle.Colors.Values.ForEach(p => p.Prefabs.Sort());
}
}
#else
public sealed class UIStyleFile : OtherFile
{
public UIStyleFile(ContentPackage contentPackage, ContentPath path) : base(contentPackage, path) { }
}
#endif
}