Skip to content
Snippets Groups Projects
Commit b604ec7b authored by Philipp Müller's avatar Philipp Müller
Browse files

first draft of process list

parent c202edd2
Branches
No related tags found
1 merge request!28added program list
Showing
with 551 additions and 5 deletions
{
"Programs": [
{
"processName": "steam",
"mainWindowTitle": "The Steam Game Launcher",
"distracting": true
},
{
"processName": "discord",
"mainWindowTitle": "Messaging service",
"distracting": true
}
]
}
\ No newline at end of file
......@@ -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>
......
......
......@@ -12,6 +12,9 @@
</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>
......
......
......@@ -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>
......
......
......@@ -228,9 +228,14 @@ namespace InnoLabProjektDektopApp
if (!string.IsNullOrEmpty(category))
{
if(category == "Other Programs")
{
this.NavigationService.Navigate(new ProgramsList());
}
else
{
this.NavigationService.Navigate(new DistractionsList(category));
}
}
}
}
......
......
<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 websites and programs for this category"
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/websites 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 website:"
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="Url"
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="350">
<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="70,0,0,0" ToolTip="Refresh" Click="RefreshButton_Click">
<TextBlock Text="Click to Refresh"/>
</Button>
</StackPanel>
</Grid>
</StackPanel>
<ScrollViewer VerticalScrollBarVisibility="Auto" Margin="20,215,20,8" Width="400px" HorizontalAlignment="Left">
<StackPanel x:Name="ItemsPanel" />
</ScrollViewer>
<ScrollViewer VerticalScrollBarVisibility="Auto" Margin="20,215,20,8" Width="400px" HorizontalAlignment="Right">
<StackPanel x:Name="ItemsPanel2" />
</ScrollViewer>
</Grid>
</Page>
\ No newline at end of file
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;
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");
LoadCategoryItems();
}
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
var stackPanel = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(5, 2, 5, 2) };
var checkBox = new CheckBox
{
Content = $"{item.ProcessName}: {item.MainWindowTitle}",
Margin = new Thickness(5),
IsChecked = item.IsDistracting,
Tag = item
};
checkBox.Checked += CheckBox_CheckedChanged;
checkBox.Unchecked += CheckBox_CheckedChanged;
stackPanel.Children.Add(checkBox);
// Add the filtered StackPanel to ItemsPanel
ItemsPanel.Children.Add(stackPanel);
}
}
}
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>();
}
_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);
MessageBox.Show($"Process '{enteredUrl}' has been added to the 'Programs' category.", "Success", MessageBoxButton.OK, MessageBoxImage.Information);
// Clear the input field
UrlInputBox.Clear();
}
private void RefreshButton_Click(object sender, RoutedEventArgs e)
{
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 == process.Name.ToLower())) continue;
var stackPanel = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(5, 2, 5, 2) };
// a button with the tag "+"next to the button write the processName: mainWindowTitle
// if a process has been added to the left list (clicked the Add button), delete its entry from the right list
var button = new Button
{
Content = "+",
Width = 30,
Margin = new Thickness(5)
};
var textBlock = new TextBlock
{
Text = $"{process.Name}: {process.MainWindowTitle}",
Margin = new Thickness(5)
};
button.Click += (s, args) =>
{
var processName = process.Name;
var mainWindowTitle = process.MainWindowTitle;
// Check if the process is already in the list
if (_data.ContainsKey("Programs") && _data["Programs"].Any(p => p.ProcessName == processName))
{
MessageBox.Show($"Process '{processName}' is already added.", "Info", MessageBoxButton.OK, MessageBoxImage.Information);
return;
}
// Add the process to the list
if (!_data.ContainsKey("Programs"))
{
_data["Programs"] = new List<ProcessEntry>();
}
_data["Programs"].Add(new ProcessEntry
{
ProcessName = processName,
MainWindowTitle = mainWindowTitle,
IsDistracting = true
});
// Save changes to the JSON
SaveData();
// Add to UI dynamically
var newStackPanel = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(5, 2, 5, 2) };
var newCheckBox = new CheckBox
{
Content = $"{processName}: {mainWindowTitle}",
Margin = new Thickness(5),
IsChecked = true,
Tag = new ProcessEntry { ProcessName = processName, MainWindowTitle = mainWindowTitle, IsDistracting = true }
};
newCheckBox.Checked += CheckBox_CheckedChanged;
newCheckBox.Unchecked += CheckBox_CheckedChanged;
newStackPanel.Children.Add(newCheckBox);
ItemsPanel.Children.Add(newStackPanel);
};
stackPanel.Children.Add(button);
stackPanel.Children.Add(textBlock);
ItemsPanel2.Children.Add(stackPanel);
}
}
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
}
}
private void LoadCategoryItems()
{
try
{
LoadProgramList();
}
catch (Exception ex)
{
MessageBox.Show($"Error loading items: {ex.Message}");
}
}
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)
{
// Checkbox erstellen
var stackPanel = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(5, 2, 5, 2) };
var checkBox = new CheckBox
{
Content = $"{item.ProcessName}: {item.MainWindowTitle}",
Margin = new Thickness(5),
IsChecked = item.IsDistracting,
Tag = item // Speichert die Referenz zum Item
};
checkBox.Checked += CheckBox_CheckedChanged;
checkBox.Unchecked += CheckBox_CheckedChanged;
stackPanel.Children.Add(checkBox);
// Elemente zur Liste hinzufügen
ItemsPanel.Children.Add(stackPanel);
}
// Überschrift setzen
HeaderTextBlock.Text = "Programs";
}
else
{
MessageBox.Show($"No items found for category 'Programs'.");
}
}
catch (Exception ex)
{
MessageBox.Show($"Error loading items: {ex.Message}");
}
var processes = ProcessMonitor.GetWindowedProcesses();
foreach (var process in processes)
{
Debug.WriteLine($"Process: {process.Name}, Title: {process.MainWindowTitle}");
}
}
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;
// Ä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
......@@ -125,7 +125,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
......
......
......@@ -71,6 +71,16 @@ 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))
.Select(p => (p.ProcessName, p.MainWindowTitle))
.ToList();
return processes;
}
private void HandleNewProcess(ManagementBaseObject e)
{
var processName = Path.GetFileNameWithoutExtension((string)((ManagementBaseObject)e["TargetInstance"])["Name"]);
......
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment