From f894c3b2127ccfe0747319c4004d1fd4b5a0c458 Mon Sep 17 00:00:00 2001
From: Lorenz Stechauner <lorenz.stechauner@necronda.net>
Date: Mon, 8 Jan 2024 14:20:20 +0100
Subject: [PATCH] PaymentVariantsWindow: Rework Buttons

---
 Elwig/Windows/PaymentVariantsWindow.xaml    | 85 +++++++++++++++------
 Elwig/Windows/PaymentVariantsWindow.xaml.cs | 62 ++++++++++++++-
 2 files changed, 118 insertions(+), 29 deletions(-)

diff --git a/Elwig/Windows/PaymentVariantsWindow.xaml b/Elwig/Windows/PaymentVariantsWindow.xaml
index 93cda0b..cbba99d 100644
--- a/Elwig/Windows/PaymentVariantsWindow.xaml
+++ b/Elwig/Windows/PaymentVariantsWindow.xaml
@@ -55,15 +55,15 @@
                 </DataTemplate>
             </ListBox.ItemTemplate>
         </ListBox>
-        <Button x:Name="AddButton" Content="&#xF8AA;" FontFamily="Segoe MDL2 Assets" FontSize="11" Padding="0,1.5,0,0"
-                Click="AddButton_Click"
-                VerticalAlignment="Center" HorizontalAlignment="Right" Width="25" Height="25" Margin="5,0,5,60" Grid.RowSpan="2"/>
-        <Button x:Name="CopyButton" Content="&#xE8C8;" FontFamily="Segoe MDL2 Assets" FontSize="12" Padding="0,0,0,0" IsEnabled="False"
-                Click="CopyButton_Click"
-                VerticalAlignment="Center" HorizontalAlignment="Right" Width="25" Height="25" Margin="5,0,5,0" Grid.RowSpan="2"/>
-        <Button x:Name="DeleteButton" Content="&#xF8AB;" FontFamily="Segoe MDL2 Assets" FontSize="11" Padding="0,1.5,0,0" IsEnabled="False"
-                Click="DeleteButton_Click"
-                VerticalAlignment="Center" HorizontalAlignment="Right" Width="25" Height="25" Margin="5,60,5,0" Grid.RowSpan="2"/>
+        <Button x:Name="AddButton" Content="&#xF8AA;" 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.RowSpan="2"
+                Click="AddButton_Click"/>
+        <Button x:Name="CopyButton" Content="&#xE8C8;" 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="5,0,5,0" Grid.RowSpan="2"
+                Click="CopyButton_Click"/>
+        <Button x:Name="DeleteButton" Content="&#xF8AB;" 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.RowSpan="2"
+                Click="DeleteButton_Click"/>
 
         <Label Content="Name:" Margin="10,10,0,0" Grid.Column="1"/>
         <TextBox x:Name="NameInput" Width="200" Grid.Column="2" HorizontalAlignment="Left" Margin="0,10,0,0"
@@ -80,27 +80,62 @@
         <TextBox x:Name="TransferDateInput" Grid.Column="2" Width="77" HorizontalAlignment="Left" Margin="0,100,10,0"
                  TextChanged="TransferDateInput_TextChanged"/>
 
-        <TextBox x:Name="DataInput" Margin="82,70,10,42" Grid.Column="2"
+        <TextBox x:Name="DataInput" Margin="82,70,10,74" Grid.Column="2"
                  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="auto"
                  AcceptsReturn="True" VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Auto"
                  FontFamily="Cascadia Code Light" FontSize="13"
                  TextChanged="DataInput_TextChanged"/>
 
