267 lines
15 KiB
XML
267 lines
15 KiB
XML
<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>
|