diff --git a/LehrerApp.Desktop/ViewModels/Groups/ParticipationViewModels.cs b/LehrerApp.Desktop/ViewModels/Groups/ParticipationViewModels.cs index 5777db6..e349b5b 100644 --- a/LehrerApp.Desktop/ViewModels/Groups/ParticipationViewModels.cs +++ b/LehrerApp.Desktop/ViewModels/Groups/ParticipationViewModels.cs @@ -468,7 +468,7 @@ public static class HomeworkDisplay public static string Label(HomeworkStatus? status) => status switch { - null => "Keine Hausaufgabe erfasst", + null => "Keine Hausaufgabe aufgegeben", HomeworkStatus.Completed => "Hausaufgabe gemacht", HomeworkStatus.PartiallyCompleted => "Teilweise angefertigt – Rest offen", HomeworkStatus.PartialSubmittedLate => "Teilweise angefertigt – Rest nachgereicht", @@ -476,7 +476,7 @@ public static class HomeworkDisplay HomeworkStatus.MissingOpen => "Nicht gemacht – Nachreichen offen", HomeworkStatus.MissingOverdue => "Nicht gemacht – nicht mehr nachgereicht", HomeworkStatus.SubmittedLate => "Hausaufgabe nachgereicht", - _ => "Keine Hausaufgabe erfasst", + _ => "Keine Hausaufgabe aufgegeben", }; public static string Symbol(HomeworkStatus? status) => status switch diff --git a/LehrerApp.Desktop/Views/Groups/AttendanceHomeworkQuickInputDialog.axaml b/LehrerApp.Desktop/Views/Groups/AttendanceHomeworkQuickInputDialog.axaml index 22b244a..7f62a8a 100644 --- a/LehrerApp.Desktop/Views/Groups/AttendanceHomeworkQuickInputDialog.axaml +++ b/LehrerApp.Desktop/Views/Groups/AttendanceHomeworkQuickInputDialog.axaml @@ -28,9 +28,9 @@ + Text="Anwesenheit: 1 anwesend · 2 Entschuldigung offen · 5 krank/entschuldigt · 7 andere Schulveranstaltung · 9 geschwänzt · 0 unentschuldigt · X nicht kontrolliert"/> + Text="Hausaufgaben mit Alt/⌥: 1 gemacht · 3 teilweise/Rest offen · 4 Rest nachgereicht · 5 Rest nicht nachgereicht · 7 nicht gemacht/offen · 8 vollständig nachgereicht · 0 endgültig nicht nachgereicht · X keine aufgegeben"/> diff --git a/LehrerApp.Desktop/Views/Groups/AttendanceHomeworkQuickInputDialog.axaml.cs b/LehrerApp.Desktop/Views/Groups/AttendanceHomeworkQuickInputDialog.axaml.cs index b4f0959..beb7659 100644 --- a/LehrerApp.Desktop/Views/Groups/AttendanceHomeworkQuickInputDialog.axaml.cs +++ b/LehrerApp.Desktop/Views/Groups/AttendanceHomeworkQuickInputDialog.axaml.cs @@ -13,10 +13,16 @@ namespace LehrerApp.Desktop.Views.Groups; public partial class AttendanceHomeworkQuickInputDialog : Window { + private bool _leftAltDown; + private bool _rightAltDown; + public AttendanceHomeworkQuickInputDialog() { InitializeComponent(); BuildColumns(); + // Im Tunnel lauschen, bevor DataGrid/Button einen Modifier-Event konsumieren können. + AddHandler(KeyDownEvent, OnPreviewKeyDown, RoutingStrategies.Tunnel, handledEventsToo: true); + AddHandler(KeyUpEvent, OnPreviewKeyUp, RoutingStrategies.Tunnel, handledEventsToo: true); } protected override void OnOpened(EventArgs e) @@ -55,13 +61,13 @@ public partial class AttendanceHomeworkQuickInputDialog : Window if (row is null) return new TextBlock(); var button = StatusButton(185); var flyout = new MenuFlyout { Placement = PlacementMode.BottomEdgeAlignedLeft }; - AddAttendanceItem(flyout, row, "· Nicht kontrolliert", null); - AddAttendanceItem(flyout, row, "✓ Anwesend", AttendanceStatus.Present); - AddAttendanceItem(flyout, row, "? Entschuldigung offen", AttendanceStatus.ExcusePending); - AddAttendanceItem(flyout, row, "⊘ Krank, entschuldigt", AttendanceStatus.Excused); - AddAttendanceItem(flyout, row, "! Unentschuldigt", AttendanceStatus.Unexcused); - AddAttendanceItem(flyout, row, "✕ Geschwänzt", AttendanceStatus.Truant); - AddAttendanceItem(flyout, row, "◇ Andere Schulveranstaltung", AttendanceStatus.OtherSchoolEvent); + AddAttendanceItem(flyout, row, "[1] ✓ Anwesend", AttendanceStatus.Present); + AddAttendanceItem(flyout, row, "[2] ? Entschuldigung offen", AttendanceStatus.ExcusePending); + AddAttendanceItem(flyout, row, "[5] ⊘ Krank, entschuldigt", AttendanceStatus.Excused); + AddAttendanceItem(flyout, row, "[7] ◇ Andere Schulveranstaltung", AttendanceStatus.OtherSchoolEvent); + AddAttendanceItem(flyout, row, "[9] ✕ Geschwänzt", AttendanceStatus.Truant); + AddAttendanceItem(flyout, row, "[0] ! Unentschuldigt", AttendanceStatus.Unexcused); + AddAttendanceItem(flyout, row, "[X] · Nicht kontrolliert", null); button.Flyout = flyout; void Refresh() @@ -84,14 +90,14 @@ public partial class AttendanceHomeworkQuickInputDialog : Window if (row is null) return new TextBlock(); var button = StatusButton(245); var flyout = new MenuFlyout { Placement = PlacementMode.BottomEdgeAlignedLeft }; - AddHomeworkItem(flyout, row, "· Keine Hausaufgabe", null); - AddHomeworkItem(flyout, row, "✓ Gemacht", HomeworkStatus.Completed); - AddHomeworkItem(flyout, row, "◐ Teilweise, Rest offen", HomeworkStatus.PartiallyCompleted); - AddHomeworkItem(flyout, row, "◕ Rest nachgereicht", HomeworkStatus.PartialSubmittedLate); - AddHomeworkItem(flyout, row, "◒ Rest nicht nachgereicht", HomeworkStatus.PartialMissingOverdue); - AddHomeworkItem(flyout, row, "! Nicht gemacht, Nachreichen offen", HomeworkStatus.MissingOpen); - AddHomeworkItem(flyout, row, "✕ Nicht mehr nachgereicht", HomeworkStatus.MissingOverdue); - AddHomeworkItem(flyout, row, "↺ Nachgereicht", HomeworkStatus.SubmittedLate); + AddHomeworkItem(flyout, row, "[⌥1] ✓ Gemacht", HomeworkStatus.Completed); + AddHomeworkItem(flyout, row, "[⌥3] ◐ Teilweise, Rest offen", HomeworkStatus.PartiallyCompleted); + AddHomeworkItem(flyout, row, "[⌥4] ◕ Rest nachgereicht", HomeworkStatus.PartialSubmittedLate); + AddHomeworkItem(flyout, row, "[⌥5] ◒ Rest nicht nachgereicht", HomeworkStatus.PartialMissingOverdue); + AddHomeworkItem(flyout, row, "[⌥7] ! Nicht gemacht, Nachreichen offen", HomeworkStatus.MissingOpen); + AddHomeworkItem(flyout, row, "[⌥8] ↺ Vollständig nachgereicht", HomeworkStatus.SubmittedLate); + AddHomeworkItem(flyout, row, "[⌥0] ✕ Nicht mehr nachgereicht", HomeworkStatus.MissingOverdue); + AddHomeworkItem(flyout, row, "[⌥X] · Keine Hausaufgabe aufgegeben", null); button.Flyout = flyout; void Refresh() => UpdateButton(button, row.HomeworkSymbol, row.HomeworkTooltip, @@ -154,27 +160,41 @@ public partial class AttendanceHomeworkQuickInputDialog : Window } } - protected override void OnKeyDown(KeyEventArgs e) + private void OnPreviewKeyDown(object? sender, KeyEventArgs e) { + if (e.PhysicalKey == PhysicalKey.AltLeft) + { + _leftAltDown = true; + return; + } + if (e.PhysicalKey == PhysicalKey.AltRight) + { + _rightAltDown = true; + return; + } + var vm = ViewModel; var row = vm?.SelectedRow; - if (vm is null || row is null) { base.OnKeyDown(e); return; } + if (vm is null || row is null) return; - if (e.KeyModifiers.HasFlag(KeyModifiers.Alt)) + var digit = DigitFromEvent(e); + var isX = e.Key == Key.X || e.PhysicalKey == PhysicalKey.X; + var altDown = _leftAltDown || _rightAltDown || + e.KeyModifiers.HasFlag(KeyModifiers.Alt); + if (altDown) { - var homework = e.Key switch + HomeworkStatus? homework = isX ? null : digit switch { - Key.D0 or Key.NumPad0 => (HomeworkStatus?)null, - Key.M => HomeworkStatus.Completed, - Key.T => HomeworkStatus.PartiallyCompleted, - Key.R => HomeworkStatus.PartialSubmittedLate, - Key.X => HomeworkStatus.PartialMissingOverdue, - Key.O => HomeworkStatus.MissingOpen, - Key.F => HomeworkStatus.MissingOverdue, - Key.S => HomeworkStatus.SubmittedLate, + 1 => HomeworkStatus.Completed, + 3 => HomeworkStatus.PartiallyCompleted, + 4 => HomeworkStatus.PartialSubmittedLate, + 5 => HomeworkStatus.PartialMissingOverdue, + 7 => HomeworkStatus.MissingOpen, + 8 => HomeworkStatus.SubmittedLate, + 0 => HomeworkStatus.MissingOverdue, _ => null, }; - var recognized = e.Key is Key.D0 or Key.NumPad0 or Key.M or Key.T or Key.R or Key.X or Key.O or Key.F or Key.S; + var recognized = isX || digit is 0 or 1 or 3 or 4 or 5 or 7 or 8; if (recognized) { vm.ApplyHomework(row, homework); @@ -182,19 +202,27 @@ public partial class AttendanceHomeworkQuickInputDialog : Window e.Handled = true; return; } + + // Eine mit Alt/Option gedrückte Ziffer darf niemals in den + // Anwesenheitszweig durchfallen, auch wenn sie nicht belegt ist. + if (digit is not null) + { + e.Handled = true; + return; + } } - AttendanceStatus? attendance = e.Key switch + AttendanceStatus? attendance = isX ? null : digit switch { - Key.A => AttendanceStatus.Present, - Key.K => AttendanceStatus.ExcusePending, - Key.E => AttendanceStatus.Excused, - Key.U => AttendanceStatus.Unexcused, - Key.G => AttendanceStatus.Truant, - Key.V => AttendanceStatus.OtherSchoolEvent, + 1 => AttendanceStatus.Present, + 2 => AttendanceStatus.ExcusePending, + 5 => AttendanceStatus.Excused, + 7 => AttendanceStatus.OtherSchoolEvent, + 9 => AttendanceStatus.Truant, + 0 => AttendanceStatus.Unexcused, _ => null, }; - var attendanceRecognized = e.Key is Key.D0 or Key.NumPad0 or Key.A or Key.K or Key.E or Key.U or Key.G or Key.V; + var attendanceRecognized = isX || digit is 0 or 1 or 2 or 5 or 7 or 9; if (attendanceRecognized) { vm.ApplyAttendance(row, attendance); @@ -208,13 +236,49 @@ public partial class AttendanceHomeworkQuickInputDialog : Window case Key.Up: vm.MoveSelection(-1); BringSelectionIntoView(); e.Handled = true; break; case Key.Down or Key.Enter: vm.MoveSelection(1); BringSelectionIntoView(); e.Handled = true; break; case Key.Escape: Close(); e.Handled = true; break; - default: base.OnKeyDown(e); break; + default: break; } } + private void OnPreviewKeyUp(object? sender, KeyEventArgs e) + { + if (e.PhysicalKey == PhysicalKey.AltLeft) _leftAltDown = false; + if (e.PhysicalKey == PhysicalKey.AltRight) _rightAltDown = false; + } + private AttendanceHomeworkQuickInputViewModel? ViewModel => DataContext as AttendanceHomeworkQuickInputViewModel; + private static int? DigitFromEvent(KeyEventArgs e) => e.PhysicalKey switch + { + PhysicalKey.Digit0 => 0, + PhysicalKey.Digit1 => 1, + PhysicalKey.Digit2 => 2, + PhysicalKey.Digit3 => 3, + PhysicalKey.Digit4 => 4, + PhysicalKey.Digit5 => 5, + PhysicalKey.Digit6 => 6, + PhysicalKey.Digit7 => 7, + PhysicalKey.Digit8 => 8, + PhysicalKey.Digit9 => 9, + _ => DigitFromKey(e.Key), + }; + + private static int? DigitFromKey(Key key) => key switch + { + Key.D0 or Key.NumPad0 => 0, + Key.D1 or Key.NumPad1 => 1, + Key.D2 or Key.NumPad2 => 2, + Key.D3 or Key.NumPad3 => 3, + Key.D4 or Key.NumPad4 => 4, + Key.D5 or Key.NumPad5 => 5, + Key.D6 or Key.NumPad6 => 6, + Key.D7 or Key.NumPad7 => 7, + Key.D8 or Key.NumPad8 => 8, + Key.D9 or Key.NumPad9 => 9, + _ => null, + }; + private void BringSelectionIntoView() { if (ViewModel?.SelectedRow is { } row) diff --git a/LehrerApp.Desktop/Views/Groups/ParticipationWizardDialog.axaml b/LehrerApp.Desktop/Views/Groups/ParticipationWizardDialog.axaml index 7aab710..fe1c5bd 100644 --- a/LehrerApp.Desktop/Views/Groups/ParticipationWizardDialog.axaml +++ b/LehrerApp.Desktop/Views/Groups/ParticipationWizardDialog.axaml @@ -34,7 +34,7 @@ - +