Fixed plotting (#226)

Thanks to @lordmortis
This commit is contained in:
lordmortis
2020-04-07 11:09:25 +02:00
committed by GitHub
parent b0e7ea96b1
commit e11d86f805
2 changed files with 59 additions and 17 deletions
+48 -12
View File
@@ -12,6 +12,7 @@ using System.Windows.Forms;
using LibreHardwareMonitor.Hardware;
using LibreHardwareMonitor.Utilities;
using OxyPlot;
using OxyPlot.Annotations;
using OxyPlot.Axes;
using OxyPlot.WindowsForms;
using OxyPlot.Series;
@@ -26,6 +27,7 @@ namespace LibreHardwareMonitor.UI
private readonly PlotModel _model;
private readonly TimeSpanAxis _timeAxis = new TimeSpanAxis();
private readonly SortedDictionary<SensorType, LinearAxis> _axes = new SortedDictionary<SensorType, LinearAxis>();
private readonly Dictionary<SensorType, LineAnnotation> _annotations = new Dictionary<SensorType, LineAnnotation>();
private UserOption _stackedAxes;
private UserOption _showAxesLabels;
private UserOption _timeAxisEnableZoom;
@@ -45,7 +47,7 @@ namespace LibreHardwareMonitor.UI
_model = CreatePlotModel();
_plot = new PlotView { Dock = DockStyle.Fill, Model = _model, BackColor = Color.White, ContextMenu = CreateMenu() };
UpdateAxesPosition();
SuspendLayout();
@@ -173,6 +175,7 @@ namespace LibreHardwareMonitor.UI
foreach (SensorType type in Enum.GetValues(typeof(SensorType)))
{
string typeName = type.ToString();
var axis = new LinearAxis
{
Position = AxisPosition.Left,
@@ -183,15 +186,31 @@ namespace LibreHardwareMonitor.UI
MinorGridlineThickness = 1,
MinorGridlineColor = _timeAxis.MinorGridlineColor,
AxislineStyle = LineStyle.Solid,
Title = type.ToString(),
Key = type.ToString()
Title = typeName,
Key = typeName,
};
var annotation = new LineAnnotation
{
Type = LineAnnotationType.Horizontal,
ClipByXAxis = false,
ClipByYAxis = false,
LineStyle = LineStyle.Solid,
Color = OxyColors.Black,
YAxisKey = typeName,
StrokeThickness = 2,
};
axis.AxisChanged += (sender, args) => annotation.Y = axis.ActualMinimum;
axis.TransformChanged += (sender, args) => annotation.Y = axis.ActualMinimum;
axis.Zoom(_settings.GetValue("plotPanel.Min" + axis.Key, float.NaN), _settings.GetValue("plotPanel.Max" + axis.Key, float.NaN));
if (units.ContainsKey(type))
axis.Unit = units[type];
_axes.Add(type, axis);
_annotations.Add(type, annotation);
}
var model = new ScaledPlotModel(_dpiXScale, _dpiYScale);
@@ -228,10 +247,10 @@ namespace LibreHardwareMonitor.UI
public void SetSensors(List<ISensor> sensors, IDictionary<ISensor, Color> colors)
{
_model.Series.Clear();
var types = new System.Collections.Generic.HashSet<SensorType>();
var types = new HashSet<SensorType>();
Func<SensorType, SensorValue, DataPoint> createDataPoint = (SensorType type, SensorValue value) =>
DataPoint CreateDataPoint(SensorType type, SensorValue value)
{
float displayedValue;
@@ -243,18 +262,22 @@ namespace LibreHardwareMonitor.UI
{
displayedValue = value.Value;
}
return new DataPoint((_now - value.Time).TotalSeconds, displayedValue);
};
}
foreach (ISensor sensor in sensors)
{
var series = new LineSeries();
var series = new LineSeries
{
ItemsSource = sensor.Values.Select(value => CreateDataPoint(sensor.SensorType, value)),
Color = colors[sensor].ToOxyColor(),
StrokeThickness = 1,
YAxisKey = _axes[sensor.SensorType].Key,
Title = sensor.Hardware.Name + " " + sensor.Name
};
series.ItemsSource = sensor.Values.Select(value => createDataPoint(sensor.SensorType, value));
series.Color = colors[sensor].ToOxyColor();
series.StrokeThickness = 1;
series.YAxisKey = _axes[sensor.SensorType].Key;
series.Title = sensor.Hardware.Name + " " + sensor.Name;
_model.Series.Add(series);
types.Add(sensor.SensorType);
@@ -287,6 +310,10 @@ namespace LibreHardwareMonitor.UI
axis.PositionTier = 0;
axis.MajorGridlineStyle = LineStyle.Solid;
axis.MinorGridlineStyle = LineStyle.Solid;
LineAnnotation annotation = _annotations[pair.Key];
annotation.Y = axis.ActualMinimum;
if (!_model.Annotations.Contains(annotation))
_model.Annotations.Add(annotation);
}
}
else
@@ -312,6 +339,9 @@ namespace LibreHardwareMonitor.UI
}
axis.MajorGridlineStyle = LineStyle.None;
axis.MinorGridlineStyle = LineStyle.None;
LineAnnotation annotation = _annotations[pair.Key];
if (_model.Annotations.Contains(annotation))
_model.Annotations.Remove(_annotations[pair.Key]);
}
}
}
@@ -328,6 +358,12 @@ namespace LibreHardwareMonitor.UI
SensorType type = pair.Key;
if (type == SensorType.Temperature)
axis.Unit = _unitManager.TemperatureUnit == TemperatureUnit.Celsius ? "°C" : "°F";
if (!_stackedAxes.Value)
continue;
var annotation = _annotations[pair.Key];
annotation.Y = axis.ActualMaximum;
}
}
@@ -180,14 +180,23 @@ namespace LibreHardwareMonitor.Utilities
{
if (float.TryParse(str, NumberStyles.Float, CultureInfo.InvariantCulture, out float parsedValue))
return parsedValue;
}
return value;
return value;
}
public double GetValue(string name, double value)
{
if (_settings.TryGetValue(name, out string str))
{
if (double.TryParse(str, NumberStyles.Float, CultureInfo.InvariantCulture, out double parsedValue))
return parsedValue;
}
return value;
}
public void SetValue(string name, bool value)
{
_settings[name] = value ? "true" : "false";
@@ -214,9 +223,6 @@ namespace LibreHardwareMonitor.Utilities
{
if (int.TryParse(str, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out int parsedValue))
return Color.FromArgb(parsedValue);
return value;
}
return value;