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;
}
}
}