Skip to content

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
    }
}