2018-11-30 02:41:06 +00:00
using System ;
using System.Collections.Generic ;
using Microsoft.Xna.Framework ;
using Microsoft.Xna.Framework.Graphics ;
using Microsoft.Xna.Framework.Input ;
2018-12-04 13:45:09 +00:00
using RecrownedAthenaeum.Camera ;
2018-11-30 02:41:06 +00:00
2018-12-04 13:45:09 +00:00
namespace RecrownedAthenaeum.UI.Modular
2018-11-30 02:41:06 +00:00
{
2019-01-14 06:34:35 +00:00
/// <summary>
/// Contains a group of modules and has its own relative coordinate system.
/// </summary>
2018-11-30 02:41:06 +00:00
public class UIModuleGroup : UIModule
{
List < UIModule > modules = new List < UIModule > ( ) ;
Rectangle scissorBounds ;
2019-01-30 13:46:58 +00:00
RasterizerState scissorRasterizer ;
2019-01-15 02:00:11 +00:00
/// <summary>
/// Camera used by the module for cropping.
/// </summary>
2019-01-30 13:46:58 +00:00
public Camera2D camera ;
2018-11-30 02:41:06 +00:00
2019-01-15 02:00:11 +00:00
/// <summary>
/// Creates a module group.
/// </summary>
/// <param name="crop">Whether or not to crop out of bounds. Default is false.</param>
2019-01-30 13:46:58 +00:00
/// <param name="camera">What camera to use for cropping. Default is null and will use <see cref="Configuration"/>'s camera if crop is enabled.</param>
2018-11-30 02:41:06 +00:00
public UIModuleGroup ( bool crop = false , Camera2D camera = null )
{
2019-01-30 13:46:58 +00:00
if ( crop & & camera = = null ) camera = Configuration . Camera2D ;
this . camera = camera ;
2018-11-30 02:41:06 +00:00
if ( crop )
{
2019-01-30 13:46:58 +00:00
scissorRasterizer = new RasterizerState ( ) ;
2018-11-30 02:41:06 +00:00
scissorRasterizer . ScissorTestEnable = true ;
scissorBounds = new Rectangle ( ) ;
}
}
2019-01-14 06:34:35 +00:00
/// <summary>
/// Draws this group of modules.
/// </summary>
/// <param name="batch">Batch used to draw the group.</param>
2018-11-30 02:41:06 +00:00
public override void Draw ( SpriteBatch batch )
{
if ( scissorBounds ! = null )
{
batch . End ( ) ;
2019-01-30 13:46:58 +00:00
batch . Begin ( SpriteSortMode . Deferred , null , null , null , scissorRasterizer , null , camera ? . Matrix ) ;
2018-11-30 02:41:06 +00:00
scissorBounds . Width = bounds . Width ;
scissorBounds . Height = bounds . Height ;
scissorBounds . X = bounds . X ;
scissorBounds . Y = bounds . Y ;
Rectangle scissor = scissorBounds ;
scissorBounds = batch . GraphicsDevice . ScissorRectangle ;
batch . GraphicsDevice . ScissorRectangle = scissor ;
}
foreach ( UIModule module in modules )
{
int offsetX = module . bounds . X ;
int offsetY = module . bounds . Y ;
module . bounds . X = bounds . X + offsetX - ( int ) module . origin . X ;
module . bounds . Y = bounds . Y + offsetY - ( int ) module . origin . Y ;
module . Draw ( batch ) ;
module . bounds . X = offsetX ;
module . bounds . Y = offsetY ;
}
if ( scissorBounds ! = null )
{
batch . GraphicsDevice . ScissorRectangle = scissorBounds ;
batch . End ( ) ;
2019-01-30 13:46:58 +00:00
batch . Begin ( SpriteSortMode . Deferred , null , null , null , null , null , camera ? . Matrix ) ;
2018-11-30 02:41:06 +00:00
}
}
2019-01-14 06:34:35 +00:00
/// <summary>
/// Updates the group of modules.
/// </summary>
/// <param name="gameTime">Game time used.</param>
2018-11-30 02:41:06 +00:00
public override void Update ( GameTime gameTime )
{
foreach ( UIModule module in modules )
{
module . Update ( gameTime ) ;
}
}
2019-01-14 05:23:03 +00:00
/// <summary>
/// Adds module(s) to this group.
/// </summary>
/// <param name="addModules">The module(s) to add.</param>
2018-11-30 02:41:06 +00:00
public void AddModule ( params UIModule [ ] addModules )
{
foreach ( UIModule module in addModules )
{
if ( modules . Contains ( module ) )
{
throw new InvalidOperationException ( module . ToString ( ) + " already exists in " + this . ToString ( ) ) ;
}
module . Parent = this ;
modules . Add ( module ) ;
}
}
2019-01-14 05:23:03 +00:00
/// <summary>
/// Removes given module from group.
/// </summary>
/// <param name="module">module to remove.</param>
2018-11-30 02:41:06 +00:00
public void RemoveModule ( UIModule module )
{
module . Parent = null ;
modules . Remove ( module ) ;
}
2019-01-14 06:34:35 +00:00
/// <summary>
/// Updates the keyboard state of the modules in this group.
/// </summary>
/// <param name="state">The new state.</param>
/// <returns>Whether or not to continue updating the other listeners.</returns>
2018-11-30 02:41:06 +00:00
public override bool KeyboardStateChanged ( KeyboardState state )
{
foreach ( UIModule module in modules )
{
module . KeyboardStateChanged ( state ) ;
}
return base . KeyboardStateChanged ( state ) ;
}
2019-01-14 06:34:35 +00:00
/// <summary>
/// Updates the moues state of the modules in this group.
/// </summary>
/// <param name="state">The new state.</param>
/// <returns>Whether or not to continue updating other listeners.</returns>
2018-11-30 02:41:06 +00:00
public override bool MouseStateChanged ( MouseState state )
{
foreach ( UIModule module in modules )
{
module . MouseStateChanged ( state ) ;
}
return base . MouseStateChanged ( state ) ;
}
}
}