From b3a923f6066cfb3c065a192496c529ead95502db Mon Sep 17 00:00:00 2001 From: Sandra Borst <108298114+VerfluchteZocke@users.noreply.github.com> Date: Sat, 8 Mar 2025 00:34:08 +0100 Subject: [PATCH] improved design of overview page, made seonds warning mode work, made it possible to enter custom values --- .../Screens/Regulaer/01Overview.xaml | 183 +++++--- .../Screens/Regulaer/01Overview.xaml.cs | 412 ++++++++++++++++-- 2 files changed, 496 insertions(+), 99 deletions(-) diff --git a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/Regulaer/01Overview.xaml b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/Regulaer/01Overview.xaml index 0701f3f..c0c4792 100644 --- a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/Regulaer/01Overview.xaml +++ b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/Regulaer/01Overview.xaml @@ -5,9 +5,10 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:InnoLabProjektDektopApp" xmlns:header="clr-namespace:InnoLabProjektDektopApp.Screens.Templates" - mc:Ignorable="d"> + mc:Ignorable="d" + Background="{StaticResource BACKGROUND_PRIMARY_BRUSH}"> <ScrollViewer> - <Grid> + <Grid VerticalAlignment="Center"> <StackPanel Margin="20,0,20,20"> <!-- Überschrift --> @@ -19,7 +20,7 @@ <!-- Profiles and Add Button Section --> - <Border Background="#333333" CornerRadius="10" Padding="15" > + <Border Background="{StaticResource BACKGROUND_SECONDARY_BRUSH}" CornerRadius="10" Padding="15" > <StackPanel Orientation="Vertical"> <TextBlock Style="{StaticResource Header2}" Text="Want to customize this profile?" @@ -62,7 +63,7 @@ HorizontalAlignment="Left" /> </Border> <!-- Settings Section --> - <Border Background="#333333" CornerRadius="10" Padding="15" Margin="0,20,0,0"> + <Border Background="{StaticResource BACKGROUND_SECONDARY_BRUSH}" CornerRadius="10" Padding="15" Margin="0,20,0,0"> <StackPanel> <!-- Überschrift innerhalb des Hintergrunds --> <TextBlock Style="{StaticResource Header2}" @@ -75,71 +76,143 @@ HorizontalAlignment="Left" /> <StackPanel Grid.Row="0" Grid.Column="0" Margin="10"> <TextBlock Text="Focus period" FontSize="14" FontWeight="Bold" Foreground="White" /> <StackPanel Orientation="Horizontal"> - <ComboBox x:Name="FocusPeriodComboBox" HorizontalAlignment="Left" Height="30" Width="70" FontSize="14" Padding="5" SelectionChanged="ComboBox_SelectionChanged" IsEditable="True" PreviewTextInput="ComboBox_PreviewTextInput"> - <ComboBoxItem Content="1" /> - <ComboBoxItem Content="20" /> - <ComboBoxItem Content="30" /> - <ComboBoxItem Content="40" /> - <ComboBoxItem Content="50" IsSelected="True" /> - <ComboBoxItem Content="60" /> - <ComboBoxItem Content="90" /> - <ComboBoxItem Content="120" /> - <ComboBoxItem Content="150" /> - <ComboBoxItem Content="180" /> - </ComboBox> - <TextBlock Text="minutes" VerticalAlignment="Center" Margin="5,0,0,0" FontSize="14" Foreground="Gray" /> + + <Border Name="DropdownBorder1" Background="{StaticResource HIGHLIGHT_PRIMARY_BRUSH}" CornerRadius="5" Margin="0,5,0,0" +Width="70" MouseDown="TogglePopup1"> + <Grid> + <TextBox x:Name="SelectedText1" Text="45" Foreground="{StaticResource BACKGROUND_PRIMARY_BRUSH}" + FontWeight="Bold" VerticalAlignment="Center" Margin="10,0,30,0" + Background="Transparent" BorderThickness="0" TextChanged="SelectedTextBox_TextChanged"/> + <Path Fill="{StaticResource BACKGROUND_PRIMARY_BRUSH}" Data="M 0 0 L 8 8 L 16 0 Z" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="10"/> + </Grid> + </Border> + + <!-- Popup für die Dropdown-Liste --> + <Popup Name="PopupMenu1" Placement="Bottom" PlacementTarget="{Binding ElementName=DropdownBorder1}" StaysOpen="True" Width="70"> + <Border Background="{StaticResource HIGHLIGHT_SECONDARY_BRUSH}" CornerRadius="5" BorderThickness="1" BorderBrush="Black" Width="70"> + <ListBox x:Name="CategoryList1" SelectionChanged="CategoryList_SelectionChanged1" Background="{StaticResource HIGHLIGHT_SECONDARY_BRUSH}"> + <ListBoxItem Content="20"/> + <ListBoxItem Content="30"/> + <ListBoxItem Content="45"/> + <ListBoxItem Content="60"/> + <ListBoxItem Content="90"/> + <ListBoxItem Content="120"/> + <ListBoxItem Content="180"/> + </ListBox> + </Border> + </Popup> + <TextBlock Text="minutes" VerticalAlignment="Center" Margin="5,0,0,0" FontSize="14" /> </StackPanel> </StackPanel> <StackPanel Grid.Row="0" Grid.Column="1" Margin="10"> <TextBlock Text="Break period" FontSize="14" FontWeight="Bold" Foreground="White" /> <StackPanel Orientation="Horizontal"> - <ComboBox x:Name="BreakPeriodComboBox" HorizontalAlignment="Left" Height="30" Width="70" FontSize="14" Padding="5" IsEditable="True" PreviewTextInput="ComboBox_PreviewTextInput"> - <ComboBoxItem Content="0" /> - <ComboBoxItem Content="1" /> - <ComboBoxItem Content="3" /> - <ComboBoxItem Content="5" /> - <ComboBoxItem Content="10" IsSelected="True" /> - <ComboBoxItem Content="15" /> - <ComboBoxItem Content="20" /> - <ComboBoxItem Content="25" /> - <ComboBoxItem Content="30" /> - </ComboBox> - <TextBlock Text="minutes" VerticalAlignment="Center" Margin="5,0,0,0" FontSize="14" Foreground="Gray" /> + + <Border Name="DropdownBorder2" Background="{StaticResource HIGHLIGHT_PRIMARY_BRUSH}" CornerRadius="5" Margin="0,5,0,0" +Width="70" MouseDown="TogglePopup2"> + <Grid> + <TextBox x:Name="SelectedText2" Text="10" Foreground="{StaticResource BACKGROUND_PRIMARY_BRUSH}" + FontWeight="Bold" VerticalAlignment="Center" Margin="10,0,30,0" + Background="Transparent" BorderThickness="0" TextChanged="SelectedTextBox_TextChanged"/> + <Path Fill="{StaticResource BACKGROUND_PRIMARY_BRUSH}" Data="M 0 0 L 8 8 L 16 0 Z" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="10"/> + </Grid> + </Border> + + <!-- Popup für die Dropdown-Liste --> + <Popup Name="PopupMenu2" Placement="Bottom" PlacementTarget="{Binding ElementName=DropdownBorder2}" StaysOpen="True" Width="70"> + <Border Background="{StaticResource HIGHLIGHT_SECONDARY_BRUSH}" CornerRadius="5" BorderThickness="1" BorderBrush="Black" Width="70"> + <ListBox x:Name="CategoryList2" SelectionChanged="CategoryList_SelectionChanged2" Background="{StaticResource HIGHLIGHT_SECONDARY_BRUSH}"> + <ListBoxItem Content="0"/> + <ListBoxItem Content="1"/> + <ListBoxItem Content="3"/> + <ListBoxItem Content="5"/> + <ListBoxItem Content="10"/> + <ListBoxItem Content="20"/> + <ListBoxItem Content="30"/> + </ListBox> + </Border> + </Popup> + <TextBlock Text="minutes" VerticalAlignment="Center" Margin="5,0,0,0" FontSize="14" /> </StackPanel> </StackPanel> <StackPanel Grid.Row="0" Grid.Column="2" Margin="10"> <TextBlock Text="Cycles" FontSize="14" FontWeight="Bold" Foreground="White" /> - <ComboBox x:Name="CyclesComboBox" HorizontalAlignment="Left" Height="30" Width="50" FontSize="14" Padding="5" IsEditable="True" PreviewTextInput="ComboBox_PreviewTextInput"> - <ComboBoxItem Content="1" /> - <ComboBoxItem Content="2" /> - <ComboBoxItem Content="3" /> - <ComboBoxItem Content="4" IsSelected="True" /> - <ComboBoxItem Content="5" /> - <ComboBoxItem Content="6" /> - </ComboBox> + + <Border Name="DropdownBorder3" Background="{StaticResource HIGHLIGHT_PRIMARY_BRUSH}" CornerRadius="5" Margin="0,5,0,0" +Width="70" MouseDown="TogglePopup3"> + <Grid> + <TextBox x:Name="SelectedText3" Text="10" Foreground="{StaticResource BACKGROUND_PRIMARY_BRUSH}" + FontWeight="Bold" VerticalAlignment="Center" Margin="10,0,30,0" + Background="Transparent" BorderThickness="0" TextChanged="SelectedTextBox_TextChanged"/> + <Path Fill="{StaticResource BACKGROUND_PRIMARY_BRUSH}" Data="M 0 0 L 8 8 L 16 0 Z" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="10"/> + </Grid> + </Border> + + <!-- Popup für die Dropdown-Liste --> + <Popup Name="PopupMenu3" Placement="Bottom" PlacementTarget="{Binding ElementName=DropdownBorder3}" StaysOpen="True" Width="70"> + <Border Background="{StaticResource HIGHLIGHT_SECONDARY_BRUSH}" CornerRadius="5" BorderThickness="1" BorderBrush="Black" Width="70"> + <ListBox x:Name="CategoryList3" SelectionChanged="CategoryList_SelectionChanged3" Background="{StaticResource HIGHLIGHT_SECONDARY_BRUSH}"> + <ListBoxItem Content="1"/> + <ListBoxItem Content="2"/> + <ListBoxItem Content="3"/> + <ListBoxItem Content="4"/> + <ListBoxItem Content="5"/> + <ListBoxItem Content="6"/> + </ListBox> + </Border> + </Popup> </StackPanel> <!-- Zweite Reihe --> - <StackPanel Grid.Row="1" Grid.Column="0" Margin="10" x:Name="SecondsWarningPanel" > + <StackPanel Grid.Row="1" Grid.Column="0" Margin="10" x:Name="SecondsWarningPanel" Visibility="Collapsed" > <TextBlock Text="Seconds" Foreground="White" FontSize="14" FontWeight="Bold" /> - <ComboBox x:Name="SecondsWarningComboBox" Width="50" HorizontalAlignment="Left"> - <ComboBoxItem Content="3" /> - <ComboBoxItem Content="5" /> - <ComboBoxItem Content="10" IsSelected="True"/> - <ComboBoxItem Content="15" /> - <ComboBoxItem Content="30" /> - </ComboBox> + <Border Name="DropdownBorder4" Background="{StaticResource HIGHLIGHT_PRIMARY_BRUSH}" CornerRadius="5" Margin="0,5,0,0" +Width="70" MouseDown="TogglePopup4"> + <Grid> + <TextBox x:Name="SelectedText4" Text="4" Foreground="{StaticResource BACKGROUND_PRIMARY_BRUSH}" + FontWeight="Bold" VerticalAlignment="Center" Margin="10,0,30,0" + Background="Transparent" BorderThickness="0" TextChanged="SelectedTextBox_TextChanged"/> + <Path Fill="{StaticResource BACKGROUND_PRIMARY_BRUSH}" Data="M 0 0 L 8 8 L 16 0 Z" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="10"/> + </Grid> + </Border> + + <!-- Popup für die Dropdown-Liste --> + <Popup Name="PopupMenu4" Placement="Bottom" PlacementTarget="{Binding ElementName=DropdownBorder4}" StaysOpen="True" Width="70"> + <Border Background="{StaticResource HIGHLIGHT_SECONDARY_BRUSH}" CornerRadius="5" BorderThickness="1" BorderBrush="Black" Width="70"> + <ListBox x:Name="CategoryList4" SelectionChanged="CategoryList_SelectionChanged4" Background="{StaticResource HIGHLIGHT_SECONDARY_BRUSH}"> + <ListBoxItem Content="3"/> + <ListBoxItem Content="5"/> + <ListBoxItem Content="10"/> + <ListBoxItem Content="15"/> + <ListBoxItem Content="30" /> + </ListBox> + </Border> + </Popup> </StackPanel> <StackPanel Grid.Row="1" Grid.Column="1" VerticalAlignment="Center" Margin="10"> <TextBlock Text="Distraction Mode" Foreground="White" FontSize="14" FontWeight="Bold" /> - <ComboBox x:Name="DistractionModeComboBox" Width="170" HorizontalAlignment="Left" SelectionChanged="DistractionMode_SelectionChanged"> - <ComboBoxItem Content="Full-blocking mode" IsSelected="True" /> - <ComboBoxItem Content="seconds warning mode" /> - <ComboBoxItem Content="Mascot feedback only" /> - </ComboBox> + + <Border Name="DropdownBorder" Background="{StaticResource HIGHLIGHT_PRIMARY_BRUSH}" CornerRadius="5" BorderThickness="1" BorderBrush="Black" Margin="0,5,0,0" +Width="200" MouseDown="TogglePopup"> + <Grid> + <TextBlock x:Name="SelectedText" Text="Full-blocking mode" Foreground="{StaticResource BACKGROUND_PRIMARY_BRUSH}" FontWeight="Bold" VerticalAlignment="Center" Margin="10,0,30,0"/> + <Path Fill="{StaticResource BACKGROUND_PRIMARY_BRUSH}" Data="M 0 0 L 8 8 L 16 0 Z" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="10"/> + </Grid> + </Border> + + <!-- Popup für die Dropdown-Liste --> + <Popup Name="PopupMenu" Placement="Bottom" PlacementTarget="{Binding ElementName=DropdownBorder}" StaysOpen="True" Width="200"> + <Border Background="{StaticResource HIGHLIGHT_SECONDARY_BRUSH}" CornerRadius="5" BorderThickness="1" BorderBrush="Black" Width="200"> + <ListBox x:Name="CategoryList" SelectionChanged="CategoryList_SelectionChanged" Background="{StaticResource HIGHLIGHT_SECONDARY_BRUSH}"> + <ListBoxItem Content="Full-blocking mode"/> + <ListBoxItem Content="seconds warning mode"/> + <ListBoxItem Content="Mascot feedback only"/> + </ListBox> + </Border> + </Popup> </StackPanel> <StackPanel Grid.Row="1" Grid.Column="2" VerticalAlignment="Center" Margin="10" Width="150"> @@ -190,14 +263,12 @@ TextChanged="FocusTopicInputBox_TextChanged" /> </Grid> <!-- Start Button --> - <Border Width="150" Height="50" CornerRadius="25" Background="Gray" VerticalAlignment="Bottom" HorizontalAlignment="Left" Margin="0,10,0,0"> - <Button Background="Transparent" BorderThickness="0" Click="StartButton_Click"> - <TextBlock Text="Start" FontSize="16" FontWeight="Bold" Foreground="#1A202C" HorizontalAlignment="Center" VerticalAlignment="Center" /> - </Button> - </Border> + <Border Margin="0,10" Style="{StaticResource RoundedButtonBorder}" MouseDown="StartButton_Click"> + <TextBlock Text="Start" Style="{StaticResource ButtonTextStyle}" /> + </Border> - </StackPanel> + </StackPanel> </Grid> </ScrollViewer> diff --git a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/Regulaer/01Overview.xaml.cs b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/Regulaer/01Overview.xaml.cs index ded3731..13a8568 100644 --- a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/Regulaer/01Overview.xaml.cs +++ b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/Regulaer/01Overview.xaml.cs @@ -1,6 +1,8 @@ using InnoLabProjektDektopApp.Services; using System.IO; +using System.Net.Sockets; using System.Text.Json; +using System.Text.RegularExpressions; using System.Windows; using System.Windows.Controls; using System.Windows.Input; @@ -54,64 +56,113 @@ namespace InnoLabProjektDektopApp // Focus Period if (profileSettings.TryGetProperty("focusPeriod", out var focusPeriodElement)) { - string focusPeriod = focusPeriodElement.GetString(); - FocusPeriodComboBox.Text = focusPeriod; + string focusPeriod = focusPeriodElement.GetString() ?? "45"; + + // Setze den geladenen Wert in das Textfeld (SelectedText1) + SelectedText1.Text = focusPeriod; + + // Falls der geladene Wert mit einem ListBoxItem übereinstimmt, markiere es + foreach (ListBoxItem item in CategoryList1.Items) + { + if (item.Content.ToString() == focusPeriod) + { + CategoryList1.SelectedItem = item; + break; + } + } } + // Break Period if (profileSettings.TryGetProperty("breakPeriod", out var breakPeriodElement)) { - string breakPeriod = breakPeriodElement.GetString(); - BreakPeriodComboBox.Text = breakPeriod; + string breakPeriod = breakPeriodElement.GetString() ?? "10"; + + // Setze den geladenen Wert in das Textfeld + SelectedText2.Text = breakPeriod; + + // Falls der geladene Wert mit einem ListBoxItem übereinstimmt, markiere es + foreach (ListBoxItem item in CategoryList2.Items) + { + if (item.Content.ToString() == breakPeriod) + { + CategoryList2.SelectedItem = item; + break; + } + } } // Cycles if (profileSettings.TryGetProperty("cycles", out var cyclesElement)) { - string cycles = cyclesElement.GetString(); - CyclesComboBox.Text = cycles; + string cycles = cyclesElement.GetString() ?? "4"; + + // Setze den geladenen Wert in das Textfeld + SelectedText3.Text = cycles; + + // Falls der geladene Wert mit einem ListBoxItem übereinstimmt, markiere es + foreach (ListBoxItem item in CategoryList3.Items) + { + if (item.Content.ToString() == cycles) + { + CategoryList3.SelectedItem = item; + break; + } + } } // Distraction Mode + if (profileSettings.TryGetProperty("distractionMode", out var distractionModeElement)) { - string distractionMode = distractionModeElement.GetString(); - DistractionModeComboBox.SelectedItem = FindComboBoxItem(DistractionModeComboBox, distractionMode); + string distractionMode = distractionModeElement.GetString() ?? "Full-blocking mode"; - // Zusätzliche ComboBox für Sekunden aktivieren, wenn Modus "seconds warning mode" ist - if (distractionMode == "seconds warning mode") - { - SecondsWarningComboBox.Visibility = Visibility.Visible; - + // Setze den geladenen Wert in das Textfeld + SelectedText.Text = distractionMode; + + // Falls der geladene Wert mit einem ListBoxItem übereinstimmt, markiere es + foreach (ListBoxItem item in CategoryList.Items) + { + if (item.Content.ToString() == distractionMode) + { + CategoryList.SelectedItem = item; + break; + } } - else + + // Zusätzliche ComboBox für Sekunden aktivieren, wenn Modus "seconds warning mode" ist + if (distractionMode == "seconds warning mode") { - SecondsWarningComboBox.Visibility = Visibility.Collapsed; + SecondsWarningPanel.Visibility = Visibility.Visible; } + } - //Get information about seconds + + // Get information about warning seconds if (profileSettings.TryGetProperty("warningSeconds", out var warningSecondsElement)) { string warningSeconds = warningSecondsElement.GetString(); - // Überprüfen, ob der Wert existiert, andernfalls auf Standard setzen - var item = SecondsWarningComboBox.Items - .OfType<ComboBoxItem>() + // Überprüfen, ob der gespeicherte Wert in der ListBox vorhanden ist + var item = CategoryList4.Items + .OfType<ListBoxItem>() .FirstOrDefault(i => i.Content.ToString() == warningSeconds); if (item != null) { - SecondsWarningComboBox.SelectedItem = item; + // Falls der Wert in der Liste existiert, setze ihn als Auswahl + SelectedText4.Text = item.Content.ToString(); } else { - // Setze einen Standardwert, falls der gespeicherte Wert ungültig ist - SecondsWarningComboBox.SelectedItem = "10"; // Default: "10" + // Falls der gespeicherte Wert ungültig ist oder nicht gefunden wurde, Standardwert setzen + SelectedText4.Text = "10"; // Standard: "10" } } + // Mascot Visibility if (profileSettings.TryGetProperty("mascotVisibility", out var mascotVisibilityElement)) { @@ -204,10 +255,100 @@ namespace InnoLabProjektDektopApp private void StartButton_Click(object sender, RoutedEventArgs e) { // Werte auslesen - int focusPeriod = int.Parse(((ComboBoxItem)FocusPeriodComboBox.SelectedItem)?.Content.ToString().Split()[0] ?? "50"); - int breakPeriod = int.Parse(((ComboBoxItem)BreakPeriodComboBox.SelectedItem)?.Content.ToString().Split()[0] ?? "10"); - int cycles = int.Parse(((ComboBoxItem)CyclesComboBox.SelectedItem)?.Content.ToString() ?? "4"); - string distractionMode = ((ComboBoxItem)DistractionModeComboBox.SelectedItem)?.Content.ToString() ?? "Full-blocking mode"; + int focusPeriod; + + // Prüfe zuerst, ob die TextBox (`SelectedText1`) eine gültige Zahl enthält + if (int.TryParse(SelectedText1.Text, out focusPeriod)) + { + // Wert aus der TextBox wurde erfolgreich als Ganzzahl geparst + } + else if (CategoryList1.SelectedItem is ListBoxItem selectedItem && + int.TryParse(selectedItem.Content.ToString(), out focusPeriod)) + { + // Falls die TextBox leer ist, prüfe ob ein Wert in der ListBox ausgewählt wurde + } + else + { + // Falls nichts gültiges eingegeben wurde, setze den Standardwert 50 + focusPeriod = 50; + } + + // Werte auslesen + int breakPeriod; + + // Prüfe zuerst, ob die TextBox (`SelectedText1`) eine gültige Zahl enthält + if (int.TryParse(SelectedText2.Text, out breakPeriod)) + { + // Wert aus der TextBox wurde erfolgreich als Ganzzahl geparst + } + else if (CategoryList2.SelectedItem is ListBoxItem selectedItem && + int.TryParse(selectedItem.Content.ToString(), out breakPeriod)) + { + // Falls die TextBox leer ist, prüfe ob ein Wert in der ListBox ausgewählt wurde + } + else + { + // Falls nichts gültiges eingegeben wurde, setze den Standardwert 50 + breakPeriod = 10; + } + + // Werte auslesen + int cycles; + + // Prüfe zuerst, ob die TextBox (`SelectedText1`) eine gültige Zahl enthält + if (int.TryParse(SelectedText3.Text, out cycles)) + { + // Wert aus der TextBox wurde erfolgreich als Ganzzahl geparst + } + else if (CategoryList3.SelectedItem is ListBoxItem selectedItem && + int.TryParse(selectedItem.Content.ToString(), out cycles)) + { + // Falls die TextBox leer ist, prüfe ob ein Wert in der ListBox ausgewählt wurde + } + else + { + // Falls nichts gültiges eingegeben wurde, setze den Standardwert 50 + cycles = 4; + } + + // Standardwert für distractionMode + string distractionMode = "Full-blocking mode"; + + // Prüfe zuerst, ob die TextBox (`SelectedText`) einen gültigen Wert enthält + if (!string.IsNullOrWhiteSpace(SelectedText.Text)) + { + distractionMode = SelectedText.Text; // Wert aus der TextBox übernehmen + } + else if (CategoryList.SelectedItem is ListBoxItem selectedItem) + { + distractionMode = selectedItem.Content.ToString(); // Falls in der ListBox etwas gewählt wurde + } + else + { + // Falls nichts gültiges eingegeben wurde, setze den Standardwert + distractionMode = "Full-blocking mode"; + } + + int warningSeconds; + + // Prüfe zuerst, ob die TextBox (`SelectedText1`) eine gültige Zahl enthält + if (int.TryParse(SelectedText4.Text, out warningSeconds)) + { + // Wert aus der TextBox wurde erfolgreich als Ganzzahl geparst + } + else if (CategoryList4.SelectedItem is ListBoxItem selectedItem && + int.TryParse(selectedItem.Content.ToString(), out warningSeconds)) + { + // Falls die TextBox leer ist, prüfe ob ein Wert in der ListBox ausgewählt wurde + } + else + { + MessageBox.Show("THIS", "Title", MessageBoxButton.OK, MessageBoxImage.Information); + + // Falls nichts gültiges eingegeben wurde, setze den Standardwert 50 + warningSeconds = 10; + } + string mascotVisible = ((ComboBoxItem)MascotVisibilityComboBox.SelectedItem)?.Content.ToString() ?? "Yes"; bool wordsOfAffirmation = WordsOfAffirmationCheckBox.IsChecked ?? false; bool insultingWords = InsultingWordsCheckBox.IsChecked ?? false; @@ -217,6 +358,7 @@ namespace InnoLabProjektDektopApp $"Break Period: {breakPeriod} minutes\n" + $"Cycles: {cycles}\n" + $"Distraction Mode: {distractionMode}\n" + + $"Warning Seconds: {warningSeconds}\n" + $"Mascot Visible: {mascotVisible}\n" + $"Words of Affirmation: {wordsOfAffirmation}\n" + $"Insulting Words: {insultingWords}", @@ -247,24 +389,7 @@ namespace InnoLabProjektDektopApp } - private void DistractionMode_SelectionChanged(object sender, SelectionChangedEventArgs e) - { - if (DistractionModeComboBox.SelectedItem != null && - DistractionModeComboBox.SelectedItem.ToString().Contains("seconds warning mode")) - { - SecondsWarningPanel.Visibility = Visibility.Visible; - // Setze einen Standardwert, falls keiner ausgewählt ist - if (SecondsWarningComboBox.SelectedItem == null) - { - SecondsWarningComboBox.SelectedItem = "10"; // Default: "10" - } - } - else - { - SecondsWarningPanel.Visibility = Visibility.Collapsed; - } - } private void MascotVisibilityComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { @@ -288,7 +413,208 @@ namespace InnoLabProjektDektopApp } } + private void SelectedTextBox_TextChanged(object sender, TextChangedEventArgs e) + { + TextBox textBox = sender as TextBox; + if (textBox == null) return; + + string input = textBox.Text; + + // Erlaubt nur numerische Eingaben (positive Ganzzahlen) und begrenzt die Länge auf 3 Zeichen + if (!Regex.IsMatch(input, @"^\d*$")) + { + int cursorPos = textBox.SelectionStart - 1; // Cursor-Position speichern + textBox.Text = Regex.Replace(input, @"\D", ""); // Alle nicht-numerischen Zeichen entfernen + textBox.SelectionStart = Math.Max(cursorPos, 0); // Cursor wieder an die ursprüngliche Stelle setzen + } + + // Maximal 3 Zeichen erlauben + if (textBox.Text.Length > 3) + { + int cursorPos = textBox.SelectionStart - 1; // Cursor-Position speichern + textBox.Text = textBox.Text.Substring(0, 3); // Kürzt den Text auf 3 Zeichen + textBox.SelectionStart = Math.Max(cursorPos, 0); // Cursor-Position wieder setzen + } + } + + private void TogglePopup(object sender, MouseButtonEventArgs e) + { + // Popup umschalten + PopupMenu.IsOpen = !PopupMenu.IsOpen; + + // Wenn das Popup geöffnet wird, registriere das globale Klick-Event + if (PopupMenu.IsOpen) + { + this.PreviewMouseDown += ClosePopupOnClickOutside; + } + } + + private void CategoryList_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (CategoryList.SelectedItem is ListBoxItem selectedItem) + { + SelectedText.Text = selectedItem.Content.ToString(); + PopupMenu.IsOpen = false; // Popup schließen nach Auswahl + this.PreviewMouseDown -= ClosePopupOnClickOutside; // Event entfernen + + if (SelectedText.Text.Contains("seconds warning mode")) + { + SecondsWarningPanel.Visibility = Visibility.Visible; + + // Setze einen Standardwert für Warning Seconds, falls kein Wert vorhanden ist + if (string.IsNullOrWhiteSpace(SelectedText.Text)) + { + SelectedText.Text = "10"; // Default-Wert für Warning Seconds + } + } + else + { + SecondsWarningPanel.Visibility = Visibility.Collapsed; + } + } + } + + private void ClosePopupOnClickOutside(object sender, MouseButtonEventArgs e) + { + if (!PopupMenu.IsMouseOver && !DropdownBorder.IsMouseOver) + { + PopupMenu.IsOpen = false; + this.PreviewMouseDown -= ClosePopupOnClickOutside; // Event entfernen + } + } + + private void TogglePopup1(object sender, MouseButtonEventArgs e) + { + // Popup umschalten + PopupMenu1.IsOpen = !PopupMenu1.IsOpen; + + // Wenn das Popup geöffnet wird, registriere das globale Klick-Event + if (PopupMenu1.IsOpen) + { + this.PreviewMouseDown += ClosePopupOnClickOutside1; + } + } + + private void CategoryList_SelectionChanged1(object sender, SelectionChangedEventArgs e) + { + if (CategoryList1.SelectedItem is ListBoxItem selectedItem) + { + SelectedText1.Text = selectedItem.Content.ToString(); + PopupMenu1.IsOpen = false; // Popup schließen nach Auswahl + this.PreviewMouseDown -= ClosePopupOnClickOutside1; // Event entfernen + } + } + + + + + + private void ClosePopupOnClickOutside1(object sender, MouseButtonEventArgs e) + { + if (!PopupMenu1.IsMouseOver && !DropdownBorder1.IsMouseOver) + { + PopupMenu1.IsOpen = false; + this.PreviewMouseDown -= ClosePopupOnClickOutside1; // Event entfernen + } + } + + private void TogglePopup2(object sender, MouseButtonEventArgs e) + { + // Popup umschalten + PopupMenu2.IsOpen = !PopupMenu2.IsOpen; + + // Wenn das Popup geöffnet wird, registriere das globale Klick-Event + if (PopupMenu2.IsOpen) + { + this.PreviewMouseDown += ClosePopupOnClickOutside2; + } + } + private void CategoryList_SelectionChanged2(object sender, SelectionChangedEventArgs e) + { + if (CategoryList2.SelectedItem is ListBoxItem selectedItem) + { + SelectedText2.Text = selectedItem.Content.ToString(); + PopupMenu2.IsOpen = false; // Popup schließen nach Auswahl + this.PreviewMouseDown -= ClosePopupOnClickOutside2; // Event entfernen + } + } + + + private void ClosePopupOnClickOutside2(object sender, MouseButtonEventArgs e) + { + if (!PopupMenu2.IsMouseOver && !DropdownBorder2.IsMouseOver) + { + PopupMenu2.IsOpen = false; + this.PreviewMouseDown -= ClosePopupOnClickOutside2; // Event entfernen + } + } + + private void TogglePopup3(object sender, MouseButtonEventArgs e) + { + // Popup umschalten + PopupMenu3.IsOpen = !PopupMenu2.IsOpen; + + // Wenn das Popup geöffnet wird, registriere das globale Klick-Event + if (PopupMenu3.IsOpen) + { + this.PreviewMouseDown += ClosePopupOnClickOutside3; + } + } + + private void CategoryList_SelectionChanged3(object sender, SelectionChangedEventArgs e) + { + if (CategoryList3.SelectedItem is ListBoxItem selectedItem) + { + SelectedText3.Text = selectedItem.Content.ToString(); + PopupMenu3.IsOpen = false; // Popup schließen nach Auswahl + this.PreviewMouseDown -= ClosePopupOnClickOutside3; // Event entfernen + } + } + + + + private void ClosePopupOnClickOutside3(object sender, MouseButtonEventArgs e) + { + if (!PopupMenu3.IsMouseOver && !DropdownBorder2.IsMouseOver) + { + PopupMenu3.IsOpen = false; + this.PreviewMouseDown -= ClosePopupOnClickOutside3; // Event entfernen + } + } + + private void TogglePopup4(object sender, MouseButtonEventArgs e) + { + // Popup umschalten + PopupMenu4.IsOpen = !PopupMenu2.IsOpen; + + // Wenn das Popup geöffnet wird, registriere das globale Klick-Event + if (PopupMenu4.IsOpen) + { + this.PreviewMouseDown += ClosePopupOnClickOutside4; + } + } + + private void CategoryList_SelectionChanged4(object sender, SelectionChangedEventArgs e) + { + if (CategoryList4.SelectedItem is ListBoxItem selectedItem) + { + SelectedText4.Text = selectedItem.Content.ToString(); + PopupMenu4.IsOpen = false; // Popup schließen nach Auswahl + this.PreviewMouseDown -= ClosePopupOnClickOutside4; // Event entfernen + } + } + + + + private void ClosePopupOnClickOutside4(object sender, MouseButtonEventArgs e) + { + if (!PopupMenu4.IsMouseOver && !DropdownBorder2.IsMouseOver) + { + PopupMenu4.IsOpen = false; + this.PreviewMouseDown -= ClosePopupOnClickOutside4; // Event entfernen + } + } } } -- GitLab