Skip to content

Commit

Permalink
Progress: Use ParameterState framework. (#8433)
Browse files Browse the repository at this point in the history
  • Loading branch information
ScarletKuro committed Mar 24, 2024
1 parent 1a3d242 commit 687ce2f
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 95 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
@namespace MudBlazor
@inherits MudComponentBase

<div @attributes="UserAttributes" class="@DivClassname" role="progressbar" style="@Style" aria-valuenow="@Value">
<div @attributes="UserAttributes" class="@DivClassname" role="progressbar" style="@Style" aria-valuenow="@_valueState.Value">
<svg class="mud-progress-circular-svg" viewBox="22 22 44 44">
@if (Indeterminate)
{
Expand Down
71 changes: 33 additions & 38 deletions src/MudBlazor/Components/Progress/MudProgressCircular.razor.cs
Original file line number Diff line number Diff line change
@@ -1,28 +1,31 @@
using System;
using System.Diagnostics.CodeAnalysis;
using Microsoft.AspNetCore.Components;
using MudBlazor.State;
using MudBlazor.Utilities;

namespace MudBlazor
{
#nullable enable
public partial class MudProgressCircular : MudComponentBase
{
private int _svgValue;
private IParameterState<double> _valueState;
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("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)
.AddClass("mud-progress-indeterminate", Indeterminate)
.AddClass("mud-progress-static", !Indeterminate)
.Build();

/// <summary>
Expand Down Expand Up @@ -54,46 +57,14 @@ public partial class MudProgressCircular : MudComponentBase
[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 (!DoubleEpsilonEqualityComparer.Default.Equals(_value, value))
{
_value = value;
_svgValue = ToSvgValue(_value);
StateHasChanged();
}
}
}

private int ToSvgValue(double value)
{
var minValue = Math.Min(Math.Max(Min, value), Max);
// calculate fraction, which is a value between 0 and 1
var fraction = (minValue - Min) / (Max - Min);
// now project into the range of the SVG value (126 .. 0)
return (int)Math.Round(_magicNumber - _magicNumber * fraction);
}
public double Value { get; set; }

[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]
Expand All @@ -104,6 +75,30 @@ protected override void OnInitialized()
[Parameter]
public double Maximum { get => Max; set => Max = value; }

#endregion
public MudProgressCircular()
{
_valueState = RegisterParameter(nameof(Value), () => Value, OnValueParameterChanged, DoubleEpsilonEqualityComparer.Default);
}

private void OnValueParameterChanged(ParameterChangedEventArgs<double> args)
{
_svgValue = ToSvgValue(args.Value);
StateHasChanged();
}

protected override void OnInitialized()
{
base.OnInitialized();
_svgValue = ToSvgValue(_valueState.Value);
}

private int ToSvgValue(double value)
{
var minValue = Math.Min(Math.Max(Min, value), Max);
// calculate fraction, which is a value between 0 and 1
var fraction = (minValue - Min) / (Max - Min);
// now project into the range of the SVG value (126 .. 0)
return (int)Math.Round(_magicNumber - _magicNumber * fraction);
}
}
}
2 changes: 1 addition & 1 deletion src/MudBlazor/Components/Progress/MudProgressLinear.razor
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
@using MudBlazor.Extensions
@inherits MudComponentBase

<div @attributes="UserAttributes" class="@DivClassname" style="@Style" role="progressbar" aria-valuenow="@_value.ToInvariantString()" aria-valuemin="@_min.ToInvariantString()" aria-valuemax="@_max.ToInvariantString()">
<div @attributes="UserAttributes" class="@DivClassname" style="@Style" role="progressbar" aria-valuenow="@_valueState.Value.ToInvariantString()" aria-valuemin="@_minState.Value.ToInvariantString()" aria-valuemax="@_maxState.Value.ToInvariantString()">
<div class="mud-progress-linear-bars">
@if (Indeterminate)
{
Expand Down
93 changes: 38 additions & 55 deletions src/MudBlazor/Components/Progress/MudProgressLinear.razor.cs
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
using System;
using System.Diagnostics.CodeAnalysis;
using Microsoft.AspNetCore.Components;
using MudBlazor.State;
using MudBlazor.Utilities;

namespace MudBlazor
{
#nullable enable
public partial class MudProgressLinear : MudComponentBase
{
private double _min = 0.0;
private double _max = 100.0;
private double _value;
private double _bufferValue;
private IParameterState<double> _minState;
private IParameterState<double> _maxState;
private IParameterState<double> _valueState;
private IParameterState<double> _bufferValueState;

protected string DivClassname =>
new CssBuilder("mud-progress-linear")
Expand Down Expand Up @@ -88,59 +89,48 @@ public partial class MudProgressLinear : MudComponentBase
/// </summary>
[Parameter]
[Category(CategoryTypes.ProgressLinear.Behavior)]
public double Min
{
get => _min;
set
{
_min = value;
UpdatePercentages();
}
}
public double Min { get; set; } = 0.0;

/// <summary>
/// The maximum allowed value of the linear progress. Should not be equal to min.
/// </summary>
[Parameter]
[Category(CategoryTypes.ProgressLinear.Behavior)]
public double Max
{
get => _max;
set
{
_max = value;
UpdatePercentages();
}
}
public double Max { get; set; } = 100.0;

/// <summary>
/// The maximum allowed value of the linear progress. Should not be equal to min.
/// </summary>
[Parameter]
[Category(CategoryTypes.ProgressLinear.Behavior)]
public double Value
{
get => _value;
set
{
_value = value;
UpdatePercentages();
}
}
public double Value { get; set; }

[Parameter]
[Category(CategoryTypes.ProgressLinear.Behavior)]
public double BufferValue
public double BufferValue { get; set; }

[Obsolete("Use Min instead.", true)]
[ExcludeFromCodeCoverage]
[Parameter]
public double Minimum { get => Min; set => Min = value; }

[Obsolete("Use Max instead.", true)]
[ExcludeFromCodeCoverage]
[Parameter]
public double Maximum { get => Max; set => Max = value; }

public MudProgressLinear()
{
get => _bufferValue;
set
{
_bufferValue = value;
UpdatePercentages();
}
_valueState = RegisterParameter(nameof(Value), () => Value, OnParameterChangedShared, DoubleEpsilonEqualityComparer.Default);
_minState = RegisterParameter(nameof(Min), () => Min, OnParameterChangedShared);
_maxState = RegisterParameter(nameof(Max), () => Max, OnParameterChangedShared);
_bufferValueState = RegisterParameter(nameof(BufferValue), () => BufferValue, OnParameterChangedShared);
}

private void OnParameterChangedShared() => UpdatePercentages();

protected double ValuePercent { get; set; }

protected double BufferPercent { get; set; }

protected void UpdatePercentages()
Expand All @@ -152,34 +142,27 @@ protected void UpdatePercentages()

private double GetPercentage(double input)
{
var total = Math.Abs(_max - _min);
var total = Math.Abs(_maxState.Value - _minState.Value);
if (DoubleEpsilonEqualityComparer.Default.Equals(0, total))
{ // numeric instability!
{
// numeric instability!
return 0.0;
}
var value = Math.Max(0, Math.Min(total, input - _min));

var value = Math.Max(0, Math.Min(total, input - _minState.Value));

return value / total * 100.0;
}

public double GetValuePercent() => GetPercentage(_value);
public double GetBufferPercent() => GetPercentage(_bufferValue);
public double GetValuePercent() => GetPercentage(_valueState.Value);

public double GetBufferPercent() => GetPercentage(_bufferValueState.Value);

private string GetStyleBarTransform(double input) =>
Vertical ? $"transform: translateY({(int)Math.Round(100 - input)}%);" : $"transform: translateX(-{(int)Math.Round(100 - input)}%);";

public string GetStyledBar1Transform() => GetStyleBarTransform(ValuePercent);
public string GetStyledBar2Transform() => GetStyleBarTransform(BufferPercent);

#region --> Obsolete Forwarders for Backwards-Compatiblilty

[Obsolete("Use Min instead.", true)]
[ExcludeFromCodeCoverage]
[Parameter] public double Minimum { get => Min; set => Min = value; }

[Obsolete("Use Max instead.", true)]
[ExcludeFromCodeCoverage]
[Parameter] public double Maximum { get => Max; set => Max = value; }

#endregion
public string GetStyledBar2Transform() => GetStyleBarTransform(BufferPercent);
}
}

0 comments on commit 687ce2f

Please sign in to comment.