using System.Diagnostics.CodeAnalysis;
using Connected.Annotations;
using Connected.Extensions;
using Connected.Utilities;
using Microsoft.AspNetCore.Components;
namespace Connected.Components;
public partial class ProgressCircular : UIComponent
{
private const int _magicNumber = 126; // weird, but required for the SVG to work
protected string DivClassname =>
new CssBuilder("mud-progress-circular")
.AddClass($"mud-{Color.ToDescriptionString()}-text")
.AddClass($"mud-progress-{Size.ToDescriptionString()}")
.AddClass($"mud-progress-indeterminate", Indeterminate)
.AddClass($"mud-progress-static", !Indeterminate)
.AddClass(Class)
.Build();
protected string SvgClassname =>
new CssBuilder("mud-progress-circular-circle")
.AddClass($"mud-progress-indeterminate", Indeterminate)
.AddClass($"mud-progress-static", !Indeterminate)
.Build();
///
/// The color of the component. It supports the theme colors.
///
[Parameter]
[Category(CategoryTypes.ProgressCircular.Appearance)]
public ThemeColor Color { get; set; } = ThemeColor.Default;
///
/// The size of the component.
///
[Parameter]
[Category(CategoryTypes.ProgressCircular.Appearance)]
public Size Size { get; set; } = Size.Medium;
///
/// Constantly animates, does not follow any value.
///
[Parameter]
[Category(CategoryTypes.ProgressCircular.Behavior)]
public bool Indeterminate { get; set; }
[Parameter]
[Category(CategoryTypes.ProgressCircular.Behavior)]
public double Min { get; set; } = 0.0;
[Parameter]
[Category(CategoryTypes.ProgressCircular.Behavior)]
public double Max { get; set; } = 100.0;
private int _svgValue;
private double _value;
[Parameter]
[Category(CategoryTypes.ProgressCircular.Behavior)]
public double Value
{
get => _value;
set
{
if (_value != value)
{
_value = value;
_svgValue = ToSvgValue(_value);
StateHasChanged();
}
}
}
private int ToSvgValue(double in_value)
{
var value = Math.Min(Math.Max(Min, in_value), Max);
// calculate fraction, which is a value between 0 and 1
var fraction = (value - Min) / (Max - Min);
// now project into the range of the SVG value (126 .. 0)
return (int)Math.Round(_magicNumber - _magicNumber * fraction);
}
[Parameter]
[Category(CategoryTypes.ProgressCircular.Appearance)]
public int StrokeWidth { get; set; } = 3;
protected override void OnInitialized()
{
base.OnInitialized();
_svgValue = ToSvgValue(_value);
}
#region --> Obsolete Forwarders for Backwards-Compatiblilty
[ExcludeFromCodeCoverage]
[Obsolete("Use Min instead.", true)]
[Parameter] public double Minimum { get => Min; set => Min = value; }
[ExcludeFromCodeCoverage]
[Obsolete("Use Max instead.", true)]
[Parameter] public double Maximum { get => Max; set => Max = value; }
#endregion
}