1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
using System;
using Microsoft.Xna.Framework;
using MonoGame.Extended.Gui.Controls;
namespace MonoGame.Extended.Gui
{
public enum HorizontalAlignment { Left, Right, Centre, Stretch }
public enum VerticalAlignment { Top, Bottom, Centre, Stretch }
public static class LayoutHelper
{
public static void PlaceControl(IGuiContext context, Control control, float x, float y, float width, float height)
{
var rectangle = new Rectangle((int)x, (int)y, (int)width, (int)height);
var desiredSize = control.CalculateActualSize(context);
var alignedRectangle = AlignRectangle(control.HorizontalAlignment, control.VerticalAlignment, desiredSize, rectangle);
control.Position = new Point(control.Margin.Left + alignedRectangle.X, control.Margin.Top + alignedRectangle.Y);
control.ActualSize = (Size)alignedRectangle.Size - control.Margin.Size;
control.InvalidateMeasure();
}
public static Rectangle AlignRectangle(HorizontalAlignment horizontalAlignment, VerticalAlignment verticalAlignment, Size size, Rectangle targetRectangle)
{
var x = GetHorizontalPosition(horizontalAlignment, size, targetRectangle);
var y = GetVerticalPosition(verticalAlignment, size, targetRectangle);
var width = horizontalAlignment == HorizontalAlignment.Stretch ? targetRectangle.Width : size.Width;
var height = verticalAlignment == VerticalAlignment.Stretch ? targetRectangle.Height : size.Height;
return new Rectangle(x, y, width, height);
}
public static int GetHorizontalPosition(HorizontalAlignment horizontalAlignment, Size size, Rectangle targetRectangle)
{
switch (horizontalAlignment)
{
case HorizontalAlignment.Stretch:
case HorizontalAlignment.Left:
return targetRectangle.X;
case HorizontalAlignment.Right:
return targetRectangle.Right - size.Width;
case HorizontalAlignment.Centre:
return targetRectangle.X + targetRectangle.Width / 2 - size.Width / 2;
default:
throw new ArgumentOutOfRangeException(nameof(horizontalAlignment), horizontalAlignment, $"{horizontalAlignment} is not supported");
}
}
public static int GetVerticalPosition(VerticalAlignment verticalAlignment, Size size, Rectangle targetRectangle)
{
switch (verticalAlignment)
{
case VerticalAlignment.Stretch:
case VerticalAlignment.Top:
return targetRectangle.Y;
case VerticalAlignment.Bottom:
return targetRectangle.Bottom - size.Height;
case VerticalAlignment.Centre:
return targetRectangle.Y + targetRectangle.Height / 2 - size.Height / 2;
default:
throw new ArgumentOutOfRangeException(nameof(verticalAlignment), verticalAlignment, $"{verticalAlignment} is not supported");
}
}
}
}
|