space_engineers/AirMonitor/AirMonitorDisplay.cs

109 lines
4.7 KiB
C#

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<MySprite> _staticSprites = new List<MySprite>();
private List<ZoneRow> _rows = new List<ZoneRow>();
private float _scale = 1f;
public AirMonitorDisplay(IMyTextSurface surface, List<AirZone> 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<AirZone> zones = new List<AirZone>();
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<AirZone> 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;
}
}
}
}
}