Files
FlaxEngine/Source/Engine/UI/GUI/Panels/HorizontalPanel.cs
2024-10-22 22:34:57 +02:00

104 lines
3.5 KiB
C#

// Copyright (c) 2012-2024 Wojciech Figat. All rights reserved.
namespace FlaxEngine.GUI
{
/// <summary>
/// This panel arranges child controls horizontally.
/// </summary>
/// <seealso cref="FlaxEngine.GUI.PanelWithMargins" />
[ActorToolbox("GUI")]
public class HorizontalPanel : PanelWithMargins
{
/// <summary>
/// Initializes a new instance of the <see cref="HorizontalPanel"/> class.
/// </summary>
public HorizontalPanel()
{
}
/// <inheritdoc />
protected override void PerformLayoutBeforeChildren()
{
base.PerformLayoutBeforeChildren();
// Pre-set height of all controls
if (!ControlChildSize)
return;
float h = Height - _margin.Height;
for (int i = 0; i < _children.Count; i++)
{
Control c = _children[i];
if (c.Visible && Mathf.IsZero(c.AnchorMin.Y) && Mathf.IsZero(c.AnchorMax.Y))
{
c.Height = h;
}
}
}
/// <inheritdoc />
protected override void PerformLayoutAfterChildren()
{
// Sort controls horizontally
float left = _margin.Left;
float right = _margin.Right;
float h = Height - _margin.Height;
float maxHeight = h;
bool hasAnyLeft = false, hasAnyRight = false;
for (int i = 0; i < _children.Count; i++)
{
Control c = _children[i];
if (c.Visible)
{
var w = c.Width;
var ch = ControlChildSize ? h : c.Height;
if (Mathf.IsZero(c.AnchorMin.X) && Mathf.IsZero(c.AnchorMax.X))
{
c.Bounds = new Rectangle(left + _offset.X, _margin.Top + _offset.Y, w, ch);
left = c.Right + _spacing;
hasAnyLeft = true;
}
else if (Mathf.IsOne(c.AnchorMin.X) && Mathf.IsOne(c.AnchorMax.X))
{
right += w + _spacing;
c.Bounds = new Rectangle(Width - right + _offset.X, _margin.Top + _offset.Y, w, ch);
hasAnyRight = true;
}
maxHeight = Mathf.Max(maxHeight, ch);
}
}
if (hasAnyLeft)
left -= _spacing;
if (hasAnyRight)
right -= _spacing;
// Update size
if (_autoSize)
{
var size = Size;
size.X = left + right;
if (!ControlChildSize)
size.Y = maxHeight;
Size = size;
}
else if (_alignment != TextAlignment.Near && hasAnyLeft)
{
// Apply layout alignment
var offset = Width - left - _margin.Right;
if (_alignment == TextAlignment.Center)
offset *= 0.5f;
for (int i = 0; i < _children.Count; i++)
{
Control c = _children[i];
if (c.Visible)
{
if (Mathf.IsZero(c.AnchorMin.X) && Mathf.IsZero(c.AnchorMax.X))
{
c.X += offset;
}
}
}
}
}
}
}