using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using RecrownedAthenaeum.Input; using RecrownedAthenaeum.Render; using System; namespace RecrownedAthenaeum.UI.Modular { /// /// Module for UI layout. /// public class UIModule : IInputListener { private RectangleRenderer rectangleRenderer; /// /// Draws rectangle using the bounds of this module. /// public bool Debugging { set { if (value) { if (rectangleRenderer == null) rectangleRenderer = new RectangleRenderer(); } else { rectangleRenderer?.Dispose(); rectangleRenderer = null; } } get { return rectangleRenderer != null; } } /// /// The bounds before factoring in the origin. /// public Rectangle bounds; /// /// Bounds of this module (after factoring in the origin). /// public Rectangle ActualBounds { get { return new Rectangle((int)(bounds.X - origin.X), (int)(bounds.Y - origin.Y), bounds.Width, bounds.Height); } } /// /// Origin of this module. /// public Vector2 origin; /// /// The parent of this module. May be null. /// public UIModuleGroup Parent; /// /// Name of this module. For organizational/referencial purposes mostly. /// public string Name; /// /// The color tint of this module. /// public Color color = Color.White; /// /// Called every frame to update this module. Calculations and movement should go here. /// /// Game time information. public virtual void Update(GameTime gameTime) { } /// /// Called every frame to draw this module. Anything that needs to be drawn should go here. /// /// Batch used to draw. public virtual void Draw(SpriteBatch batch) { if (Debugging) { rectangleRenderer.Begin(); rectangleRenderer.Draw(ActualBounds.X, ActualBounds.Y, ActualBounds.Width, ActualBounds.Height, Color.Red); rectangleRenderer.End(); } } /// /// Converts the given rectangle to the coordinates of the parent. /// /// Rectangle to convert. /// public Rectangle ConvertToParentCoordinates(Rectangle rectangle) { if (Parent != null) { Rectangle parentHitbox = Parent.ConvertToParentCoordinates(rectangle); int tX = rectangle.X + parentHitbox.X; int tY = rectangle.Y + parentHitbox.Y; return new Rectangle(tX, tY, rectangle.Width, rectangle.Height); } else { return rectangle; } } /// /// Removes this module from the parent. /// public void RemoveFromParent() { if (Parent == null) throw new InvalidOperationException("Parent is null."); Parent.RemoveModule(this); } /// /// Called whenever the keyboard state is changed. /// /// The current keyboard state. /// Returning whether or not to continue to call the next listener. public virtual bool KeyboardStateChanged(KeyboardState state) { return true; } /// /// Called whenever the state of the mouse changes. This includes movement. /// /// The current state of the mouse. /// Returning whether or not to continue to call the next listener. public virtual bool MouseStateChanged(MouseState state) { return true; } /// /// Sets the origin to be the center of the bounds. /// public void CenterOrigin() { origin.X = bounds.Width / 2f; origin.Y = bounds.Height / 2f; } } }