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