using System;
using System.Linq;
namespace Radzen.Blazor
{
///
/// A sparkline is a small chart that provides a simple way to visualize trends in data.
///
public partial class RadzenSparkline : RadzenChart
{
///
/// Instantiates a new instance of .
///
public RadzenSparkline()
{
CategoryAxis = new RadzenCategoryAxis { Visible = false };
ValueAxis = new RadzenValueAxis { Visible = false };
Legend = new RadzenLegend { Visible = false };
TooltipTolerance = 5;
}
///
/// Updates the scales based on the configuration.
///
/// True if the chart should refresh; otherwise false;
protected override bool UpdateScales()
{
var valueScale = ValueScale;
var categoryScale = CategoryScale;
CategoryScale = new LinearScale { Output = CategoryScale.Output };
ValueScale = new LinearScale { Output = ValueScale.Output };
var visibleSeries = Series.Where(series => series.Visible).ToList();
var invisibleSeries = Series.Where(series => series.Visible == false).ToList();
if (visibleSeries.Count == 0 && invisibleSeries.Count > 0)
{
visibleSeries.Add(invisibleSeries.Last());
}
foreach (var series in visibleSeries)
{
CategoryScale = series.TransformCategoryScale(CategoryScale);
ValueScale = series.TransformValueScale(ValueScale);
}
AxisBase xAxis = CategoryAxis;
AxisBase yAxis = ValueAxis;
if (ShouldInvertAxes())
{
xAxis = ValueAxis;
yAxis = CategoryAxis;
}
else
{
CategoryScale.Padding = CategoryAxis.Padding;
}
CategoryScale.Resize(xAxis.Min!, xAxis.Max!);
if (xAxis.Step != null)
{
CategoryScale.Step = xAxis.Step;
CategoryScale.Round = false;
}
ValueScale.Resize(yAxis.Min!, yAxis.Max!);
if (yAxis.Step != null)
{
ValueScale.Step = yAxis.Step;
ValueScale.Round = false;
}
var legendSize = Legend.Measure(this);
var valueAxisSize = ValueAxis.Measure(this);
var categoryAxisSize = CategoryAxis.Measure(this);
if (!ShouldRenderAxes())
{
valueAxisSize = categoryAxisSize = 0;
}
if (ValueAxis.Visible)
{
MarginLeft = valueAxisSize;
}
if (Legend.Visible)
{
if (Legend.Position == LegendPosition.Right || Legend.Position == LegendPosition.Left)
{
if (Legend.Position == LegendPosition.Right)
{
MarginRight = legendSize + 16;
}
else
{
MarginLeft = legendSize + 16 + valueAxisSize;
}
}
else if (Legend.Position == LegendPosition.Top || Legend.Position == LegendPosition.Bottom)
{
if (Legend.Position == LegendPosition.Top)
{
MarginTop = legendSize + 16;
}
else
{
MarginBottom = legendSize + 16 + categoryAxisSize;
}
}
}
CategoryScale.Output = new ScaleRange { Start = MarginLeft, End = (Width ?? 0) - MarginRight };
ValueScale.Output = new ScaleRange { Start = (Height ?? 0) - MarginBottom, End = MarginTop };
ValueScale.Fit(ValueAxis.TickDistance);
CategoryScale.Fit(CategoryAxis.TickDistance);
var stateHasChanged = !ValueScale.IsEqualTo(valueScale);
if (!CategoryScale.IsEqualTo(categoryScale))
{
stateHasChanged = true;
}
return stateHasChanged;
}
}
}