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 ;
2019-03-09 08:03:05 +00:00
using RecrownedAthenaeum.ScreenSystem ;
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-03-09 08:03:05 +00:00
BeginBatch beginBatch ;
2019-01-30 13:46:58 +00:00
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>
2019-03-09 08:03:05 +00:00
/// <param name="beginBatchFunction">The function to be called that begins the batch.</param>
public UIModuleGroup ( bool crop = false , Camera2D camera = null , BeginBatch beginBatchFunction = null )
2018-11-30 02:41:06 +00:00
{
2019-03-09 08:03:05 +00:00
if ( beginBatchFunction = = null ) beginBatchFunction = Configuration . BeginBatchFunction ;
2019-01-30 13:46:58 +00:00
if ( crop & & camera = = null ) camera = Configuration . Camera2D ;
2019-03-09 08:03:05 +00:00
this . beginBatch = beginBatchFunction ;
2019-01-30 13:46:58 +00:00
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-03-09 08:03:05 +00:00
beginBatch ( batch ) ;
2019-03-09 06:57:29 +00:00
scissorBounds . Width = situation . Width ;
scissorBounds . Height = situation . Height ;
scissorBounds . X = situation . X ;
scissorBounds . Y = situation . Y ;
2018-11-30 02:41:06 +00:00
Rectangle scissor = scissorBounds ;
scissorBounds = batch . GraphicsDevice . ScissorRectangle ;
batch . GraphicsDevice . ScissorRectangle = scissor ;
}
2019-03-02 05:24:08 +00:00
2018-11-30 02:41:06 +00:00
foreach ( UIModule module in modules )
{
2019-03-09 06:57:29 +00:00
int offsetX = module . situation . X ;
int offsetY = module . situation . Y ;
module . situation . X = situation . X + offsetX ;
module . situation . Y = situation . Y + offsetY ;
2018-11-30 02:41:06 +00:00
module . Draw ( batch ) ;
2019-03-09 06:57:29 +00:00
module . situation . X = offsetX ;
module . situation . Y = offsetY ;
2018-11-30 02:41:06 +00:00
}
if ( scissorBounds ! = null )
{
batch . GraphicsDevice . ScissorRectangle = scissorBounds ;
batch . End ( ) ;
2019-03-09 08:03:05 +00:00
beginBatch ( batch ) ;
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 ) ;
}
}
}