-        <Button x:Name="SaveButton" Content="Speichern" Grid.Column="1" Grid.ColumnSpan="2"
-                Click="SaveButton_Click"
-                VerticalAlignment="Bottom" HorizontalAlignment="Center" Width="100" Margin="10,10,325,10"/>
-        <Button x:Name="CommitButton" Content="Festsetzen" Grid.Column="1" Grid.ColumnSpan="2"
-                Click="CommitButton_Click"
-                VerticalAlignment="Bottom" HorizontalAlignment="Center" Width="100" Margin="10,10,115,10"/>
-        <Button x:Name="RevertButton" Content="Freigeben" Grid.Column="1" Grid.ColumnSpan="2"
-                Click="RevertButton_Click"
-                VerticalAlignment="Bottom" HorizontalAlignment="Center" Width="100" Margin="10,10,115,10"/>
-        <Button x:Name="CalculateButton" Content="Berechnen" Grid.Column="1" Grid.ColumnSpan="2"
-                Click="CalculateButton_Click"
-                VerticalAlignment="Bottom" HorizontalAlignment="Center" Width="100" Margin="115,10,10,10"/>
-        <Button x:Name="EditButton" Content="Bearbeiten" Grid.Column="1" Grid.ColumnSpan="2"
-                Click="EditButton_Click"
-                VerticalAlignment="Bottom" HorizontalAlignment="Center" Width="100" Margin="325,10,10,10"/>
+        <Grid Grid.Column="1" Grid.ColumnSpan="2" VerticalAlignment="Bottom" HorizontalAlignment="Center" Margin="10,10,10,10">
+            <Grid.ColumnDefinitions>
+                <ColumnDefinition Width="110"/>
+                <ColumnDefinition Width="27"/>
+                <ColumnDefinition Width="110"/>
+                <ColumnDefinition Width="27"/>
+                <ColumnDefinition Width="110"/>
+            </Grid.ColumnDefinitions>
+            <Grid.RowDefinitions>
+                <RowDefinition Height="27"/>
+                <RowDefinition Height="5"/>
+                <RowDefinition Height="27"/>
+            </Grid.RowDefinitions>
+
+            <Grid.Resources>
+                <Style TargetType="Label">
+                    <Setter Property="HorizontalAlignment" Value="Center"/>
+                    <Setter Property="VerticalAlignment" Value="Center"/>
+                    <Setter Property="Padding" Value="0"/>
+                    <Setter Property="Height" Value="auto"/>
+                </Style>
+                <Style TargetType="Button">
+                    <Setter Property="HorizontalAlignment" Value="Stretch"/>
+                    <Setter Property="FontSize" Value="14"/>
+                </Style>
+            </Grid.Resources>
+
+            <Button x:Name="ModifierButton" Content="Zu-/Abschläge" Grid.Column="0" Grid.Row="0"
+                    Click="ModifierButton_Click"/>
+            <Label Content="&#xF0AF;" FontFamily="Segoe MDL2 Assets" FontSize="16" Grid.Row="0" Grid.Column="1" RenderTransformOrigin="0.5,0.5" >
+                <Label.RenderTransform>
+                    <TransformGroup>
+                        <RotateTransform Angle="45"/>
+                        <TranslateTransform Y="5"/>
+                    </TransformGroup>
+                </Label.RenderTransform>
+            </Label>
+            <Button x:Name="EditButton" Content="Bearbeiten" Grid.Column="0" Grid.Row="2"
+                    Click="EditButton_Click"/>
+            <Label Content="&#xF0AF;" FontFamily="Segoe MDL2 Assets" FontSize="16" Grid.Row="2" Grid.Column="1"/>
+            <Button x:Name="CalculateButton" Content="Berechnen" Grid.Column="2" Grid.Row="2"
+                    Click="CalculateButton_Click"/>
+            <Label Content="&#xF0AF;" FontFamily="Segoe MDL2 Assets" FontSize="16" Grid.Row="2" Grid.Column="3" x:Name="Arrow3"/>
+            <Button x:Name="CommitButton" Content="Festsetzen" Grid.Column="4" Grid.Row="2"
+                    Click="CommitButton_Click"/>
+            <Button x:Name="RevertButton" Content="Freigeben" Grid.Column="4" Grid.Row="2"
+                    Click="RevertButton_Click"/>
+            <Button x:Name="SaveButton" Content="Speichern" Grid.Column="4" Grid.Row="0"
+                    Click="SaveButton_Click"/>
+        </Grid>
 
         <Grid Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2">
             <Grid.ColumnDefinitions>
