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;