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
No related branches found
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 @@ ...@@ -15,6 +15,7 @@
<ItemGroup> <ItemGroup>
<None Remove="Assets\blockedProcesses.json" /> <None Remove="Assets\blockedProcesses.json" />
<None Remove="Assets\distractingPrograms.json" />
<None Remove="Assets\distractingWebsites.json" /> <None Remove="Assets\distractingWebsites.json" />
<None Remove="Assets\gamesicon.png" /> <None Remove="Assets\gamesicon.png" />
<None Remove="Assets\icon.ico" /> <None Remove="Assets\icon.ico" />
...@@ -55,6 +56,9 @@ ...@@ -55,6 +56,9 @@
<Content Include="Assets\blockedProcesses.json"> <Content Include="Assets\blockedProcesses.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
<Content Include="Assets\distractingPrograms.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Assets\distractingWebsites.json"> <Content Include="Assets\distractingWebsites.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
......
...@@ -12,6 +12,9 @@ ...@@ -12,6 +12,9 @@
</Compile> </Compile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Screens\FirstLaunch\03_2ProgramsList.xaml">
<SubType>Designer</SubType>
</Page>
<Page Update="Screens\FirstLaunch\03_1DistractionsList.xaml"> <Page Update="Screens\FirstLaunch\03_1DistractionsList.xaml">
<SubType>Designer</SubType> <SubType>Designer</SubType>
</Page> </Page>
......
...@@ -68,7 +68,7 @@ ...@@ -68,7 +68,7 @@
</Grid> </Grid>
<TextBlock Style="{StaticResource StandardText}" Text="By clicking on each category, you can change the programs/websites that should be marked as distracting."/> <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" /> <StackPanel x:Name="SearchResultsPanel" />
</ScrollViewer> </ScrollViewer>
......
...@@ -228,9 +228,14 @@ namespace InnoLabProjektDektopApp ...@@ -228,9 +228,14 @@ namespace InnoLabProjektDektopApp
if (!string.IsNullOrEmpty(category)) if (!string.IsNullOrEmpty(category))
{ {
if(category == "Other Programs")
this.NavigationService.Navigate(new DistractionsList(category)); {
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 ...@@ -125,7 +125,8 @@ namespace InnoLabProjektDektopApp
// Ereignis-Handler für den "Edit Profile"-Button // Ereignis-Handler für den "Edit Profile"-Button
private void EditProfile_Click(object sender, RoutedEventArgs e) 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 // Ereignis-Handler für den "Add Profile"-Button
......
...@@ -71,6 +71,16 @@ namespace InnoLabProjektDektopApp.Services ...@@ -71,6 +71,16 @@ namespace InnoLabProjektDektopApp.Services
Debug.WriteLine($"Distraction stage: {stage}"); 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) private void HandleNewProcess(ManagementBaseObject e)
{ {
var processName = Path.GetFileNameWithoutExtension((string)((ManagementBaseObject)e["TargetInstance"])["Name"]); 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.
Finish editing this message first!
Please register or to comment