Files
CMLeonOS/Gui/UILib/ProgressBar.cs
2026-03-31 22:19:53 +08:00

114 lines
3.3 KiB
C#

using System;
using System.Drawing;
namespace CMLeonOS.Gui.UILib
{
internal class ProgressBar : Control
{
public ProgressBar(Window parent, int x, int y, int width, int height) : base(parent, x, y, width, height)
{
}
private float _minimum = 0f;
internal float Minimum
{
get { return _minimum; }
set
{
_minimum = value;
if (_maximum < _minimum) _maximum = _minimum;
if (_value < _minimum) _value = _minimum;
Render();
}
}
private float _maximum = 100f;
internal float Maximum
{
get { return _maximum; }
set
{
_maximum = Math.Max(value, _minimum);
if (_value > _maximum) _value = _maximum;
Render();
}
}
private float _value = 0f;
internal float Value
{
get { return _value; }
set
{
float clamped = Math.Max(_minimum, Math.Min(_maximum, value));
if (Math.Abs(clamped - _value) < 0.0001f) return;
_value = clamped;
Render();
}
}
private Color _background = UITheme.SurfaceMuted;
internal Color Background
{
get { return _background; }
set { _background = value; Render(); }
}
private Color _foreground = UITheme.Accent;
internal Color Foreground
{
get { return _foreground; }
set { _foreground = value; Render(); }
}
private Color _border = UITheme.SurfaceBorder;
internal Color Border
{
get { return _border; }
set { _border = value; Render(); }
}
internal bool ShowPercentageText { get; set; } = true;
internal float GetPercent()
{
float range = _maximum - _minimum;
if (range <= 0.0001f) return 1f;
return (_value - _minimum) / range;
}
internal override void Render()
{
Clear(UITheme.Surface);
int innerW = Math.Max(0, Width - 2);
int innerH = Math.Max(0, Height - 2);
DrawFilledRectangle(1, 1, innerW, innerH, Background);
float percent = Math.Max(0f, Math.Min(1f, GetPercent()));
int fillWidth = (int)(innerW * percent);
if (fillWidth > 0)
{
DrawFilledRectangle(1, 1, fillWidth, innerH, Foreground);
DrawHorizontalLine(Math.Max(0, fillWidth - 1), 1, 1, Color.FromArgb(
Math.Min(255, Foreground.R + 20),
Math.Min(255, Foreground.G + 20),
Math.Min(255, Foreground.B + 20)));
}
DrawRectangle(0, 0, Width, Height, Border);
if (ShowPercentageText)
{
string text = ((int)(percent * 100f)).ToString() + "%";
int textX = (Width / 2) - (text.Length * 4);
int textY = (Height / 2) - 8;
Color textColor = percent > 0.45f ? Color.White : UITheme.TextPrimary;
DrawString(text, textColor, textX, textY);
}
WM.Update(this);
}
}
}