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/AbstractMenu.cs | |
parent | 0394dccaf06e1009e591a6ff4d645895574724c1 (diff) | |
download | V3-release.tar.gz V3-release.tar.bz2 |
Diffstat (limited to 'V3/Widgets/AbstractMenu.cs')
-rw-r--r-- | V3/Widgets/AbstractMenu.cs | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/V3/Widgets/AbstractMenu.cs b/V3/Widgets/AbstractMenu.cs new file mode 100644 index 0000000..f179b5e --- /dev/null +++ b/V3/Widgets/AbstractMenu.cs @@ -0,0 +1,96 @@ +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework.Input; +using System.Collections.Generic; +using System.Linq; +using V3.Input; + +namespace V3.Widgets +{ + /// <summary> + /// An abstract menu that handles the updating and drawing of widgtes. + /// </summary> + public abstract class AbstractMenu : IMenu + { + public List<IWidget> Widgets { get; } = new List<IWidget>(); + public Vector2 Size { get; private set; } + public Vector2 Position { get; private set; } + + private readonly GraphicsDeviceManager mGraphicsDeviceManager; + + protected AbstractMenu(GraphicsDeviceManager graphicsDeviceManager) + { + mGraphicsDeviceManager = graphicsDeviceManager; + } + + public void HandleMouseEvent(IMouseEvent mouseEvent) + { + foreach (var clickable in Widgets.OfType<IClickable>()) + clickable.HandleMouseEvent(mouseEvent); + } + + public void Draw(SpriteBatch spriteBatch) + { + UpdateWidgetRelativePositions(); + UpdateWidgetAbsolutePositions(); + spriteBatch.Begin(); + Widgets.ForEach(w => w.Draw(spriteBatch)); + spriteBatch.End(); + } + + public void Update() + { + ResetClicked(); + UpdateMouseSelection(); + UpdateWidgetSizes(); + } + + protected abstract void UpdateWidgetSizes(); + + protected abstract void UpdateWidgetRelativePositions(); + + protected abstract Vector2 GetTotalSize(); + + private void UpdateWidgetAbsolutePositions() + { + var viewport = mGraphicsDeviceManager.GraphicsDevice.Viewport; + Size = GetTotalSize(); + var viewportSize = new Vector2(viewport.Bounds.Width, viewport.Bounds.Height); + Position = (viewportSize - Size) / 2; + Widgets.ForEach(w => w.Position = w.Position + Position); + } + + private void ResetClicked() + { + foreach (var clickable in Widgets.OfType<IClickable>()) + clickable.IsClicked = false; + } + + private void UpdateMouseSelection() + { + var position = Mouse.GetState().Position; + foreach (var selectable in Widgets.OfType<ISelectable>()) + selectable.IsSelected = selectable.CheckSelected(position); + } + + protected static void MakeWidgetsSameSize(IEnumerable<IWidget> widgets) + { + var xMax = 0f; + var yMax = 0f; + + var widgetsCopy = widgets as IList<IWidget> ?? widgets.ToList(); + foreach (var widget in widgetsCopy) + { + var size = widget.GetMinimumSize(); + if (size.X > xMax) + xMax = size.X; + if (size.Y > yMax) + yMax = size.Y; + } + + var sizeMax = new Vector2(xMax, yMax); + foreach (var widget in widgetsCopy) + widget.Size = sizeMax; + } + } +} |