File NativeStatsPanel.cs
File List > LemonUI > LemonUI > Menus > NativeStatsPanel.cs
Go to the documentation of this file
using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
namespace LemonUI.Menus
{
public class NativeStatsPanel : NativePanel, IContainer<NativeStatsInfo>, IEnumerable<NativeStatsInfo>
{
#region Fields
private readonly List<NativeStatsInfo> fields = new List<NativeStatsInfo>();
private PointF lastPosition = PointF.Empty;
private float lastWidth = 0;
private Color backgroundColor = Color.FromArgb(255, 169, 169, 169);
private Color foregroundColor = Color.FromArgb(255, 255, 255, 255);
#endregion
#region Properties
public Color BackgroundColor
{
get => backgroundColor;
set
{
backgroundColor = value;
foreach (NativeStatsInfo field in fields)
{
field.SetColor(value, foregroundColor);
}
}
}
public Color ForegroundColor
{
get => foregroundColor;
set
{
foregroundColor = value;
foreach (NativeStatsInfo field in fields)
{
field.SetColor(backgroundColor, value);
}
}
}
#endregion
#region Constructors
public NativeStatsPanel(params NativeStatsInfo[] stats)
{
foreach (NativeStatsInfo field in stats)
{
Add(field);
}
}
#endregion
#region Functions
public IEnumerator<NativeStatsInfo> GetEnumerator() => fields.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
public void Add(NativeStatsInfo field)
{
if (fields.Contains(field))
{
throw new InvalidOperationException("Stat is already part of the panel.");
}
fields.Add(field);
field.SetColor(backgroundColor, foregroundColor);
}
public void Remove(NativeStatsInfo field)
{
if (!fields.Contains(field))
{
return;
}
fields.Remove(field);
Recalculate();
}
public void Remove(Func<NativeStatsInfo, bool> func)
{
foreach (NativeStatsInfo item in new List<NativeStatsInfo>(fields))
{
if (func(item))
{
Remove(item);
}
}
}
public void Clear()
{
fields.Clear();
Recalculate();
}
public bool Contains(NativeStatsInfo field) => fields.Contains(field);
public void Recalculate() => Recalculate(lastPosition, lastWidth);
public override void Recalculate(PointF position, float width)
{
base.Recalculate(position, width);
const float differenceTop = 7;
const float perStatSeparation = 38;
Background.Size = new SizeF(width, differenceTop + (perStatSeparation * fields.Count));
for (int i = 0; i < fields.Count; i++)
{
PointF fieldPosition = new PointF(position.X, position.Y + differenceTop + (perStatSeparation * i));
fields[i].Recalculate(fieldPosition, width);
}
}
public override void Process()
{
base.Process();
foreach (NativeStatsInfo info in fields)
{
info.Draw();
}
}
#endregion
}
}