diff --git a/Elwig/Windows/ChartWindow.xaml b/Elwig/Windows/ChartWindow.xaml index cbc4e28..163373e 100644 --- a/Elwig/Windows/ChartWindow.xaml +++ b/Elwig/Windows/ChartWindow.xaml @@ -137,12 +137,11 @@ </Grid.ColumnDefinitions> <Label Content="Oechsle:" Margin="10,10,0,0" Grid.Column="0"/> - <ctrl:UnitTextBox x:Name="OechsleInput" Unit="°Oe" TextChanged="OechsleInput_TextChanged" IsEnabled="False" LostFocus="OechsleInput_LostFocus" + <ctrl:UnitTextBox x:Name="OechsleInput" Unit="°Oe" TextChanged="OechsleInput_TextChanged" IsEnabled="False" Grid.Column="1" Width="90" Margin="0,10,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"/> - <Label Content="Preis:" Margin="10,40,0,0" Grid.Column="0"/> - <ctrl:UnitTextBox x:Name="PriceInput" Unit="€/kg" TextChanged="PriceInput_TextChanged" IsEnabled="False" LostFocus="PriceInput_LostFocus" + <ctrl:UnitTextBox x:Name="PriceInput" Unit="€/kg" TextChanged="PriceInput_TextChanged" IsEnabled="False" Grid.Column="1" Width="90" Margin="0,40,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"/> </Grid> </GroupBox> diff --git a/Elwig/Windows/ChartWindow.xaml.cs b/Elwig/Windows/ChartWindow.xaml.cs index e5dc980..30f1f60 100644 --- a/Elwig/Windows/ChartWindow.xaml.cs +++ b/Elwig/Windows/ChartWindow.xaml.cs @@ -5,13 +5,13 @@ using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Input; -using Elwig.Controls; using Elwig.Helpers; using Elwig.Helpers.Billing; using Elwig.Models.Entities; using ScottPlot.Plottables; using ScottPlot; using ScottPlot.Control; +using Microsoft.EntityFrameworkCore; namespace Elwig.Windows { public partial class ChartWindow : ContextWindow { @@ -22,6 +22,7 @@ namespace Elwig.Windows { public readonly int Year; public readonly int AvNr; public Season Season; + public string CurrencySymbol; private PaymentVar PaymentVar; private bool HasChanged = false; @@ -72,6 +73,9 @@ namespace Elwig.Windows { AvNr = avnr; using var ctx = new AppDbContext(); Season = ctx.Seasons.Find(year) ?? throw new ArgumentException("Season not found"); + CurrencySymbol = Season.Currency.Symbol ?? Season.Currency.Code; + PriceInput.Unit = $"{CurrencySymbol}/kg"; + GebundenFlatBonus.Unit = $"{CurrencySymbol}/kg"; PaymentVar = ctx.PaymentVariants.Find(year, avnr) ?? throw new ArgumentException("PaymentVar not found"); Title = $"{PaymentVar?.Name} - Lese {year} - Elwig"; LockContext = true; @@ -99,6 +103,9 @@ namespace Elwig.Windows { private async Task RefreshGraphList(AppDbContext ctx) { PaymentVar = await ctx.PaymentVariants.FindAsync(Year, AvNr) ?? throw new ArgumentException("PaymentVar not found"); Season = await ctx.Seasons.FindAsync(Year) ?? throw new ArgumentException("Season not found"); + CurrencySymbol = Season.Currency.Symbol ?? Season.Currency.Code; + PriceInput.Unit = $"{CurrencySymbol}/kg"; + GebundenFlatBonus.Unit = $"{CurrencySymbol}/kg"; try { var data = EditBillingData.FromJson(PaymentVar.Data, Utils.GetVaributes(ctx, Year)); @@ -156,15 +163,15 @@ namespace Elwig.Windows { } else { CopyButton.IsEnabled = false; DeleteButton.IsEnabled = false; - DisableUnitTextBox(OechsleInput); + DisableTextBox(OechsleInput); DisableOptionButtons(); } if (!PaymentVar.TestVariant) { AddButton.IsEnabled = false; CopyButton.IsEnabled = false; DeleteButton.IsEnabled = false; - DisableUnitTextBox(OechsleInput); - DisableUnitTextBox(PriceInput); + DisableTextBox(OechsleInput); + DisableTextBox(PriceInput); GebundenTypeFixed.IsEnabled = false; GebundenTypeGraph.IsEnabled = false; GebundenTypeNone.IsEnabled = false; @@ -407,7 +414,7 @@ namespace Elwig.Windows { EnableActionButtons(); OechslePricePlot.Refresh(); - EnableUnitTextBox(PriceInput); + EnableTextBox(PriceInput); return; } } @@ -416,9 +423,9 @@ namespace Elwig.Windows { ChangeMarker(PrimaryMarkedPointPlot, false); DisableActionButtons(); PriceInput.Text = ""; - DisableUnitTextBox(PriceInput); + DisableTextBox(PriceInput); OechslePricePlot.Refresh(); - DisableUnitTextBox(PriceInput); + DisableTextBox(PriceInput); } private void PriceInput_TextChanged(object sender, TextChangedEventArgs evt) { @@ -517,7 +524,7 @@ namespace Elwig.Windows { OechsleInput.Text = ""; PriceInput.Text = ""; - DisableUnitTextBox(PriceInput); + DisableTextBox(PriceInput); DisableActionButtons(); } @@ -531,28 +538,39 @@ namespace Elwig.Windows { MouseChange(e); } + private Coordinates GetMouseCoordinates(Point p) { + Pixel px = new(p.X, p.Y); + var source = PresentationSource.FromVisual(this); + if (source?.CompositionTarget != null) { + var matrix = source.CompositionTarget.TransformToDevice; + px.X *= (float)matrix.M11; + px.Y *= (float)matrix.M22; + } + return OechslePricePlot.Plot.GetCoordinates(px); + } + private void MouseChange(MouseEventArgs e) { if (GraphList.SelectedItem == null) { return; } - (double x, double y, int index)? mouseOnData = MouseOnPlot(DataPlot, e.GetPosition(OechslePricePlot)); - (double x, double y, int index)? mouseOnGebunden = MouseOnPlot(GebundenPlot, e.GetPosition(OechslePricePlot)); + var mouseOnData = MouseOnPlot(DataPlot, GetMouseCoordinates(e.GetPosition(OechslePricePlot))); + var mouseOnGebunden = MouseOnPlot(GebundenPlot, GetMouseCoordinates(e.GetPosition(OechslePricePlot))); Highlighted = LastHighlighted; if (mouseOnData != null) { - ChangeMarker(HighlightedPointPlot, true, mouseOnData.Value.x, mouseOnData.Value.y); + ChangeMarker(HighlightedPointPlot, true, mouseOnData.Value.X, mouseOnData.Value.Y); HighlightedPointPlot.IsVisible = true; HoverChanged = true ^ HoverActive; HoverActive = true; - HandleTooltip(mouseOnData.Value.x, mouseOnData.Value.y, mouseOnData.Value.index, SelectedGraphEntry!.DataGraph, e.GetPosition(OechslePricePlot), e is MouseWheelEventArgs); + HandleTooltip(mouseOnData.Value.X, mouseOnData.Value.Y, mouseOnData.Value.Index, SelectedGraphEntry!.DataGraph, e.GetPosition(OechslePricePlot), e is MouseWheelEventArgs); } else if (mouseOnGebunden != null) { - ChangeMarker(HighlightedPointPlot, true, mouseOnGebunden.Value.x, mouseOnGebunden.Value.y); + ChangeMarker(HighlightedPointPlot, true, mouseOnGebunden.Value.X, mouseOnGebunden.Value.Y); HighlightedPointPlot.IsVisible = true; HoverChanged = true ^ HoverActive; HoverActive = true; - HandleTooltip(mouseOnGebunden.Value.x, mouseOnGebunden.Value.y, mouseOnGebunden.Value.index, SelectedGraphEntry!.GebundenGraph!, e.GetPosition(OechslePricePlot), e is MouseWheelEventArgs); + HandleTooltip(mouseOnGebunden.Value.X, mouseOnGebunden.Value.Y, mouseOnGebunden.Value.Index, SelectedGraphEntry!.GebundenGraph!, e.GetPosition(OechslePricePlot), e is MouseWheelEventArgs); } else { ChangeMarker(HighlightedPointPlot, false); HoverChanged = false ^ HoverActive; @@ -562,30 +580,20 @@ namespace Elwig.Windows { } } - private (double, double, int)? MouseOnPlot(Scatter? plot, Point p) { - if (plot == null) { + private (double X, double Y, int Index)? MouseOnPlot(Scatter? plot, Coordinates c) { + if (plot == null) return null; - } - OechslePricePlot.Refresh(); - Pixel mousePixel = new(p.X, p.Y); - Coordinates mouseLocation = OechslePricePlot.Plot.GetCoordinates(mousePixel); - DataPoint nearestPoint = plot.Data.GetNearest(mouseLocation, OechslePricePlot.Plot.LastRender, 3); - - if (nearestPoint.IsReal) { - return (nearestPoint.X, nearestPoint.Y, nearestPoint.Index); - } else { - return null; - } + DataPoint nearestPoint = plot.Data.GetNearest(c, OechslePricePlot.Plot.LastRender, 5); + return nearestPoint.IsReal ? (nearestPoint.X, nearestPoint.Y, nearestPoint.Index) : null; } private void HandleTooltip(double pointX, double pointY, int pointIndex, Graph g, Point p, bool force) { if (force || LastHighlighted != Highlighted || HoverChanged) { OechslePricePlot.Plot.PlottableList.Remove(TooltipPlot); if (TooltipInput.IsChecked == true) { - Pixel mousePixel = new(p.X, p.Y - 30); - Coordinates mouseLocation = OechslePricePlot.Plot.GetCoordinates(mousePixel); - TooltipPlot = OechslePricePlot.Plot.Add.Text($"Oechsle: {pointX:N2}, Preis: {Math.Round(pointY, Season.Precision)}€/kg", mouseLocation.X, mouseLocation.Y); + Coordinates mouseLocation = GetMouseCoordinates(new(p.X, p.Y - 30)); + TooltipPlot = OechslePricePlot.Plot.Add.Text($"Oechsle: {pointX:N2}, Preis: {Math.Round(pointY, Season.Precision)} {CurrencySymbol}/kg", mouseLocation.X, mouseLocation.Y); TooltipPlot.LabelFontSize = 12; TooltipPlot.LabelBold = true; TooltipPlot.LabelBorderColor = Colors.Black; @@ -658,30 +666,30 @@ namespace Elwig.Windows { SetHasChanged(false); } - private void EnableUnitTextBox(UnitTextBox u) { + private void EnableTextBox(TextBox u) { if (PaymentVar.TestVariant) { u.IsEnabled = true; u.IsReadOnly = false; } } - private void DisableUnitTextBox(UnitTextBox u) { + private void DisableTextBox(TextBox u) { u.IsEnabled = false; u.IsReadOnly = true; } private void ChangeActiveGraph(Graph? g) { if (g != null && g == SelectedGraphEntry?.DataGraph) { - EnableUnitTextBox(OechsleInput); + EnableTextBox(OechsleInput); if (SelectedGraphEntry?.GebundenGraph != null) ChangeLineWidth(DataPlot, 4); ChangeLineWidth(GebundenPlot, 1); } else if (g != null && g == SelectedGraphEntry?.GebundenGraph) { - EnableUnitTextBox(OechsleInput); + EnableTextBox(OechsleInput); ChangeLineWidth(GebundenPlot, 4); ChangeLineWidth(DataPlot, 1); } else { - DisableUnitTextBox(OechsleInput); - DisableUnitTextBox(PriceInput); + DisableTextBox(OechsleInput); + DisableTextBox(PriceInput); OechsleInput.Text = ""; PriceInput.Text = ""; ChangeLineWidth(DataPlot, 1); @@ -700,14 +708,6 @@ namespace Elwig.Windows { RefreshInputs(); } - private void PriceInput_LostFocus(object sender, RoutedEventArgs e) { - - } - - private void OechsleInput_LostFocus(object sender, RoutedEventArgs e) { - - } - private void GebundenFlatBonus_TextChanged(object sender, TextChangedEventArgs e) { if (FillingInputs) return; var r = Validator.CheckDecimal(GebundenFlatBonus, true, 2, Season.Precision); @@ -778,19 +778,19 @@ namespace Elwig.Windows { private void GebundenType_Checked(object sender, RoutedEventArgs e) { if (FillingInputs) return; if (SelectedGraphEntry == null) { - DisableUnitTextBox(GebundenFlatBonus); + DisableTextBox(GebundenFlatBonus); return; } if (GebundenTypeNone.IsChecked == true) { SelectedGraphEntry.RemoveGebundenGraph(); - DisableUnitTextBox(GebundenFlatBonus); + DisableTextBox(GebundenFlatBonus); } else if (GebundenTypeFixed.IsChecked == true) { SelectedGraphEntry.GebundenFlatBonus = double.TryParse(GebundenFlatBonus.Text, out var val) ? val : 0.1; SelectedGraphEntry.AddGebundenGraph(); - EnableUnitTextBox(GebundenFlatBonus); + EnableTextBox(GebundenFlatBonus); } else if (GebundenTypeGraph.IsChecked == true) { SelectedGraphEntry.AddGebundenGraph(); - DisableUnitTextBox(GebundenFlatBonus); + DisableTextBox(GebundenFlatBonus); } SetHasChanged(); RefreshInputs(); @@ -801,11 +801,11 @@ namespace Elwig.Windows { if (SelectedGraphEntry?.GebundenFlatBonus is double bonus) { GebundenTypeFixed.IsChecked = true; GebundenFlatBonus.Text = $"{bonus}"; - EnableUnitTextBox(GebundenFlatBonus); + EnableTextBox(GebundenFlatBonus); } else if (SelectedGraphEntry?.GebundenGraph != null) { GebundenTypeGraph.IsChecked = true; GebundenFlatBonus.Text = ""; - DisableUnitTextBox(GebundenFlatBonus); + DisableTextBox(GebundenFlatBonus); } FillingInputs = false; }