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 { /// /// An abstract menu that handles the updating and drawing of widgtes. /// public abstract class AbstractMenu : IMenu { public List Widgets { get; } = new List(); 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()) 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()) clickable.IsClicked = false; } private void UpdateMouseSelection() { var position = Mouse.GetState().Position; foreach (var selectable in Widgets.OfType()) selectable.IsSelected = selectable.CheckSelected(position); } protected static void MakeWidgetsSameSize(IEnumerable widgets) { var xMax = 0f; var yMax = 0f; var widgetsCopy = widgets as IList ?? 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; } } }