Files
LehrerApp/LehrerApp.Desktop/Views/Groups/ParticipationQuickInputDialog.axaml.cs
adminandClaude Sonnet 5 1215d4ac22
CI / build-and-test (push) Canceled after 0s
Tagesflagge im Sitzplan, Leistungsüberblick mit Zielnoten-Rechner
- Mitarbeit: Tagesflagge (👑 Spitzentag / 😴 Schlaftag /  Schlechter Tag)
  je Schüler und Sitzung. Primär im Sitzplatz-Dialog (⇧1/2/3, ⇧X) mit
  Badge auf der Sitzplatz-Kachel; Fallback in der Schnelleingabe für
  Lerngruppen ohne Sitzplan.
- Noten: neuer Dialog "Überblick" in der Notenübersicht zeigt Klausuren,
  Mitarbeit- und sonstige Noten eines Schülers samt berechneter
  Zeugnisnote. Zielnoten-Rechner (ReportGradeTargetCalculator) beantwortet
  "was brauche ich noch für Note X", ein Was-wäre-wenn-Rechner simuliert
  eine zusätzliche Klausurnote. Bewerter-/Schülermodus per Umschalter im
  selben Fenster — Bewertermodus zeigt zusätzlich Kursdurchschnitt je
  Klausur und erlaubt das Bearbeiten von Mitarbeit-/Sonstige-Noten.
  Klausurverlauf als Balken-Sparkline wie die bestehende Notenentwicklung.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-30 11:43:47 +02:00

84 lines
4.0 KiB
C#

using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Interactivity;
using LehrerApp.Core.Models;
using LehrerApp.Desktop.ViewModels.Groups;
namespace LehrerApp.Desktop.Views.Groups;
public partial class ParticipationQuickInputDialog : Window
{
public ParticipationQuickInputDialog() => InitializeComponent();
protected override void OnOpened(EventArgs e)
{
base.OnOpened(e);
Focus();
}
protected override void OnKeyDown(KeyEventArgs e)
{
if (DataContext is not QuickInputViewModel vm) { base.OnKeyDown(e); return; }
if (e.KeyModifiers.HasFlag(KeyModifiers.Shift))
{
switch (e.Key)
{
case Key.D1 or Key.NumPad1: vm.SetDayHighlight(DayHighlightKind.Standout); e.Handled = true; break;
case Key.D2 or Key.NumPad2: vm.SetDayHighlight(DayHighlightKind.Sleepy); e.Handled = true; break;
case Key.D3 or Key.NumPad3: vm.SetDayHighlight(DayHighlightKind.Rough); e.Handled = true; break;
case Key.D0 or Key.NumPad0: vm.SetDayHighlight(null); e.Handled = true; break;
}
if (e.Handled) return;
}
switch (e.Key)
{
case Key.D0 or Key.NumPad0: vm.SetRatingByNumber(0); e.Handled = true; break;
case Key.D1 or Key.NumPad1: vm.SetRatingByNumber(1); e.Handled = true; break;
case Key.D2 or Key.NumPad2: vm.SetRatingByNumber(2); e.Handled = true; break;
case Key.D3 or Key.NumPad3: vm.SetRatingByNumber(3); e.Handled = true; break;
case Key.D4 or Key.NumPad4: vm.SetRatingByNumber(4); e.Handled = true; break;
case Key.D5 or Key.NumPad5: vm.SetRatingByNumber(5); e.Handled = true; break;
// 6-9 sind nur für Punkte-Aspekte (3.1.3) sinnvoll, siehe QuickInputViewModel.SetRatingByNumber.
case Key.D6 or Key.NumPad6: vm.SetRatingByNumber(6); e.Handled = true; break;
case Key.D7 or Key.NumPad7: vm.SetRatingByNumber(7); e.Handled = true; break;
case Key.D8 or Key.NumPad8: vm.SetRatingByNumber(8); e.Handled = true; break;
case Key.D9 or Key.NumPad9: vm.SetRatingByNumber(9); e.Handled = true; break;
case Key.Q: vm.SelectAspect(0); e.Handled = true; break;
case Key.W: vm.SelectAspect(1); e.Handled = true; break;
case Key.E: vm.SelectAspect(2); e.Handled = true; break;
case Key.R: vm.SelectAspect(3); e.Handled = true; break;
case Key.T: vm.SelectAspect(4); e.Handled = true; break;
case Key.Space: vm.NextAspect(); e.Handled = true; break;
case Key.Enter:
if (vm.IsLastStudent) Close();
else vm.NextStudent();
e.Handled = true;
break;
case Key.Back: vm.PreviousStudent(); e.Handled = true; break;
// Rechtsseitiges Pendant zu Q/W/E/R/T (links)/Enter/Backspace/Leertaste: ohne diese
// Fälle fallen Pfeiltasten auf Avalonias Standard-Fokusnavigation durch und der Fokus
// springt auf den Schließen-Button — ein Enter danach schließt dann den Dialog statt
// zum nächsten Schüler zu springen.
case Key.Up: vm.PreviousAspect(); e.Handled = true; break;
case Key.Down: vm.NextAspect(); e.Handled = true; break;
case Key.Right: vm.NextStudent(); e.Handled = true; break;
case Key.Left: vm.PreviousStudent(); e.Handled = true; break;
case Key.OemPlus or Key.Add: vm.IncrementRating(); e.Handled = true; break;
case Key.OemMinus or Key.Subtract: vm.DecrementRating(); e.Handled = true; break;
case Key.Delete: vm.ClearRating(); e.Handled = true; break;
case Key.Escape: Close(); e.Handled = true; break;
default: base.OnKeyDown(e); break;
}
}
private void OnClose(object? s, RoutedEventArgs e) => Close();
}