using System; using System.Collections.Generic; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Input; using RecrownedAthenaeum.Graphics.Render; namespace RecrownedAthenaeum.UI.Modular { /// /// Contains a group of modules and has its own relative coordinate system. /// public class UIModuleGroup : UIModule { List modules = new List(); /// /// Set this to crop anything that flows out of the boundaries of this group. Will not crop if this is null. /// public BasicScissor basicScissor; /// /// Instantiates the UI module group. /// /// Sets the field. public UIModuleGroup(BasicScissor basicScissor = null) { this.basicScissor = basicScissor; } /// /// Draws this group of modules. If scissoring, will use the matrix and effect designated in the to begin the batch normally again. /// /// Batch used to draw the group. public override void Draw(ConsistentSpriteBatch spriteBatch) { if (basicScissor != null) { spriteBatch.End(); basicScissor.Begin(Boundaries, spriteBatch); } foreach (UIModule module in modules) { int offsetX = module.X; int offsetY = module.Y; module.X = X + offsetX; module.Y = Y + offsetY; module.Draw(spriteBatch); module.X = offsetX; module.Y = offsetY; } if (basicScissor != null) { basicScissor.End(); spriteBatch.Begin(); } } /// /// Updates the group of modules. /// /// Game time used. public override void Update(GameTime gameTime) { foreach (UIModule module in modules) { module.Update(gameTime); } } /// /// Adds module(s) to this group. /// /// The module(s) to add. public virtual void AddModules(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); } } /// /// Removes given module from group. /// /// module to remove. public virtual void RemoveModule(UIModule module) { module.parent = null; modules.Remove(module); } /// /// Obtains an array snapshot of all the modules. /// public UIModule[] GetCopyOfModules() { return modules.ToArray(); } /// /// Updates the keyboard state of the modules in this group. /// /// The new state. /// Whether or not to continue updating the other listeners. public override bool KeyboardStateChanged(KeyboardState state) { foreach (UIModule module in modules) { module.KeyboardStateChanged(state); } return base.KeyboardStateChanged(state); } /// /// Updates the moues state of the modules in this group. /// /// The new state. /// Whether or not to continue updating other listeners. public override bool MouseStateChanged(MouseState state) { foreach (UIModule module in modules) { module.MouseStateChanged(state); } return base.MouseStateChanged(state); } } }