diff --git a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Assets/distractingPrograms.json b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Assets/distractingPrograms.json new file mode 100644 index 0000000000000000000000000000000000000000..2d5a7c5c2af6d6e21d1b1096cfa6d066f9edac22 --- /dev/null +++ b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Assets/distractingPrograms.json @@ -0,0 +1,14 @@ +{ + "Programs": [ + { + "processName": "steam", + "mainWindowTitle": "The Steam Game Launcher", + "distracting": true + }, + { + "processName": "discord", + "mainWindowTitle": "Messaging service", + "distracting": true + } + ] +} \ No newline at end of file diff --git a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/InnoLabProjektDektopApp.csproj b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/InnoLabProjektDektopApp.csproj index 5e480db54ac8031f331301280c37b2da08a89c14..63aa5dd38b2c763d2c4e6efcdc8e30556899c1b0 100644 --- a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/InnoLabProjektDektopApp.csproj +++ b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/InnoLabProjektDektopApp.csproj @@ -15,6 +15,7 @@ <ItemGroup> <None Remove="Assets\blockedProcesses.json" /> + <None Remove="Assets\distractingPrograms.json" /> <None Remove="Assets\distractingWebsites.json" /> <None Remove="Assets\gamesicon.png" /> <None Remove="Assets\icon.ico" /> @@ -55,6 +56,9 @@ <Content Include="Assets\blockedProcesses.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> + <Content Include="Assets\distractingPrograms.json"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> <Content Include="Assets\distractingWebsites.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> diff --git a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/InnoLabProjektDektopApp.csproj.user b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/InnoLabProjektDektopApp.csproj.user index af921afd5877ef45f3aa8fea89de501934c70d25..92b7ce65cc46375f291131fc7d5d03ffb956158d 100644 --- a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/InnoLabProjektDektopApp.csproj.user +++ b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/InnoLabProjektDektopApp.csproj.user @@ -10,8 +10,14 @@ <Compile Update="Screens\Templates\HeaderTemplate.xaml.cs"> <SubType>Code</SubType> </Compile> + <Compile Update="Utils\InputDialog.xaml.cs"> + <SubType>Code</SubType> + </Compile> </ItemGroup> <ItemGroup> + <Page Update="Screens\FirstLaunch\03_2ProgramsList.xaml"> + <SubType>Designer</SubType> + </Page> <Page Update="Screens\FirstLaunch\03_1DistractionsList.xaml"> <SubType>Designer</SubType> </Page> @@ -45,5 +51,8 @@ <Page Update="Styles\Styles.xaml"> <SubType>Designer</SubType> </Page> + <Page Update="Utils\InputDialog.xaml"> + <SubType>Designer</SubType> + </Page> </ItemGroup> </Project> \ No newline at end of file diff --git a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/FirstLaunch/03_0Distractions.xaml b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/FirstLaunch/03_0Distractions.xaml index 5a06954c9a5def8ca2ba89ed4fe4b09784207c57..e62c6ab5b39a53e753d769cc4c88ba0bb3c29194 100644 --- a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/FirstLaunch/03_0Distractions.xaml +++ b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/FirstLaunch/03_0Distractions.xaml @@ -68,7 +68,7 @@ </Grid> <TextBlock Style="{StaticResource StandardText}" Text="By clicking on each category, you can change the programs/websites that should be marked as distracting."/> - <ScrollViewer VerticalScrollBarVisibility="Auto" Margin="20,10,0,8" Height="100"> + <ScrollViewer VerticalScrollBarVisibility="Auto" Margin="20,0,0,8" Height="0"> <StackPanel x:Name="SearchResultsPanel" /> </ScrollViewer> diff --git a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/FirstLaunch/03_0Distractions.xaml.cs b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/FirstLaunch/03_0Distractions.xaml.cs index 87142798f082f98d2f62705954b230f8a20e4dae..554562b3c62ce3d907473b10c9c489f0b94bf996 100644 --- a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/FirstLaunch/03_0Distractions.xaml.cs +++ b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/FirstLaunch/03_0Distractions.xaml.cs @@ -228,9 +228,14 @@ namespace InnoLabProjektDektopApp if (!string.IsNullOrEmpty(category)) { - - this.NavigationService.Navigate(new DistractionsList(category)); - + if(category == "Other Programs") + { + this.NavigationService.Navigate(new ProgramsList()); + } + else + { + this.NavigationService.Navigate(new DistractionsList(category)); + } } } } diff --git a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/FirstLaunch/03_2ProgramsList.xaml b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/FirstLaunch/03_2ProgramsList.xaml new file mode 100644 index 0000000000000000000000000000000000000000..25c59825347f2e94e66b03f3faea008a3a4adda8 --- /dev/null +++ b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/FirstLaunch/03_2ProgramsList.xaml @@ -0,0 +1,175 @@ +<Page x:Class="InnoLabProjektDektopApp.ProgramsList" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:local="clr-namespace:InnoLabProjektDektopApp" + xmlns:header="clr-namespace:InnoLabProjektDektopApp.Screens.Templates" + mc:Ignorable="d"> + <Grid> + <StackPanel Margin="20,20,20,20"> + <Grid> + <Grid.ColumnDefinitions> + <ColumnDefinition Width="*" /> + <ColumnDefinition Width="Auto" /> + </Grid.ColumnDefinitions> + + <Button Width="40" + Height="40" + Background="White" + BorderBrush="Black" + BorderThickness="1" + HorizontalAlignment="Left" + VerticalAlignment="Top" + Click="BackButton_Click"> + <Button.Template> + <ControlTemplate TargetType="Button"> + <Grid> + <Ellipse Fill="Gray" /> + <TextBlock Text="←" + FontSize="16" + VerticalAlignment="Center" + HorizontalAlignment="Center" /> + </Grid> + </ControlTemplate> + </Button.Template> + </Button> + + + <!-- Überschrift --> + <TextBlock Grid.Column="0" + Style="{StaticResource Header1}" + Text="Edit the list of distracting programs" + HorizontalAlignment="Left" Margin="0,46,0,-46" /> + + <!-- Suchfeld --> + <DockPanel Grid.Column="1" HorizontalAlignment="Right" Margin="10,0,0,0"> + <!-- TextBox für Suche --> + <Grid> + <TextBox x:Name="SearchBox" + Width="150" + Height="30" + FontSize="14" + VerticalAlignment="Center" + Padding="5" + HorizontalAlignment="Left" + Foreground="Black" + Background="Transparent" + BorderBrush="Gray" + BorderThickness="1" + TextChanged="SearchBox_TextChanged" /> + + <TextBlock x:Name="SearchPlaceholder" + Text="Search..." + VerticalAlignment="Center" + HorizontalAlignment="Left" + Foreground="Gray" + FontSize="14" + Padding="5" + IsHitTestVisible="False" + Margin="5,0,0,0" /> + </Grid> + + <!-- Lupe-Symbol --> + <Button Width="30" + Height="30" + Margin="5,0,0,0" + VerticalAlignment="Center" + HorizontalAlignment="Right"> + <TextBlock Text="🔍" + FontSize="14" + VerticalAlignment="Center" + HorizontalAlignment="Center" /> + </Button> + </DockPanel> + </Grid> + <TextBlock Style="{StaticResource StandardText}" Margin="0,40,0,0" + Text="By clicking on a toggle, you can change the programs that should be marked as distracting." /> + + <Border Background="#2C2C2C" CornerRadius="10" Padding="10" Margin="0,10,0,0"> + <Grid> + <Grid.ColumnDefinitions> + <ColumnDefinition Width="2*" /> + <ColumnDefinition Width="3*" /> + <ColumnDefinition Width="2*" /> + <ColumnDefinition Width="Auto" /> + </Grid.ColumnDefinitions> + + <!-- Label --> + <TextBlock Text="Add a distracting program:" + VerticalAlignment="Center" + Foreground="White" + FontSize="14" + FontWeight="Bold" + Grid.Column="0" + Margin="10,0,10,0" /> + + <!-- Input Field with Placeholder --> + <Grid Grid.Column="1" VerticalAlignment="Center" Margin="0,0,10,0"> + <TextBox x:Name="UrlInputBox" + VerticalAlignment="Center" + Padding="5" + FontSize="14" + Background="Transparent" + Foreground="White" + BorderBrush="Gray" + BorderThickness="1" + TextChanged="UrlInputBox_TextChanged" /> + <TextBlock x:Name="UrlPlaceholder" + Text="process name" + VerticalAlignment="Center" + Foreground="Gray" + FontSize="14" + Padding="5" + IsHitTestVisible="False" + Margin="5,0,0,0" /> + </Grid> + + <!-- Add Button --> + <Button Width="30" + Height="30" + VerticalAlignment="Center" + HorizontalAlignment="Right" + Grid.Column="3" + Margin="0" + BorderThickness="0" + ToolTip="Add" + Click="AddButton_Click"> + <TextBlock Text="+" + FontSize="20" + Foreground="#333436" + VerticalAlignment="Center" + HorizontalAlignment="Center" + /> + </Button> + </Grid> + </Border> + + <!-- Überschrift --> + <Grid> + <StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="0,10,0,10" Width="350"> + <CheckBox x:Name="OtherProgramsCheckBox" IsChecked="True" VerticalAlignment="Center"/> + <TextBlock x:Name="HeaderTextBlock" + Style="{StaticResource Header2}" + Text="CATEGORY" RenderTransformOrigin="0.548,1.689" Margin="10,0,0,0"/> + </StackPanel> + <StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="0,10,0,10" Width="430"> + <TextBlock x:Name="HeaderTextBlock2" + Style="{StaticResource Header2}" + Text="Running Programs" RenderTransformOrigin="0.548,1.689" Margin="0,0,0,0" HorizontalAlignment="Right"/> + <Button Width="110" Margin="150,0,0,0" ToolTip="Refresh" Click="RefreshButton_Click"> + <TextBlock Text="Click to Refresh"/> + </Button> + </StackPanel> + </Grid> + </StackPanel> + <ScrollViewer VerticalScrollBarVisibility="Auto" Margin="20,225,20,8" Width="400px" HorizontalAlignment="Left"> + <StackPanel x:Name="ItemsPanel" /> + </ScrollViewer> + <ScrollViewer VerticalScrollBarVisibility="Auto" Margin="20,225,20,8" Width="400px" HorizontalAlignment="Right"> + <StackPanel x:Name="ItemsPanel2" /> + </ScrollViewer> + + + </Grid> +</Page> \ No newline at end of file diff --git a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/FirstLaunch/03_2ProgramsList.xaml.cs b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/FirstLaunch/03_2ProgramsList.xaml.cs new file mode 100644 index 0000000000000000000000000000000000000000..c323f922c82432dfb6bb61444c5db2f4810bbca1 --- /dev/null +++ b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/FirstLaunch/03_2ProgramsList.xaml.cs @@ -0,0 +1,360 @@ +using System.Text; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.Json; +using System.Text.Json.Serialization; +using InnoLabProjektDektopApp.Services; +using System.Diagnostics; +using static InnoLabProjektDektopApp.DistractionsList; +using System; +using InnoLabProjektDektopApp.Utils; + + +namespace InnoLabProjektDektopApp +{ + public partial class ProgramsList : Page + { + private Dictionary<string, List<ProcessEntry>> _data; + private readonly string _jsonFilePath; + + public ProgramsList() + { + InitializeComponent(); + _jsonFilePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Assets", "distractingPrograms.json"); + LoadProgramList(); + RefreshRunningProcessList(); + } + + private void SearchBox_TextChanged(object sender, TextChangedEventArgs e) + { + // Platzhalter ein- oder ausblenden + if (!string.IsNullOrEmpty(SearchBox.Text)) + { + SearchPlaceholder.Visibility = Visibility.Collapsed; // Ausblenden + } + else + { + SearchPlaceholder.Visibility = Visibility.Visible; // Einblenden + } + + // Filterlogik für die Suchergebnisse + string searchText = SearchBox.Text?.ToLower() ?? string.Empty; + + // Clear current UI + ItemsPanel.Children.Clear(); + + // Filter items based on search text + if (_data != null && _data.TryGetValue("Programs", out List<ProcessEntry>? value)) + { + var filteredItems = value.Where( + item => string.IsNullOrEmpty(searchText) || + item.ProcessName.Contains(searchText, StringComparison.CurrentCultureIgnoreCase)) + .ToList(); + + foreach (var item in filteredItems) + { + // Create a StackPanel for each filtered item + ShowNewItemInList(item.ProcessName, item.MainWindowTitle, item.IsDistracting); + } + } + } + + + + private void AddButton_Click(object sender, RoutedEventArgs e) + { + string enteredUrl = UrlInputBox.Text.Trim(); + + if (string.IsNullOrEmpty(enteredUrl)) + { + MessageBox.Show("Please enter a URL.", "Invalid Input", MessageBoxButton.OK, MessageBoxImage.Warning); + return; + } + + // Add the new URL to the current category + if (!_data.ContainsKey("Programs")) + { + _data["Programs"] = new List<ProcessEntry>(); + } + + // Check if the process is already in the list + if (_data["Programs"].Any(p => p.ProcessName.Equals(enteredUrl, StringComparison.CurrentCultureIgnoreCase))) + { + MessageBox.Show($"Process '{enteredUrl}' is already added.", "Info", MessageBoxButton.OK, MessageBoxImage.Information); + UrlInputBox.Clear(); + return; + } + + _data["Programs"].Add(new ProcessEntry + { + ProcessName = enteredUrl, + MainWindowTitle = enteredUrl, + IsDistracting = true + }); + + // Save changes to the JSON + SaveData(); + + // Add to UI dynamically + var stackPanel = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(5, 2, 5, 2) }; + + var checkBox = new CheckBox + { + Content = $"{enteredUrl}: {enteredUrl}", + Margin = new Thickness(5), + IsChecked = true, + Tag = new ProcessEntry { ProcessName = enteredUrl, MainWindowTitle = enteredUrl, IsDistracting = true } + }; + + checkBox.Checked += CheckBox_CheckedChanged; + checkBox.Unchecked += CheckBox_CheckedChanged; + + stackPanel.Children.Add(checkBox); + ItemsPanel.Children.Add(stackPanel); + + // Clear the input field + UrlInputBox.Clear(); + + // Refresh Panel to exclude duplicates + RefreshRunningProcessList(); + } + + private void RefreshButton_Click(object sender, RoutedEventArgs e) + { + RefreshRunningProcessList(); + } + + private void RefreshRunningProcessList() + { + var windowedProcesses = ProcessMonitor.GetWindowedProcesses(); + ItemsPanel2.Children.Clear(); + foreach (var process in windowedProcesses) + { + // check if the process is not already in the list + if (_data["Programs"].Any(p => p.ProcessName.Equals(process.Name, StringComparison.CurrentCultureIgnoreCase))) continue; + + var stackPanel = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(5, 2, 5, 2) }; + + var button = new Button + { + Content = "+", + Width = 30, + Margin = new Thickness(5) + }; + + var textBlock = new TextBlock + { + Text = $"{process.MainWindowTitle} ({process.Name})", + Margin = new Thickness(5), + ToolTip = $"{process.MainWindowTitle} ({process.Name})" + }; + + button.Click += (s, args) => + { + AddProcessFromList(process.Name, process.MainWindowTitle); + }; + + stackPanel.Children.Add(button); + stackPanel.Children.Add(textBlock); + ItemsPanel2.Children.Add(stackPanel); + } + } + + private void AddProcessFromList(string processName, string mainWindowTitle) + { + // Check if the process is already in the list + if (_data.TryGetValue("Programs", out List<ProcessEntry>? value) && value.Any(p => p.ProcessName.Equals(processName, StringComparison.CurrentCultureIgnoreCase))) + { + MessageBox.Show($"Process '{processName}' is already added.", "Info", MessageBoxButton.OK, MessageBoxImage.Information); + return; + } + + //show a message box to give the user the option to change the main window title + var inputDialog = new InputDialog("Enter a new Title:", mainWindowTitle); // Assuming InputDialog is a custom dialog + if (inputDialog.ShowDialog() == true) + { + mainWindowTitle = inputDialog.Input; // Get updated title + } + + if (inputDialog.DialogResult == false) return; + + + // Add the process to the list + if (!_data.ContainsKey("Programs")) + { + _data["Programs"] = []; + } + _data["Programs"].Add(new ProcessEntry + { + ProcessName = processName, + MainWindowTitle = mainWindowTitle, + IsDistracting = true + }); + + ShowNewItemInList(processName, mainWindowTitle, true); + RefreshRunningProcessList(); + + // Save changes to the JSON + SaveData(); + } + + private void ShowNewItemInList(string processName, string mainWindowTitle, bool isDistracting) + { + // Add to UI dynamically + var newStackPanel = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(5, 2, 5, 2) }; + var newCheckBox = new CheckBox + { + Content = $"{mainWindowTitle} ({processName})", + Margin = new Thickness(5), + IsChecked = isDistracting, + ToolTip = $"{mainWindowTitle} ({processName})", + Tag = new ProcessEntry { ProcessName = processName, MainWindowTitle = mainWindowTitle, IsDistracting = isDistracting } + }; + newCheckBox.Checked += CheckBox_CheckedChanged; + newCheckBox.Unchecked += CheckBox_CheckedChanged; + + var editButton = new Button + { + Content = "Edit", + Margin = new Thickness(5, 0, 0, 0), + Tag = newCheckBox // Store reference to checkbox for easier editing + }; + editButton.Click += (s, e) => EditItemInList(processName, mainWindowTitle); + + newStackPanel.Children.Add(newCheckBox); + newStackPanel.Children.Add(editButton); + ItemsPanel.Children.Add(newStackPanel); + } + + private void EditItemInList(string processName, string mainWindowTitle) + { + var inputDialog = new InputDialog("Enter a new Title:", mainWindowTitle); + inputDialog.ShowDialog(); + if (inputDialog.DialogResult == false || inputDialog.Input.Length == 0) return; + + _data["Programs"].FirstOrDefault(p => p.ProcessName.Equals(processName, StringComparison.CurrentCultureIgnoreCase))!.MainWindowTitle = inputDialog.Input; + + SaveData(); + RefreshProgramList(); + } + + + private void UrlInputBox_TextChanged(object sender, TextChangedEventArgs e) + { + // Überprüfen, ob die TextBox leer ist + if (!string.IsNullOrEmpty(UrlInputBox.Text)) + { + UrlPlaceholder.Visibility = Visibility.Collapsed; // Placeholder ausblenden + } + else + { + UrlPlaceholder.Visibility = Visibility.Visible; // Placeholder anzeigen + } + } + + public void RefreshProgramList() + { + ItemsPanel.Children.Clear(); + + // Kategorie-Elemente laden + var items = _data["Programs"]; + foreach (var item in items) + { + ShowNewItemInList(item.ProcessName, item.MainWindowTitle, item.IsDistracting); + } + + // Überschrift setzen + HeaderTextBlock.Text = "Programs"; + } + + public void LoadProgramList() + { + try + { + // JSON-Datei lesen + string jsonContent = File.ReadAllText(_jsonFilePath); + + // JSON deserialisieren + _data = JsonSerializer.Deserialize<Dictionary<string, List<ProcessEntry>>>(jsonContent); + + if (_data != null && _data.ContainsKey("Programs")) + { + // Kategorie-Elemente laden + var items = _data["Programs"]; + foreach (var item in items) + { + ShowNewItemInList(item.ProcessName, item.MainWindowTitle, item.IsDistracting); + } + + // Überschrift setzen + HeaderTextBlock.Text = "Programs"; + } + else + { + MessageBox.Show($"No items found for category 'Programs'."); + } + } + catch (Exception ex) + { + MessageBox.Show($"Error loading items: {ex.Message}"); + } + } + + + private void CheckBox_CheckedChanged(object sender, RoutedEventArgs e) + { + if (sender is CheckBox checkBox && checkBox.Tag is ProcessEntry item) + { + // Wert in der JSON-Datenstruktur aktualisieren + item.IsDistracting = checkBox.IsChecked ?? false; + + // Write the value into the _data dictionary + _data["Programs"].FirstOrDefault(p => p.ProcessName.Equals(item.ProcessName, StringComparison.CurrentCultureIgnoreCase))!.IsDistracting = item.IsDistracting; + + // Änderungen in die Datei schreiben + SaveData(); + } + } + + private void SaveData() + { + try + { + string updatedJson = JsonSerializer.Serialize(_data, new JsonSerializerOptions { WriteIndented = true }); + File.WriteAllText(_jsonFilePath, updatedJson); + MessageBox.Show("Data saved successfully!"); + } + catch (Exception ex) + { + MessageBox.Show($"Error saving data: {ex.Message}"); + } + } + + private void BackButton_Click(object sender, RoutedEventArgs e) + { + this.NavigationService.Navigate(new Distractions()); + } + + public class ProcessEntry + { + [JsonPropertyName("processName")] + public required string ProcessName { get; set; } + + [JsonPropertyName("mainWindowTitle")] + public required string MainWindowTitle { get; set; } + + [JsonPropertyName("distracting")] + public bool IsDistracting { get; set; } + } + } +} \ No newline at end of file diff --git a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/Regulaer/01Overview.xaml.cs b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/Regulaer/01Overview.xaml.cs index 1a54142f4748f7d5596ce10a02074a551883f58f..2fffb6f90e1f20a8b45bcc1f01feddbeb3ec40c7 100644 --- a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/Regulaer/01Overview.xaml.cs +++ b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Screens/Regulaer/01Overview.xaml.cs @@ -171,7 +171,8 @@ namespace InnoLabProjektDektopApp // Ereignis-Handler für den "Edit Profile"-Button private void EditProfile_Click(object sender, RoutedEventArgs e) { - MessageBox.Show("Edit Profile clicked!"); + var distractions = new Distractions(); + this.NavigationService.Navigate(distractions); } // Ereignis-Handler für den "Add Profile"-Button diff --git a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Services/ProcessMonitor.cs b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Services/ProcessMonitor.cs index 731269595d516603cc74b964ecddb3c42efe0411..026c3552064ba79686b435dc97bc727428e816ca 100644 --- a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Services/ProcessMonitor.cs +++ b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Services/ProcessMonitor.cs @@ -25,7 +25,7 @@ namespace InnoLabProjektDektopApp.Services public ProcessMonitor() { blockedProcesses = LoadBlockedProcesses(); - + } public async void StartMonitoring() @@ -71,6 +71,17 @@ namespace InnoLabProjektDektopApp.Services Debug.WriteLine($"Distraction stage: {stage}"); } + + public static List<(string Name, string MainWindowTitle)> GetWindowedProcesses() + { + var processes = Process.GetProcesses() + .Where(p => !string.IsNullOrWhiteSpace(p.MainWindowTitle)) + .Where(p => p.ProcessName.ToLower() != "coflow") + .Select(p => (p.ProcessName, p.MainWindowTitle)) + .ToList(); + return processes; + } + private void HandleNewProcess(ManagementBaseObject e) { var processName = Path.GetFileNameWithoutExtension((string)((ManagementBaseObject)e["TargetInstance"])["Name"]); diff --git a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Utils/InputDialog.xaml b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Utils/InputDialog.xaml new file mode 100644 index 0000000000000000000000000000000000000000..c479217f231cc3eeb586371b1bb54a957792578c --- /dev/null +++ b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Utils/InputDialog.xaml @@ -0,0 +1,14 @@ +<Window x:Class="InnoLabProjektDektopApp.Utils.InputDialog" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + Title="Input Dialog" Height="150" Width="300" WindowStartupLocation="CenterOwner"> + <StackPanel Margin="10"> + <TextBlock x:Name="PromptText" Text="Enter your input:" Margin="0,0,0,10" TextWrapping="Wrap"/> + <TextBox x:Name="InputTextBox" Margin="0,0,0,10"/> + <StackPanel Orientation="Horizontal" HorizontalAlignment="Right"> + <Button Content="OK" Click="OK_Click" Width="75" Margin="0,0,10,0" IsDefault="True"/> + <Button Content="Cancel" Click="Cancel_Click" Width="75" IsCancel="True"/> + </StackPanel> + </StackPanel> +</Window> + diff --git a/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Utils/InputDialog.xaml.cs b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Utils/InputDialog.xaml.cs new file mode 100644 index 0000000000000000000000000000000000000000..a335da0e2c3f86092b3940f4063a03f9db4cda7d --- /dev/null +++ b/InnoLabProjektDektopApp/InnoLabProjektDektopApp/Utils/InputDialog.xaml.cs @@ -0,0 +1,33 @@ +using System.Windows; + +namespace InnoLabProjektDektopApp.Utils +{ + /// <summary> + /// Interaction logic for InputDialog.xaml + /// </summary> + public partial class InputDialog : Window + { + public string Input { get; private set; } + + public InputDialog(string prompt, string defaultValue = "") + { + InitializeComponent(); + PromptText.Text = prompt; // Ensure XAML has a TextBlock named PromptText + InputTextBox.Text = defaultValue; // Ensure XAML has a TextBox named InputTextBox + InputTextBox.Focus(); + } + + private void OK_Click(object sender, RoutedEventArgs e) + { + Input = InputTextBox.Text; + DialogResult = true; // Sets DialogResult and allows the window to close + Close(); + } + + private void Cancel_Click(object sender, RoutedEventArgs e) + { + DialogResult = false; // Indicates cancellation + Close(); + } + } +}