using Sandbox.ModAPI.Ingame; using System; using System.Collections.Generic; using VRage.Game.GUI.TextPanel; using VRageMath; namespace IngameScript { partial class Program { public class AirMonitorDisplay { private class ZoneRow { public AirZone Zone { get; private set; } public MySprite Name { get; private set; } public MySprite Level; // { get; private set; } public MySprite Triggered { get; private set; } public ZoneRow(RectangleF viewport, AirZone zone, float yPosition, float scale) { float xIncrement = viewport.Size.X / 3; Zone = zone; Name = new MySprite(SpriteType.TEXT, Zone.Name, new Vector2(0, yPosition) + viewport.Position, null, Color.White, "Debug", TextAlignment.LEFT, scale); Level = new MySprite(SpriteType.TEXT, "----", new Vector2(xIncrement, yPosition) + viewport.Position, null, Color.White, "Debug", TextAlignment.LEFT, scale); Triggered = new MySprite(SpriteType.TEXTURE, "Danger", new Vector2(xIncrement * 2, yPosition) + viewport.Position, new Vector2(32f, 32f), Color.White, null, TextAlignment.CENTER, 0f); } } private IMyTextSurface _surface; private List _staticSprites = new List(); private List _rows = new List(); private float _scale = 1f; public AirMonitorDisplay(IMyTextSurface surface, List zones) { // Setup draw surface _surface = surface; _surface.ScriptBackgroundColor = new Color(0, 0, 0, 255); _surface.ContentType = ContentType.SCRIPT; _surface.Script = ""; buildSprites(zones); } public void Draw() { if (_surface.FontSize != _scale) { _scale = _surface.FontSize; // Is it worth it to save this list? Maybe, but we don't anticipate // this changing often at all. List zones = new List(); foreach (ZoneRow row in _rows) { zones.Add(row.Zone); } buildSprites(zones); } MySpriteDrawFrame frame = _surface.DrawFrame(); foreach (MySprite sprite in _staticSprites) { frame.Add(sprite); } // for (int i=0; i < _rows.Count; i++) foreach (ZoneRow row in _rows) { frame.Add(row.Name); row.Level.Data = row.Zone.OxygenLevel.ToString("P2"); frame.Add(row.Level); if (row.Zone.Triggered) frame.Add(row.Triggered); } frame.Dispose(); } private void buildSprites(List zones) { RectangleF viewport = new RectangleF( (_surface.TextureSize - _surface.SurfaceSize) / 2f, _surface.SurfaceSize ); // build static sprites float yPosition = 0f; float xIncrement = viewport.Size.X / 3; // float scale = 500 / Math.Min(viewport.Size.X, viewport.Size.Y); _staticSprites.Clear(); _staticSprites.Add(new MySprite(SpriteType.TEXT, "OXYGEN REPORT", new Vector2(viewport.Size.X / 2, yPosition) + viewport.Position, null, Color.White, "Debug", TextAlignment.CENTER, 1.25f * _scale)); // title yPosition += 30f; _staticSprites.Add(new MySprite(SpriteType.TEXT, "ZONE", new Vector2(0, yPosition) + viewport.Position, null, Color.Blue, "Debug", TextAlignment.LEFT, 1.2f * _scale)); // title _staticSprites.Add(new MySprite(SpriteType.TEXT, "O2 LEVEL", new Vector2(xIncrement, yPosition) + viewport.Position, null, Color.Blue, "Debug", TextAlignment.LEFT, 1.2f * _scale)); // title _staticSprites.Add(new MySprite(SpriteType.TEXT, "STATUS", new Vector2(xIncrement * 2, yPosition) + viewport.Position, null, Color.Blue, "Debug", TextAlignment.LEFT, 1.2f * _scale)); // title yPosition += 30f; // build dynamic sprites _rows.Clear(); foreach (AirZone zone in zones) { _rows.Add(new ZoneRow(viewport, zone, yPosition, _scale)); yPosition += 30f; } } } } }