diff --git a/MainWindow.axaml b/MainWindow.axaml index 8293063..3e9db94 100644 --- a/MainWindow.axaml +++ b/MainWindow.axaml @@ -196,8 +196,20 @@ - - + + + + + + + + + + + + + + @@ -211,7 +223,13 @@ - + + + + + + + diff --git a/MainWindow.axaml.cs b/MainWindow.axaml.cs index 46f3e71..5cccbbe 100644 --- a/MainWindow.axaml.cs +++ b/MainWindow.axaml.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.Linq; using Avalonia.Controls; using Avalonia.Input; using Avalonia.Interactivity; @@ -12,6 +13,26 @@ public partial class MainWindow : Window { public static MainWindow Instance { get; set; } public static string ApplicationVersion = "v1.2.24"; + + private sealed class ResultEntry + { + public Student Student { get; } + public int Semester { get; } + public string CourseName { get; } + + public ResultEntry(Student student, int semester, string? courseName) + { + Student = student; + Semester = semester; + CourseName = courseName ?? string.Empty; + } + + public override string ToString() + { + return $"{Student.Name} ({Student.ID}) - {Semester}. Semester: {CourseName}"; + } + } + public MainWindow() { InitializeComponent(); @@ -20,10 +41,108 @@ public partial class MainWindow : Window RefreshCoursesList(); try { - NudSportMaxPerSemester.Value = Settings.Instance.NumCoursesPerSemester; + NudSportMaxPerSemester1.Value = Settings.Instance.NumCoursesPerSemester[0]; + NudSportMaxPerSemester2.Value = Settings.Instance.NumCoursesPerSemester[1]; + NudSportMaxPerSemester3.Value = Settings.Instance.NumCoursesPerSemester[2]; + NudSportMaxPerSemester4.Value = Settings.Instance.NumCoursesPerSemester[3]; } catch {} } + private void RegenerateContextMenu() + { + MnuChange.Items.Clear(); + foreach (var sport in Settings.Instance.Sports) + { + var item = new MenuItem { Header = sport.Name }; + item.Click += (_, _) => ChangeStudentCourse(sport); + MnuChange.Items.Add(item); + } + } + + private void ChangeStudentCourse(Sport targetSport) + { + if (LbResult.SelectedItem is not ResultEntry selectedEntry) + return; + + try + { + if (ApplyStudentCourseChange(selectedEntry.Student, selectedEntry.Semester, targetSport)) + { + CourseCrafter.ReloadResult(); + RefreshResultView(); + RegenerateContextMenu(); + } + } + catch (Exception ex) + { + Console.WriteLine(ex.Message + "\n" + ex.StackTrace); + } + } + + private bool ApplyStudentCourseChange(Student student, int semester, Sport targetSport) + { + if (semester < 1 || semester > 4) + return false; + + var semesterCourses = CourseCrafter.GeneratedCourses + .Where(course => course.Semester == semester) + .ToList(); + + var currentCourses = semesterCourses + .Where(course => course.Instance.Students.Contains(student.ID)) + .ToList(); + + CourseCrafter.CourseInstance? targetCourse = currentCourses + .FirstOrDefault(course => course.Instance.Sport.Name == targetSport.Name) + .Instance; + + if (targetCourse == null) + { + targetCourse = semesterCourses + .Where(course => course.Instance.Sport.Name == targetSport.Name) + .OrderBy(course => course.Instance.Students.Count) + .Select(course => course.Instance) + .FirstOrDefault(); + } + + bool changed = false; + + foreach (var course in currentCourses) + { + if (targetCourse != null && ReferenceEquals(course.Instance, targetCourse)) + continue; + + if (course.Instance.Students.Remove(student.ID)) + changed = true; + } + + int removedEmptyCourses = CourseCrafter.GeneratedCourses.RemoveAll(course => + course.Semester == semester && + course.Instance.Students.Count == 0 && + !ReferenceEquals(course.Instance, targetCourse)); + if (removedEmptyCourses > 0) + changed = true; + + if (targetCourse == null) + { + var newCourse = new CourseCrafter.CourseInstance + { + Sport = targetSport, + Students = new List { student.ID } + }; + + CourseCrafter.GeneratedCourses.Add((semester, newCourse)); + changed = true; + } + else if (!targetCourse.Students.Contains(student.ID)) + { + targetCourse.Students.Add(student.ID); + changed = true; + } + + return changed; + } + private void MnuExpSettings_OnClick(object? sender, RoutedEventArgs e) { var res = MessageBox.Show(this, "Dieses Feature ist noch nicht implementiert", "Fehlend"); @@ -159,6 +278,21 @@ public partial class MainWindow : Window //TbiResults.Focus(); } + private void LbResult_OnPointerPressed(object? sender, PointerPressedEventArgs e) + { + if (!e.GetCurrentPoint(LbResult).Properties.IsRightButtonPressed) + return; + + if (e.Source is Control control && control.DataContext is ResultEntry entry) + { + LbResult.SelectedItem = entry; + } + else + { + LbResult.SelectedItem = null; + } + } + private void RefreshResultView() { LbResult.Items.Clear(); @@ -168,7 +302,7 @@ public partial class MainWindow : Window { for(int i = 0; i