ChartWindow: wip
This commit is contained in:
@ -3,52 +3,31 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text.Json.Nodes;
|
using System.Text.Json.Nodes;
|
||||||
|
using System.Windows.Documents;
|
||||||
|
|
||||||
namespace Elwig.Helpers.Billing {
|
namespace Elwig.Helpers.Billing {
|
||||||
public class Graph : ICloneable {
|
public class Graph : ICloneable {
|
||||||
|
|
||||||
public BillingData.CurveMode Mode { get; set; }
|
|
||||||
public int Id { get; set; }
|
|
||||||
private int MinX { get; set; }
|
|
||||||
private int MaxX { get; set; }
|
|
||||||
public List<Tuple<string, string>> Contracts { get; set; }
|
|
||||||
public double[] DataX { get; set; }
|
public double[] DataX { get; set; }
|
||||||
public double[] DataY { get; set; }
|
public double[] DataY { get; set; }
|
||||||
|
|
||||||
public Graph(int id, BillingData.CurveMode mode, int minX, int maxX) {
|
public Graph(int minX, int maxX) {
|
||||||
Id = id;
|
DataX = DataGen.Range(minX, maxX + 1);
|
||||||
Mode = mode;
|
DataY = DataGen.Zeros(maxX - minX + 1);
|
||||||
Contracts = new List<Tuple<string, string>>();
|
|
||||||
MinX = minX;
|
|
||||||
MaxX = maxX;
|
|
||||||
|
|
||||||
DataX = DataGen.Range(MinX, MaxX + 1);
|
|
||||||
DataY = DataGen.Zeros(MaxX - MinX + 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Graph(int id, BillingData.CurveMode mode, Dictionary<double, decimal> data, int minX, int maxX) {
|
public Graph(Dictionary<double, decimal> data, int minX, int maxX) {
|
||||||
Id = id;
|
DataX = DataGen.Range(minX, maxX + 1);
|
||||||
Mode = mode;
|
DataY = DataGen.Zeros(maxX - minX + 1);
|
||||||
Contracts = new List<Tuple<string, string>>();
|
ParseGraphData(data, minX, maxX);
|
||||||
MinX = minX;
|
|
||||||
MaxX = maxX;
|
|
||||||
|
|
||||||
DataX = DataGen.Range(MinX, MaxX + 1);
|
|
||||||
DataY = DataGen.Zeros(MaxX - MinX + 1);
|
|
||||||
ParseGraphData(data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Graph(int id, BillingData.CurveMode mode, int minX, int maxX, List<Tuple<string, string>> contracts, double[] dataX, double[] dataY) {
|
public Graph(double[] dataX, double[] dataY) {
|
||||||
Id = id;
|
|
||||||
Mode = mode;
|
|
||||||
MinX = minX;
|
|
||||||
MaxX = maxX;
|
|
||||||
Contracts = contracts;
|
|
||||||
DataX = dataX;
|
DataX = dataX;
|
||||||
DataY = dataY;
|
DataY = dataY;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ParseGraphData(Dictionary<double, decimal> graphPoints) {
|
private void ParseGraphData(Dictionary<double, decimal> graphPoints, int minX, int maxX) {
|
||||||
if (graphPoints.Keys.Count < 1) {
|
if (graphPoints.Keys.Count < 1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -56,11 +35,11 @@ namespace Elwig.Helpers.Billing {
|
|||||||
var minKey = graphPoints.Keys.Order().First();
|
var minKey = graphPoints.Keys.Order().First();
|
||||||
var maxKey = graphPoints.Keys.OrderDescending().First();
|
var maxKey = graphPoints.Keys.OrderDescending().First();
|
||||||
|
|
||||||
if (!graphPoints.ContainsKey(MinX)) {
|
if (!graphPoints.ContainsKey(minX)) {
|
||||||
graphPoints.Add(MinX, graphPoints.GetValueOrDefault(minKey));
|
graphPoints.Add(minX, graphPoints.GetValueOrDefault(minKey));
|
||||||
}
|
}
|
||||||
if (!graphPoints.ContainsKey(MaxX)) {
|
if (!graphPoints.ContainsKey(maxX)) {
|
||||||
graphPoints.Add(MaxX, graphPoints.GetValueOrDefault(maxKey));
|
graphPoints.Add(maxX, graphPoints.GetValueOrDefault(maxKey));
|
||||||
}
|
}
|
||||||
|
|
||||||
var keys = graphPoints.Keys.Order().ToArray();
|
var keys = graphPoints.Keys.Order().ToArray();
|
||||||
@ -70,56 +49,60 @@ namespace Elwig.Helpers.Billing {
|
|||||||
if (i + 1 < keys.Length) {
|
if (i + 1 < keys.Length) {
|
||||||
decimal point2Value = graphPoints[keys[i + 1]];
|
decimal point2Value = graphPoints[keys[i + 1]];
|
||||||
if (point1Value == point2Value) {
|
if (point1Value == point2Value) {
|
||||||
for (int j = (int)(keys[i] - MinX); j < keys[i + 1] - MinX; j++) {
|
for (int j = (int)(keys[i] - minX); j < keys[i + 1] - minX; j++) {
|
||||||
DataY[j] = (double)point1Value;
|
DataY[j] = (double)point1Value;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
int steps = (int)Math.Abs(keys[i + 1] - keys[i]);
|
int steps = (int)Math.Abs(keys[i + 1] - keys[i]);
|
||||||
decimal step = (point2Value - point1Value) / steps;
|
decimal step = (point2Value - point1Value) / steps;
|
||||||
|
|
||||||
DataY[(int)(keys[i] - MinX)] = (double)point1Value;
|
DataY[(int)(keys[i] - minX)] = (double)point1Value;
|
||||||
DataY[(int)(keys[i + 1] - MinX)] = (double)point2Value;
|
DataY[(int)(keys[i + 1] - minX)] = (double)point2Value;
|
||||||
|
|
||||||
for (int j = (int)(keys[i] - MinX); j < keys[i + 1] - MinX - 1; j++) {
|
for (int j = (int)(keys[i] - minX); j < keys[i + 1] - minX - 1; j++) {
|
||||||
DataY[j + 1] = Math.Round(DataY[j] + (double)step, 4); // TODO richtig runden
|
DataY[j + 1] = Math.Round(DataY[j] + (double)step, 4); // TODO richtig runden
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for (int j = (int)(keys[i] - MinX); j < DataX.Length; j++) {
|
for (int j = (int)(keys[i] - minX); j < DataX.Length; j++) {
|
||||||
DataY[j] = (double)point1Value;
|
DataY[j] = (double)point1Value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public JsonObject ToJson() {
|
public void FlattenGraph(int begin, int end, double value) {
|
||||||
var graph = new JsonObject {
|
for (int i = begin; i <= end; i++) {
|
||||||
["id"] = Id,
|
DataY[i] = value;
|
||||||
["mode"] = Mode.ToString().ToLower(),
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
|
public void LinearIncreaseGraph(int begin, int end, double inc) {
|
||||||
|
for (int i = begin; i < end; i++) {
|
||||||
|
DataY[i + 1] = DataY[i] + inc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public JsonObject ToJson(string mode) {
|
||||||
var data = new JsonObject();
|
var data = new JsonObject();
|
||||||
|
|
||||||
if (DataY[0] != DataY[1]) {
|
if (DataY[0] != DataY[1]) {
|
||||||
data.Add(new KeyValuePair<string, JsonNode?>(DataX[0] + Mode.ToString().ToLower(), Math.Round(DataY[0], 4)));
|
data.Add(new KeyValuePair<string, JsonNode?>(DataX[0] + mode, Math.Round(DataY[0], 4)));
|
||||||
}
|
}
|
||||||
for (int i = 1; i < DataX.Length - 1; i++) {
|
for (int i = 1; i < DataX.Length - 1; i++) {
|
||||||
if (Math.Round(DataY[i] - DataY[i - 1], 10) != Math.Round(DataY[i + 1] - DataY[i], 10)) {
|
if (Math.Round(DataY[i] - DataY[i - 1], 10) != Math.Round(DataY[i + 1] - DataY[i], 10)) {
|
||||||
data.Add(new KeyValuePair<string, JsonNode?>(DataX[i] + Mode.ToString().ToLower(), Math.Round(DataY[i], 4)));
|
data.Add(new KeyValuePair<string, JsonNode?>(DataX[i] + mode, Math.Round(DataY[i], 4)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (DataY[^1] != DataY[^2]) {
|
if (DataY[^1] != DataY[^2]) {
|
||||||
data.Add(new KeyValuePair<string, JsonNode?>(DataX[^1] + Mode.ToString().ToLower(), Math.Round(DataY[^1], 4)));
|
data.Add(new KeyValuePair<string, JsonNode?>(DataX[^1] + mode, Math.Round(DataY[^1], 4)));
|
||||||
}
|
}
|
||||||
|
return data;
|
||||||
graph["data"] = data;
|
|
||||||
|
|
||||||
return graph;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public object Clone() {
|
public object Clone() {
|
||||||
return new Graph(Id, Mode, MinX, MaxX, Contracts.ConvertAll(item => new Tuple<string, string>(item.Item1, item.Item2)), (double[])DataX.Clone(), (double[])DataY.Clone());
|
return new Graph((double[])DataX.Clone(), (double[])DataY.Clone());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
66
Elwig/Helpers/Billing/GraphEntry.cs
Normal file
66
Elwig/Helpers/Billing/GraphEntry.cs
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Text.Json.Nodes;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Elwig.Helpers.Billing {
|
||||||
|
public class GraphEntry {
|
||||||
|
|
||||||
|
public int Id { get; set; }
|
||||||
|
public BillingData.CurveMode Mode { get; set; }
|
||||||
|
public Graph DataGraph { get; set; }
|
||||||
|
public Graph? GebundenGraph { get; set; }
|
||||||
|
public decimal? GebundenFlatPrice { get; set; }
|
||||||
|
public List<string> Contracts { get; set; }
|
||||||
|
private int MinX { get; set; }
|
||||||
|
private int MaxX { get; set; }
|
||||||
|
|
||||||
|
public GraphEntry(int id, BillingData.CurveMode mode, int minX, int maxX) {
|
||||||
|
Id = id;
|
||||||
|
Mode = mode;
|
||||||
|
MinX = minX;
|
||||||
|
MaxX = maxX;
|
||||||
|
DataGraph = new Graph(minX, maxX);
|
||||||
|
Contracts = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
public GraphEntry(int id, BillingData.CurveMode mode, Dictionary<double, decimal> data, int minX, int maxX) : this(id, mode, minX, maxX) {
|
||||||
|
DataGraph = new Graph(data, minX, maxX);
|
||||||
|
}
|
||||||
|
|
||||||
|
private GraphEntry(int id, BillingData.CurveMode mode, Graph dataGraph, Graph? gebundenGraph,
|
||||||
|
decimal? gebundenFlatPrice, List<string> contracts, int minX, int maxX) {
|
||||||
|
Id = id;
|
||||||
|
Mode = mode;
|
||||||
|
MinX = minX;
|
||||||
|
MaxX = maxX;
|
||||||
|
DataGraph = dataGraph;
|
||||||
|
GebundenGraph = gebundenGraph;
|
||||||
|
GebundenFlatPrice = gebundenFlatPrice;
|
||||||
|
Contracts = contracts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public JsonObject ToJson() {
|
||||||
|
var curve = new JsonObject {
|
||||||
|
["id"] = Id,
|
||||||
|
["mode"] = Mode.ToString().ToLower(),
|
||||||
|
};
|
||||||
|
|
||||||
|
curve["data"] = DataGraph.ToJson(Mode.ToString().ToLower());
|
||||||
|
|
||||||
|
if (GebundenFlatPrice != null) {
|
||||||
|
curve["geb"] = GebundenFlatPrice.ToString();
|
||||||
|
} else if (GebundenGraph != null) {
|
||||||
|
curve["geb"] = GebundenGraph.ToJson(Mode.ToString().ToLower());
|
||||||
|
}
|
||||||
|
|
||||||
|
return curve;
|
||||||
|
}
|
||||||
|
|
||||||
|
public GraphEntry Copy(int id) {
|
||||||
|
return new GraphEntry(id, Mode, (Graph)DataGraph.Clone(), (Graph?)GebundenGraph?.Clone(), GebundenFlatPrice, Contracts, MinX, MaxX);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
<local:AdministrationWindow
|
<local:ContextWindow
|
||||||
x:Class="Elwig.Windows.ChartWindow"
|
x:Class="Elwig.Windows.ChartWindow"
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
@ -8,7 +8,7 @@
|
|||||||
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
|
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
|
||||||
xmlns:ScottPlot="clr-namespace:ScottPlot;assembly=ScottPlot.WPF"
|
xmlns:ScottPlot="clr-namespace:ScottPlot;assembly=ScottPlot.WPF"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
Title="Auszahlung - Elwig" Height="700" Width="1500"
|
Title="Auszahlung - Elwig" Height="700" Width="1500" MinWidth="1000" MinHeight="500"
|
||||||
Loaded="Window_Loaded">
|
Loaded="Window_Loaded">
|
||||||
|
|
||||||
<Window.Resources>
|
<Window.Resources>
|
||||||
@ -43,94 +43,77 @@
|
|||||||
|
|
||||||
<Grid>
|
<Grid>
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="19"/>
|
<RowDefinition Height="40"/>
|
||||||
<RowDefinition Height="*"/>
|
<RowDefinition Height="*"/>
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="330"/>
|
<ColumnDefinition Width="230"/>
|
||||||
<ColumnDefinition Width="1*"/>
|
<ColumnDefinition Width="1*"/>
|
||||||
<ColumnDefinition Width="200"/>
|
<ColumnDefinition Width="200"/>
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
<Grid Grid.Row="1" Margin="5,0,0,0">
|
<Grid Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3">
|
||||||
<Grid.RowDefinitions>
|
|
||||||
<RowDefinition Height="*"/>
|
|
||||||
<RowDefinition Height="42"/>
|
|
||||||
</Grid.RowDefinitions>
|
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="*"/>
|
<ColumnDefinition Width="150"/>
|
||||||
<ColumnDefinition Width="*"/>
|
<ColumnDefinition Width="500"/>
|
||||||
<ColumnDefinition Width="*"/>
|
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
<DataGrid x:Name="GraphList" AutoGenerateColumns="False" HeadersVisibility="Column" IsReadOnly="True" GridLinesVisibility="None" SelectionMode="Single"
|
<Label Content="Graph:" Margin="10,0,0,0" FontSize="14" Grid.Column="0" VerticalAlignment="Center"/>
|
||||||
CanUserDeleteRows="False" CanUserResizeRows="False" CanUserAddRows="False"
|
<TextBlock x:Name="GraphNum" Margin="0,0,40,0" FontSize="14" Width="50" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Right"/>
|
||||||
SelectionChanged="GraphList_SelectionChanged"
|
|
||||||
Margin="5,15,5,0" Grid.Row="0" FontSize="14" Grid.ColumnSpan="3">
|
|
||||||
<DataGrid.Columns>
|
|
||||||
<DataGridTextColumn Header="Nr." Binding="{Binding Id}" Width="40">
|
|
||||||
<DataGridTextColumn.ElementStyle>
|
|
||||||
<Style>
|
|
||||||
<Setter Property="TextBlock.TextWrapping" Value="Wrap" />
|
|
||||||
</Style>
|
|
||||||
</DataGridTextColumn.ElementStyle>
|
|
||||||
</DataGridTextColumn>
|
|
||||||
<DataGridTextColumn Header="Modus" Binding="{Binding Mode}" Width="40"/>
|
|
||||||
<DataGridTextColumn Header="Angewandte Verträge" Binding="{Binding Contracts}" Width="4*"/>
|
|
||||||
</DataGrid.Columns>
|
|
||||||
</DataGrid>
|
|
||||||
|
|
||||||
<Button x:Name="NewButton" Content="Neu"
|
<Label Content="Für:" Margin="10,0,0,0" FontSize="14" Grid.Column="1" VerticalAlignment="Center"/>
|
||||||
HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Margin="5,5,2.5,10" Grid.Column="0" Grid.Row="2"
|
<xctk:CheckComboBox x:Name="AppliedInput" Margin="0,10,10,10" Grid.Column="1"
|
||||||
Click="NewButton_Click"/>
|
Delimiter=", " AllItemsSelectedContent="Alle"
|
||||||
<Button x:Name="EditButton" Content="Bearbeiten" IsEnabled="False"
|
Width="400" HorizontalAlignment="Right">
|
||||||
HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Margin="2.5,5,2.5,10" Grid.Column="1" Grid.Row="2"
|
<!--<xctk:CheckComboBox.ItemTemplate>
|
||||||
Click="EditButton_Click"/>
|
<DataTemplate>
|
||||||
<Button x:Name="DeleteButton" Content="Löschen" IsEnabled="False"
|
<StackPanel Orientation="Horizontal">
|
||||||
HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Margin="2.5,5,5,10" Grid.Column="2" Grid.Row="2"
|
<TextBlock Text="{}" Width="40"/>
|
||||||
Click="DeleteButton_Click"/>
|
</StackPanel>
|
||||||
|
</DataTemplate>
|
||||||
<Button x:Name="SaveButton" Content="Speichern" IsEnabled="False" Visibility="Hidden"
|
</xctk:CheckComboBox.ItemTemplate>-->
|
||||||
HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Margin="5,5,2.5,10" Grid.Column="0" Grid.Row="2"
|
</xctk:CheckComboBox>
|
||||||
Click="SaveButton_Click"/>
|
|
||||||
<Button x:Name="ResetButton" Content="Zurücksetzen" IsEnabled="False" Visibility="Hidden"
|
|
||||||
HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Margin="2.5,5,2.5,10" Grid.Column="1" Grid.Row="2"
|
|
||||||
Click="ResetButton_Click"/>
|
|
||||||
<Button x:Name="CancelButton" Content="Abbrechen" IsEnabled="False" Visibility="Hidden" IsCancel="True"
|
|
||||||
HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Margin="2.5,5,5,10" Grid.Column="2" Grid.Row="2"
|
|
||||||
Click="CancelButton_Click"/>
|
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
|
<ListBox x:Name="GraphList" Margin="10,10,35,50" Grid.Column="0" Grid.Row="1" SelectionChanged="GraphList_SelectionChanged">
|
||||||
|
<ListBox.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<TextBlock Text="{Binding Id}" Width="40"/>
|
||||||
|
<TextBlock Text="{Binding Contracts}" Width="100"/>
|
||||||
|
</StackPanel>
|
||||||
|
</DataTemplate>
|
||||||
|
</ListBox.ItemTemplate>
|
||||||
|
</ListBox>
|
||||||
|
|
||||||
|
<Button x:Name="SaveButton" Content="Speichern" IsEnabled="True"
|
||||||
|
HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Margin="10,5,35,15" Grid.Column="0" Grid.Row="2"
|
||||||
|
Click="SaveButton_Click"/>
|
||||||
|
|
||||||
|
<Button x:Name="AddButton" Content="" FontFamily="Segoe MDL2 Assets" FontSize="11" Padding="0,1.5,0,0" ToolTip="Neue Auszahlungsvariante hinzufügen"
|
||||||
|
VerticalAlignment="Center" HorizontalAlignment="Right" Width="25" Height="25" Margin="5,0,5,60" Grid.Column="0" Grid.Row="1"
|
||||||
|
Click="AddButton_Click"/>
|
||||||
|
<Button x:Name="CopyButton" Content="" FontFamily="Segoe MDL2 Assets" FontSize="12" Padding="0,0,0,0" IsEnabled="False" ToolTip="Ausgewählte Auszahlungsvariante duplizieren"
|
||||||
|
VerticalAlignment="Center" HorizontalAlignment="Right" Width="25" Height="25" Margin="0,0,5,0" Grid.Column="0" Grid.Row="1"
|
||||||
|
Click="CopyButton_Click"/>
|
||||||
|
<Button x:Name="DeleteButton" Content="" FontFamily="Segoe MDL2 Assets" FontSize="11" Padding="0,1.5,0,0" IsEnabled="False" ToolTip="Ausgewählte Auszahlungsvariante löschen"
|
||||||
|
VerticalAlignment="Center" HorizontalAlignment="Right" Width="25" Height="25" Margin="5,60,5,0" Grid.Column="0" Grid.Row="1"
|
||||||
|
Click="DeleteButton_Click"/>
|
||||||
|
|
||||||
<Grid Grid.Row="1" Grid.Column="1">
|
<Grid Grid.Row="1" Grid.Column="1">
|
||||||
<ScottPlot:WpfPlot x:Name="OechslePricePlot" MouseMove="OechslePricePlot_MouseMove" MouseDown="OechslePricePlot_MouseDown" IsEnabled="False"/>
|
<ScottPlot:WpfPlot x:Name="OechslePricePlot" MouseMove="OechslePricePlot_MouseMove" MouseDown="OechslePricePlot_MouseDown" IsEnabled="False"/>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
<Grid Grid.Row="1" Grid.Column="2" Margin="0,0,5,0">
|
<Grid Grid.Row="1" Grid.Column="2" Margin="0,0,5,36">
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="120"/>
|
<RowDefinition Height="120"/>
|
||||||
<RowDefinition Height="120"/>
|
<RowDefinition Height="90"/>
|
||||||
<RowDefinition Height="210"/>
|
<RowDefinition Height="210"/>
|
||||||
|
<RowDefinition Height="1*"/>
|
||||||
<RowDefinition Height="110"/>
|
<RowDefinition Height="110"/>
|
||||||
<RowDefinition Height="42"/>
|
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
|
|
||||||
<GroupBox Header="Graph" Grid.Row="0" Margin="0,5,5,5">
|
<GroupBox Header="Datenpunkt" Grid.Row="0" Margin="0,5,5,5">
|
||||||
<Grid>
|
|
||||||
<Grid.ColumnDefinitions>
|
|
||||||
<ColumnDefinition Width="85"/>
|
|
||||||
<ColumnDefinition Width="*"/>
|
|
||||||
</Grid.ColumnDefinitions>
|
|
||||||
|
|
||||||
<Label Content="Nummer:" Margin="10,10,0,0" Grid.Column="0"/>
|
|
||||||
<TextBox x:Name="GraphNumberInput" Grid.Column="1" HorizontalAlignment="Left" Margin="0,10,0,0" Text="" Width="90" TextChanged="GraphNumberInput_TextChanged" LostFocus="GraphNumberInput_LostFocus"/>
|
|
||||||
|
|
||||||
<Label Content="Typ:" Margin="10,45,0,0" Grid.Column="0"/>
|
|
||||||
<RadioButton x:Name="OechsleGraphType_Input" GroupName="GraphType" Grid.Column="1" Margin="0,45,0,0">Oechsle</RadioButton>
|
|
||||||
<RadioButton x:Name="KmwGraphType_Input" GroupName="GraphType" Grid.Column="1" Margin="0,60,0,0">KMW</RadioButton>
|
|
||||||
</Grid>
|
|
||||||
</GroupBox>
|
|
||||||
|
|
||||||
<GroupBox Header="Datenpunkt" Grid.Row="1" Margin="0,5,5,5">
|
|
||||||
<Grid>
|
<Grid>
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="85"/>
|
<ColumnDefinition Width="85"/>
|
||||||
@ -146,6 +129,23 @@
|
|||||||
</Grid>
|
</Grid>
|
||||||
</GroupBox>
|
</GroupBox>
|
||||||
|
|
||||||
|
<GroupBox Header="Gebunden" Grid.Row="1" Margin="0,5,5,5">
|
||||||
|
<Grid>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="85"/>
|
||||||
|
<ColumnDefinition Width="*"/>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
|
<StackPanel Margin="10,10,0,0">
|
||||||
|
<RadioButton GroupName="GebundenType">Fix</RadioButton>
|
||||||
|
<RadioButton GroupName="GebundenType">Graph</RadioButton>
|
||||||
|
<RadioButton GroupName="GebundenType" IsChecked="True">Nein</RadioButton>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<TextBox x:Name="GebundenBonus" IsReadOnly="True" Grid.Column="1" HorizontalAlignment="Left" Margin="0,12,0,0" Text="" Width="90" TextChanged="GebundenBonus_TextChanged"/>
|
||||||
|
</Grid>
|
||||||
|
</GroupBox>
|
||||||
|
|
||||||
<GroupBox Header="Aktionen" Grid.Row="2" Margin="0,5,5,5">
|
<GroupBox Header="Aktionen" Grid.Row="2" Margin="0,5,5,5">
|
||||||
<Grid>
|
<Grid>
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
@ -166,7 +166,7 @@
|
|||||||
</Grid>
|
</Grid>
|
||||||
</GroupBox>
|
</GroupBox>
|
||||||
|
|
||||||
<GroupBox Header="Optionen" Grid.Row="3" Margin="0,5,5,5">
|
<GroupBox Header="Optionen" Grid.Row="4" Margin="0,5,5,5">
|
||||||
<Grid>
|
<Grid>
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="*"/>
|
<ColumnDefinition Width="*"/>
|
||||||
@ -186,4 +186,4 @@
|
|||||||
</GroupBox>
|
</GroupBox>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Grid>
|
</Grid>
|
||||||
</local:AdministrationWindow>
|
</local:ContextWindow>
|
||||||
|
@ -17,10 +17,11 @@ using ScottPlot;
|
|||||||
using ScottPlot.Plottable;
|
using ScottPlot.Plottable;
|
||||||
|
|
||||||
namespace Elwig.Windows {
|
namespace Elwig.Windows {
|
||||||
public partial class ChartWindow : AdministrationWindow {
|
public partial class ChartWindow : ContextWindow {
|
||||||
|
|
||||||
public readonly int Year;
|
public readonly int Year;
|
||||||
public readonly int AvNr;
|
public readonly int AvNr;
|
||||||
|
private readonly PaymentVar PaymentVar;
|
||||||
|
|
||||||
private ScatterPlot OechslePricePlotScatter;
|
private ScatterPlot OechslePricePlotScatter;
|
||||||
private MarkerPlot HighlightedPoint;
|
private MarkerPlot HighlightedPoint;
|
||||||
@ -38,21 +39,18 @@ namespace Elwig.Windows {
|
|||||||
private const int MinOechsle = 50;
|
private const int MinOechsle = 50;
|
||||||
private const int MaxOechsle = 140;
|
private const int MaxOechsle = 140;
|
||||||
|
|
||||||
private Graph? Graph;
|
private List<GraphEntry> GraphEntries = [];
|
||||||
|
private GraphEntry? SelectedGraphEntry;
|
||||||
|
|
||||||
public ChartWindow(int year, int avnr) {
|
public ChartWindow(int year, int avnr) {
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
Year = year;
|
Year = year;
|
||||||
AvNr = avnr;
|
AvNr = avnr;
|
||||||
var v = Context.PaymentVariants.Find(year, avnr);
|
PaymentVar = Context.PaymentVariants.Find(year, avnr) ?? throw new ArgumentException("PaymentVar not found");
|
||||||
Title = $"{v?.Name} - Lese {year} - Elwig";
|
Title = $"{PaymentVar?.Name} - Lese {year} - Elwig";
|
||||||
ExemptInputs = [
|
|
||||||
GraphList, OechsleInput, PriceInput, FreeZoomInput, GradationLinesInput, TooltipInput
|
|
||||||
];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Window_Loaded(object sender, RoutedEventArgs evt) {
|
private void Window_Loaded(object sender, RoutedEventArgs evt) {
|
||||||
LockInputs();
|
|
||||||
OechslePricePlot.IsEnabled = false;
|
OechslePricePlot.IsEnabled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -70,20 +68,27 @@ namespace Elwig.Windows {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private async Task RefreshGraphListQuery(bool updateSort = false) {
|
private async Task RefreshGraphListQuery(bool updateSort = false) {
|
||||||
var paymentVar = await Context.PaymentVariants.FindAsync(Year, AvNr);
|
var data = ParseData(PaymentVar);
|
||||||
if (paymentVar == null) return;
|
|
||||||
var data = ParseData(paymentVar);
|
|
||||||
if (data == null) return;
|
if (data == null) return;
|
||||||
|
|
||||||
var curves = BillingData.GetCurves(data, BillingData.CalculationMode.Elwig);
|
var curves = BillingData.GetCurves(data, BillingData.CalculationMode.Elwig);
|
||||||
List<Graph> graphs = [];
|
|
||||||
|
|
||||||
foreach (var (id, curve) in curves) {
|
foreach (var (id, curve) in curves) {
|
||||||
graphs.Add(new Graph(id, curve.Mode, curve.Normal, MinOechsle, MaxOechsle));
|
GraphEntries.Add(new GraphEntry(id, curve.Mode, curve.Normal, MinOechsle, MaxOechsle));
|
||||||
}
|
}
|
||||||
|
|
||||||
ControlUtils.RenewItemsSource(GraphList, graphs, g => (g as Graph)?.Id);
|
var attrVariants = Context.DeliveryParts
|
||||||
if (graphs.Count == 1) {
|
.Where(d => d.Year == Year)
|
||||||
|
.Select(d => $"{d.SortId}{d.AttrId}")
|
||||||
|
.Distinct()
|
||||||
|
.ToList()
|
||||||
|
.Union(Context.WineVarieties.Select(v => v.SortId))
|
||||||
|
.Order()
|
||||||
|
.ToList();
|
||||||
|
ControlUtils.RenewItemsSource(AppliedInput, attrVariants, g => (g as GraphEntry)?.Id);
|
||||||
|
|
||||||
|
ControlUtils.RenewItemsSource(GraphList, GraphEntries, g => (g as GraphEntry)?.Id);
|
||||||
|
if (GraphEntries.Count == 1) {
|
||||||
GraphList.SelectedIndex = 0;
|
GraphList.SelectedIndex = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,201 +96,46 @@ namespace Elwig.Windows {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private string ParseContracts(JsonObject auszahlungsSorten, int num) {
|
private string ParseContracts(JsonObject auszahlungsSorten, int num) {
|
||||||
List<string> contracts = [];
|
return "";
|
||||||
|
|
||||||
foreach (var sorte in auszahlungsSorten) {
|
|
||||||
if (sorte.Key == "Kurven") continue;
|
|
||||||
foreach (var attribut in sorte.Value.AsObject()) {
|
|
||||||
foreach (var bindung in attribut.Value.AsObject()) {
|
|
||||||
if ((int)bindung.Value.AsValue() == num) {
|
|
||||||
contracts.Add($"{sorte.Key}/{attribut.Key}/{bindung.Key}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return string.Join("\n", contracts);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<bool> RemoveGraph(int num) {
|
|
||||||
var paymentVar = await Context.PaymentVariants.FindAsync(Year, AvNr);
|
|
||||||
if (paymentVar == null) return false;
|
|
||||||
var data = ParseData(paymentVar);
|
|
||||||
if (data == null) return false;
|
|
||||||
|
|
||||||
MessageBox.Show("1");
|
|
||||||
|
|
||||||
|
|
||||||
JsonArray? curves;
|
|
||||||
JsonObject? payment;
|
|
||||||
|
|
||||||
if (data["mode"]?.GetValue<string>() == "elwig") {
|
|
||||||
curves = data["curves"]?.AsArray();
|
|
||||||
payment = data["payment"]?.AsObject();
|
|
||||||
} else if (data["mode"]?.GetValue<string>() == "wgmaster") {
|
|
||||||
curves = data["Kurven"]?.AsArray();
|
|
||||||
payment = data["AuszahlungSorten"]?.AsObject();
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
MessageBox.Show("2");
|
|
||||||
|
|
||||||
|
|
||||||
if (curves == null || payment == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
MessageBox.Show("3");
|
|
||||||
|
|
||||||
foreach (var curve in curves) {
|
|
||||||
MessageBox.Show("LOOP");
|
|
||||||
if (curve?.AsObject()?["id"]?.GetValue<int>() == num) {
|
|
||||||
MessageBox.Show(curve.ToJsonString());
|
|
||||||
curves.Remove(curve);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
MessageBox.Show("4");
|
|
||||||
|
|
||||||
var keysToRemove = new List<string>();
|
|
||||||
foreach (var sorte in payment) {
|
|
||||||
MessageBox.Show(sorte.Value.GetType().ToString());
|
|
||||||
if (sorte.Value.AsValue().TryGetValue(out string? curve) && curve.Equals($"curve:{num}")) {
|
|
||||||
keysToRemove.Add(sorte.Key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var key in keysToRemove) {
|
|
||||||
payment.Remove(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
MessageBox.Show("5");
|
|
||||||
|
|
||||||
EntityEntry<PaymentVar>? tr = null;
|
|
||||||
try {
|
|
||||||
paymentVar.Data = data.ToString();
|
|
||||||
tr = Context.Update(paymentVar);
|
|
||||||
|
|
||||||
await Context.SaveChangesAsync();
|
|
||||||
await App.HintContextChange();
|
|
||||||
} catch (Exception exc) {
|
|
||||||
if (tr != null) await tr.ReloadAsync();
|
|
||||||
var str = "Der Eintrag konnte nicht in der Datenbank gelöscht werden!\n\n" + exc.Message;
|
|
||||||
if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;
|
|
||||||
MessageBox.Show(str, "Graph löschen", MessageBoxButton.OK, MessageBoxImage.Error);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task<int?> UpdateGraph(Graph g) {
|
|
||||||
var paymentVar = await Context.PaymentVariants.FindAsync(Year, AvNr);
|
|
||||||
if (paymentVar == null) return null;
|
|
||||||
|
|
||||||
var data = ParseData(paymentVar);
|
|
||||||
if (data == null) return null;
|
|
||||||
|
|
||||||
JsonArray? curves;
|
|
||||||
JsonObject? payment;
|
|
||||||
|
|
||||||
if (data["mode"]?.GetValue<string>() == "elwig") {
|
|
||||||
curves = data["curves"]?.AsArray();
|
|
||||||
payment = data["payment"]?.AsObject();
|
|
||||||
} else if (data["mode"]?.GetValue<string>() == "wgmaster") {
|
|
||||||
curves = data["Kurven"]?.AsArray();
|
|
||||||
payment = data["AuszahlungSorten"]?.AsObject();
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (curves == null || payment == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (IsEditing) {
|
|
||||||
int i = 0;
|
|
||||||
foreach (var curve in curves) {
|
|
||||||
if (curve?.AsObject()?["id"]?.GetValue<int>() == g.Id) {
|
|
||||||
curves[i] = g.ToJson();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
} else if(IsCreating) {
|
|
||||||
curves.Add(g.ToJson());
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
EntityEntry<PaymentVar>? tr = null;
|
|
||||||
try {
|
|
||||||
paymentVar.Data = data.ToString();
|
|
||||||
tr = Context.Update(paymentVar);
|
|
||||||
|
|
||||||
await Context.SaveChangesAsync();
|
|
||||||
await App.HintContextChange();
|
|
||||||
} catch (Exception exc) {
|
|
||||||
if (tr != null) await tr.ReloadAsync();
|
|
||||||
var str = "Der Eintrag konnte nicht in der Datenbank gelöscht werden!\n\n" + exc.Message;
|
|
||||||
if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;
|
|
||||||
MessageBox.Show(str, "Graph löschen", MessageBoxButton.OK, MessageBoxImage.Error);
|
|
||||||
}
|
|
||||||
|
|
||||||
return g.Id;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void RefreshInputs(bool validate = false) {
|
private void RefreshInputs(bool validate = false) {
|
||||||
ResetPlot();
|
ResetPlot();
|
||||||
ClearInputStates();
|
if (!PaymentVar.TestVariant) {
|
||||||
if (GraphList.SelectedItem is Graph g) {
|
AddButton.IsEnabled = false;
|
||||||
EditButton.IsEnabled = true;
|
CopyButton.IsEnabled = false;
|
||||||
DeleteButton.IsEnabled = true;
|
|
||||||
EnableOptionButtons();
|
|
||||||
FillInputs(g);
|
|
||||||
} else {
|
|
||||||
EditButton.IsEnabled = false;
|
|
||||||
DeleteButton.IsEnabled = false;
|
DeleteButton.IsEnabled = false;
|
||||||
|
OechsleInput.IsReadOnly = true;
|
||||||
|
PriceInput.IsReadOnly = true;
|
||||||
|
} else if (SelectedGraphEntry != null) {
|
||||||
|
CopyButton.IsEnabled = true;
|
||||||
|
DeleteButton.IsEnabled = true;
|
||||||
|
OechsleInput.IsReadOnly = false;
|
||||||
|
EnableOptionButtons();
|
||||||
|
FillInputs();
|
||||||
|
} else {
|
||||||
|
CopyButton.IsEnabled = false;
|
||||||
|
DeleteButton.IsEnabled = false;
|
||||||
|
OechsleInput.IsReadOnly = true;
|
||||||
DisableOptionButtons();
|
DisableOptionButtons();
|
||||||
ClearOriginalValues();
|
|
||||||
ClearInputs(validate);
|
|
||||||
ClearInputStates();
|
|
||||||
}
|
}
|
||||||
GC.Collect();
|
GC.Collect();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void FillInputs(Graph g) {
|
private void FillInputs() {
|
||||||
ClearOriginalValues();
|
GraphNum.Text = SelectedGraphEntry.Id.ToString();
|
||||||
|
|
||||||
Graph = (Graph)g.Clone();
|
|
||||||
|
|
||||||
GraphNumberInput.Text = Graph.Id.ToString();
|
|
||||||
if (Graph.Mode == BillingData.CurveMode.Oe) {
|
|
||||||
OechsleGraphType_Input.IsChecked = true;
|
|
||||||
} else if (Graph.Mode == BillingData.CurveMode.Kmw) {
|
|
||||||
KmwGraphType_Input.IsChecked = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
InitPlot();
|
InitPlot();
|
||||||
OechslePricePlot.IsEnabled = true;
|
OechslePricePlot.IsEnabled = true;
|
||||||
|
|
||||||
FinishInputFilling();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void InitInputs() {
|
|
||||||
GraphNumberInput.Text = (GraphList.Items.Count + 1).ToString();
|
|
||||||
OechsleGraphType_Input.IsChecked = true;
|
|
||||||
FinishInputFilling();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override async Task OnRenewContext() {
|
protected override async Task OnRenewContext() {
|
||||||
await base.OnRenewContext();
|
|
||||||
await RefreshGraphList();
|
await RefreshGraphList();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitPlot() {
|
private void InitPlot() {
|
||||||
OechslePricePlotScatter = OechslePricePlot.Plot.AddScatter(Graph.DataX, Graph.DataY);
|
OechslePricePlotScatter = OechslePricePlot.Plot.AddScatter(SelectedGraphEntry.DataGraph.DataX, SelectedGraphEntry.DataGraph.DataY);
|
||||||
|
|
||||||
OechslePricePlot.Configuration.DoubleClickBenchmark = false;
|
OechslePricePlot.Configuration.DoubleClickBenchmark = false;
|
||||||
OechslePricePlotScatter.LineColor = Color.Blue;
|
OechslePricePlotScatter.LineColor = Color.Blue;
|
||||||
@ -326,7 +176,6 @@ namespace Elwig.Windows {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void ResetPlot() {
|
private void ResetPlot() {
|
||||||
Graph = null;
|
|
||||||
PrimaryMarkedPointIndex = -1;
|
PrimaryMarkedPointIndex = -1;
|
||||||
OechslePricePlot.Plot.Remove(OechslePricePlotScatter);
|
OechslePricePlot.Plot.Remove(OechslePricePlotScatter);
|
||||||
OechslePricePlot.Plot.Clear();
|
OechslePricePlot.Plot.Clear();
|
||||||
@ -341,16 +190,12 @@ namespace Elwig.Windows {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void FlattenGraph(int begin, int end, double value) {
|
private void FlattenGraph(int begin, int end, double value) {
|
||||||
for (int i = begin; i <= end; i++) {
|
SelectedGraphEntry.DataGraph.FlattenGraph(begin, end, value);
|
||||||
Graph.DataY[i] = value;
|
|
||||||
}
|
|
||||||
OechslePricePlot.Render();
|
OechslePricePlot.Render();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void LinearIncreaseGraph(int begin, int end, double inc) {
|
private void LinearIncreaseGraph(int begin, int end, double inc) {
|
||||||
for (int i = begin; i < end; i++) {
|
SelectedGraphEntry.DataGraph.LinearIncreaseGraph(begin, end, inc);
|
||||||
Graph.DataY[i + 1] = Graph.DataY[i] + inc;
|
|
||||||
}
|
|
||||||
OechslePricePlot.Render();
|
OechslePricePlot.Render();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -441,8 +286,6 @@ namespace Elwig.Windows {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void OechsleInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
private void OechsleInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
||||||
IntegerInput_TextChanged(sender, evt);
|
|
||||||
|
|
||||||
bool success = int.TryParse(OechsleInput.Text, out int oechsle);
|
bool success = int.TryParse(OechsleInput.Text, out int oechsle);
|
||||||
|
|
||||||
SecondaryMarkedPointIndex = -1;
|
SecondaryMarkedPointIndex = -1;
|
||||||
@ -451,12 +294,13 @@ namespace Elwig.Windows {
|
|||||||
if (success) {
|
if (success) {
|
||||||
if (oechsle >= MinOechsle && oechsle <= MaxOechsle) {
|
if (oechsle >= MinOechsle && oechsle <= MaxOechsle) {
|
||||||
PrimaryMarkedPointIndex = oechsle - MinOechsle;
|
PrimaryMarkedPointIndex = oechsle - MinOechsle;
|
||||||
ChangeMarker(PrimaryMarkedPoint, true, Graph.DataX[PrimaryMarkedPointIndex], Graph.DataY[PrimaryMarkedPointIndex]);
|
ChangeMarker(PrimaryMarkedPoint, true, SelectedGraphEntry.DataGraph.DataX[PrimaryMarkedPointIndex], SelectedGraphEntry.DataGraph.DataY[PrimaryMarkedPointIndex]);
|
||||||
|
|
||||||
PriceInput.Text = Graph.DataY[PrimaryMarkedPointIndex].ToString();
|
PriceInput.Text = SelectedGraphEntry.DataGraph.DataY[PrimaryMarkedPointIndex].ToString();
|
||||||
|
|
||||||
if (IsEditing || IsCreating) EnableActionButtons();
|
EnableActionButtons();
|
||||||
OechslePricePlot.Render();
|
OechslePricePlot.Render();
|
||||||
|
PriceInput.IsReadOnly = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -466,6 +310,7 @@ namespace Elwig.Windows {
|
|||||||
DisableActionButtons();
|
DisableActionButtons();
|
||||||
PriceInput.Text = "";
|
PriceInput.Text = "";
|
||||||
OechslePricePlot.Render();
|
OechslePricePlot.Render();
|
||||||
|
PriceInput.IsReadOnly = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void PriceInput_TextChanged(object sender, RoutedEventArgs evt) {
|
private void PriceInput_TextChanged(object sender, RoutedEventArgs evt) {
|
||||||
@ -473,10 +318,8 @@ namespace Elwig.Windows {
|
|||||||
bool success = Double.TryParse(PriceInput.Text, out double price);
|
bool success = Double.TryParse(PriceInput.Text, out double price);
|
||||||
|
|
||||||
if (success) {
|
if (success) {
|
||||||
Graph.DataY[PrimaryMarkedPointIndex] = price;
|
SelectedGraphEntry.DataGraph.DataY[PrimaryMarkedPointIndex] = price;
|
||||||
PrimaryMarkedPoint.Y = price;
|
PrimaryMarkedPoint.Y = price;
|
||||||
SaveButton.IsEnabled = true;
|
|
||||||
ResetButton.IsEnabled = true;
|
|
||||||
OechslePricePlot.Refresh();
|
OechslePricePlot.Refresh();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -486,18 +329,14 @@ namespace Elwig.Windows {
|
|||||||
if (PrimaryMarkedPointIndex == -1) {
|
if (PrimaryMarkedPointIndex == -1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
FlattenGraph(0, PrimaryMarkedPointIndex, Graph.DataY[PrimaryMarkedPointIndex]);
|
FlattenGraph(0, PrimaryMarkedPointIndex, SelectedGraphEntry.DataGraph.DataY[PrimaryMarkedPointIndex]);
|
||||||
SaveButton.IsEnabled = true;
|
|
||||||
ResetButton.IsEnabled = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RightFlatButton_Click(object sender, RoutedEventArgs evt) {
|
private void RightFlatButton_Click(object sender, RoutedEventArgs evt) {
|
||||||
if (PrimaryMarkedPointIndex == -1) {
|
if (PrimaryMarkedPointIndex == -1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
FlattenGraph(PrimaryMarkedPointIndex, Graph.DataY.Length - 1, Graph.DataY[PrimaryMarkedPointIndex]);
|
FlattenGraph(PrimaryMarkedPointIndex, SelectedGraphEntry.DataGraph.DataY.Length - 1, SelectedGraphEntry.DataGraph.DataY[PrimaryMarkedPointIndex]);
|
||||||
SaveButton.IsEnabled = true;
|
|
||||||
ResetButton.IsEnabled = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InterpolateButton_Click(object sender, RoutedEventArgs evt) {
|
private void InterpolateButton_Click(object sender, RoutedEventArgs evt) {
|
||||||
@ -507,13 +346,11 @@ namespace Elwig.Windows {
|
|||||||
}
|
}
|
||||||
var (lowIndex, highIndex) = PrimaryMarkedPointIndex < SecondaryMarkedPointIndex ? (PrimaryMarkedPointIndex, SecondaryMarkedPointIndex): (SecondaryMarkedPointIndex, PrimaryMarkedPointIndex);
|
var (lowIndex, highIndex) = PrimaryMarkedPointIndex < SecondaryMarkedPointIndex ? (PrimaryMarkedPointIndex, SecondaryMarkedPointIndex): (SecondaryMarkedPointIndex, PrimaryMarkedPointIndex);
|
||||||
|
|
||||||
double step = (Graph.DataY[highIndex] - Graph.DataY[lowIndex]) / steps;
|
double step = (SelectedGraphEntry.DataGraph.DataY[highIndex] - SelectedGraphEntry.DataGraph.DataY[lowIndex]) / steps;
|
||||||
|
|
||||||
for (int i = lowIndex; i < highIndex - 1; i++) {
|
for (int i = lowIndex; i < highIndex - 1; i++) {
|
||||||
Graph.DataY[i + 1] = Math.Round(Graph.DataY[i] + step, 4); // TODO richtig runden
|
SelectedGraphEntry.DataGraph.DataY[i + 1] = Math.Round(SelectedGraphEntry.DataGraph.DataY[i] + step, 4); // TODO richtig runden
|
||||||
}
|
}
|
||||||
SaveButton.IsEnabled = true;
|
|
||||||
ResetButton.IsEnabled = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void LinearIncreaseButton_Click(object sender, RoutedEventArgs e) {
|
private void LinearIncreaseButton_Click(object sender, RoutedEventArgs e) {
|
||||||
@ -524,23 +361,21 @@ namespace Elwig.Windows {
|
|||||||
if (priceIncrease == null) {
|
if (priceIncrease == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
LinearIncreaseGraph(PrimaryMarkedPointIndex, Graph.DataY.Length - 1, priceIncrease.Value);
|
LinearIncreaseGraph(PrimaryMarkedPointIndex, SelectedGraphEntry.DataGraph.DataY.Length - 1, priceIncrease.Value);
|
||||||
SaveButton.IsEnabled = true;
|
|
||||||
ResetButton.IsEnabled = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OechslePricePlot_MouseDown(object sender, MouseEventArgs e) {
|
private void OechslePricePlot_MouseDown(object sender, MouseEventArgs e) {
|
||||||
if (!IsCreating && GraphList.SelectedItem == null) {
|
if (GraphList.SelectedItem == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HoverActive) {
|
if (HoverActive) {
|
||||||
if ((IsEditing || IsCreating) && Keyboard.IsKeyDown(Key.LeftCtrl)) {
|
if (PaymentVar.TestVariant && Keyboard.IsKeyDown(Key.LeftCtrl)) {
|
||||||
if (PrimaryMarkedPointIndex == -1) {
|
if (PrimaryMarkedPointIndex == -1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
SecondaryMarkedPointIndex = HighlightedIndex;
|
SecondaryMarkedPointIndex = HighlightedIndex;
|
||||||
ChangeMarker(SecondaryMarkedPoint, true, Graph.DataX[SecondaryMarkedPointIndex], Graph.DataY[SecondaryMarkedPointIndex]);
|
ChangeMarker(SecondaryMarkedPoint, true, SelectedGraphEntry.DataGraph.DataX[SecondaryMarkedPointIndex], SelectedGraphEntry.DataGraph.DataY[SecondaryMarkedPointIndex]);
|
||||||
|
|
||||||
InterpolateButton.IsEnabled = true;
|
InterpolateButton.IsEnabled = true;
|
||||||
|
|
||||||
@ -548,12 +383,12 @@ namespace Elwig.Windows {
|
|||||||
}
|
}
|
||||||
|
|
||||||
PrimaryMarkedPointIndex = HighlightedIndex;
|
PrimaryMarkedPointIndex = HighlightedIndex;
|
||||||
ChangeMarker(PrimaryMarkedPoint, true, Graph.DataX[PrimaryMarkedPointIndex], Graph.DataY[PrimaryMarkedPointIndex]);
|
ChangeMarker(PrimaryMarkedPoint, true, SelectedGraphEntry.DataGraph.DataX[PrimaryMarkedPointIndex], SelectedGraphEntry.DataGraph.DataY[PrimaryMarkedPointIndex]);
|
||||||
|
|
||||||
OechsleInput.Text = Graph.DataX[HighlightedIndex].ToString();
|
OechsleInput.Text = SelectedGraphEntry.DataGraph.DataX[HighlightedIndex].ToString();
|
||||||
PriceInput.Text = Graph.DataY[HighlightedIndex].ToString();
|
PriceInput.Text = SelectedGraphEntry.DataGraph.DataY[HighlightedIndex].ToString();
|
||||||
|
|
||||||
if (IsEditing || IsCreating) {
|
if (PaymentVar.TestVariant) {
|
||||||
EnableActionButtons();
|
EnableActionButtons();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -570,7 +405,7 @@ namespace Elwig.Windows {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void OechslePricePlot_MouseMove(object sender, MouseEventArgs e) {
|
private void OechslePricePlot_MouseMove(object sender, MouseEventArgs e) {
|
||||||
if (!IsCreating && GraphList.SelectedItem == null) {
|
if (GraphList.SelectedItem == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -607,144 +442,45 @@ namespace Elwig.Windows {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override protected void UpdateButtons() {
|
private int getMaxGraphId() {
|
||||||
if (!IsEditing && !IsCreating) return;
|
return GraphEntries.Count == 0 ? 0 : GraphEntries.Select(g => g.Id).Max();
|
||||||
bool ch = HasChanged, v = IsValid;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DisableNewEditDeleteButtons() {
|
private void AddButton_Click(object sender, RoutedEventArgs e) {
|
||||||
NewButton.IsEnabled = false;
|
GraphEntry newGraphEntry = new(getMaxGraphId() + 1, BillingData.CurveMode.Oe, MinOechsle, MaxOechsle);
|
||||||
EditButton.IsEnabled = false;
|
GraphEntries.Add(newGraphEntry);
|
||||||
DeleteButton.IsEnabled = false;
|
GraphList.Items.Refresh();
|
||||||
|
GraphList.SelectedItem = newGraphEntry;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void EnableNewEditDeleteButtons() {
|
private void CopyButton_Click(object sender, RoutedEventArgs e) {
|
||||||
NewButton.IsEnabled = true;
|
if (SelectedGraphEntry == null) return;
|
||||||
EditButton.IsEnabled = GraphList.SelectedItem != null;
|
|
||||||
DeleteButton.IsEnabled = GraphList.SelectedItem != null;
|
GraphEntry newGraphEntry = SelectedGraphEntry.Copy(getMaxGraphId() + 1);
|
||||||
|
GraphEntries.Add(newGraphEntry);
|
||||||
|
GraphList.Items.Refresh();
|
||||||
|
GraphList.SelectedItem = newGraphEntry;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ShowSaveResetCancelButtons() {
|
private void DeleteButton_Click(object sender, RoutedEventArgs e) {
|
||||||
SaveButton.IsEnabled = false;
|
if (SelectedGraphEntry == null) return;
|
||||||
ResetButton.IsEnabled = false;
|
|
||||||
CancelButton.IsEnabled = true;
|
|
||||||
SaveButton.Visibility = Visibility.Visible;
|
|
||||||
ResetButton.Visibility = Visibility.Visible;
|
|
||||||
CancelButton.Visibility = Visibility.Visible;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void HideSaveResetCancelButtons() {
|
|
||||||
SaveButton.IsEnabled = false;
|
|
||||||
ResetButton.IsEnabled = false;
|
|
||||||
CancelButton.IsEnabled = false;
|
|
||||||
SaveButton.Visibility = Visibility.Hidden;
|
|
||||||
ResetButton.Visibility = Visibility.Hidden;
|
|
||||||
CancelButton.Visibility = Visibility.Hidden;
|
|
||||||
}
|
|
||||||
private void ShowNewEditDeleteButtons() {
|
|
||||||
EnableNewEditDeleteButtons();
|
|
||||||
NewButton.Visibility = Visibility.Visible;
|
|
||||||
EditButton.Visibility = Visibility.Visible;
|
|
||||||
DeleteButton.Visibility = Visibility.Visible;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void HideNewEditDeleteButtons() {
|
|
||||||
DisableNewEditDeleteButtons();
|
|
||||||
NewButton.Visibility = Visibility.Hidden;
|
|
||||||
EditButton.Visibility = Visibility.Hidden;
|
|
||||||
DeleteButton.Visibility = Visibility.Hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void NewButton_Click(object sender, RoutedEventArgs e) {
|
|
||||||
IsCreating = true;
|
|
||||||
GraphList.IsEnabled = false;
|
|
||||||
GraphList.SelectedItem = null;
|
|
||||||
HideNewEditDeleteButtons();
|
|
||||||
ShowSaveResetCancelButtons();
|
|
||||||
UnlockInputs();
|
|
||||||
PriceInput.IsReadOnly = false;
|
|
||||||
OechsleInput.IsReadOnly = false;
|
|
||||||
InitInputs();
|
|
||||||
FillInputs(new Graph(GraphList.Items.Count + 1, BillingData.CurveMode.Oe, MinOechsle, MaxOechsle)); //TODO not hardcode oe
|
|
||||||
EnableOptionButtons();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void EditButton_Click(object sender, RoutedEventArgs e) {
|
|
||||||
if (GraphList.SelectedItem == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
IsEditing = true;
|
|
||||||
GraphList.IsEnabled = false;
|
|
||||||
|
|
||||||
HideNewEditDeleteButtons();
|
|
||||||
ShowSaveResetCancelButtons();
|
|
||||||
UnlockInputs();
|
|
||||||
PriceInput.IsReadOnly = false;
|
|
||||||
OechsleInput.IsReadOnly = false;
|
|
||||||
if (PrimaryMarkedPointIndex != -1) EnableActionButtons();
|
|
||||||
}
|
|
||||||
|
|
||||||
private async void DeleteButton_Click(object sender, RoutedEventArgs e) {
|
|
||||||
Graph g = (Graph)GraphList.SelectedItem;
|
|
||||||
if (g == null) return;
|
|
||||||
|
|
||||||
var r = MessageBox.Show(
|
var r = MessageBox.Show(
|
||||||
$"Soll der Graph {g.Id} (verwendet in folgenden Verträgen: {g.Contracts}) wirklich unwiderruflich gelöscht werden?",
|
$"Soll der Graph {SelectedGraphEntry.Id} (verwendet in folgenden Verträgen: {SelectedGraphEntry.Contracts}) wirklich gelöscht werden?",
|
||||||
"Graph löschen", MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.No);
|
"Graph löschen", MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.No);
|
||||||
|
|
||||||
if (r == MessageBoxResult.Yes) {
|
if (r == MessageBoxResult.Yes) {
|
||||||
bool success = await RemoveGraph(g.Id);
|
GraphEntries.Remove(SelectedGraphEntry);
|
||||||
if (!success) {
|
GraphList.Items.Refresh();
|
||||||
MessageBox.Show("Der Graph konnte nicht gelöscht werden", "Graph löschen", MessageBoxButton.OK, MessageBoxImage.Error);
|
|
||||||
}
|
|
||||||
await RefreshGraphList();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SaveButton_Click(object sender, RoutedEventArgs e) {
|
||||||
private async void SaveButton_Click(object sender, RoutedEventArgs e) {
|
//TODO SAVE
|
||||||
int? index = await UpdateGraph(Graph);
|
|
||||||
if (index == null) {
|
|
||||||
MessageBox.Show("Der Graph konnte nicht gespeichert werden", "Graph speichern", MessageBoxButton.OK, MessageBoxImage.Error);
|
|
||||||
}
|
|
||||||
IsEditing = false;
|
|
||||||
IsCreating = false;
|
|
||||||
GraphList.IsEnabled = true;
|
|
||||||
HideSaveResetCancelButtons();
|
|
||||||
ShowNewEditDeleteButtons();
|
|
||||||
LockInputs();
|
|
||||||
PriceInput.IsReadOnly = true;
|
|
||||||
OechsleInput.IsReadOnly = true;
|
|
||||||
await RefreshGraphList();
|
|
||||||
GraphList.SelectedIndex = index.Value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ResetButton_Click(object sender, RoutedEventArgs e) {
|
private void GraphList_SelectionChanged(object sender, SelectionChangedEventArgs e) {
|
||||||
if (IsEditing) {
|
SelectedGraphEntry = (GraphEntry)GraphList.SelectedItem;
|
||||||
RefreshInputs();
|
|
||||||
} else if (IsCreating) {
|
|
||||||
InitInputs();
|
|
||||||
}
|
|
||||||
UpdateButtons();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void CancelButton_Click(object sender, RoutedEventArgs e) {
|
|
||||||
IsEditing = false;
|
|
||||||
IsCreating = false;
|
|
||||||
GraphList.IsEnabled = true;
|
|
||||||
HideSaveResetCancelButtons();
|
|
||||||
ShowNewEditDeleteButtons();
|
|
||||||
DisableActionButtons();
|
|
||||||
RefreshInputs();
|
|
||||||
PriceInput.Text = "";
|
|
||||||
OechsleInput.Text = "";
|
|
||||||
ClearInputStates();
|
|
||||||
LockInputs();
|
|
||||||
PriceInput.IsReadOnly = true;
|
|
||||||
OechsleInput.IsReadOnly = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void GraphList_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) {
|
|
||||||
RefreshInputs();
|
RefreshInputs();
|
||||||
|
|
||||||
//var x = OechslePricePlot.Plot.GetPlottables().OfType<ScatterPlot>();
|
//var x = OechslePricePlot.Plot.GetPlottables().OfType<ScatterPlot>();
|
||||||
@ -759,11 +495,7 @@ namespace Elwig.Windows {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void GraphNumberInput_TextChanged(object sender, TextChangedEventArgs e) {
|
private void GebundenBonus_TextChanged(object sender, TextChangedEventArgs evt) {
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void GraphNumberInput_LostFocus(object sender, RoutedEventArgs e) {
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user