using Microsoft.Xna.Framework; using System; using System.Collections.Generic; using System.Xml.Linq; namespace Barotrauma { public class UISprite { public Sprite Sprite { get; private set; } public bool Tile { get; private set; } public bool Slice { get; set; } public Rectangle[] Slices { get; set; } public bool MaintainAspectRatio { get; private set; } public UISprite(Sprite sprite, bool tile, bool maintainAspectRatio) { Sprite = sprite; Tile = tile; MaintainAspectRatio = maintainAspectRatio; } } public class GUIComponentStyle { public readonly Vector4 Padding; public readonly Color Color; public readonly Color textColor; public readonly Color HoverColor; public readonly Color SelectedColor; public readonly Color OutlineColor; public readonly Dictionary> Sprites; public Dictionary ChildStyles; public GUIComponentStyle(XElement element) { Sprites = new Dictionary>(); foreach (GUIComponent.ComponentState state in Enum.GetValues(typeof(GUIComponent.ComponentState))) { Sprites[state] = new List(); } ChildStyles = new Dictionary(); Padding = ToolBox.GetAttributeVector4(element, "padding", Vector4.Zero); Vector4 colorVector = ToolBox.GetAttributeVector4(element, "color", new Vector4(0.0f, 0.0f, 0.0f, 0.0f)); Color = new Color(colorVector.X, colorVector.Y, colorVector.Z, colorVector.W); colorVector = ToolBox.GetAttributeVector4(element, "textcolor", new Vector4(0.0f, 0.0f, 0.0f, 1.0f)); textColor = new Color(colorVector.X, colorVector.Y, colorVector.Z, colorVector.W); colorVector = ToolBox.GetAttributeVector4(element, "hovercolor", new Vector4(0.0f, 0.0f, 0.0f, 0.0f)); HoverColor = new Color(colorVector.X, colorVector.Y, colorVector.Z, colorVector.W); colorVector = ToolBox.GetAttributeVector4(element, "selectedcolor", new Vector4(0.0f, 0.0f, 0.0f, 0.0f)); SelectedColor = new Color(colorVector.X, colorVector.Y, colorVector.Z, colorVector.W); colorVector = ToolBox.GetAttributeVector4(element, "outlinecolor", new Vector4(0.0f, 0.0f, 0.0f, 0.0f)); OutlineColor = new Color(colorVector.X, colorVector.Y, colorVector.Z, colorVector.W); foreach (XElement subElement in element.Elements()) { switch (subElement.Name.ToString().ToLowerInvariant()) { case "sprite": Sprite sprite = new Sprite(subElement); bool maintainAspect = ToolBox.GetAttributeBool(subElement, "maintainaspectratio",false); bool tile = ToolBox.GetAttributeBool(subElement, "tile", true); string stateStr = ToolBox.GetAttributeString(subElement, "state", "None"); GUIComponent.ComponentState spriteState = GUIComponent.ComponentState.None; Enum.TryParse(stateStr, out spriteState); UISprite newSprite = new UISprite(sprite, tile, maintainAspect); Vector4 sliceVec = ToolBox.GetAttributeVector4(subElement, "slice", Vector4.Zero); if (sliceVec != Vector4.Zero) { Rectangle slice = new Rectangle((int)sliceVec.X, (int)sliceVec.Y, (int)(sliceVec.Z - sliceVec.X), (int)(sliceVec.W - sliceVec.Y)); newSprite.Slice = true; newSprite.Slices = new Rectangle[9]; //top-left newSprite.Slices[0] = new Rectangle(newSprite.Sprite.SourceRect.Location, slice.Location - newSprite.Sprite.SourceRect.Location); //top-mid newSprite.Slices[1] = new Rectangle(slice.Location.X, newSprite.Slices[0].Y, slice.Width, newSprite.Slices[0].Height); //top-right newSprite.Slices[2] = new Rectangle(slice.Right, newSprite.Slices[0].Y, newSprite.Sprite.SourceRect.Right - slice.Right, newSprite.Slices[0].Height); //mid-left newSprite.Slices[3] = new Rectangle(newSprite.Slices[0].X, slice.Y, newSprite.Slices[0].Width, slice.Height); //center newSprite.Slices[4] = slice; //mid-right newSprite.Slices[5] = new Rectangle(newSprite.Slices[2].X, slice.Y, newSprite.Slices[2].Width, slice.Height); //bottom-left newSprite.Slices[6] = new Rectangle(newSprite.Slices[0].X, slice.Bottom, newSprite.Slices[0].Width, newSprite.Sprite.SourceRect.Bottom - slice.Bottom); //bottom-mid newSprite.Slices[7] = new Rectangle(newSprite.Slices[1].X, slice.Bottom, newSprite.Slices[1].Width, newSprite.Sprite.SourceRect.Bottom - slice.Bottom); //bottom-right newSprite.Slices[8] = new Rectangle(newSprite.Slices[2].X, slice.Bottom, newSprite.Slices[2].Width, newSprite.Sprite.SourceRect.Bottom - slice.Bottom); } Sprites[spriteState].Add(newSprite); break; default: ChildStyles.Add(subElement.Name.ToString().ToLowerInvariant(), new GUIComponentStyle(subElement)); break; } } } } }