Push 1.1-prev
This commit is contained in:
@@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.10.34928.147
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MSCFixer", "MSCFixer\MSCFixer.csproj", "{FA7D5C89-63D3-4AF0-80C2-D650D35E575B}"
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CFixer", "CFixer\CFixer.csproj", "{FA7D5C89-63D3-4AF0-80C2-D650D35E575B}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
@@ -1,14 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<startup>
|
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
|
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8.1"/>
|
||||
</startup>
|
||||
<runtime>
|
||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
|
||||
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
|
||||
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
|
||||
</dependentAssembly>
|
||||
</assemblyBinding>
|
||||
</runtime>
|
||||
</configuration>
|
||||
</configuration>
|
||||
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 914 B After Width: | Height: | Size: 914 B |
@@ -7,8 +7,9 @@ using System.Threading.Tasks;
|
||||
using Windows.Foundation;
|
||||
using Windows.Management.Deployment;
|
||||
|
||||
namespace Crapfixer
|
||||
namespace CrapFixer
|
||||
{
|
||||
|
||||
public class AppAnalysisResult
|
||||
{
|
||||
public string AppName { get; set; }
|
||||
@@ -55,7 +56,7 @@ namespace Crapfixer
|
||||
Logger.Log("Bloatware apps detected:", LogLevel.Info);
|
||||
foreach (var app in apps)
|
||||
{
|
||||
Logger.Log($"❌ {app.AppName} [{app.FullName}]", LogLevel.Warning);
|
||||
Logger.Log($"❌ [ Bloatware ] {app.AppName} ({app.FullName})", LogLevel.Warning);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -179,11 +180,12 @@ namespace Crapfixer
|
||||
try
|
||||
{
|
||||
string exeDir = AppDomain.CurrentDomain.BaseDirectory;
|
||||
string fullPath = Path.Combine(exeDir, fileName);
|
||||
string pluginsDir = Path.Combine(exeDir, "plugins");
|
||||
string fullPath = Path.Combine(pluginsDir, fileName);
|
||||
|
||||
if (!File.Exists(fullPath))
|
||||
{
|
||||
Logger.Log($"⚠️ The bloatware radar stays basic for now 🧠. Get the enhanced detection list from the GitHub releases (Assets).", LogLevel.Warning);
|
||||
Logger.Log($"⚠️ The bloatware radar stays basic for now 🧠. Get the CFEnhancer detection list from Options > Plugins ", LogLevel.Warning);
|
||||
return Array.Empty<string>();
|
||||
}
|
||||
|
||||
@@ -6,12 +6,13 @@
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{FA7D5C89-63D3-4AF0-80C2-D650D35E575B}</ProjectGuid>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<RootNamespace>MSCFixer</RootNamespace>
|
||||
<AssemblyName>MSCFixer</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
|
||||
<RootNamespace>CFixer</RootNamespace>
|
||||
<AssemblyName>CFixer</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.8.1</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||
<Deterministic>true</Deterministic>
|
||||
<TargetFrameworkProfile />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
@@ -56,6 +57,7 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="AppManagerService.cs" />
|
||||
<Compile Include="Features\AI\AskCopilot.cs" />
|
||||
<Compile Include="Features\FeatureManager.cs" />
|
||||
<Compile Include="Features\Edge\BrowserSignin.cs" />
|
||||
<Compile Include="Features\Edge\DefaultTopSites.cs" />
|
||||
@@ -75,10 +77,13 @@
|
||||
<Compile Include="Features\System\NetworkThrottling.cs" />
|
||||
<Compile Include="Features\System\SpeedUpShutdown.cs" />
|
||||
<Compile Include="Features\System\SystemResponsiveness.cs" />
|
||||
<Compile Include="Features\System\TaskbarEndTask.cs" />
|
||||
<Compile Include="Features\UI\DarkMode.cs" />
|
||||
<Compile Include="Features\UI\SearchBoxSuggestions.cs" />
|
||||
<Compile Include="Features\UI\SnapAssistFlyout.cs" />
|
||||
<Compile Include="Features\UI\Transparency.cs" />
|
||||
<Compile Include="Helpers\LogActions.cs" />
|
||||
<Compile Include="Helpers\LogActionsController.cs" />
|
||||
<Compile Include="Helpers\OSHelper.cs" />
|
||||
<Compile Include="Helpers\Utils.cs" />
|
||||
<Compile Include="Helpers\Logger.cs" />
|
||||
@@ -129,6 +134,12 @@
|
||||
<Compile Include="Views\AboutView.Designer.cs">
|
||||
<DependentUpon>AboutView.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\PluginsView.cs">
|
||||
<SubType>UserControl</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Views\PluginsView.Designer.cs">
|
||||
<DependentUpon>PluginsView.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\SettingsView.cs">
|
||||
<SubType>UserControl</SubType>
|
||||
</Compile>
|
||||
@@ -152,6 +163,9 @@
|
||||
<EmbeddedResource Include="Views\AboutView.resx">
|
||||
<DependentUpon>AboutView.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Views\PluginsView.resx">
|
||||
<DependentUpon>PluginsView.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Views\SettingsView.resx">
|
||||
<DependentUpon>SettingsView.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
@@ -0,0 +1,78 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.AI
|
||||
{
|
||||
internal class AskCopilot : FeatureBase
|
||||
{
|
||||
private const string keyPath = @"Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked";
|
||||
private const string fullKeyPath = @"HKEY_CURRENT_USER\" + keyPath;
|
||||
private const string valueName = "{CB3B0003-8088-4EDE-8769-8B354AB2FF8C}";
|
||||
private const string displayValue = "Ask Copilot";
|
||||
|
||||
public override string GetFeatureDetails()
|
||||
{
|
||||
return $"{fullKeyPath} | Value: {valueName} = \"{displayValue}\" | Blocks Copilot context menu entry.";
|
||||
}
|
||||
|
||||
public override string ID()
|
||||
{
|
||||
return "Remove Ask Copilot from context menu";
|
||||
}
|
||||
|
||||
public override string Info()
|
||||
{
|
||||
return "Blocks the 'Ask Copilot' entry in the Windows 11 context menu by disabling its Shell Extension.";
|
||||
}
|
||||
|
||||
public override Task<bool> CheckFeature()
|
||||
{
|
||||
using (RegistryKey key = Registry.CurrentUser.OpenSubKey(keyPath))
|
||||
{
|
||||
if (key == null) return Task.FromResult(false);
|
||||
object value = key.GetValue(valueName);
|
||||
return Task.FromResult(value != null && value.ToString() == displayValue);
|
||||
}
|
||||
}
|
||||
|
||||
public override Task<bool> DoFeature()
|
||||
{
|
||||
try
|
||||
{
|
||||
using (RegistryKey key = Registry.CurrentUser.CreateSubKey(keyPath))
|
||||
{
|
||||
key.SetValue(valueName, displayValue, RegistryValueKind.String);
|
||||
}
|
||||
|
||||
Logger.Log("'Ask Copilot' context menu entry has been blocked.", LogLevel.Info);
|
||||
return Task.FromResult(true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.Log("Error blocking Copilot context menu: " + ex.Message, LogLevel.Error);
|
||||
return Task.FromResult(false);
|
||||
}
|
||||
}
|
||||
|
||||
public override bool UndoFeature()
|
||||
{
|
||||
try
|
||||
{
|
||||
using (RegistryKey key = Registry.CurrentUser.OpenSubKey(keyPath, writable: true))
|
||||
{
|
||||
key?.DeleteValue(valueName, false);
|
||||
}
|
||||
|
||||
Logger.Log("'Ask Copilot' context menu entry has been restored.", LogLevel.Info);
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.Log("Error restoring Copilot context menu: " + ex.Message, LogLevel.Error);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.AI
|
||||
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.AI
|
||||
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Ads
|
||||
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Ads
|
||||
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Ads
|
||||
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Ads
|
||||
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Ads
|
||||
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Ads
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Ads
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Ads
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Ads
|
||||
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Edge
|
||||
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Edge
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Edge
|
||||
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Edge
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Edge
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Edge
|
||||
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Edge
|
||||
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Edge
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Edge
|
||||
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Edge
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Edge
|
||||
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Edge
|
||||
@@ -1,6 +1,6 @@
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Crapfixer
|
||||
namespace CrapFixer
|
||||
{
|
||||
public abstract class FeatureBase
|
||||
{
|
||||
@@ -36,6 +36,7 @@ namespace Features
|
||||
new FeatureNode(new NetworkThrottling()),
|
||||
new FeatureNode(new SystemResponsiveness()),
|
||||
new FeatureNode(new MenuShowDelay()),
|
||||
new FeatureNode(new TaskbarEndTask()),
|
||||
}
|
||||
},
|
||||
|
||||
@@ -120,6 +121,7 @@ namespace Features
|
||||
{
|
||||
new FeatureNode(new CopilotTaskbar()),
|
||||
new FeatureNode(new Recall()),
|
||||
new FeatureNode(new AskCopilot()),
|
||||
}
|
||||
},
|
||||
};
|
||||
@@ -4,7 +4,7 @@ using System.Drawing;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace Crapfixer
|
||||
namespace CrapFixer
|
||||
{
|
||||
/// <summary>
|
||||
/// Provides operations to load, analyze, fix, restore, and show help for FeatureNodes.
|
||||
@@ -222,6 +222,30 @@ namespace Crapfixer
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Recursively previews changes for all checked features.
|
||||
/// </summary>
|
||||
/// <param name="node"></param>
|
||||
public static void PreviewChanges(TreeNode node)
|
||||
{
|
||||
if (node.Tag is FeatureNode fn)
|
||||
{
|
||||
if (!fn.IsCategory && fn.Feature != null)
|
||||
{
|
||||
string details = fn.Feature.GetFeatureDetails();
|
||||
|
||||
string category = node.Parent?.Text ?? "General";
|
||||
Logger.Log($"🛈 [PREVIEW] [{category}] {fn.Name}", LogLevel.Info);
|
||||
Logger.Log($" ➤ {details}");
|
||||
Logger.Log(new string('-', 50), LogLevel.Info);
|
||||
}
|
||||
|
||||
foreach (TreeNode child in node.Nodes)
|
||||
PreviewChanges(child);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Displays help information for the selected feature.
|
||||
/// </summary>
|
||||
@@ -1,5 +1,5 @@
|
||||
using System.Collections.Generic;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
|
||||
public class FeatureNode
|
||||
{
|
||||
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Gaming
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Gaming
|
||||
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Gaming
|
||||
@@ -3,7 +3,7 @@ using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using System.Diagnostics;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
|
||||
namespace Settings.Issues
|
||||
{
|
||||
@@ -1,7 +1,7 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Threading.Tasks;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
|
||||
namespace Settings.System
|
||||
{
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Privacy
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Privacy
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Privacy
|
||||
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Privacy
|
||||
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.System
|
||||
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.System
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.System
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.System
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.System
|
||||
@@ -0,0 +1,64 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.System
|
||||
{
|
||||
internal class TaskbarEndTask : FeatureBase
|
||||
{
|
||||
private const string keyName = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\TaskbarDeveloperSettings";
|
||||
private const string valueName = "TaskbarEndTask";
|
||||
private const int recommendedValue = 1;
|
||||
|
||||
public override string GetFeatureDetails()
|
||||
{
|
||||
return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}";
|
||||
}
|
||||
|
||||
public override string ID()
|
||||
{
|
||||
return "Enable End Task";
|
||||
}
|
||||
|
||||
public override string Info()
|
||||
{
|
||||
return "Adds 'End Task' to the Windows 11 taskbar context menu, allowing you to directly kill unresponsive apps.";
|
||||
}
|
||||
|
||||
public override Task<bool> CheckFeature()
|
||||
{
|
||||
return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue));
|
||||
}
|
||||
|
||||
public override Task<bool> DoFeature()
|
||||
{
|
||||
try
|
||||
{
|
||||
Registry.SetValue(keyName, valueName, recommendedValue, RegistryValueKind.DWord);
|
||||
return Task.FromResult(true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.Log("Failed to enable End Task: " + ex.Message, LogLevel.Error);
|
||||
}
|
||||
|
||||
return Task.FromResult(false);
|
||||
}
|
||||
|
||||
public override bool UndoFeature()
|
||||
{
|
||||
try
|
||||
{
|
||||
Registry.SetValue(keyName, valueName, 0, RegistryValueKind.DWord);
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.Log("Failed to disable End Task: " + ex.Message, LogLevel.Error);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.System
|
||||
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Personalization
|
||||
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Personalization
|
||||
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Personalization
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.UI
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Personalization
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Personalization
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Personalization
|
||||
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Personalization
|
||||
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Personalization
|
||||
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Personalization
|
||||
@@ -1,6 +1,6 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using CrapFixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.Personalization
|
||||
@@ -0,0 +1,54 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Windows.Forms;
|
||||
|
||||
/// <summary>
|
||||
/// Provides actions for interacting with and managing the content of a log displayed in a <see cref="RichTextBox"/>.
|
||||
/// </summary>
|
||||
/// <remarks>This class allows users to perform common operations on a log, such as copying its content to the
|
||||
/// clipboard, analyzing it using the CrapFixer online analyzer tool, or clearing the log. It is designed to work with a <see
|
||||
/// cref="RichTextBox"/> control that serves as the log display.</remarks>
|
||||
public sealed class LogActions
|
||||
{
|
||||
private readonly RichTextBox _logBox;
|
||||
|
||||
public LogActions(RichTextBox logBox)
|
||||
{
|
||||
_logBox = logBox ?? throw new ArgumentNullException(nameof(logBox));
|
||||
}
|
||||
|
||||
/// <summary>Copies the whole log to the clipboard.</summary>
|
||||
public void CopyToClipboard()
|
||||
{
|
||||
var text = _logBox.Text;
|
||||
if (!string.IsNullOrEmpty(text))
|
||||
Clipboard.SetText(text);
|
||||
}
|
||||
|
||||
/// <summary>Opens CrapFixer online analyzer tool and passes the log via URL‑encoded GET parameter.</summary>
|
||||
public void AnalyzeOnline(string baseUrl)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(baseUrl)) return;
|
||||
|
||||
// Get the current log text
|
||||
var logText = _logBox.Text;
|
||||
if (string.IsNullOrEmpty(logText)) return;
|
||||
|
||||
// Copy the log to the cboard
|
||||
Clipboard.SetText(logText);
|
||||
|
||||
Process.Start(baseUrl);
|
||||
|
||||
MessageBox.Show(
|
||||
"The log has been copied to the clipboard.\n" +
|
||||
"Click “Paste log from clipboard” on the log analyzer page, or simply press CTRL+V,\n" +
|
||||
"to insert it into the analyzer.",
|
||||
"Log copied",
|
||||
MessageBoxButtons.OK,
|
||||
MessageBoxIcon.Information);
|
||||
}
|
||||
|
||||
/// <summary>Clears the logger output.</summary>
|
||||
public void Clear()
|
||||
=> _logBox.Clear();
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
|
||||
/// <summary>
|
||||
/// Manages log-related actions using a ComboBox in MainForm.
|
||||
/// </summary>
|
||||
public class LogActionsController
|
||||
{
|
||||
private readonly ComboBox _combo;
|
||||
private readonly LogActions _logActions;
|
||||
|
||||
public LogActionsController(ComboBox comboLogActions, LogActions logActions)
|
||||
{
|
||||
if (comboLogActions == null) throw new ArgumentNullException(nameof(comboLogActions));
|
||||
if (logActions == null) throw new ArgumentNullException(nameof(logActions));
|
||||
|
||||
_combo = comboLogActions;
|
||||
_logActions = logActions;
|
||||
|
||||
Initialize();
|
||||
}
|
||||
|
||||
private void Initialize()
|
||||
{
|
||||
_combo.Items.Clear();
|
||||
_combo.Items.Add("Select an action...");
|
||||
_combo.Items.Add("Analyze log online (recommended)");
|
||||
_combo.Items.Add("Copy log to clipboard");
|
||||
_combo.Items.Add("Clear log");
|
||||
_combo.SelectedIndex = 0;
|
||||
|
||||
_combo.SelectedIndexChanged += Combo_SelectedIndexChanged;
|
||||
}
|
||||
|
||||
private void Combo_SelectedIndexChanged(object sender, EventArgs e)
|
||||
{
|
||||
string selected = _combo.SelectedItem as string;
|
||||
if (string.IsNullOrEmpty(selected))
|
||||
{
|
||||
Reset();
|
||||
return;
|
||||
}
|
||||
|
||||
switch (selected)
|
||||
{
|
||||
case "Analyze log online (recommended)":
|
||||
_logActions.AnalyzeOnline("https://builtbybel.github.io/CrapFixer/log-analyzer/index.html");
|
||||
break;
|
||||
|
||||
case "Copy log to clipboard":
|
||||
_logActions.CopyToClipboard();
|
||||
break;
|
||||
|
||||
case "Clear log":
|
||||
_logActions.Clear();
|
||||
break;
|
||||
}
|
||||
|
||||
Reset();
|
||||
}
|
||||
|
||||
private void Reset()
|
||||
{
|
||||
// Reset the combo box to the default selection
|
||||
_combo.SelectedIndex = 0;
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,7 @@ using System.Management.Automation;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.Win32;
|
||||
|
||||
// This file is part of MSCFixer.
|
||||
// This file is part of CFixer.
|
||||
namespace OSHelper
|
||||
{
|
||||
internal class OSHelper
|
||||
@@ -1,12 +1,10 @@
|
||||
using Microsoft.Win32;
|
||||
using System.Windows.Forms;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Windows.Forms;
|
||||
|
||||
// This file is part of MSCFixer.
|
||||
namespace Crapfixer
|
||||
// This file is part of CFixer.
|
||||
namespace CrapFixer
|
||||
{
|
||||
internal class Utils
|
||||
{
|
||||
@@ -0,0 +1,200 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Windows.Forms;
|
||||
|
||||
public static class IniStateManager
|
||||
{
|
||||
// CrapFixer.ini path
|
||||
private static readonly string IniPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "CrapFixer.ini");
|
||||
|
||||
private static readonly object FileLock = new object();
|
||||
|
||||
// Saves the global states (App size, TreeView nodes states)
|
||||
public static void Save(TreeView tree, Form form)
|
||||
{
|
||||
lock (FileLock)
|
||||
{
|
||||
// Read existing lines if file exists
|
||||
var lines = File.Exists(IniPath) ? File.ReadAllLines(IniPath).ToList() : new List<string>();
|
||||
|
||||
// Remove old APP and FEATURES sections
|
||||
RemoveSection(lines, "APP");
|
||||
RemoveSection(lines, "FEATURES");
|
||||
|
||||
// Append new APP section
|
||||
lines.Add("[APP]");
|
||||
lines.Add($"Width={form.Width}");
|
||||
lines.Add($"Height={form.Height}");
|
||||
lines.Add(""); // empty line for spacing
|
||||
|
||||
// Append new FEATURES section (TreeView nodes states)
|
||||
lines.Add("[FEATURES]");
|
||||
AppendNodeStates(lines, tree.Nodes);
|
||||
|
||||
// Write all back
|
||||
File.WriteAllLines(IniPath, lines);
|
||||
}
|
||||
}
|
||||
|
||||
// Removes a section from the INI content
|
||||
private static void RemoveSection(List<string> lines, string sectionName)
|
||||
{
|
||||
int start = lines.FindIndex(l => l.Trim().Equals($"[{sectionName}]", StringComparison.OrdinalIgnoreCase));
|
||||
if (start < 0) return;
|
||||
|
||||
int end = start + 1;
|
||||
while (end < lines.Count && !lines[end].TrimStart().StartsWith("["))
|
||||
end++;
|
||||
|
||||
lines.RemoveRange(start, end - start);
|
||||
}
|
||||
|
||||
// Helper to write TreeNode states to a list of strings
|
||||
private static void AppendNodeStates(List<string> lines, TreeNodeCollection nodes)
|
||||
{
|
||||
foreach (TreeNode node in nodes)
|
||||
{
|
||||
lines.Add($"{node.Text.Trim()}={node.Checked}");
|
||||
if (node.Nodes.Count > 0)
|
||||
AppendNodeStates(lines, node.Nodes);
|
||||
}
|
||||
}
|
||||
|
||||
// Loads global states (App size, TreeView nodes states) from the INI file
|
||||
public static void Load(TreeView tree, Form form)
|
||||
{
|
||||
if (!File.Exists(IniPath)) return;
|
||||
|
||||
var lines = File.ReadAllLines(IniPath);
|
||||
var section = "";
|
||||
var states = new Dictionary<string, bool>();
|
||||
|
||||
foreach (var line in lines)
|
||||
{
|
||||
var trimmed = line.Trim();
|
||||
if (string.IsNullOrWhiteSpace(trimmed)) continue;
|
||||
|
||||
// Check if line is a section
|
||||
if (trimmed.StartsWith("[") && trimmed.EndsWith("]"))
|
||||
{
|
||||
section = trimmed;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Split line into key and value
|
||||
var parts = trimmed.Split(new[] { '=' }, 2);
|
||||
if (parts.Length != 2) continue;
|
||||
|
||||
var key = parts[0].Trim();
|
||||
var value = parts[1].Trim();
|
||||
|
||||
if (section == "[FEATURES]")
|
||||
{
|
||||
states[key] = value.ToLower() == "true";
|
||||
}
|
||||
else if (section == "[APP]")
|
||||
{
|
||||
if (int.TryParse(value, out int size))
|
||||
{
|
||||
if (key.Equals("Width", StringComparison.OrdinalIgnoreCase))
|
||||
form.Width = size;
|
||||
else if (key.Equals("Height", StringComparison.OrdinalIgnoreCase))
|
||||
form.Height = size;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Apply saved feature states to tree nodes
|
||||
ApplyStates(tree.Nodes, states);
|
||||
}
|
||||
|
||||
// Applies the saved states to the TreeView nodes
|
||||
private static void ApplyStates(TreeNodeCollection nodes, Dictionary<string, bool> states)
|
||||
{
|
||||
foreach (TreeNode node in nodes)
|
||||
{
|
||||
string nodeName = node.Text.Trim();
|
||||
if (states.ContainsKey(nodeName))
|
||||
node.Checked = states[nodeName];
|
||||
|
||||
if (node.Nodes.Count > 0)
|
||||
ApplyStates(node.Nodes, states);
|
||||
}
|
||||
}
|
||||
|
||||
// Saves individual settings (like checkbox states) for a specific view
|
||||
public static void SaveViewSettings(string viewName, Dictionary<string, bool> settings)
|
||||
{
|
||||
lock (FileLock)
|
||||
{
|
||||
var lines = File.Exists(IniPath) ? File.ReadAllLines(IniPath).ToList() : new List<string>();
|
||||
|
||||
// Remove previous section to avoid duplicates
|
||||
RemoveSection(lines, viewName);
|
||||
|
||||
// Append new section with updated settings
|
||||
lines.Add($"[{viewName}]");
|
||||
foreach (var kvp in settings)
|
||||
{
|
||||
lines.Add($"{kvp.Key}={kvp.Value}");
|
||||
}
|
||||
|
||||
File.WriteAllLines(IniPath, lines);
|
||||
}
|
||||
}
|
||||
|
||||
// Loads individual settings for a specific view (e.g. checkboxes)
|
||||
public static Dictionary<string, bool> LoadViewSettings(string viewName)
|
||||
{
|
||||
var result = new Dictionary<string, bool>();
|
||||
if (!File.Exists(IniPath)) return result;
|
||||
|
||||
var lines = File.ReadAllLines(IniPath);
|
||||
bool inTargetSection = false;
|
||||
|
||||
foreach (var line in lines)
|
||||
{
|
||||
var trimmed = line.Trim();
|
||||
if (string.IsNullOrWhiteSpace(trimmed)) continue;
|
||||
|
||||
// Check if we are in the desired view section
|
||||
if (trimmed.StartsWith("[") && trimmed.EndsWith("]"))
|
||||
{
|
||||
inTargetSection = trimmed.Equals($"[{viewName}]", StringComparison.OrdinalIgnoreCase);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!inTargetSection) continue;
|
||||
|
||||
var parts = trimmed.Split(new[] { '=' }, 2);
|
||||
if (parts.Length != 2) continue;
|
||||
|
||||
var key = parts[0].Trim();
|
||||
var value = parts[1].Trim();
|
||||
|
||||
result[key] = value.ToLower() == "true";
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// Checks if a setting exists in a specific section
|
||||
public static bool IsViewSettingEnabled(string sectionName, string settingName)
|
||||
{
|
||||
var settings = LoadViewSettings(sectionName);
|
||||
return settings.ContainsKey(settingName) && settings[settingName];
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Extension methods for IDictionary to provide default value retrieval.
|
||||
/// </summary>
|
||||
public static class DictionaryExtensions
|
||||
{
|
||||
public static TValue GetValueOrDefault<TKey, TValue>(this IDictionary<TKey, TValue> dict, TKey key, TValue defaultValue = default)
|
||||
{
|
||||
return dict.TryGetValue(key, out var value) ? value : defaultValue;
|
||||
}
|
||||
}
|
||||
+39
-12
@@ -1,4 +1,4 @@
|
||||
namespace Crapfixer
|
||||
namespace CrapFixer
|
||||
{
|
||||
partial class MainForm
|
||||
{
|
||||
@@ -29,6 +29,7 @@
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.components = new System.ComponentModel.Container();
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
|
||||
this.panelContainer = new System.Windows.Forms.Panel();
|
||||
this.panelContent = new System.Windows.Forms.Panel();
|
||||
this.btnAnalyze = new System.Windows.Forms.Button();
|
||||
@@ -37,6 +38,7 @@
|
||||
this.treeFeatures = new System.Windows.Forms.TreeView();
|
||||
this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
|
||||
this.analyzeMarkedFeatureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.previewMarkedFeatureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.fixMarkedFeatureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.seperatorToolStripMenuItem = new System.Windows.Forms.ToolStripSeparator();
|
||||
this.restoreMarkedFeatureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
@@ -44,6 +46,7 @@
|
||||
this.Apps = new System.Windows.Forms.TabPage();
|
||||
this.checkedListBoxApps = new System.Windows.Forms.CheckedListBox();
|
||||
this.groupBox = new System.Windows.Forms.GroupBox();
|
||||
this.comboLogActions = new System.Windows.Forms.ComboBox();
|
||||
this.rtbLogger = new System.Windows.Forms.RichTextBox();
|
||||
this.btnFix = new System.Windows.Forms.Button();
|
||||
this.panelHeader = new System.Windows.Forms.Panel();
|
||||
@@ -159,13 +162,14 @@
|
||||
//
|
||||
this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.analyzeMarkedFeatureToolStripMenuItem,
|
||||
this.previewMarkedFeatureToolStripMenuItem,
|
||||
this.fixMarkedFeatureToolStripMenuItem,
|
||||
this.seperatorToolStripMenuItem,
|
||||
this.restoreMarkedFeatureToolStripMenuItem,
|
||||
this.helpMarkedFeatureToolStripMenuItem});
|
||||
this.contextMenuStrip.Name = "contextManualMenu";
|
||||
this.contextMenuStrip.RenderMode = System.Windows.Forms.ToolStripRenderMode.System;
|
||||
this.contextMenuStrip.Size = new System.Drawing.Size(119, 98);
|
||||
this.contextMenuStrip.Size = new System.Drawing.Size(119, 120);
|
||||
//
|
||||
// analyzeMarkedFeatureToolStripMenuItem
|
||||
//
|
||||
@@ -174,6 +178,13 @@
|
||||
this.analyzeMarkedFeatureToolStripMenuItem.Text = "Analyze";
|
||||
this.analyzeMarkedFeatureToolStripMenuItem.Click += new System.EventHandler(this.analyzeMarkedFeatureToolStripMenuItem_Click);
|
||||
//
|
||||
// previewMarkedFeatureToolStripMenuItem
|
||||
//
|
||||
this.previewMarkedFeatureToolStripMenuItem.Name = "previewMarkedFeatureToolStripMenuItem";
|
||||
this.previewMarkedFeatureToolStripMenuItem.Size = new System.Drawing.Size(118, 22);
|
||||
this.previewMarkedFeatureToolStripMenuItem.Text = "Preview";
|
||||
this.previewMarkedFeatureToolStripMenuItem.Click += new System.EventHandler(this.previewMarkedFeatureToolStripMenuItem_Click);
|
||||
//
|
||||
// fixMarkedFeatureToolStripMenuItem
|
||||
//
|
||||
this.fixMarkedFeatureToolStripMenuItem.Name = "fixMarkedFeatureToolStripMenuItem";
|
||||
@@ -234,6 +245,7 @@
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.groupBox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(252)))), ((int)(((byte)(252)))), ((int)(((byte)(252)))));
|
||||
this.groupBox.Controls.Add(this.comboLogActions);
|
||||
this.groupBox.Controls.Add(this.rtbLogger);
|
||||
this.groupBox.Location = new System.Drawing.Point(280, 21);
|
||||
this.groupBox.Name = "groupBox";
|
||||
@@ -241,6 +253,20 @@
|
||||
this.groupBox.TabIndex = 200;
|
||||
this.groupBox.TabStop = false;
|
||||
//
|
||||
// comboLogActions
|
||||
//
|
||||
this.comboLogActions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.comboLogActions.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||
this.comboLogActions.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||
this.comboLogActions.Font = new System.Drawing.Font("Tahoma", 8.25F);
|
||||
this.comboLogActions.FormattingEnabled = true;
|
||||
this.comboLogActions.Location = new System.Drawing.Point(7, 292);
|
||||
this.comboLogActions.Name = "comboLogActions";
|
||||
this.comboLogActions.Size = new System.Drawing.Size(305, 21);
|
||||
this.comboLogActions.TabIndex = 210;
|
||||
this.comboLogActions.Visible = false;
|
||||
//
|
||||
// rtbLogger
|
||||
//
|
||||
this.rtbLogger.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
@@ -252,7 +278,7 @@
|
||||
this.rtbLogger.Location = new System.Drawing.Point(7, 12);
|
||||
this.rtbLogger.Name = "rtbLogger";
|
||||
this.rtbLogger.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical;
|
||||
this.rtbLogger.Size = new System.Drawing.Size(305, 297);
|
||||
this.rtbLogger.Size = new System.Drawing.Size(305, 273);
|
||||
this.rtbLogger.TabIndex = 195;
|
||||
this.rtbLogger.Text = "";
|
||||
//
|
||||
@@ -266,7 +292,7 @@
|
||||
this.btnFix.Name = "btnFix";
|
||||
this.btnFix.Size = new System.Drawing.Size(121, 29);
|
||||
this.btnFix.TabIndex = 2;
|
||||
this.btnFix.Text = "Run &CFixer";
|
||||
this.btnFix.Text = "Run &Fixer";
|
||||
this.btnFix.UseVisualStyleBackColor = false;
|
||||
this.btnFix.Click += new System.EventHandler(this.btnFix_Click);
|
||||
//
|
||||
@@ -300,7 +326,7 @@
|
||||
this.lblVersionInfo.AutoSize = true;
|
||||
this.lblVersionInfo.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.5F);
|
||||
this.lblVersionInfo.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(230)))), ((int)(((byte)(230)))));
|
||||
this.lblVersionInfo.Location = new System.Drawing.Point(195, 15);
|
||||
this.lblVersionInfo.Location = new System.Drawing.Point(198, 15);
|
||||
this.lblVersionInfo.Name = "lblVersionInfo";
|
||||
this.lblVersionInfo.Size = new System.Drawing.Size(13, 13);
|
||||
this.lblVersionInfo.TabIndex = 2;
|
||||
@@ -309,18 +335,18 @@
|
||||
// lblHeader
|
||||
//
|
||||
this.lblHeader.AutoEllipsis = true;
|
||||
this.lblHeader.Font = new System.Drawing.Font("Tahoma", 15F, System.Drawing.FontStyle.Bold);
|
||||
this.lblHeader.Font = new System.Drawing.Font("Tahoma", 14F, System.Drawing.FontStyle.Bold);
|
||||
this.lblHeader.ForeColor = System.Drawing.Color.White;
|
||||
this.lblHeader.Location = new System.Drawing.Point(89, 9);
|
||||
this.lblHeader.Name = "lblHeader";
|
||||
this.lblHeader.Size = new System.Drawing.Size(105, 25);
|
||||
this.lblHeader.Size = new System.Drawing.Size(117, 25);
|
||||
this.lblHeader.TabIndex = 1;
|
||||
this.lblHeader.Text = "Crapfixer";
|
||||
this.lblHeader.Text = "CrapFixer";
|
||||
this.lblHeader.UseCompatibleTextRendering = true;
|
||||
//
|
||||
// pictureHeader
|
||||
//
|
||||
this.pictureHeader.Image = global::MSCFixer.Properties.Resources.AppIcon32;
|
||||
this.pictureHeader.Image = ((System.Drawing.Image)(resources.GetObject("pictureHeader.Image")));
|
||||
this.pictureHeader.Location = new System.Drawing.Point(30, 9);
|
||||
this.pictureHeader.Name = "pictureHeader";
|
||||
this.pictureHeader.Size = new System.Drawing.Size(44, 41);
|
||||
@@ -359,8 +385,7 @@
|
||||
this.linkUpdateCheck.TabIndex = 203;
|
||||
this.linkUpdateCheck.TabStop = true;
|
||||
this.linkUpdateCheck.Text = "Check for updates";
|
||||
this.linkUpdateCheck.TextAlign = System.Drawing.ContentAlignment.TopCenter;
|
||||
this.linkUpdateCheck.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkUpdateCheck_LinkClicked);
|
||||
this.linkUpdateCheck.TextAlign = System.Drawing.ContentAlignment.TopCenter;
|
||||
//
|
||||
// btnSettings
|
||||
//
|
||||
@@ -429,7 +454,7 @@
|
||||
this.ShowIcon = false;
|
||||
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show;
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
|
||||
this.Text = "Crapfixer";
|
||||
this.Text = "CrapFixer";
|
||||
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing);
|
||||
this.Shown += new System.EventHandler(this.MainForm_Shown);
|
||||
this.panelContainer.ResumeLayout(false);
|
||||
@@ -475,6 +500,8 @@
|
||||
private System.Windows.Forms.Button btnSettings;
|
||||
private System.Windows.Forms.Button btnHome;
|
||||
private System.Windows.Forms.LinkLabel linkSelection;
|
||||
private System.Windows.Forms.ToolStripMenuItem previewMarkedFeatureToolStripMenuItem;
|
||||
private System.Windows.Forms.ComboBox comboLogActions;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,34 +1,42 @@
|
||||
using MSCFixer;
|
||||
using MSCFixer.Properties;
|
||||
using MSCFixer.Views;
|
||||
using CFixer;
|
||||
using CFixer.Properties;
|
||||
using CFixer.Views;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using Views;
|
||||
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
|
||||
|
||||
namespace Crapfixer
|
||||
namespace CrapFixer
|
||||
{
|
||||
public partial class MainForm : Form
|
||||
{
|
||||
private readonly string iniPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Crapfixer.ini");
|
||||
|
||||
private NavigationManager navigationManager;
|
||||
private NavigationHandler navigationHandler;
|
||||
private readonly AppManagerService appManager = new AppManagerService();
|
||||
private NavigationManager _navigationManager;
|
||||
private NavigationHandler _navigationHandler;
|
||||
private LogActions _logActions;
|
||||
private LogActionsController _logActionsController;
|
||||
private readonly AppManagerService _appManager = new AppManagerService();
|
||||
|
||||
public MainForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
navigationManager = new NavigationManager(panelContainer);
|
||||
|
||||
// Set up the main navigation manager and logger
|
||||
_navigationManager = new NavigationManager(panelContainer);
|
||||
Logger.OutputBox = rtbLogger;
|
||||
|
||||
// Set up log actions controller
|
||||
_logActions = new LogActions(rtbLogger);
|
||||
_logActionsController = new LogActionsController(comboLogActions, _logActions);
|
||||
|
||||
// Load features and plugins, and restore INI state if enabled
|
||||
FeatureNodeManager.LoadFeatures(treeFeatures);
|
||||
PluginManager.LoadPlugins(treeFeatures);
|
||||
IniStateManager.Load(treeFeatures, iniPath);
|
||||
if (IniStateManager.IsViewSettingEnabled("SETTINGS", "checkSaveToINI"))
|
||||
{
|
||||
IniStateManager.Load(treeFeatures, this);
|
||||
}
|
||||
}
|
||||
|
||||
private void MainForm_Shown(object sender, EventArgs e)
|
||||
@@ -38,34 +46,34 @@ namespace Crapfixer
|
||||
|
||||
private void InitializeUI()
|
||||
{
|
||||
navigationHandler = new NavigationHandler(btnHome, btnSettings);
|
||||
|
||||
btnHome.Click += (s, e) =>
|
||||
// Set the default active button
|
||||
_navigationHandler = new NavigationHandler(btnHome, btnSettings);
|
||||
_navigationHandler.NavigationButtonClicked += button =>
|
||||
{
|
||||
navigationManager.GoToMain();
|
||||
navigationHandler.SetActive(btnHome);
|
||||
if (button == btnHome)
|
||||
{
|
||||
_navigationManager.GoToMain();
|
||||
}
|
||||
else if (button == btnSettings)
|
||||
{
|
||||
_navigationManager.SwitchView(new OptionsView());
|
||||
}
|
||||
};
|
||||
|
||||
btnSettings.Click += (s, e) =>
|
||||
// Set up link label for update check
|
||||
linkUpdateCheck.LinkClicked += (_, __) =>
|
||||
Process.Start($"https://builtbybel.github.io/CrapFixer/update-check.html?version={Program.GetAppVersion()}");
|
||||
|
||||
// Set up log actions controller
|
||||
_logActionsController = new LogActionsController(comboLogActions, _logActions);
|
||||
|
||||
// Set up version labels
|
||||
async Task SetVersionLabels()
|
||||
{
|
||||
navigationManager.SwitchView(new OptionsView(navigationManager));
|
||||
navigationHandler.SetActive(btnSettings);
|
||||
};
|
||||
|
||||
linkUpdateCheck.Click += (s, e) =>
|
||||
|
||||
{
|
||||
Process.Start("https://github.com/builtbybel/Crapfixer/issues");
|
||||
};
|
||||
|
||||
UpdateTitleWithOSVersion(); // Update OS version label
|
||||
this.lblVersionInfo.Text = $"v{Program.GetAppVersion()} "; // Update version label
|
||||
}
|
||||
|
||||
private async void UpdateTitleWithOSVersion()
|
||||
{
|
||||
string osVersion = await OSHelper.OSHelper.GetWindowsVersion();
|
||||
this.lblOSInfo.Text = osVersion;
|
||||
lblVersionInfo.Text = $"v{Program.GetAppVersion()} ";
|
||||
lblOSInfo.Text = await OSHelper.OSHelper.GetWindowsVersion();
|
||||
}
|
||||
_ = SetVersionLabels();
|
||||
}
|
||||
|
||||
private async void btnAnalyze_Click(object sender, EventArgs e)
|
||||
@@ -83,6 +91,9 @@ namespace Crapfixer
|
||||
|
||||
// Analyze apps
|
||||
await AnalyzeApps();
|
||||
|
||||
// Show log actions combo box
|
||||
comboLogActions.Visible = true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -94,7 +105,7 @@ namespace Crapfixer
|
||||
checkedListBoxApps.Items.Clear();
|
||||
|
||||
// Try loading external bloatware list from file
|
||||
string[] predefined = appManager.LoadExternalBloatwareList();
|
||||
string[] predefined = _appManager.LoadExternalBloatwareList();
|
||||
|
||||
if (predefined.Length == 0)
|
||||
{
|
||||
@@ -111,7 +122,7 @@ namespace Crapfixer
|
||||
}
|
||||
|
||||
// Analyze installed apps against the predefined list
|
||||
var apps = await appManager.AnalyzeAndLogAppsAsync(predefined);
|
||||
var apps = await _appManager.AnalyzeAndLogAppsAsync(predefined);
|
||||
|
||||
foreach (var app in apps)
|
||||
{
|
||||
@@ -183,6 +194,21 @@ namespace Crapfixer
|
||||
}
|
||||
}
|
||||
|
||||
private async void previewMarkedFeatureToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (treeFeatures.SelectedNode is TreeNode selectedNode)
|
||||
{
|
||||
if (PluginManager.IsPluginNode(selectedNode))
|
||||
{
|
||||
await PluginManager.AnalyzePlugin(selectedNode);
|
||||
}
|
||||
else
|
||||
{
|
||||
FeatureNodeManager.PreviewChanges(selectedNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private async void fixMarkedFeatureToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (treeFeatures.SelectedNode is TreeNode selectedNode)
|
||||
@@ -312,18 +338,10 @@ namespace Crapfixer
|
||||
|
||||
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
|
||||
{
|
||||
IniStateManager.Save(treeFeatures, iniPath);
|
||||
}
|
||||
|
||||
private void linkUpdateCheck_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
|
||||
{
|
||||
string version = Program.GetAppVersion();
|
||||
string url = $"https://builtbybel.github.io/Crapfixer/update-check.html?version={version}";
|
||||
Process.Start(new ProcessStartInfo
|
||||
if (IniStateManager.IsViewSettingEnabled("SETTINGS", "checkSaveToINI"))
|
||||
{
|
||||
FileName = url,
|
||||
UseShellExecute = true
|
||||
});
|
||||
IniStateManager.Save(treeFeatures, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,458 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<metadata name="contextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>23, 15</value>
|
||||
</metadata>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="pictureHeader.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
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
|
||||
AABJRU5ErkJggg==
|
||||
</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1,8 +1,9 @@
|
||||
using System.Collections.Generic;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace MSCFixer
|
||||
namespace CFixer
|
||||
{
|
||||
/// <summary>
|
||||
/// Handles navigation button highlighting for a set of UI buttons.
|
||||
@@ -21,6 +22,11 @@ namespace MSCFixer
|
||||
// Border color for inactive buttons
|
||||
private readonly Color _inactiveBorderColor = Color.FromArgb(114, 114, 114);
|
||||
|
||||
/// <summary>
|
||||
/// Event fired when a navigation button is clicked.
|
||||
/// </summary>
|
||||
public event Action<Button> NavigationButtonClicked;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes the handler with the buttons that should be managed.
|
||||
/// </summary>
|
||||
@@ -28,8 +34,21 @@ namespace MSCFixer
|
||||
public NavigationHandler(params Button[] buttons)
|
||||
{
|
||||
_buttons = new List<Button>(buttons);
|
||||
|
||||
foreach (var button in _buttons)
|
||||
{
|
||||
button.Click += OnButtonClick;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnButtonClick(object sender, EventArgs e)
|
||||
{
|
||||
if (sender is Button clickedButton)
|
||||
{
|
||||
SetActive(clickedButton);
|
||||
NavigationButtonClicked?.Invoke(clickedButton);
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Sets the specified button as active, changing colors accordingly.
|
||||
/// </summary>
|
||||
@@ -57,7 +57,7 @@ public static class PluginManager
|
||||
if (!Directory.Exists(pluginsFolder))
|
||||
{
|
||||
Directory.CreateDirectory(pluginsFolder);
|
||||
// Logger.Log("No Plugins found.\nGet it on https://github.com/builtbybel/Crapfixer");
|
||||
// Logger.Log("No Plugins found.\nGet it on https://github.com/builtbybel/CrapFixer");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace Crapfixer
|
||||
namespace CrapFixer
|
||||
{
|
||||
internal static class Program
|
||||
{
|
||||
@@ -5,11 +5,11 @@ using System.Runtime.InteropServices;
|
||||
// Allgemeine Informationen über eine Assembly werden über die folgenden
|
||||
// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
|
||||
// die einer Assembly zugeordnet sind.
|
||||
[assembly: AssemblyTitle("Crapfixer")]
|
||||
[assembly: AssemblyDescription("Crapfixer for Windows 11")]
|
||||
[assembly: AssemblyTitle("CrapFixer")]
|
||||
[assembly: AssemblyDescription("CrapFixer for Windows 11")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("A Belim app creation 2025")]
|
||||
[assembly: AssemblyProduct("Crapfixer")]
|
||||
[assembly: AssemblyProduct("CrapFixer")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2025")]
|
||||
[assembly: AssemblyTrademark("Builtbybel")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
||||
// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden,
|
||||
// indem Sie "*" wie unten gezeigt eingeben:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("0.55.160")]
|
||||
[assembly: AssemblyFileVersion("0.55.160")]
|
||||
[assembly: AssemblyVersion("1.2.252")]
|
||||
[assembly: AssemblyFileVersion("1.2.252")]
|
||||
+2
-2
@@ -8,7 +8,7 @@
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace MSCFixer.Properties {
|
||||
namespace CFixer.Properties {
|
||||
using System;
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ namespace MSCFixer.Properties {
|
||||
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||
get {
|
||||
if (object.ReferenceEquals(resourceMan, null)) {
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MSCFixer.Properties.Resources", typeof(Resources).Assembly);
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("CFixer.Properties.Resources", typeof(Resources).Assembly);
|
||||
resourceMan = temp;
|
||||
}
|
||||
return resourceMan;
|
||||
+2
-2
@@ -8,11 +8,11 @@
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace MSCFixer.Properties {
|
||||
namespace CFixer.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.13.0.0")]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.14.0.0")]
|
||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
||||
+24
-10
@@ -35,6 +35,7 @@
|
||||
this.linkGitHub = new System.Windows.Forms.LinkLabel();
|
||||
this.btnDonate = new System.Windows.Forms.Button();
|
||||
this.panelSettings = new System.Windows.Forms.Panel();
|
||||
this.lblCopyright = new System.Windows.Forms.Label();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
|
||||
this.panelSettings.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
@@ -47,9 +48,9 @@
|
||||
this.lblHeader.ForeColor = System.Drawing.Color.Black;
|
||||
this.lblHeader.Location = new System.Drawing.Point(61, 19);
|
||||
this.lblHeader.Name = "lblHeader";
|
||||
this.lblHeader.Size = new System.Drawing.Size(69, 21);
|
||||
this.lblHeader.Size = new System.Drawing.Size(71, 21);
|
||||
this.lblHeader.TabIndex = 235;
|
||||
this.lblHeader.Text = "Crapfixer";
|
||||
this.lblHeader.Text = "CrapFixer";
|
||||
this.lblHeader.UseCompatibleTextRendering = true;
|
||||
//
|
||||
// label1
|
||||
@@ -57,7 +58,7 @@
|
||||
this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.label1.AutoEllipsis = true;
|
||||
this.label1.Location = new System.Drawing.Point(18, 121);
|
||||
this.label1.Location = new System.Drawing.Point(19, 138);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(589, 26);
|
||||
this.label1.TabIndex = 236;
|
||||
@@ -66,7 +67,7 @@
|
||||
//
|
||||
// pictureBox1
|
||||
//
|
||||
this.pictureBox1.Image = global::MSCFixer.Properties.Resources.AppIcon32;
|
||||
this.pictureBox1.Image = global::CFixer.Properties.Resources.AppIcon32;
|
||||
this.pictureBox1.Location = new System.Drawing.Point(18, 19);
|
||||
this.pictureBox1.Name = "pictureBox1";
|
||||
this.pictureBox1.Size = new System.Drawing.Size(37, 34);
|
||||
@@ -76,7 +77,7 @@
|
||||
// lblVersionInfo
|
||||
//
|
||||
this.lblVersionInfo.AutoSize = true;
|
||||
this.lblVersionInfo.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.5F);
|
||||
this.lblVersionInfo.Font = new System.Drawing.Font("Microsoft Sans Serif", 8F);
|
||||
this.lblVersionInfo.ForeColor = System.Drawing.Color.Black;
|
||||
this.lblVersionInfo.Location = new System.Drawing.Point(61, 40);
|
||||
this.lblVersionInfo.Name = "lblVersionInfo";
|
||||
@@ -87,12 +88,12 @@
|
||||
// linkGitHub
|
||||
//
|
||||
this.linkGitHub.AutoSize = true;
|
||||
this.linkGitHub.Location = new System.Drawing.Point(37, 156);
|
||||
this.linkGitHub.Location = new System.Drawing.Point(38, 173);
|
||||
this.linkGitHub.Name = "linkGitHub";
|
||||
this.linkGitHub.Size = new System.Drawing.Size(190, 13);
|
||||
this.linkGitHub.Size = new System.Drawing.Size(193, 13);
|
||||
this.linkGitHub.TabIndex = 239;
|
||||
this.linkGitHub.TabStop = true;
|
||||
this.linkGitHub.Text = "https://github.com/builtbybel/Crapfixer";
|
||||
this.linkGitHub.Text = "https://github.com/builtbybel/CrapFixer";
|
||||
this.linkGitHub.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkGitHub_LinkClicked);
|
||||
//
|
||||
// btnDonate
|
||||
@@ -103,16 +104,17 @@
|
||||
this.btnDonate.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||
this.btnDonate.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.btnDonate.ForeColor = System.Drawing.Color.White;
|
||||
this.btnDonate.Location = new System.Drawing.Point(60, 68);
|
||||
this.btnDonate.Location = new System.Drawing.Point(61, 85);
|
||||
this.btnDonate.Name = "btnDonate";
|
||||
this.btnDonate.Size = new System.Drawing.Size(207, 39);
|
||||
this.btnDonate.TabIndex = 240;
|
||||
this.btnDonate.Text = "Like Crapfixer? Support future updates on Ko-fi or PayPal";
|
||||
this.btnDonate.Text = "Like CrapFixer? Support future updates on Ko-fi or PayPal";
|
||||
this.btnDonate.UseVisualStyleBackColor = false;
|
||||
this.btnDonate.Click += new System.EventHandler(this.btnDonate_Click);
|
||||
//
|
||||
// panelSettings
|
||||
//
|
||||
this.panelSettings.Controls.Add(this.lblCopyright);
|
||||
this.panelSettings.Controls.Add(this.btnDonate);
|
||||
this.panelSettings.Controls.Add(this.lblHeader);
|
||||
this.panelSettings.Controls.Add(this.linkGitHub);
|
||||
@@ -125,6 +127,17 @@
|
||||
this.panelSettings.Size = new System.Drawing.Size(625, 395);
|
||||
this.panelSettings.TabIndex = 242;
|
||||
//
|
||||
// lblCopyright
|
||||
//
|
||||
this.lblCopyright.AutoSize = true;
|
||||
this.lblCopyright.Font = new System.Drawing.Font("Microsoft Sans Serif", 8F);
|
||||
this.lblCopyright.ForeColor = System.Drawing.Color.Black;
|
||||
this.lblCopyright.Location = new System.Drawing.Point(61, 58);
|
||||
this.lblCopyright.Name = "lblCopyright";
|
||||
this.lblCopyright.Size = new System.Drawing.Size(193, 13);
|
||||
this.lblCopyright.TabIndex = 241;
|
||||
this.lblCopyright.Text = "Copyright (c) 2025 A Belim app creation";
|
||||
//
|
||||
// AboutView
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
|
||||
@@ -149,5 +162,6 @@
|
||||
private System.Windows.Forms.LinkLabel linkGitHub;
|
||||
private System.Windows.Forms.Button btnDonate;
|
||||
private System.Windows.Forms.Panel panelSettings;
|
||||
private System.Windows.Forms.Label lblCopyright;
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
using Crapfixer;
|
||||
using MSCFixer.Views;
|
||||
using CrapFixer;
|
||||
using CFixer.Views;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Windows.Forms;
|
||||
@@ -9,7 +9,6 @@ namespace Views
|
||||
public partial class AboutView : UserControl
|
||||
|
||||
{
|
||||
|
||||
public AboutView()
|
||||
{
|
||||
InitializeComponent();
|
||||
@@ -24,14 +23,14 @@ namespace Views
|
||||
|
||||
private void linkGitHub_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
|
||||
{
|
||||
Process.Start("https://github.com/builtbybel/Crapfixer/releases");
|
||||
Process.Start("https://github.com/builtbybel/CrapFixer/releases");
|
||||
}
|
||||
|
||||
private void btnDonate_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = MessageBox.Show(
|
||||
"Hi! I'm building Crapfixer solo. Want to support me and help launch Version 1.0?",
|
||||
"Support Crapfixer ❤️",
|
||||
"Hi! I'm building CrapFixer solo. Want to support me and help launch Version 1.0?",
|
||||
"Support CrapFixer ❤️",
|
||||
MessageBoxButtons.YesNo,
|
||||
MessageBoxIcon.Information);
|
||||
|
||||
@@ -61,7 +60,5 @@ namespace Views
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
+20
-2
@@ -1,4 +1,4 @@
|
||||
namespace MSCFixer.Views
|
||||
namespace CFixer.Views
|
||||
{
|
||||
partial class OptionsView
|
||||
{
|
||||
@@ -32,12 +32,14 @@
|
||||
this.panelSubContent = new System.Windows.Forms.Panel();
|
||||
this.btnAboutMenu = new System.Windows.Forms.Button();
|
||||
this.btnSettingsMenu = new System.Windows.Forms.Button();
|
||||
this.btnPluginsMenu = new System.Windows.Forms.Button();
|
||||
this.panelSettings.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// panelSettings
|
||||
//
|
||||
this.panelSettings.BackColor = System.Drawing.Color.White;
|
||||
this.panelSettings.Controls.Add(this.btnPluginsMenu);
|
||||
this.panelSettings.Controls.Add(this.panelSubContent);
|
||||
this.panelSettings.Controls.Add(this.btnAboutMenu);
|
||||
this.panelSettings.Controls.Add(this.btnSettingsMenu);
|
||||
@@ -60,11 +62,12 @@
|
||||
//
|
||||
// btnAboutMenu
|
||||
//
|
||||
this.btnAboutMenu.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
||||
this.btnAboutMenu.BackColor = System.Drawing.Color.White;
|
||||
this.btnAboutMenu.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(153)))), ((int)(((byte)(180)))), ((int)(((byte)(209)))));
|
||||
this.btnAboutMenu.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||
this.btnAboutMenu.Font = new System.Drawing.Font("Tahoma", 8F);
|
||||
this.btnAboutMenu.Location = new System.Drawing.Point(14, 53);
|
||||
this.btnAboutMenu.Location = new System.Drawing.Point(14, 343);
|
||||
this.btnAboutMenu.Name = "btnAboutMenu";
|
||||
this.btnAboutMenu.Size = new System.Drawing.Size(107, 34);
|
||||
this.btnAboutMenu.TabIndex = 242;
|
||||
@@ -86,6 +89,20 @@
|
||||
this.btnSettingsMenu.UseVisualStyleBackColor = false;
|
||||
this.btnSettingsMenu.Click += new System.EventHandler(this.btnSettingsMenu_Click);
|
||||
//
|
||||
// btnPluginsMenu
|
||||
//
|
||||
this.btnPluginsMenu.BackColor = System.Drawing.Color.White;
|
||||
this.btnPluginsMenu.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(153)))), ((int)(((byte)(180)))), ((int)(((byte)(209)))));
|
||||
this.btnPluginsMenu.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||
this.btnPluginsMenu.Font = new System.Drawing.Font("Tahoma", 8F);
|
||||
this.btnPluginsMenu.Location = new System.Drawing.Point(14, 53);
|
||||
this.btnPluginsMenu.Name = "btnPluginsMenu";
|
||||
this.btnPluginsMenu.Size = new System.Drawing.Size(107, 34);
|
||||
this.btnPluginsMenu.TabIndex = 247;
|
||||
this.btnPluginsMenu.Text = "Plugins";
|
||||
this.btnPluginsMenu.UseVisualStyleBackColor = false;
|
||||
this.btnPluginsMenu.Click += new System.EventHandler(this.btnPluginsMenu_Click);
|
||||
//
|
||||
// OptionsView
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
@@ -104,5 +121,6 @@
|
||||
private System.Windows.Forms.Button btnSettingsMenu;
|
||||
private System.Windows.Forms.Button btnAboutMenu;
|
||||
private System.Windows.Forms.Panel panelSubContent;
|
||||
private System.Windows.Forms.Button btnPluginsMenu;
|
||||
}
|
||||
}
|
||||
@@ -2,13 +2,13 @@
|
||||
using System.Windows.Forms;
|
||||
using Views;
|
||||
|
||||
namespace MSCFixer.Views
|
||||
namespace CFixer.Views
|
||||
{
|
||||
public partial class OptionsView : UserControl
|
||||
{
|
||||
private NavigationManager subNavigation;
|
||||
|
||||
public OptionsView(NavigationManager navigationManager)
|
||||
public OptionsView()
|
||||
{
|
||||
InitializeComponent();
|
||||
subNavigation = new NavigationManager(panelSubContent);
|
||||
@@ -24,5 +24,10 @@ namespace MSCFixer.Views
|
||||
{
|
||||
subNavigation.SwitchView(new SettingsView());
|
||||
}
|
||||
|
||||
private void btnPluginsMenu_Click(object sender, EventArgs e)
|
||||
{
|
||||
subNavigation.SwitchView(new PluginsView());
|
||||
}
|
||||
}
|
||||
}
|
||||
Generated
+168
@@ -0,0 +1,168 @@
|
||||
namespace CFixer.Views
|
||||
{
|
||||
partial class PluginsView
|
||||
{
|
||||
/// <summary>
|
||||
/// Erforderliche Designervariable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Verwendete Ressourcen bereinigen.
|
||||
/// </summary>
|
||||
/// <param name="disposing">True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Vom Komponenten-Designer generierter Code
|
||||
|
||||
/// <summary>
|
||||
/// Erforderliche Methode für die Designerunterstützung.
|
||||
/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.btnPluginInstall = new System.Windows.Forms.Button();
|
||||
this.btnDescription = new System.Windows.Forms.Button();
|
||||
this.listBoxPlugins = new System.Windows.Forms.CheckedListBox();
|
||||
this.progressBarDownload = new System.Windows.Forms.ProgressBar();
|
||||
this.btnPluginOpen = new System.Windows.Forms.Button();
|
||||
this.btnPluginRemove = new System.Windows.Forms.Button();
|
||||
this.btnPluginSubmit = new System.Windows.Forms.Button();
|
||||
this.btnPluginUpdateAll = new System.Windows.Forms.Button();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// btnPluginInstall
|
||||
//
|
||||
this.btnPluginInstall.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.btnPluginInstall.Location = new System.Drawing.Point(488, 46);
|
||||
this.btnPluginInstall.Name = "btnPluginInstall";
|
||||
this.btnPluginInstall.Size = new System.Drawing.Size(121, 29);
|
||||
this.btnPluginInstall.TabIndex = 7;
|
||||
this.btnPluginInstall.Text = "Install";
|
||||
this.btnPluginInstall.UseVisualStyleBackColor = true;
|
||||
this.btnPluginInstall.Click += new System.EventHandler(this.btnPluginInstall_Click);
|
||||
//
|
||||
// btnDescription
|
||||
//
|
||||
this.btnDescription.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.btnDescription.AutoEllipsis = true;
|
||||
this.btnDescription.BackColor = System.Drawing.Color.WhiteSmoke;
|
||||
this.btnDescription.FlatAppearance.BorderColor = System.Drawing.Color.Gainsboro;
|
||||
this.btnDescription.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||
this.btnDescription.Location = new System.Drawing.Point(15, 10);
|
||||
this.btnDescription.Name = "btnDescription";
|
||||
this.btnDescription.Padding = new System.Windows.Forms.Padding(20, 0, 0, 0);
|
||||
this.btnDescription.Size = new System.Drawing.Size(594, 25);
|
||||
this.btnDescription.TabIndex = 6;
|
||||
this.btnDescription.Text = "Plugins Gallery (App restart needed after install)";
|
||||
this.btnDescription.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
|
||||
this.btnDescription.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// listBoxPlugins
|
||||
//
|
||||
this.listBoxPlugins.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.listBoxPlugins.Font = new System.Drawing.Font("Tahoma", 8.25F);
|
||||
this.listBoxPlugins.FormattingEnabled = true;
|
||||
this.listBoxPlugins.Location = new System.Drawing.Point(15, 44);
|
||||
this.listBoxPlugins.Name = "listBoxPlugins";
|
||||
this.listBoxPlugins.Size = new System.Drawing.Size(457, 340);
|
||||
this.listBoxPlugins.TabIndex = 8;
|
||||
this.listBoxPlugins.SelectedIndexChanged += new System.EventHandler(this.listBoxPlugins_SelectedIndexChanged);
|
||||
//
|
||||
// progressBarDownload
|
||||
//
|
||||
this.progressBarDownload.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.progressBarDownload.Location = new System.Drawing.Point(15, 380);
|
||||
this.progressBarDownload.Name = "progressBarDownload";
|
||||
this.progressBarDownload.Size = new System.Drawing.Size(457, 12);
|
||||
this.progressBarDownload.TabIndex = 9;
|
||||
this.progressBarDownload.Visible = false;
|
||||
//
|
||||
// btnPluginOpen
|
||||
//
|
||||
this.btnPluginOpen.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.btnPluginOpen.Location = new System.Drawing.Point(488, 116);
|
||||
this.btnPluginOpen.Name = "btnPluginOpen";
|
||||
this.btnPluginOpen.Size = new System.Drawing.Size(121, 29);
|
||||
this.btnPluginOpen.TabIndex = 10;
|
||||
this.btnPluginOpen.Text = "Open";
|
||||
this.btnPluginOpen.UseVisualStyleBackColor = true;
|
||||
this.btnPluginOpen.Click += new System.EventHandler(this.btnPluginOpen_Click);
|
||||
//
|
||||
// btnPluginRemove
|
||||
//
|
||||
this.btnPluginRemove.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.btnPluginRemove.Location = new System.Drawing.Point(488, 151);
|
||||
this.btnPluginRemove.Name = "btnPluginRemove";
|
||||
this.btnPluginRemove.Size = new System.Drawing.Size(121, 29);
|
||||
this.btnPluginRemove.TabIndex = 11;
|
||||
this.btnPluginRemove.Text = "Remove";
|
||||
this.btnPluginRemove.UseVisualStyleBackColor = true;
|
||||
this.btnPluginRemove.Click += new System.EventHandler(this.btnPluginRemove_Click);
|
||||
//
|
||||
// btnPluginSubmit
|
||||
//
|
||||
this.btnPluginSubmit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.btnPluginSubmit.Location = new System.Drawing.Point(488, 345);
|
||||
this.btnPluginSubmit.Name = "btnPluginSubmit";
|
||||
this.btnPluginSubmit.Size = new System.Drawing.Size(121, 29);
|
||||
this.btnPluginSubmit.TabIndex = 12;
|
||||
this.btnPluginSubmit.Text = "Submit Plugin";
|
||||
this.btnPluginSubmit.UseVisualStyleBackColor = true;
|
||||
this.btnPluginSubmit.Click += new System.EventHandler(this.btnPluginSubmit_Click);
|
||||
//
|
||||
// btnPluginUpdateAll
|
||||
//
|
||||
this.btnPluginUpdateAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.btnPluginUpdateAll.Location = new System.Drawing.Point(488, 81);
|
||||
this.btnPluginUpdateAll.Name = "btnPluginUpdateAll";
|
||||
this.btnPluginUpdateAll.Size = new System.Drawing.Size(121, 29);
|
||||
this.btnPluginUpdateAll.TabIndex = 13;
|
||||
this.btnPluginUpdateAll.Text = "Update All";
|
||||
this.btnPluginUpdateAll.UseVisualStyleBackColor = true;
|
||||
this.btnPluginUpdateAll.Click += new System.EventHandler(this.btnPluginUpdateAll_Click);
|
||||
//
|
||||
// PluginsView
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
|
||||
this.AutoScroll = true;
|
||||
this.BackColor = System.Drawing.Color.White;
|
||||
this.Controls.Add(this.btnPluginUpdateAll);
|
||||
this.Controls.Add(this.btnPluginSubmit);
|
||||
this.Controls.Add(this.btnPluginRemove);
|
||||
this.Controls.Add(this.btnPluginOpen);
|
||||
this.Controls.Add(this.progressBarDownload);
|
||||
this.Controls.Add(this.listBoxPlugins);
|
||||
this.Controls.Add(this.btnPluginInstall);
|
||||
this.Controls.Add(this.btnDescription);
|
||||
this.Name = "PluginsView";
|
||||
this.Size = new System.Drawing.Size(625, 395);
|
||||
this.Load += new System.EventHandler(this.PluginsView_Load);
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.Button btnPluginInstall;
|
||||
private System.Windows.Forms.Button btnDescription;
|
||||
private System.Windows.Forms.CheckedListBox listBoxPlugins;
|
||||
private System.Windows.Forms.ProgressBar progressBarDownload;
|
||||
private System.Windows.Forms.Button btnPluginOpen;
|
||||
private System.Windows.Forms.Button btnPluginRemove;
|
||||
private System.Windows.Forms.Button btnPluginSubmit;
|
||||
private System.Windows.Forms.Button btnPluginUpdateAll;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,243 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace CFixer.Views
|
||||
{
|
||||
public partial class PluginsView : UserControl
|
||||
{
|
||||
private List<PluginEntry> plugins = new List<PluginEntry>();
|
||||
private HashSet<string> installedPlugins = new HashSet<string>();
|
||||
private const string manifestUrl = "https://raw.githubusercontent.com/builtbybel/CrapFixer/main/plugins/plugins_manifest.txt";
|
||||
|
||||
public class PluginEntry
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public string Description { get; set; }
|
||||
public string Url { get; set; }
|
||||
}
|
||||
|
||||
public PluginsView()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private async void PluginsView_Load(object sender, EventArgs e)
|
||||
{
|
||||
await LoadPlugins();
|
||||
}
|
||||
|
||||
private void LoadInstalledPlugins()
|
||||
{
|
||||
var pluginPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "plugins");
|
||||
if (Directory.Exists(pluginPath))
|
||||
{
|
||||
foreach (var file in Directory.GetFiles(pluginPath))
|
||||
{
|
||||
installedPlugins.Add(Path.GetFileName(file));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private async Task LoadPlugins()
|
||||
{
|
||||
try
|
||||
{
|
||||
LoadInstalledPlugins();
|
||||
|
||||
|
||||
using (var client = new WebClient())
|
||||
{
|
||||
string content = await Task.Run(() => client.DownloadString(manifestUrl));
|
||||
plugins = ParseManifest(content);
|
||||
|
||||
listBoxPlugins.Items.Clear();
|
||||
foreach (var plugin in plugins)
|
||||
{
|
||||
var fileName = Path.GetFileName(plugin.Url);
|
||||
string displayName = plugin.Name;
|
||||
|
||||
if (installedPlugins.Contains(fileName))
|
||||
displayName += " (Installed)";
|
||||
|
||||
listBoxPlugins.Items.Add(displayName);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show("Error loading plugins: " + ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
private List<PluginEntry> ParseManifest(string content)
|
||||
{
|
||||
var result = new List<PluginEntry>();
|
||||
var lines = content.Split(new[] { "\r\n", "\n" }, StringSplitOptions.None);
|
||||
PluginEntry current = null;
|
||||
|
||||
foreach (var line in lines)
|
||||
{
|
||||
if (line.StartsWith("[") && line.EndsWith("]"))
|
||||
{
|
||||
if (current != null)
|
||||
result.Add(current);
|
||||
|
||||
var name = line.Substring(1, line.Length - 2).Trim();
|
||||
current = new PluginEntry { Name = name };
|
||||
}
|
||||
else if (!string.IsNullOrWhiteSpace(line) && line.Contains("=") && current != null)
|
||||
{
|
||||
var parts = line.Split(new[] { '=' }, 2);
|
||||
var key = parts[0].Trim();
|
||||
var value = parts[1].Trim();
|
||||
|
||||
switch (key)
|
||||
{
|
||||
case "description":
|
||||
current.Description = value;
|
||||
break;
|
||||
|
||||
case "url":
|
||||
current.Url = value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (current != null)
|
||||
result.Add(current);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private async Task InstallPlugins(bool force = false)
|
||||
{
|
||||
var checkedIndices = listBoxPlugins.CheckedIndices;
|
||||
if (checkedIndices.Count == 0)
|
||||
{
|
||||
MessageBox.Show("Please check one or more plugins to download.");
|
||||
return;
|
||||
}
|
||||
|
||||
string savePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "plugins");
|
||||
Directory.CreateDirectory(savePath);
|
||||
|
||||
progressBarDownload.Visible = true;
|
||||
progressBarDownload.Value = 0;
|
||||
progressBarDownload.Maximum = checkedIndices.Count;
|
||||
|
||||
int done = 0;
|
||||
|
||||
using (var client = new WebClient())
|
||||
{
|
||||
foreach (int index in checkedIndices)
|
||||
{
|
||||
var plugin = plugins[index];
|
||||
string file = Path.Combine(savePath, Path.GetFileName(plugin.Url));
|
||||
|
||||
if (!force && File.Exists(file)) // skip only if not in force‑mode
|
||||
{
|
||||
progressBarDownload.Value = ++done;
|
||||
continue;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
await client.DownloadFileTaskAsync(new Uri(plugin.Url), file);
|
||||
installedPlugins.Add(Path.GetFileName(plugin.Url));
|
||||
listBoxPlugins.Items[index] = plugin.Name + " (Installed)";
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show($"Failed to download {plugin.Name}: {ex.Message}");
|
||||
}
|
||||
|
||||
progressBarDownload.Value = ++done;
|
||||
}
|
||||
}
|
||||
|
||||
progressBarDownload.Visible = false;
|
||||
}
|
||||
|
||||
|
||||
private async void btnPluginInstall_Click(object sender, EventArgs e)
|
||||
{
|
||||
await InstallPlugins(force: false); // skip installed
|
||||
}
|
||||
|
||||
|
||||
private async void btnPluginUpdateAll_Click(object sender, EventArgs e)
|
||||
{
|
||||
// check every item
|
||||
for (int i = 0; i < listBoxPlugins.Items.Count; i++)
|
||||
listBoxPlugins.SetItemChecked(i, true);
|
||||
|
||||
await InstallPlugins(force: true); // always overwrite
|
||||
MessageBox.Show("All plugins updated.");
|
||||
}
|
||||
|
||||
private void listBoxPlugins_SelectedIndexChanged(object sender, EventArgs e)
|
||||
{
|
||||
int index = listBoxPlugins.SelectedIndex;
|
||||
if (index >= 0 && index < plugins.Count)
|
||||
{
|
||||
btnDescription.Text = plugins[index].Description;
|
||||
}
|
||||
}
|
||||
|
||||
private void btnPluginOpen_Click(object sender, EventArgs e)
|
||||
{
|
||||
string pluginPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "plugins");
|
||||
|
||||
if (Directory.Exists(pluginPath))
|
||||
{
|
||||
System.Diagnostics.Process.Start("explorer.exe", pluginPath);
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageBox.Show("The plugins folder does not exist yet.");
|
||||
}
|
||||
}
|
||||
|
||||
private void btnPluginRemove_Click(object sender, EventArgs e)
|
||||
{
|
||||
string pluginPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins");
|
||||
var indices = listBoxPlugins.CheckedIndices.Cast<int>().ToList();
|
||||
|
||||
if (indices.Count == 0)
|
||||
{
|
||||
MessageBox.Show("No plugins selected.");
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (int i in indices)
|
||||
{
|
||||
var plugin = plugins[i];
|
||||
string path = Path.Combine(pluginPath, Path.GetFileName(plugin.Url));
|
||||
|
||||
if (File.Exists(path))
|
||||
File.Delete(path);
|
||||
|
||||
listBoxPlugins.Items[i] = plugin.Name; // Remove (Installed) tag
|
||||
listBoxPlugins.SetItemChecked(i, false); // Uncheck
|
||||
installedPlugins.Remove(Path.GetFileName(plugin.Url));
|
||||
}
|
||||
|
||||
MessageBox.Show("Selected plugins removed.");
|
||||
}
|
||||
|
||||
private void btnPluginSubmit_Click(object sender, EventArgs e)
|
||||
{
|
||||
System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo
|
||||
{
|
||||
FileName = "https://github.com/builtbybel/CrapFixer/blob/main/plugins/plugins_manifest.txt",
|
||||
UseShellExecute = true
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
+17
-17
@@ -1,4 +1,4 @@
|
||||
namespace MSCFixer.Views
|
||||
namespace CFixer.Views
|
||||
{
|
||||
partial class SettingsView
|
||||
{
|
||||
@@ -28,23 +28,22 @@
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.checkBox1 = new System.Windows.Forms.CheckBox();
|
||||
this.checkSaveToINI = new System.Windows.Forms.CheckBox();
|
||||
this.checkBox2 = new System.Windows.Forms.CheckBox();
|
||||
this.button1 = new System.Windows.Forms.Button();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// checkBox1
|
||||
// checkSaveToINI
|
||||
//
|
||||
this.checkBox1.AutoSize = true;
|
||||
this.checkBox1.Checked = true;
|
||||
this.checkBox1.CheckState = System.Windows.Forms.CheckState.Checked;
|
||||
this.checkBox1.Enabled = false;
|
||||
this.checkBox1.Location = new System.Drawing.Point(15, 44);
|
||||
this.checkBox1.Name = "checkBox1";
|
||||
this.checkBox1.Size = new System.Drawing.Size(135, 17);
|
||||
this.checkBox1.TabIndex = 0;
|
||||
this.checkBox1.Text = "Save settings to INI file";
|
||||
this.checkBox1.UseVisualStyleBackColor = true;
|
||||
this.checkSaveToINI.AutoSize = true;
|
||||
this.checkSaveToINI.Checked = true;
|
||||
this.checkSaveToINI.CheckState = System.Windows.Forms.CheckState.Checked;
|
||||
this.checkSaveToINI.Location = new System.Drawing.Point(15, 44);
|
||||
this.checkSaveToINI.Name = "checkSaveToINI";
|
||||
this.checkSaveToINI.Size = new System.Drawing.Size(135, 17);
|
||||
this.checkSaveToINI.TabIndex = 0;
|
||||
this.checkSaveToINI.Text = "Save settings to INI file";
|
||||
this.checkSaveToINI.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// checkBox2
|
||||
//
|
||||
@@ -77,14 +76,15 @@
|
||||
//
|
||||
// SettingsView
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
|
||||
this.BackColor = System.Drawing.Color.White;
|
||||
this.Controls.Add(this.button1);
|
||||
this.Controls.Add(this.checkBox2);
|
||||
this.Controls.Add(this.checkBox1);
|
||||
this.Controls.Add(this.checkSaveToINI);
|
||||
this.Name = "SettingsView";
|
||||
this.Size = new System.Drawing.Size(625, 395);
|
||||
this.Leave += new System.EventHandler(this.SettingsView_Leave);
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.CheckBox checkBox1;
|
||||
private System.Windows.Forms.CheckBox checkSaveToINI;
|
||||
private System.Windows.Forms.CheckBox checkBox2;
|
||||
private System.Windows.Forms.Button button1;
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace CFixer.Views
|
||||
{
|
||||
public partial class SettingsView : UserControl
|
||||
{
|
||||
public SettingsView()
|
||||
{
|
||||
InitializeComponent();
|
||||
LoadSettings();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Collects and saves all relevant checkbox settings to the INI file.
|
||||
/// </summary>
|
||||
public void SaveSettings()
|
||||
{
|
||||
var settings = new Dictionary<string, bool>
|
||||
{
|
||||
{ nameof(checkSaveToINI), checkSaveToINI.Checked },
|
||||
};
|
||||
|
||||
IniStateManager.SaveViewSettings("SETTINGS", settings);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Loads checkbox settings from the INI file and applies them to the view.
|
||||
/// </summary>
|
||||
public void LoadSettings()
|
||||
{
|
||||
var settings = IniStateManager.LoadViewSettings("SETTINGS");
|
||||
checkSaveToINI.Checked = settings.GetValueOrDefault(nameof(checkSaveToINI), false);
|
||||
}
|
||||
|
||||
private void SettingsView_Leave(object sender, EventArgs e)
|
||||
{
|
||||
SaveSettings();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -117,7 +117,4 @@
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<metadata name="contextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>23, 15</value>
|
||||
</metadata>
|
||||
</root>
|
||||
@@ -1,74 +0,0 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.AI
|
||||
{
|
||||
internal class RecallMachine : FeatureBase
|
||||
{
|
||||
private const string keyName = @"HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsAI";
|
||||
private const string valueName = "DisableAIDataAnalysis";
|
||||
private const int recommendedValue = 0;
|
||||
|
||||
public override string GetFeatureDetails()
|
||||
{
|
||||
return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}";
|
||||
}
|
||||
|
||||
public override string ID()
|
||||
{
|
||||
return "Don't Allow system-wide snapshots";
|
||||
}
|
||||
|
||||
public override string Info()
|
||||
{
|
||||
return "This feature will disable system-wide snapshots.";
|
||||
}
|
||||
|
||||
public override bool CheckFeature()
|
||||
{
|
||||
// Check if reg key exists
|
||||
object value = Registry.GetValue(keyName, valueName, null);
|
||||
if (value == null)
|
||||
{
|
||||
// Key does not exist, turn off feature
|
||||
return false;
|
||||
}
|
||||
|
||||
// Key exists, check if value is desired value
|
||||
return (int)value != recommendedValue;
|
||||
}
|
||||
|
||||
public override Task<bool> DoFeature()
|
||||
{
|
||||
try
|
||||
{
|
||||
Registry.SetValue(keyName, valueName, 1, Microsoft.Win32.RegistryValueKind.DWord);
|
||||
Logger.Log("You've even disabled system-wide Snapshots for all users now.", LogLevel.Info);
|
||||
return Task.FromResult(true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.Log("Code red in " + ex.Message, LogLevel.Error);
|
||||
}
|
||||
|
||||
return Task.FromResult(false);
|
||||
}
|
||||
|
||||
public override bool UndoFeature()
|
||||
{
|
||||
try
|
||||
{
|
||||
Registry.SetValue(keyName, valueName, recommendedValue, Microsoft.Win32.RegistryValueKind.DWord);
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.Log("Code red in " + ex.Message, LogLevel.Error);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,74 +0,0 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using Crapfixer;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Settings.AI
|
||||
{
|
||||
internal class RecallUser : FeatureBase
|
||||
{
|
||||
private const string keyName = @"HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\WindowsAI";
|
||||
private const string valueName = "DisableAIDataAnalysis";
|
||||
private const int recommendedValue = 0;
|
||||
|
||||
public override string GetFeatureDetails()
|
||||
{
|
||||
return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}";
|
||||
}
|
||||
|
||||
public override string ID()
|
||||
{
|
||||
return "Don't Allow Windows to save snapshots of your screen";
|
||||
}
|
||||
|
||||
public override string Info()
|
||||
{
|
||||
return "This feature will disable Recall from saving snapshots of your screen.";
|
||||
}
|
||||
|
||||
public override bool CheckFeature()
|
||||
{
|
||||
// Check if reg key exists
|
||||
object value = Registry.GetValue(keyName, valueName, null);
|
||||
if (value == null)
|
||||
{
|
||||
// Key does not exist, turn off feature
|
||||
return false;
|
||||
}
|
||||
|
||||
// Key exists, check if value is desired value
|
||||
return (int)value != recommendedValue;
|
||||
}
|
||||
|
||||
public override Task<bool> DoFeature()
|
||||
{
|
||||
try
|
||||
{
|
||||
Registry.SetValue(keyName, valueName, 1, Microsoft.Win32.RegistryValueKind.DWord);
|
||||
Logger.Log("You've got snapshots disabled.", LogLevel.Info);
|
||||
return Task.FromResult(true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.Log("Code red in " + ex.Message, LogLevel.Error);
|
||||
}
|
||||
|
||||
return Task.FromResult(false);
|
||||
}
|
||||
|
||||
public override bool UndoFeature()
|
||||
{
|
||||
try
|
||||
{
|
||||
Registry.SetValue(keyName, valueName, recommendedValue, Microsoft.Win32.RegistryValueKind.DWord);
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.Log("Code red in " + ex.Message, LogLevel.Error);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,69 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Windows.Forms;
|
||||
|
||||
public static class IniStateManager
|
||||
{
|
||||
// Saves the states of the TreeView nodes to an INI file
|
||||
public static void Save(TreeView tree, string path)
|
||||
{
|
||||
using (var writer = new StreamWriter(path))
|
||||
{
|
||||
// Iterates through all nodes and saves their state
|
||||
WriteNodeStates(writer, tree.Nodes);
|
||||
}
|
||||
}
|
||||
|
||||
// Loads the states of the TreeView nodes from an INI file
|
||||
public static void Load(TreeView tree, string path)
|
||||
{
|
||||
if (!File.Exists(path)) return;
|
||||
|
||||
var lines = File.ReadAllLines(path);
|
||||
var states = lines.Select(l => l.Split(new[] { '=' }, 2))
|
||||
.Where(p => p.Length == 2)
|
||||
.ToDictionary(p => p[0].Trim(), p => p[1].Trim().ToLower() == "true");
|
||||
|
||||
// Sets the state of the nodes based on the loaded data
|
||||
ApplyStates(tree.Nodes, states);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Saves the state of each node in the TreeView recursively.
|
||||
/// </summary>
|
||||
/// <param name="writer"></param>
|
||||
/// <param name="nodes"></param>
|
||||
private static void WriteNodeStates(StreamWriter writer, TreeNodeCollection nodes)
|
||||
{
|
||||
foreach (TreeNode node in nodes)
|
||||
{
|
||||
// Saves the node's name and its checked status
|
||||
writer.WriteLine($"{node.Text.Trim()}={node.Checked}");
|
||||
// If the node has children, recursively go through all nodes
|
||||
if (node.Nodes.Count > 0)
|
||||
WriteNodeStates(writer, node.Nodes);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Applies the saved states to the TreeView nodes recursively.
|
||||
/// </summary>
|
||||
/// <param name="nodes"></param>
|
||||
/// <param name="states"></param>
|
||||
private static void ApplyStates(TreeNodeCollection nodes, Dictionary<string, bool> states)
|
||||
{
|
||||
foreach (TreeNode node in nodes)
|
||||
{
|
||||
string nodeName = node.Text.Trim();
|
||||
if (states.ContainsKey(nodeName))
|
||||
{
|
||||
node.Checked = states[nodeName];
|
||||
}
|
||||
|
||||
// Apply recursively to child nodes
|
||||
if (node.Nodes.Count > 0)
|
||||
ApplyStates(node.Nodes, states);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
using Crapfixer;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace MSCFixer.Views
|
||||
{
|
||||
public partial class SettingsView : UserControl
|
||||
{
|
||||
public SettingsView()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user