-
Notifications
You must be signed in to change notification settings - Fork 30
Expand file tree
/
Copy pathMainForm.cs
More file actions
49 lines (47 loc) · 4.87 KB
/
Copy pathMainForm.cs
File metadata and controls
49 lines (47 loc) · 4.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
namespace EasySystemCleaner;
public sealed class MainForm : Form
{
private readonly CleanerEngine _engine;
private readonly CheckedListBox _rules = new() { Dock = DockStyle.Left, Width = 360, CheckOnClick = true, BorderStyle = BorderStyle.None };
private readonly ListView _results = new() { Dock = DockStyle.Fill, View = View.Details, FullRowSelect = true, GridLines = true };
private readonly Label _summary = new() { AutoSize = true, Padding = new Padding(14, 10, 14, 10) };
private readonly Button _scan = new() { Text = "Analyse starten", AutoSize = true };
private readonly Button _clean = new() { Text = "Bereinigen", AutoSize = true, Enabled = false };
private IReadOnlyList<ScanItem> _scanItems = Array.Empty<ScanItem>();
public MainForm(CleanerEngine engine)
{
_engine = engine;
Text = "EasySystemCleaner"; Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath); MinimumSize = new Size(900, 560); Size = new Size(1100, 700); StartPosition = FormStartPosition.CenterScreen;
BackColor = Color.White; Font = new Font("Segoe UI", 10);
var header = new TableLayoutPanel { Dock = DockStyle.Top, Height = 105, ColumnCount = 2, Padding = new Padding(18, 14, 18, 6) };
header.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); header.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));
var title = new Label { Text = "EasySystemCleaner", Font = new Font("Segoe UI Semibold", 22), AutoSize = true };
var sub = new Label { Text = "Portable cleaner for Windows 11 • Version 1.2 - 2026", AutoSize = true, ForeColor = Color.DimGray };
var titlePanel = new FlowLayoutPanel { FlowDirection = FlowDirection.TopDown, AutoSize = true, Dock = DockStyle.Fill }; titlePanel.Controls.AddRange([title, sub]);
var actions = new FlowLayoutPanel { AutoSize = true, Anchor = AnchorStyles.Right | AnchorStyles.Top }; actions.Controls.AddRange([_scan, _clean]);
header.Controls.Add(titlePanel, 0, 0); header.SetRowSpan(titlePanel, 2); header.Controls.Add(actions, 1, 0);
var footer = new Label { Dock = DockStyle.Bottom, Height = 38, Text = "Copyright by Dr. René Bäder (PhDs) • Freeware • GNU General Public License v3.0", TextAlign = ContentAlignment.MiddleCenter, ForeColor = Color.DimGray };
_results.Columns.Add("Bereich", 160); _results.Columns.Add("Gefundene Dateien", 140); _results.Columns.Add("Speicher", 110); _results.Columns.Add("Beispiele", 420);
var content = new Panel { Dock = DockStyle.Fill, Padding = new Padding(18, 0, 18, 8) }; content.Controls.Add(_results); content.Controls.Add(_rules);
Controls.Add(content); Controls.Add(_summary); _summary.Dock = DockStyle.Bottom; Controls.Add(footer); Controls.Add(header);
var selected = _engine.LoadSelection(); foreach (var rule in _engine.Rules) _rules.Items.Add($"[{rule.Category}] {rule.Name}\n{rule.Description}", selected.Contains(rule.Id));
_scan.Click += async (_, _) => await ScanAsync(); _clean.Click += async (_, _) => await CleanAsync();
}
private IEnumerable<string> SelectedIds() => _rules.CheckedIndices.Cast<int>().Select(i => _engine.Rules[i].Id);
private async Task ScanAsync()
{
Toggle(false); _summary.Text = "Analysiere die ausgewählten Bereiche …"; _engine.SaveSelection(SelectedIds());
_scanItems = await Task.Run(() => _engine.Scan(SelectedIds().ToList())); _results.Items.Clear();
foreach (var item in _scanItems) _results.Items.Add(new ListViewItem([item.Rule.Name, item.Files.ToString("N0"), Formatter.Bytes(item.Bytes), string.Join("; ", item.Examples.Select(Path.GetFileName))]));
_summary.Text = $"Analyse abgeschlossen: {_scanItems.Sum(i => i.Files):N0} Dateien, {Formatter.Bytes(_scanItems.Sum(i => i.Bytes))} können bereinigt werden."; _clean.Enabled = true; Toggle(true);
}
private async Task CleanAsync()
{
if (MessageBox.Show("Ausgewählte Dateien werden endgültig gelöscht. Fortfahren?", "EasySystemCleaner", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) != DialogResult.Yes) return;
Toggle(false); _summary.Text = "Bereinigung läuft …"; var result = await Task.Run(() => _engine.Clean(SelectedIds().ToList()));
_engine.AppendLog($"Manual cleanup: {result.DeletedFiles} files, {Formatter.Bytes(result.FreedBytes)} freed."); _summary.Text = $"Bereinigung abgeschlossen: {result.DeletedFiles:N0} Dateien, {Formatter.Bytes(result.FreedBytes)} freigegeben.";
if (result.Errors.Count > 0) MessageBox.Show($"{result.Errors.Count} Elemente konnten nicht entfernt werden (z. B. in Benutzung). Details stehen in EasySystemCleaner.log.", "Hinweis", MessageBoxButtons.OK, MessageBoxIcon.Information);
_clean.Enabled = false; Toggle(true);
}
private void Toggle(bool enabled) { _rules.Enabled = enabled; _scan.Enabled = enabled; if (!enabled) _clean.Enabled = false; UseWaitCursor = !enabled; }
}