diff options
author | Thomas Leyh <leyh.thomas@web.de> | 2016-07-24 08:14:18 +0200 |
---|---|---|
committer | Thomas Leyh <leyh.thomas@web.de> | 2016-07-24 08:14:18 +0200 |
commit | ced3d03bdb3ce866d832e03fb212865140905a9a (patch) | |
tree | 2a16c2063a46d3c354ce1585029dda3124f6ad93 /V3/Widgets/FormMenu.cs | |
parent | 0394dccaf06e1009e591a6ff4d645895574724c1 (diff) | |
download | V3-ced3d03bdb3ce866d832e03fb212865140905a9a.tar.gz V3-ced3d03bdb3ce866d832e03fb212865140905a9a.tar.bz2 |
Diffstat (limited to 'V3/Widgets/FormMenu.cs')
-rw-r--r-- | V3/Widgets/FormMenu.cs | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/V3/Widgets/FormMenu.cs b/V3/Widgets/FormMenu.cs new file mode 100644 index 0000000..746f8f4 --- /dev/null +++ b/V3/Widgets/FormMenu.cs @@ -0,0 +1,75 @@ +using Microsoft.Xna.Framework; +using System; +using System.Linq; + +namespace V3.Widgets +{ + /// <summary> + /// A menu that arranges widgets in two columns. All widgets in on column + /// are made the same size (the maximum widget size). + /// </summary> + // ReSharper disable once ClassNeverInstantiated.Global + public sealed class FormMenu : AbstractMenu + { + private const float PaddingInnerX = 10; + private const float PaddingOuterX = 10; + private const float PaddingInnerY = 10; + private const float PaddingOuterY = 10; + + public FormMenu(GraphicsDeviceManager graphicsDeviceManager) : base(graphicsDeviceManager) + { + } + + protected override Vector2 GetTotalSize() + { + var size = new Vector2(2 * PaddingOuterX, 2 * PaddingOuterY); + var maxXLeft = 0f; + var maxXRight = 0f; + for (var i = 0; i < Widgets.Count; i += 2) + { + maxXLeft = Math.Max(maxXLeft, Widgets[i].Size.X); + if (i + 1 < Widgets.Count) + { + maxXRight = Math.Max(maxXRight, Widgets[i + 1].Size.X); + size.Y += Math.Max(Widgets[i].Size.Y, Widgets[i + 1].Size.Y); + } + else + { + size.Y += Widgets[i].Size.Y; + } + if (i + 2 < Widgets.Count) + size.Y += PaddingInnerY; + } + size.X += maxXLeft + maxXRight + PaddingInnerX; + return size; + } + + protected override void UpdateWidgetRelativePositions() + { + var y = PaddingOuterY; + for (var i = 0; i < Widgets.Count; i += 2) + { + var x = PaddingOuterX; + Widgets[i].Position = new Vector2(x, y); + if (i + 1 < Widgets.Count) + { + x += Widgets[i].Size.X; + x += PaddingInnerX; + Widgets[i + 1].Position = new Vector2(x, y); + y += Math.Max(Widgets[i].Size.Y, Widgets[i + 1].Size.Y); + } + else + { + y += Widgets[i].Size.Y; + } + y += PaddingInnerY; + } + } + + protected override void UpdateWidgetSizes() + { + MakeWidgetsSameSize(Widgets.Where((w, i) => i % 2 == 0)); + MakeWidgetsSameSize(Widgets.Where((w, i) => i % 2 == 1)); + } + } +} |