From dd408ca40e821d46493487c0b9dfa9d6832a3055 Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Sun, 24 Mar 2024 21:53:18 +0100 Subject: [PATCH] [#31] AdministrationWindow: Add shortcuts --- Elwig/Windows/AdministrationWindow.cs | 24 ++++++++++++ Elwig/Windows/AreaComAdminWindow.xaml | 36 +++++++++++++++--- Elwig/Windows/AreaComAdminWindow.xaml.cs | 45 ++++++++++++++++++---- Elwig/Windows/BaseDataWindow.xaml | 24 ++++++++++-- Elwig/Windows/BaseDataWindow.xaml.cs | 29 ++++++++++++-- Elwig/Windows/DeliveryAdminWindow.xaml | 44 ++++++++++++++++++---- Elwig/Windows/DeliveryAdminWindow.xaml.cs | 46 +++++++++++++++++++---- Elwig/Windows/MemberAdminWindow.xaml | 36 +++++++++++++++--- Elwig/Windows/MemberAdminWindow.xaml.cs | 44 ++++++++++++++++++---- 9 files changed, 279 insertions(+), 49 deletions(-) diff --git a/Elwig/Windows/AdministrationWindow.cs b/Elwig/Windows/AdministrationWindow.cs index 19a2409..b882323 100644 --- a/Elwig/Windows/AdministrationWindow.cs +++ b/Elwig/Windows/AdministrationWindow.cs @@ -11,6 +11,7 @@ using System.Windows; using System.Windows.Controls; using System.Windows.Threading; using Xceed.Wpf.Toolkit; +using System.Windows.Input; namespace Elwig.Windows { public abstract class AdministrationWindow : ContextWindow { @@ -48,7 +49,18 @@ namespace Elwig.Windows { private readonly Dictionary OriginalValues; private readonly Dictionary DefaultValues; + private readonly RoutedCommand AltInsert = new("AltInsert", typeof(AdministrationWindow), [new KeyGesture(Key.Insert, ModifierKeys.Alt)]); + private readonly RoutedCommand AltDelete = new("AltDelete", typeof(AdministrationWindow), [new KeyGesture(Key.Delete, ModifierKeys.Alt)]); + private readonly RoutedCommand CtrlZ = new("CtrlZ", typeof(AdministrationWindow), [new KeyGesture(Key.Z, ModifierKeys.Control)]); + private readonly RoutedCommand CtrlS = new("CtrlS", typeof(AdministrationWindow), [new KeyGesture(Key.S, ModifierKeys.Control)]); + private readonly RoutedCommand CtrlB = new("CtrlB", typeof(AdministrationWindow), [new KeyGesture(Key.B, ModifierKeys.Control)]); + public AdministrationWindow() : base() { + CommandBindings.Add(new CommandBinding(AltInsert, ShortcutNew)); + CommandBindings.Add(new CommandBinding(AltDelete, ShortcutDelete)); + CommandBindings.Add(new CommandBinding(CtrlZ, ShortcutReset)); + CommandBindings.Add(new CommandBinding(CtrlS, ShortcutSave)); + CommandBindings.Add(new CommandBinding(CtrlB, ShortcutEdit)); IsEditing = false; IsCreating = false; ExemptInputs = []; @@ -69,6 +81,18 @@ namespace Elwig.Windows { Loaded += base.OnLoaded; } + abstract protected void ShortcutNew(); + abstract protected void ShortcutDelete(); + abstract protected void ShortcutReset(); + abstract protected void ShortcutSave(); + abstract protected void ShortcutEdit(); + + private void ShortcutNew(object sender, EventArgs evt) { ShortcutNew(); } + private void ShortcutDelete(object sender, EventArgs evt) { ShortcutDelete(); } + private void ShortcutReset(object sender, EventArgs evt) { ShortcutReset(); } + private void ShortcutSave(object sender, EventArgs evt) { ShortcutSave(); } + private void ShortcutEdit(object sender, EventArgs evt) { ShortcutEdit(); } + private new void OnLoaded(object sender, RoutedEventArgs evt) { TextBoxInputs = ControlUtils.FindAllChildren(this, ExemptInputs).ToArray(); ComboBoxInputs = ControlUtils.FindAllChildren(this, ExemptInputs).ToArray(); diff --git a/Elwig/Windows/AreaComAdminWindow.xaml b/Elwig/Windows/AreaComAdminWindow.xaml index 684c583..94766d4 100644 --- a/Elwig/Windows/AreaComAdminWindow.xaml +++ b/Elwig/Windows/AreaComAdminWindow.xaml @@ -95,18 +95,42 @@ diff --git a/Elwig/Windows/AreaComAdminWindow.xaml.cs b/Elwig/Windows/AreaComAdminWindow.xaml.cs index a6d32f9..a373b60 100644 --- a/Elwig/Windows/AreaComAdminWindow.xaml.cs +++ b/Elwig/Windows/AreaComAdminWindow.xaml.cs @@ -209,7 +209,13 @@ namespace Elwig.Windows { await RefreshAreaCommitmentList(); } - private void NewAreaCommitmentButton_Click(object sender, RoutedEventArgs evt) { + protected override void ShortcutNew() { + if (!NewAreaCommitmentButton.IsEnabled || NewAreaCommitmentButton.Visibility != Visibility.Visible) + return; + NewAreaCommitmentButton_Click(null, null); + } + + private void NewAreaCommitmentButton_Click(object? sender, RoutedEventArgs? evt) { IsCreating = true; AreaCommitmentList.IsEnabled = false; AreaCommitmentList.SelectedItem = null; @@ -220,7 +226,14 @@ namespace Elwig.Windows { LockSearchInputs(); } - private void EditAreaCommitmentButton_Click(object sender, RoutedEventArgs evt) { + + protected override void ShortcutEdit() { + if (!EditAreaCommitmentButton.IsEnabled || EditAreaCommitmentButton.Visibility != Visibility.Visible) + return; + EditAreaCommitmentButton_Click(null, null); + } + + private void EditAreaCommitmentButton_Click(object? sender, RoutedEventArgs? evt) { if (AreaCommitmentList.SelectedItem == null) return; @@ -233,14 +246,20 @@ namespace Elwig.Windows { LockSearchInputs(); } - private async void DeleteAreaCommitmentButton_Click(object sender, RoutedEventArgs evt) { + protected override void ShortcutDelete() { + if (!DeleteAreaCommitmentButton.IsEnabled || DeleteAreaCommitmentButton.Visibility != Visibility.Visible) + return; + DeleteAreaCommitmentButton_Click(null, null); + } + + private async void DeleteAreaCommitmentButton_Click(object? sender, RoutedEventArgs? evt) { AreaCom a = (AreaCom)AreaCommitmentList.SelectedItem; if (a == null) return; var r = MessageBox.Show( $"Soll die Flächenbindung {a.GstNr} ({a.Area} m²) wirklich unwiderruflich gelöscht werden?", - "Flächenbindung löschen", MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.No); - if (r == MessageBoxResult.Yes) { + "Flächenbindung löschen", MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel); + if (r == MessageBoxResult.OK) { using var ctx = new AppDbContext(); ctx.Remove(a); await ctx.SaveChangesAsync(); @@ -291,7 +310,13 @@ namespace Elwig.Windows { return newFbNr; } - private async void AreaCommitmentSaveButton_Click(object sender, RoutedEventArgs evt) { + protected override void ShortcutSave() { + if (!AreaCommitmentSaveButton.IsEnabled || AreaCommitmentSaveButton.Visibility != Visibility.Visible) + return; + AreaCommitmentSaveButton_Click(null, null); + } + + private async void AreaCommitmentSaveButton_Click(object? sender, RoutedEventArgs? evt) { int? fbnr = null; try { fbnr = await UpdateAreaCom((AreaCommitmentList.SelectedItem as AreaCom)?.FbNr); @@ -314,7 +339,13 @@ namespace Elwig.Windows { ControlUtils.SelectItem(AreaCommitmentList, AreaCommitmentList.ItemsSource.Cast().Where(a => a.FbNr == fbnr).FirstOrDefault()); } - private void AreaCommitmentResetButton_Click(object sender, RoutedEventArgs evt) { + protected override void ShortcutReset() { + if (!AreaCommitmentResetButton.IsEnabled || AreaCommitmentResetButton.Visibility != Visibility.Visible) + return; + AreaCommitmentResetButton_Click(null, null); + } + + private void AreaCommitmentResetButton_Click(object? sender, RoutedEventArgs? evt) { if (IsEditing) { RefreshInputs(); } else if (IsCreating) { diff --git a/Elwig/Windows/BaseDataWindow.xaml b/Elwig/Windows/BaseDataWindow.xaml index 3c84da5..e60f0d3 100644 --- a/Elwig/Windows/BaseDataWindow.xaml +++ b/Elwig/Windows/BaseDataWindow.xaml @@ -559,15 +559,31 @@ diff --git a/Elwig/Windows/BaseDataWindow.xaml.cs b/Elwig/Windows/BaseDataWindow.xaml.cs index f1a8616..2b5f0d0 100644 --- a/Elwig/Windows/BaseDataWindow.xaml.cs +++ b/Elwig/Windows/BaseDataWindow.xaml.cs @@ -37,6 +37,10 @@ namespace Elwig.Windows { WineAttributeFillLowerLabel.Visibility = Visibility.Hidden; } + protected override void ShortcutNew() { } + + protected override void ShortcutDelete() { } + new protected void LockInputs() { base.LockInputs(); @@ -228,7 +232,14 @@ namespace Elwig.Windows { await ModifiersFinishEditing(ctx); } - private async void EditButton_Click(object sender, RoutedEventArgs evt) { + + protected override void ShortcutEdit() { + if (!EditButton.IsEnabled || EditButton.Visibility != Visibility.Visible) + return; + EditButton_Click(null, null); + } + + private async void EditButton_Click(object? sender, RoutedEventArgs? evt) { IsEditing = true; EditButton.Visibility = Visibility.Hidden; ResetButton.Visibility = Visibility.Visible; @@ -255,7 +266,13 @@ namespace Elwig.Windows { LockInputs(); } - private async void ResetButton_Click(object sender, RoutedEventArgs evt) { + protected override void ShortcutReset() { + if (!ResetButton.IsEnabled || ResetButton.Visibility != Visibility.Visible) + return; + ResetButton_Click(null, null); + } + + private async void ResetButton_Click(object? sender, RoutedEventArgs? evt) { _branchChanged = false; _attrChanged = false; _cultChanged = false; @@ -268,7 +285,13 @@ namespace Elwig.Windows { UpdateButtons(); } - private async void SaveButton_Click(object sender, RoutedEventArgs evt) { + protected override void ShortcutSave() { + if (!SaveButton.IsEnabled || SaveButton.Visibility != Visibility.Visible) + return; + SaveButton_Click(null, null); + } + + private async void SaveButton_Click(object? sender, RoutedEventArgs? evt) { try { await Save(); } catch (Exception exc) { diff --git a/Elwig/Windows/DeliveryAdminWindow.xaml b/Elwig/Windows/DeliveryAdminWindow.xaml index 37e39e3..1aa9005 100644 --- a/Elwig/Windows/DeliveryAdminWindow.xaml +++ b/Elwig/Windows/DeliveryAdminWindow.xaml @@ -183,33 +183,61 @@ ToolTip="Neue Teillieferung auf selben Lieferschein hinzufügen" HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Margin="2.5,5,2.5,10" Grid.Column="1" Grid.Row="2" Click="NewDeliveryPartButton_Click"/> - diff --git a/Elwig/Windows/DeliveryAdminWindow.xaml.cs b/Elwig/Windows/DeliveryAdminWindow.xaml.cs index 71d6025..4cd71a7 100644 --- a/Elwig/Windows/DeliveryAdminWindow.xaml.cs +++ b/Elwig/Windows/DeliveryAdminWindow.xaml.cs @@ -1276,6 +1276,12 @@ namespace Elwig.Windows { } } + protected override void ShortcutNew() { + if (!NewDeliveryButton.IsEnabled || NewDeliveryButton.Visibility != Visibility.Visible) + return; + NewDeliveryButton_Click(null, null); + } + private async void NewDeliveryButton_Click(object? sender, RoutedEventArgs? evt) { TodayOnlyInput.IsChecked = true; SearchInput.Text = ""; @@ -1357,7 +1363,13 @@ namespace Elwig.Windows { WeighingId = null; } - private void EditDeliveryButton_Click(object sender, RoutedEventArgs evt) { + protected override void ShortcutEdit() { + if (!EditDeliveryButton.IsEnabled || EditDeliveryButton.Visibility != Visibility.Visible) + return; + EditDeliveryButton_Click(null, null); + } + + private void EditDeliveryButton_Click(object? sender, RoutedEventArgs? evt) { if (DeliveryPartList.SelectedItem == null) return; @@ -1375,14 +1387,20 @@ namespace Elwig.Windows { DeleteDeliveryPartButton.IsEnabled = false; } - private async void DeleteDeliveryButton_Click(object sender, RoutedEventArgs evt) { + protected override void ShortcutDelete() { + if (!DeleteDeliveryButton.IsEnabled || DeleteDeliveryButton.Visibility != Visibility.Visible) + return; + DeleteDeliveryButton_Click(null, null); + } + + private async void DeleteDeliveryButton_Click(object? sender, RoutedEventArgs? evt) { if (DeliveryList.SelectedItem is not Delivery d) return; var r = MessageBox.Show( $"Soll die Lieferung {d.LsNr} ({d.Member.AdministrativeName}, MgNr. {d.Member.MgNr}) wirklich unwiderruflich gelöscht werden?", - "Lieferung löschen", MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.No); - if (r == MessageBoxResult.Yes) { + "Lieferung löschen", MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel); + if (r == MessageBoxResult.OK) { Mouse.OverrideCursor = Cursors.AppStarting; using (var ctx = new AppDbContext()) { ctx.Remove(d); @@ -1394,7 +1412,13 @@ namespace Elwig.Windows { } } - private async void SaveButton_Click(object sender, RoutedEventArgs evt) { + protected override void ShortcutSave() { + if (!SaveButton.IsEnabled || SaveButton.Visibility != Visibility.Visible) + return; + SaveButton_Click(null, null); + } + + private async void SaveButton_Click(object? sender, RoutedEventArgs? evt) { SaveButton.IsEnabled = false; SaveButton.Cursor = Cursors.Wait; @@ -1425,7 +1449,13 @@ namespace Elwig.Windows { DeleteDeliveryPartButton.IsEnabled = DeliveryList.SelectedItem is Delivery { Parts.Count: > 1 } && !IsCreating; } - private void ResetButton_Click(object sender, RoutedEventArgs evt) { + protected override void ShortcutReset() { + if (!ResetButton.IsEnabled || ResetButton.Visibility != Visibility.Visible) + return; + ResetButton_Click(null, null); + } + + private void ResetButton_Click(object? sender, RoutedEventArgs? evt) { if (IsEditing) { RefreshInputs(); } else if (IsCreating) { @@ -1522,8 +1552,8 @@ namespace Elwig.Windows { var r = MessageBox.Show( $"Soll die Teillieferung Nr. {p.DPNr} wirklich unwiderruflich gelöscht werden?", - "Lieferung löschen", MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.No); - if (r == MessageBoxResult.Yes) { + "Lieferung löschen", MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel); + if (r == MessageBoxResult.OK) { Mouse.OverrideCursor = Cursors.AppStarting; using (var ctx = new AppDbContext()) { ctx.Remove(p); diff --git a/Elwig/Windows/MemberAdminWindow.xaml b/Elwig/Windows/MemberAdminWindow.xaml index a014a71..c15da9a 100644 --- a/Elwig/Windows/MemberAdminWindow.xaml +++ b/Elwig/Windows/MemberAdminWindow.xaml @@ -164,23 +164,47 @@ diff --git a/Elwig/Windows/MemberAdminWindow.xaml.cs b/Elwig/Windows/MemberAdminWindow.xaml.cs index 2562e1b..c57f09d 100644 --- a/Elwig/Windows/MemberAdminWindow.xaml.cs +++ b/Elwig/Windows/MemberAdminWindow.xaml.cs @@ -369,7 +369,13 @@ namespace Elwig.Windows { await RefreshMemberListQuery(); } - private void NewMemberButton_Click(object sender, RoutedEventArgs evt) { + protected override void ShortcutNew() { + if (!NewMemberButton.IsEnabled || NewMemberButton.Visibility != Visibility.Visible) + return; + NewMemberButton_Click(null, null); + } + + private void NewMemberButton_Click(object? sender, RoutedEventArgs? evt) { IsCreating = true; MemberList.IsEnabled = false; MemberList.SelectedItem = null; @@ -383,7 +389,13 @@ namespace Elwig.Windows { LockSearchInputs(); } - private void EditMemberButton_Click(object sender, RoutedEventArgs evt) { + protected override void ShortcutEdit() { + if (!EditMemberButton.IsEnabled || EditMemberButton.Visibility != Visibility.Visible) + return; + EditMemberButton_Click(null, null); + } + + private void EditMemberButton_Click(object? sender, RoutedEventArgs? evt) { if (MemberList.SelectedItem == null) return; @@ -399,15 +411,21 @@ namespace Elwig.Windows { LockSearchInputs(); } - private async void DeleteMemberButton_Click(object sender, RoutedEventArgs evt) { + protected override void ShortcutDelete() { + if (!DeleteMemberButton.IsEnabled || DeleteMemberButton.Visibility != Visibility.Visible) + return; + DeleteMemberButton_Click(null, null); + } + + private async void DeleteMemberButton_Click(object? sender, RoutedEventArgs? evt) { if (MemberList.SelectedItem is not Member m) return; var r = MessageBox.Show( $"Soll das Mitglied \"{m.AdministrativeName}\" (MgNr. {m.MgNr}) wirklich unwiderruflich gelöscht werden?\n" + $"Sämtliche Lieferungen und Flächenbindungen dieses Mitglieds werden auch gelöscht!", - "Mitglied löschen", MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.No); - if (r == MessageBoxResult.Yes) { + "Mitglied löschen", MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel); + if (r == MessageBoxResult.OK) { using var ctx = new AppDbContext(); ctx.Remove(m); await ctx.SaveChangesAsync(); @@ -415,7 +433,13 @@ namespace Elwig.Windows { } } - private async void SaveButton_Click(object sender, RoutedEventArgs evt) { + protected override void ShortcutSave() { + if (!SaveButton.IsEnabled || SaveButton.Visibility != Visibility.Visible) + return; + SaveButton_Click(null, null); + } + + private async void SaveButton_Click(object? sender, RoutedEventArgs? evt) { int? mgnr = null; try { mgnr = await UpdateMember((MemberList.SelectedItem as Member)?.MgNr); @@ -440,7 +464,13 @@ namespace Elwig.Windows { FocusMember(m); } - private void ResetButton_Click(object sender, RoutedEventArgs evt) { + protected override void ShortcutReset() { + if (!ResetButton.IsEnabled || ResetButton.Visibility != Visibility.Visible) + return; + ResetButton_Click(null, null); + } + + private void ResetButton_Click(object? sender, RoutedEventArgs? evt) { TransferPredecessorAreaComs = false; CancelAreaComs = false; if (IsEditing) {