From c6e1bf7f41abb5e2cfaa14c7dec7e78d27f4893b Mon Sep 17 00:00:00 2001 From: dnesov Date: Sun, 29 Jun 2025 23:27:16 +0200 Subject: [PATCH] Add parsing for Size. --- TestGame/Resources/default.style.toml | 19 ++++++++++ TestGame/TestGame.cs | 8 +++-- .../Resources/DataReaders/IDataReader.cs | 8 +++++ .../Resources/DataReaders/TomlDataReader.cs | 36 ++++++++++++++++++- Voile/Source/UI/Style.cs | 8 ++--- Voile/Source/UI/UIElement.cs | 25 +++++++------ Voile/Source/UI/Widgets/Button.cs | 2 +- Voile/Source/VFS/FileSystemMountPoint.cs | 2 +- 8 files changed, 89 insertions(+), 19 deletions(-) diff --git a/TestGame/Resources/default.style.toml b/TestGame/Resources/default.style.toml index dc3fdc9..18d0bb7 100644 --- a/TestGame/Resources/default.style.toml +++ b/TestGame/Resources/default.style.toml @@ -1,6 +1,7 @@ [Button] BackgroundColor = "#0f62fe" TextColor = "#ffffff" +# Padding = [0.0, 12.0, 8.0, 0.0] Padding = 16.0 # Creates an empty rule for Button.Normal. @@ -40,6 +41,24 @@ BackgroundColor = "#0353e9" BackgroundColor = "#002d9c" BorderColor = [0, 0, 0, 0] +[Button.Link] +BackgroundColor = [0, 0, 0, 0] +TextColor = "#0f62fe" +Padding = 0.0 + +[Button.Link.Normal] + +[Button.Link.Hovered] +BorderColor = "#0043ce" +TextColor = "#0043ce" +BorderSize = [0, 0, 0, 1] + +[Button.Link.Pressed] +TextColor = "#161616" +BorderSize = [0, 0, 0, 1] +BorderColor = "#161616" + + # Default background color for all Container derived classes. [Container] BackgroundColor = "#e0e0e0" diff --git a/TestGame/TestGame.cs b/TestGame/TestGame.cs index a385b17..70f0c36 100644 --- a/TestGame/TestGame.cs +++ b/TestGame/TestGame.cs @@ -22,6 +22,8 @@ public class TestGame : Game _uiSystem = new UISystem(Input); // _uiSystem.RenderDebugRects = true; + ResourceManager.EnableFileWatching(); + _particleSystem = new ParticleSystem(); AddSystemToUpdate(_uiSystem); @@ -80,8 +82,9 @@ public class TestGame : Game var outlineButton = new Button("Outline button", _defaultFontSet); outlineButton.StyleVariant = "Outline"; - _buttonContainer.AddChild(addButton); - _buttonContainer.AddChild(removeButton); + var linkButton = new Button("Link button", _defaultFontSet); + linkButton.StyleVariant = "Link"; + var c = new HorizontalContainer() { @@ -93,6 +96,7 @@ public class TestGame : Game c.AddChild(addButton); c.AddChild(removeButton); c.AddChild(outlineButton); + c.AddChild(linkButton); var vc = new VerticalContainer(0.0f); vc.AddChild(c); diff --git a/Voile/Source/Resources/DataReaders/IDataReader.cs b/Voile/Source/Resources/DataReaders/IDataReader.cs index 8b80035..d60748e 100644 --- a/Voile/Source/Resources/DataReaders/IDataReader.cs +++ b/Voile/Source/Resources/DataReaders/IDataReader.cs @@ -80,6 +80,14 @@ namespace Voile.Resources.DataReaders /// Vector2 GetVector2(string key, Vector2 defaultValue); + /// + /// Get a from this data getter. + /// + /// Key of the value. + /// Default value in case this getter fails to get data. + /// + Size GetSize(string key, Size defaultValue); + T[] GetArray(string key, T[] defaultValue); } } \ No newline at end of file diff --git a/Voile/Source/Resources/DataReaders/TomlDataReader.cs b/Voile/Source/Resources/DataReaders/TomlDataReader.cs index 7470a1c..8b1089a 100644 --- a/Voile/Source/Resources/DataReaders/TomlDataReader.cs +++ b/Voile/Source/Resources/DataReaders/TomlDataReader.cs @@ -143,7 +143,7 @@ public class TomlDataReader : IStreamDataReader, IDataValidator, IStreamKeyValue } else { - throw new ArgumentException("Color can only be represented as an array of integers in the range of 0-255, array of floats (0-1), hexadecimal, or hex string."); + return defaultValue; } } @@ -156,6 +156,39 @@ public class TomlDataReader : IStreamDataReader, IDataValidator, IStreamKeyValue return new Vector2(arr[0], arr[1]); } + public Size GetSize(string key, Size defaultValue) + { + if (!TryGetNode(key, out var node)) + return defaultValue; + + if (node.IsInteger) + { + return new Size(node.AsInteger); + } + else if (node.IsFloat) + { + return new Size(node.AsFloat); + } + else if (node.IsArray) + { + var sizeArray = node.AsArray; + + var lNode = sizeArray[0]; + var rNode = sizeArray[1]; + var tNode = sizeArray[2]; + var bNode = sizeArray[3]; + + var l = lNode.IsInteger ? lNode.AsInteger : 0; + var t = tNode.IsInteger ? tNode.AsInteger : 0; + var r = rNode.IsInteger ? rNode.AsInteger : 0; + var b = bNode.IsInteger ? bNode.AsInteger : 0; + + return new Size(l, r, t, b); + } + + return defaultValue; + } + public T[] GetArray(string key, T[] defaultValue) { throw new NotImplementedException("Generic array reading not implemented yet."); @@ -192,6 +225,7 @@ public class TomlDataReader : IStreamDataReader, IDataValidator, IStreamKeyValue return false; } + private TomlTable? _table; private bool _valid; diff --git a/Voile/Source/UI/Style.cs b/Voile/Source/UI/Style.cs index a84e450..466b837 100644 --- a/Voile/Source/UI/Style.cs +++ b/Voile/Source/UI/Style.cs @@ -14,9 +14,9 @@ public class Style public Style() { } - public Size Padding { get; set; } + public Size? Padding { get; set; } public Color? BackgroundColor { get; set; } - public Size BorderSize { get; set; } + public Size? BorderSize { get; set; } public Color? BorderColor { get; set; } public float CornerRadius { get; set; } public Color? TextColor { get; set; } @@ -67,10 +67,10 @@ public class StyleSheetLoader : ResourceLoader style.TextColor = reader.GetColor("TextColor", Color.Black); if (reader.HasKey("Padding")) - style.Padding = new Size(reader.GetFloat("Padding")); + style.Padding = reader.GetSize("Padding", Size.Zero); if (reader.HasKey("BorderSize")) - style.BorderSize = new Size(reader.GetFloat("BorderSize")); + style.BorderSize = reader.GetSize("BorderSize", Size.Zero); if (reader.HasKey("BorderColor")) style.BorderColor = reader.GetColor("BorderColor", Color.Transparent); diff --git a/Voile/Source/UI/UIElement.cs b/Voile/Source/UI/UIElement.cs index a2b6aae..30e973f 100644 --- a/Voile/Source/UI/UIElement.cs +++ b/Voile/Source/UI/UIElement.cs @@ -121,44 +121,49 @@ public abstract class UIElement : IElement, IRenderableElement, IResizeableEleme var borderColor = style.BorderColor ?? Color.Transparent; var borderSize = style.BorderSize; + var borderLeft = borderSize?.Left ?? 0; + var borderRight = borderSize?.Right ?? 0; + var borderTop = borderSize?.Top ?? 0; + var borderBottom = borderSize?.Bottom ?? 0; + renderer.SetTransform(GlobalPosition, Vector2.Zero); renderer.DrawRectangle(new Vector2(Size.Width, Size.Height), backgroundColor); - if (borderSize.Left > 0) + if (borderLeft > 0) { renderer.SetTransform(GlobalPosition, Vector2.Zero); renderer.DrawRectangle( - new Vector2(borderSize.Left, Size.Height), + new Vector2(borderLeft, Size.Height), borderColor ); } - if (borderSize.Top > 0) + if (borderTop > 0) { renderer.SetTransform(GlobalPosition, Vector2.Zero); renderer.DrawRectangle( - new Vector2(Size.Width, borderSize.Top), + new Vector2(Size.Width, borderTop), borderColor ); } - if (borderSize.Right > 0) + if (borderRight > 0) { - var rightX = GlobalPosition.X + Size.Width - borderSize.Right; + var rightX = GlobalPosition.X + Size.Width - borderRight; renderer.SetTransform(new Vector2(rightX, GlobalPosition.Y), Vector2.Zero); renderer.DrawRectangle( - new Vector2(borderSize.Right, Size.Height), + new Vector2(borderRight, Size.Height), borderColor ); } - if (borderSize.Bottom > 0) + if (borderBottom > 0) { - var bottomY = GlobalPosition.Y + Size.Height - borderSize.Bottom; + var bottomY = GlobalPosition.Y + Size.Height - borderBottom; renderer.SetTransform(new Vector2(GlobalPosition.X, bottomY), Vector2.Zero); renderer.DrawRectangle( - new Vector2(Size.Width, borderSize.Bottom), + new Vector2(Size.Width, borderBottom), borderColor ); } diff --git a/Voile/Source/UI/Widgets/Button.cs b/Voile/Source/UI/Widgets/Button.cs index d0f03a8..417bea3 100644 --- a/Voile/Source/UI/Widgets/Button.cs +++ b/Voile/Source/UI/Widgets/Button.cs @@ -88,7 +88,7 @@ public class Button : Widget MarkDirty(); } - _padding = style.Padding; + _padding = style.Padding ?? Voile.Size.Zero; var textColor = style.TextColor ?? Color.Black; // renderer.SetTransform(GlobalPosition, Vector2.Zero); diff --git a/Voile/Source/VFS/FileSystemMountPoint.cs b/Voile/Source/VFS/FileSystemMountPoint.cs index 0e39c91..0673ce1 100644 --- a/Voile/Source/VFS/FileSystemMountPoint.cs +++ b/Voile/Source/VFS/FileSystemMountPoint.cs @@ -14,7 +14,7 @@ public class FileSystemFile : VirtualFile public override Stream GetStream() { - return new FileStream(_fsPath, FileMode.Open, FileAccess.Read); + return new FileStream(_fsPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete); } private string _fsPath;