Files
LehrerApp/LehrerApp.Desktop/Views/Groups/StudentGroupGeneratorWindow.axaml
2026-09-29 22:17:49 +02:00

267 lines
15 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:LehrerApp.Desktop.ViewModels.Groups"
xmlns:models="clr-namespace:LehrerApp.Core.Models;assembly=LehrerApp.Core"
xmlns:lottie="clr-namespace:Avalonia.Labs.Lottie;assembly=Avalonia.Labs.Lottie"
x:Class="LehrerApp.Desktop.Views.Groups.StudentGroupGeneratorWindow"
x:DataType="vm:StudentGroupGeneratorViewModel"
Title="Gruppen zusammenstellen"
Width="780" Height="650" MinWidth="620" MinHeight="480"
WindowStartupLocation="CenterScreen">
<Window.Styles>
<Style Selector="Border.studentgroup.droptarget">
<Setter Property="BorderBrush" Value="{DynamicResource AppAccentTextBrush}"/>
<Setter Property="BorderThickness" Value="2"/>
</Style>
</Window.Styles>
<Grid RowDefinitions="Auto,*,Auto,Auto" Margin="24">
<StackPanel Grid.Row="0" Spacing="3" Margin="0,0,0,16">
<TextBlock Text="Gruppen zusammenstellen" Classes="dialogtitle"/>
<TextBlock Text="Eigenständiges Fenster für die Bildschirmfreigabe"
FontSize="12" Opacity="0.55"/>
</StackPanel>
<ScrollViewer Grid.Row="1" x:Name="ResultsScrollViewer">
<Grid x:Name="GroupResults">
<Grid.Transitions>
<Transitions>
<DoubleTransition Property="Opacity" Duration="0:0:0.18"/>
</Transitions>
</Grid.Transitions>
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Spacing="12"
IsVisible="{Binding !HasGeneratedGroups}">
<TextBlock Text="◇ ◇ ◇" FontSize="26" Opacity="0.35" HorizontalAlignment="Center"/>
<TextBlock Text="Noch keine Gruppen erstellt" FontSize="20" FontWeight="SemiBold"
HorizontalAlignment="Center"/>
<TextBlock Text="{Binding StatusText}" Opacity="0.6" TextAlignment="Center"
TextWrapping="Wrap" MaxWidth="460"/>
</StackPanel>
<ItemsControl ItemsSource="{Binding GeneratedGroups}"
IsVisible="{Binding HasGeneratedGroups}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal" HorizontalAlignment="Center"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="vm:GeneratedStudentGroup">
<Border Width="220" Margin="7" Padding="16" Classes="studentgroup"
Classes.droptarget="{Binding IsDropTarget}"
Background="{DynamicResource AppCardBackgroundBrush}"
BorderBrush="{DynamicResource AppCardBorderBrush}"
BorderThickness="1" CornerRadius="12"
DragDrop.AllowDrop="True" DragDrop.DragEnter="OnGroupDragEnter"
DragDrop.DragLeave="OnGroupDragLeave" DragDrop.DragOver="OnGroupDragOver"
DragDrop.Drop="OnGroupDrop">
<StackPanel Spacing="9">
<TextBlock Text="{Binding Title}" FontSize="16" FontWeight="SemiBold"
Foreground="{DynamicResource AppAccentTextBrush}"/>
<ItemsControl ItemsSource="{Binding Members}">
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="vm:StudentGroupMember">
<Border Background="{DynamicResource AppChipBackgroundBrush}"
CornerRadius="6" Padding="8,5" Margin="0,3"
PointerPressed="OnMemberPressed" PointerMoved="OnMemberMoved"
PointerReleased="OnMemberReleased">
<TextBlock Text="{Binding Name}" TextWrapping="Wrap"/>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</ScrollViewer>
<lottie:Lottie Grid.Row="1" x:Name="TeamworkAnimation"
Path="/Assets/Animations/Teamwork.json"
RepeatCount="-1" AutoPlay="False"
Width="270" Height="270" HorizontalAlignment="Center"
VerticalAlignment="Center" IsVisible="False"/>
<StackPanel Grid.Row="2" Spacing="8" Margin="0,12,0,10">
<Button x:Name="GenerateButton" Content="Gruppen zusammenstellen" Click="OnGenerate"
IsEnabled="{Binding CanGenerate}" HorizontalAlignment="Stretch"
HorizontalContentAlignment="Center" Height="48" FontSize="16" FontWeight="SemiBold"/>
<StackPanel x:Name="PlanActions" Spacing="8">
<TextBlock Text="Schüler zwischen den Gruppenkarten ziehen, um die Einteilung anzupassen."
FontSize="11" Opacity="0.65" IsVisible="{Binding HasGeneratedGroups}"/>
<Grid ColumnDefinitions="*,10,Auto,8,Auto" IsVisible="{Binding HasSavedPlans}">
<ComboBox ItemsSource="{Binding SavedPlans}" SelectedItem="{Binding SelectedSavedPlan}"
PlaceholderText="Gespeicherte Einteilung auswählen">
<ComboBox.ItemTemplate>
<DataTemplate x:DataType="models:StudentGroupPlan">
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<Button Grid.Column="2" Content="Laden" Click="OnLoadSavedPlan"
IsEnabled="{Binding CanLoadSavedPlan}"/>
<Button Grid.Column="4" Content="Löschen" Click="OnDeleteSavedPlan"
IsEnabled="{Binding CanDeleteSavedPlan}"/>
</Grid>
<Grid ColumnDefinitions="*,10,Auto" IsVisible="{Binding HasGeneratedGroups}">
<TextBox Text="{Binding PlanName, Mode=TwoWay}" PlaceholderText="Name der Einteilung"/>
<Button Grid.Column="2" Content="Speichern" Command="{Binding SavePlanCommand}"/>
</Grid>
<TextBlock Text="{Binding SaveStatus}" FontSize="11" Opacity="0.7" TextWrapping="Wrap"
IsVisible="{Binding SaveStatus, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"/>
</StackPanel>
<StackPanel x:Name="ResultSummary" Spacing="8">
<TextBlock Text="{Binding StatusText}" HorizontalAlignment="Center" Opacity="0.65"
IsVisible="{Binding HasGeneratedGroups}"/>
<Border Background="{DynamicResource AppChipBackgroundBrush}" CornerRadius="8" Padding="10,7"
IsVisible="{Binding WarningText, Converter={x:Static StringConverters.IsNotNullOrEmpty}}">
<TextBlock Text="{Binding WarningText}" TextWrapping="Wrap" FontSize="12"
Foreground="{DynamicResource AppStatusWarningBrush}"/>
</Border>
</StackPanel>
</StackPanel>
<Expander Grid.Row="3" x:Name="OptionsExpander" Header="Optionen" IsExpanded="False">
<ScrollViewer MaxHeight="340">
<StackPanel Spacing="11" Margin="0,10,6,4">
<Grid ColumnDefinitions="*,16,*">
<StackPanel Grid.Column="0" Spacing="5">
<TextBlock Text="Lerngruppe" FontSize="12" Opacity="0.7"/>
<ComboBox ItemsSource="{Binding Groups}" SelectedItem="{Binding SelectedGroup}">
<ComboBox.ItemTemplate>
<DataTemplate x:DataType="vm:StudentDrawGroup">
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</StackPanel>
<StackPanel Grid.Column="2" Spacing="5">
<TextBlock Text="Teilnehmende" FontSize="12" Opacity="0.7"/>
<ComboBox ItemsSource="{Binding ParticipantModeOptions}"
SelectedItem="{Binding ParticipantModeName}"/>
</StackPanel>
</Grid>
<Grid ColumnDefinitions="*,16,*" Margin="0,5,0,0">
<StackPanel Grid.Column="0" Spacing="5">
<TextBlock Text="Zielgröße je Gruppe" FontSize="12" Opacity="0.7"/>
<NumericUpDown Value="{Binding TargetGroupSize}" Minimum="2" Maximum="20"
Increment="1" FormatString="0"/>
</StackPanel>
<StackPanel Grid.Column="2" Spacing="5">
<TextBlock Text="Zielanzahl Gruppen" FontSize="12" Opacity="0.7"/>
<NumericUpDown Value="{Binding TargetGroupCount}" Minimum="1" Maximum="20"
Increment="1" FormatString="0"/>
</StackPanel>
</Grid>
<Grid ColumnDefinitions="160,*,110" RowDefinitions="Auto,Auto,Auto" Margin="0,6,0,0">
<TextBlock Grid.Row="0" Text="Priorität Zielgröße" VerticalAlignment="Center"/>
<Slider Grid.Row="0" Grid.Column="1" Minimum="0" Maximum="100"
Value="{Binding SizePriority}" Margin="10,0"/>
<TextBlock Grid.Row="0" Grid.Column="2" Text="{Binding SizePriorityLabel}"
HorizontalAlignment="Right" VerticalAlignment="Center" FontSize="12" Opacity="0.7"/>
<TextBlock Grid.Row="1" Text="Priorität Gruppenanzahl" VerticalAlignment="Center"/>
<Slider Grid.Row="1" Grid.Column="1" Minimum="0" Maximum="100"
Value="{Binding CountPriority}" Margin="10,0"/>
<TextBlock Grid.Row="1" Grid.Column="2" Text="{Binding CountPriorityLabel}"
HorizontalAlignment="Right" VerticalAlignment="Center" FontSize="12" Opacity="0.7"/>
<TextBlock Grid.Row="2" Text="Leistungsverteilung" VerticalAlignment="Center"/>
<Slider Grid.Row="2" Grid.Column="1" Minimum="-100" Maximum="100"
Value="{Binding PerformanceDistribution}" Margin="10,0"/>
<TextBlock Grid.Row="2" Grid.Column="2" Text="{Binding PerformanceDistributionLabel}"
HorizontalAlignment="Right" VerticalAlignment="Center" FontSize="12" Opacity="0.7"/>
</Grid>
<Grid ColumnDefinitions="*,*" Margin="170,-7,110,0">
<TextBlock Text="homogen" FontSize="10" Opacity="0.5"/>
<TextBlock Grid.Column="1" Text="heterogen" HorizontalAlignment="Right" FontSize="10" Opacity="0.5"/>
</Grid>
<CheckBox Content="Förderschüler möglichst gleichmäßig verteilen"
IsChecked="{Binding DistributeSupportStudents}" Margin="0,5,0,0"/>
<Border Height="1" Background="{DynamicResource AppCardBorderBrush}" Margin="0,5"/>
<TextBlock Text="Paarregeln" FontWeight="SemiBold"/>
<TextBlock Text="Zwei Schüler auswählen und anschließend festlegen, ob sie zusammen oder getrennt arbeiten sollen."
FontSize="11" Opacity="0.55" TextWrapping="Wrap"/>
<Grid ColumnDefinitions="*,12,*" Margin="0,2,0,0">
<ComboBox Grid.Column="0" ItemsSource="{Binding PairCandidates}"
SelectedItem="{Binding SelectedPairStudentA}" PlaceholderText="Erster Schüler">
<ComboBox.ItemTemplate>
<DataTemplate x:DataType="vm:StudentPairCandidate">
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<ComboBox Grid.Column="2" ItemsSource="{Binding PairCandidates}"
SelectedItem="{Binding SelectedPairStudentB}" PlaceholderText="Zweiter Schüler">
<ComboBox.ItemTemplate>
<DataTemplate x:DataType="vm:StudentPairCandidate">
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</Grid>
<Grid ColumnDefinitions="*,12,*">
<Button Grid.Column="0" Content="Zusammen einteilen" Command="{Binding AddForcedPairCommand}"
HorizontalAlignment="Stretch"/>
<Button Grid.Column="2" Content="Voneinander trennen" Command="{Binding AddExcludedPairCommand}"
HorizontalAlignment="Stretch"/>
</Grid>
<TextBlock Text="{Binding PairingMessage}" Foreground="{DynamicResource AppStatusWarningBrush}"
FontSize="11" IsVisible="{Binding PairingMessage, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"/>
<Grid ColumnDefinitions="160,*,110" RowDefinitions="Auto,Auto">
<TextBlock Grid.Row="0" Text="Priorität zusammen" VerticalAlignment="Center"/>
<Slider Grid.Row="0" Grid.Column="1" Minimum="0" Maximum="100"
Value="{Binding ForcedPairPriority}" Margin="10,0"/>
<TextBlock Grid.Row="0" Grid.Column="2" Text="{Binding ForcedPairPriorityLabel}"
HorizontalAlignment="Right" VerticalAlignment="Center" FontSize="12" Opacity="0.7"/>
<TextBlock Grid.Row="1" Text="Priorität trennen" VerticalAlignment="Center"/>
<Slider Grid.Row="1" Grid.Column="1" Minimum="0" Maximum="100"
Value="{Binding ExcludedPairPriority}" Margin="10,0"/>
<TextBlock Grid.Row="1" Grid.Column="2" Text="{Binding ExcludedPairPriorityLabel}"
HorizontalAlignment="Right" VerticalAlignment="Center" FontSize="12" Opacity="0.7"/>
</Grid>
<Grid ColumnDefinitions="*,12,*">
<StackPanel Grid.Column="0" Spacing="5">
<TextBlock Text="Zusammen" FontSize="12" Opacity="0.7"/>
<ItemsControl ItemsSource="{Binding ForcedPairs}">
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="vm:StudentPairRule">
<Grid ColumnDefinitions="*,Auto" Margin="0,2">
<TextBlock Text="{Binding Display}" TextWrapping="Wrap" VerticalAlignment="Center"/>
<Button Grid.Column="1" Content="×" Command="{Binding RemoveCommand}"
ToolTip.Tip="Regel entfernen" Padding="8,2"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
<StackPanel Grid.Column="2" Spacing="5">
<TextBlock Text="Getrennt" FontSize="12" Opacity="0.7"/>
<ItemsControl ItemsSource="{Binding ExcludedPairs}">
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="vm:StudentPairRule">
<Grid ColumnDefinitions="*,Auto" Margin="0,2">
<TextBlock Text="{Binding Display}" TextWrapping="Wrap" VerticalAlignment="Center"/>
<Button Grid.Column="1" Content="×" Command="{Binding RemoveCommand}"
ToolTip.Tip="Regel entfernen" Padding="8,2"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</Grid>
</StackPanel>
</ScrollViewer>
</Expander>
</Grid>
</Window>