mirror of
https://github.com/Leonmmcoset/CMLeonOS.git
synced 2026-04-21 19:24:00 +00:00
92 lines
2.7 KiB
C#
92 lines
2.7 KiB
C#
using System;
|
|
using System.Drawing;
|
|
|
|
namespace CMLeonOS.Gui.UILib
|
|
{
|
|
internal class ProgressRing : Control
|
|
{
|
|
public ProgressRing(Window parent, int x, int y, int width, int height) : base(parent, x, y, width, height)
|
|
{
|
|
}
|
|
|
|
private Color _background = UITheme.Surface;
|
|
internal Color Background
|
|
{
|
|
get { return _background; }
|
|
set { _background = value; Render(); }
|
|
}
|
|
|
|
private Color _ringColor = UITheme.Accent;
|
|
internal Color RingColor
|
|
{
|
|
get { return _ringColor; }
|
|
set { _ringColor = value; Render(); }
|
|
}
|
|
|
|
private Color _trackColor = UITheme.SurfaceBorder;
|
|
internal Color TrackColor
|
|
{
|
|
get { return _trackColor; }
|
|
set { _trackColor = value; Render(); }
|
|
}
|
|
|
|
private bool _active = true;
|
|
internal bool Active
|
|
{
|
|
get { return _active; }
|
|
set { _active = value; Render(); }
|
|
}
|
|
|
|
internal int Thickness { get; set; } = 3;
|
|
|
|
private int frame = 0;
|
|
|
|
internal override void Render()
|
|
{
|
|
Clear(Background);
|
|
|
|
int radius = Math.Max(6, (Math.Min(Width, Height) / 2) - 4);
|
|
int centerX = Width / 2;
|
|
int centerY = Height / 2;
|
|
|
|
for (int angle = 0; angle < 360; angle += 12)
|
|
{
|
|
DrawArcPoint(centerX, centerY, radius, angle, TrackColor);
|
|
}
|
|
|
|
if (Active)
|
|
{
|
|
for (int i = 0; i < 8; i++)
|
|
{
|
|
int angle = (frame + (i * 18)) % 360;
|
|
Color color = Color.FromArgb(
|
|
Math.Max(60, RingColor.R - (i * 12)),
|
|
Math.Max(60, RingColor.G - (i * 12)),
|
|
Math.Max(60, RingColor.B - (i * 12)));
|
|
DrawArcPoint(centerX, centerY, radius, angle, color);
|
|
}
|
|
|
|
frame = (frame + 10) % 360;
|
|
WM.UpdateQueue.Enqueue(this);
|
|
}
|
|
|
|
WM.Update(this);
|
|
}
|
|
|
|
private void DrawArcPoint(int centerX, int centerY, int radius, int angleDegrees, Color color)
|
|
{
|
|
double radians = angleDegrees * (Math.PI / 180d);
|
|
int pointX = centerX + (int)(Math.Cos(radians) * radius);
|
|
int pointY = centerY + (int)(Math.Sin(radians) * radius);
|
|
|
|
for (int y = -Thickness / 2; y <= Thickness / 2; y++)
|
|
{
|
|
for (int x = -Thickness / 2; x <= Thickness / 2; x++)
|
|
{
|
|
DrawPoint(pointX + x, pointY + y, color);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|