Files
FlaxEngine/Source/Editor/Viewport/Widgets/ViewportWidgetsContainer.cs
2023-01-10 15:29:37 +01:00

141 lines
4.0 KiB
C#

// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
using FlaxEngine;
using FlaxEngine.GUI;
namespace FlaxEditor.Viewport.Widgets
{
/// <summary>
/// The viewport widget location.
/// </summary>
[HideInEditor]
public enum ViewportWidgetLocation
{
/// <summary>
/// The upper left corner of the parent container.
/// </summary>
UpperLeft,
/// <summary>
/// The upper right corner of the parent container.
/// </summary>
UpperRight,
}
/// <summary>
/// Viewport Widgets Container control
/// </summary>
/// <seealso cref="FlaxEngine.GUI.ContainerControl" />
[HideInEditor]
public class ViewportWidgetsContainer : ContainerControl
{
/// <summary>
/// The widgets margin.
/// </summary>
public const float WidgetsMargin = 4;
/// <summary>
/// The widgets height.
/// </summary>
public const float WidgetsHeight = 18;
/// <summary>
/// The widgets icon size.
/// </summary>
public const float WidgetsIconSize = 16;
/// <summary>
/// Gets the widget location.
/// </summary>
public ViewportWidgetLocation WidgetLocation { get; }
/// <summary>
/// Initializes a new instance of the <see cref="ViewportWidgetsContainer"/> class.
/// </summary>
/// <param name="location">The location.</param>
public ViewportWidgetsContainer(ViewportWidgetLocation location)
: base(0, WidgetsMargin, 64, WidgetsHeight + 2)
{
AutoFocus = false;
WidgetLocation = location;
}
/// <inheritdoc />
public override void Draw()
{
// Cache data
var style = Style.Current;
var clientRect = new Rectangle(Float2.Zero, Size);
// Draw background
Render2D.FillRectangle(clientRect, style.LightBackground * (IsMouseOver ? 0.3f : 0.2f));
base.Draw();
// Draw frame
Render2D.DrawRectangle(clientRect, style.BackgroundSelected * (IsMouseOver ? 1.0f : 0.6f));
}
/// <inheritdoc />
public override void OnChildResized(Control control)
{
base.OnChildResized(control);
PerformLayout();
}
/// <inheritdoc />
protected override void PerformLayoutBeforeChildren()
{
base.PerformLayoutBeforeChildren();
float x = 1;
for (int i = 0; i < _children.Count; i++)
{
var c = _children[i];
var w = c.Width;
c.Bounds = new Rectangle(x, 1, w, Height - 2);
x += w;
}
Width = x + 1;
}
/// <summary>
/// Arranges the widgets of the control.
/// </summary>
/// <param name="control">The control.</param>
public static void ArrangeWidgets(ContainerControl control)
{
// Arrange viewport widgets
const float margin = ViewportWidgetsContainer.WidgetsMargin;
float left = margin;
float right = control.Width - margin;
for (int i = 0; i < control.ChildrenCount; i++)
{
if (control.Children[i] is ViewportWidgetsContainer widget && widget.Visible)
{
float x;
switch (widget.WidgetLocation)
{
case ViewportWidgetLocation.UpperLeft:
x = left;
left += widget.Width + margin;
break;
case ViewportWidgetLocation.UpperRight:
x = right - widget.Width;
right = x - margin;
break;
default:
x = 0;
break;
}
widget.Location = new Float2(x, margin);
}
}
}
}
}