diff --git a/Elwig/Windows/PaymentVariantsWindow.xaml.cs b/Elwig/Windows/PaymentVariantsWindow.xaml.cs
index 349a526..fd083a5 100644
--- a/Elwig/Windows/PaymentVariantsWindow.xaml.cs
+++ b/Elwig/Windows/PaymentVariantsWindow.xaml.cs
@@ -46,6 +46,7 @@ namespace Elwig.Windows {
                 CommitButton.Visibility = !locked ? Visibility.Visible : Visibility.Hidden;
                 RevertButton.IsEnabled = locked;
                 RevertButton.Visibility = locked ? Visibility.Visible : Visibility.Hidden;
+                Arrow3.Content = locked ? "\xF0B0" : "\xF0AF";
                 CopyButton.IsEnabled = true;
                 EditButton.Content = locked ? "Ansehen" : "Bearbeiten";
                 ShowButton.IsEnabled = true;
@@ -72,6 +73,7 @@ namespace Elwig.Windows {
                 CommitButton.Visibility = Visibility.Visible;
                 RevertButton.IsEnabled = false;
                 RevertButton.Visibility = Visibility.Hidden;
+                Arrow3.Content = "\xF0AF";
                 DeleteButton.IsEnabled = false;
                 ShowButton.IsEnabled = false;
                 PrintButton.IsEnabled = false;
@@ -120,16 +122,64 @@ namespace Elwig.Windows {
             Update();
         }
 
-        private void AddButton_Click(object sender, RoutedEventArgs evt) {
+        private async void AddButton_Click(object sender, RoutedEventArgs evt) {
+            try {
+                PaymentVar v = Context.CreateProxy<PaymentVar>();
 
+                v.Year = Year;
+                v.AvNr = await Context.NextAvNr(Year);
+                v.Name = "Neue Auszahlungsvariante";
+                v.TestVariant = true;
+                v.DateString = $"{DateTime.Today:yyyy-MM-dd}";
+                v.Data = "{\"mode\": \"elwig\", \"version\": 1, \"payment\": 1.0, \"curves\": []}";
+
+                await Context.AddAsync(v);
+                await Context.SaveChangesAsync();
+                await App.HintContextChange();
+
+                ControlUtils.SelectListBoxItem(PaymentVariantList, v, v => (v as PaymentVar)?.AvNr);
+            } catch (Exception exc) {
+                var str = "Der Eintrag konnte nicht in der Datenbank aktualisiert werden!\n\n" + exc.Message;
+                if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;
+                MessageBox.Show(str, "Auszahlungsvariante erstellen", MessageBoxButton.OK, MessageBoxImage.Error);
+            }
         }
 
-        private void CopyButton_Click(object sender, RoutedEventArgs evt) {
+        private async void CopyButton_Click(object sender, RoutedEventArgs evt) {
+            if (PaymentVariantList.SelectedItem is not PaymentVar orig) return;
+            try {
+                PaymentVar n = Context.CreateProxy<PaymentVar>();
 
+                n.Year = orig.Year;
+                n.AvNr = await Context.NextAvNr(Year);
+                n.Name = $"{orig.Name} (Kopie)";
+                n.TestVariant = true;
+                n.DateString = $"{DateTime.Today:yyyy-MM-dd}";
+                n.Data = orig.Data;
+
+                await Context.AddAsync(n);
+                await Context.SaveChangesAsync();
+                await App.HintContextChange();
+
+                ControlUtils.SelectListBoxItem(PaymentVariantList, n, v => (v as PaymentVar)?.AvNr);
+            } catch (Exception exc) {
+                var str = "Der Eintrag konnte nicht in der Datenbank aktualisiert werden!\n\n" + exc.Message;
+                if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;
+                MessageBox.Show(str, "Auszahlungsvariante kopieren", MessageBoxButton.OK, MessageBoxImage.Error);
+            }
         }
 
-        private void DeleteButton_Click(object sender, RoutedEventArgs evt) {
-
+        private async void DeleteButton_Click(object sender, RoutedEventArgs evt) {
+            if (PaymentVariantList.SelectedItem is not PaymentVar v || !v.TestVariant) return;
+            try {
+                Context.Remove(v);
+                await Context.SaveChangesAsync();
+                await HintContextChange();
+            } catch (Exception exc) {
+                var str = "Der Eintrag konnte nicht in der Datenbank aktualisiert werden!\n\n" + exc.Message;
+                if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;
+                MessageBox.Show(str, "Auszahlungsvariante löschen", MessageBoxButton.OK, MessageBoxImage.Error);
+            }
         }
 
         private async void CalculateButton_Click(object sender, RoutedEventArgs evt) {
@@ -233,6 +283,10 @@ namespace Elwig.Windows {
             }
         }
 
+        private void ModifierButton_Click(object sender, RoutedEventArgs evt) {
+            App.FocusBaseDataSeason(Year);
+        }
+
         private void NameInput_TextChanged(object sender, TextChangedEventArgs evt) {
             if (PaymentVariantList.SelectedItem is not PaymentVar v) {
                 ControlUtils.ClearInputState(NameInput);