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 }