Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -69,15 +69,15 @@ jobs:
- name: Generate checksum
shell: pwsh
run: |
$hash = (Get-FileHash "Installer/Output/ControlPad-Setup.exe" -Algorithm SHA256).Hash
"$hash ControlPad-Setup.exe" | Out-File -FilePath "Installer/Output/checksums.sha256" -Encoding utf8
$hash = (Get-FileHash "Installer/Output/Slidr-Setup.exe" -Algorithm SHA256).Hash
"$hash Slidr-Setup.exe" | Out-File -FilePath "Installer/Output/checksums.sha256" -Encoding utf8

- name: Upload installer artifact
uses: actions/upload-artifact@v4
with:
name: ControlPad-Setup
name: Slidr-Setup
path: |
Installer/Output/ControlPad-Setup.exe
Installer/Output/Slidr-Setup.exe
Installer/Output/checksums.sha256

- name: Create GitHub Release
Expand All @@ -88,6 +88,6 @@ jobs:
prerelease: ${{ contains(github.ref_name, 'rc') || contains(github.ref_name, 'beta') || contains(github.ref_name, 'alpha') }}
generate_release_notes: true
files: |
Installer/Output/ControlPad-Setup.exe
Installer/Output/Slidr-Setup.exe
Installer/Output/checksums.sha256
requirements.json
4 changes: 2 additions & 2 deletions ControlPad/App.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,17 @@
{
public partial class App : Application
{
private static Mutex _mutex;

Check warning on line 15 in ControlPad/App.xaml.cs

View workflow job for this annotation

GitHub Actions / build

Non-nullable field '_mutex' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the field as nullable.
protected override void OnStartup(StartupEventArgs e)
{
const string mutexName = "ControlPad";
const string mutexName = "Slidr";
bool createdNew;

_mutex = new Mutex(true, mutexName, out createdNew);

if (!createdNew)
{
MessageBox.Show("Control Pad is already open.");
MessageBox.Show("Slidr is already open.");
_mutex?.ReleaseMutex();
_mutex?.Dispose();
Current.Shutdown();
Expand Down
2 changes: 1 addition & 1 deletion ControlPad/Autostart.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
{
const string RunKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run";
const string ApprovedKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\StartupApproved\Run";
const string AppName = "ControlPad";
const string AppName = "Slidr";

public static void Set(bool enable, bool startHidden)
{
Expand All @@ -35,7 +35,7 @@

public static bool IsEnabled()
{
using (RegistryKey key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", false))

Check warning on line 38 in ControlPad/Autostart.cs

View workflow job for this annotation

GitHub Actions / build

Converting null literal or possible null value to non-nullable type.
{
return key?.GetValue(AppName) != null;
}
Expand Down
2 changes: 1 addition & 1 deletion ControlPad/ControlPad.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<AssemblyName>ControlPad</AssemblyName>
<AssemblyName>Slidr</AssemblyName>
<RootNamespace>ControlPad</RootNamespace>
<OutputType>WinExe</OutputType>
<TargetFramework>net9.0-windows10.0.19041.0</TargetFramework>
Expand Down
18 changes: 9 additions & 9 deletions ControlPad/DataHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ public static class DataHandler
{
public static string AppDataRoaming = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
public static Preset CurrentPreset { get; set; } = new Preset(0, "Preset1 (current)");
public static string GetSliderCategoriesPath() => Path.Combine(AppDataRoaming, GetPresetPath(CurrentPreset.Id) ?? @$"ControlPad\Presets\{CurrentPreset.Name}", "SliderCategories.json");
public static string GetButtonCategoriesPath() => Path.Combine(AppDataRoaming, GetPresetPath(CurrentPreset.Id) ?? @$"ControlPad\Presets\{CurrentPreset.Name}", "ButtonCategories.json");
public static string GetCategoryControlsPath() => Path.Combine(AppDataRoaming, GetPresetPath(CurrentPreset.Id) ?? @$"ControlPad\Presets\{CurrentPreset.Name}", "CategoryControls.txt");
public static string GetSettingsPath() => Path.Combine(AppDataRoaming, GetPresetPath(CurrentPreset.Id) ?? $@"ControlPad\Presets\{CurrentPreset.Name}", "Settings.json");
public static string GetSliderCategoriesPath() => Path.Combine(AppDataRoaming, GetPresetPath(CurrentPreset.Id) ?? @$"Slidr\Presets\{CurrentPreset.Name}", "SliderCategories.json");
public static string GetButtonCategoriesPath() => Path.Combine(AppDataRoaming, GetPresetPath(CurrentPreset.Id) ?? @$"Slidr\Presets\{CurrentPreset.Name}", "ButtonCategories.json");
public static string GetCategoryControlsPath() => Path.Combine(AppDataRoaming, GetPresetPath(CurrentPreset.Id) ?? @$"Slidr\Presets\{CurrentPreset.Name}", "CategoryControls.txt");
public static string GetSettingsPath() => Path.Combine(AppDataRoaming, GetPresetPath(CurrentPreset.Id) ?? $@"Slidr\Presets\{CurrentPreset.Name}", "Settings.json");
public static ObservableCollection<SliderCategory> SliderCategories { get; set; } = new ObservableCollection<SliderCategory>();
public static ObservableCollection<ButtonCategory> ButtonCategories { get; set; } = new ObservableCollection<ButtonCategory>();
public static List<(CustomSlider slider, int value)> SliderValues { get; set; } = new();
Expand Down Expand Up @@ -128,7 +128,7 @@ public static void SetButtonTextBlocks()
public static List<Preset> GetPresets()
{
var presets = new List<Preset>();
var presetFolders = Directory.GetDirectories(Path.Combine(DataHandler.AppDataRoaming, "ControlPad", "Presets"));
var presetFolders = Directory.GetDirectories(Path.Combine(DataHandler.AppDataRoaming, "Slidr", "Presets"));
foreach (var folder in presetFolders)
{
if (File.Exists(@$"{folder}\ID.txt") && int.TryParse(File.ReadAllText(@$"{folder}\ID.txt"), out int id))
Expand All @@ -145,7 +145,7 @@ public static List<Preset> GetPresets()

public static string? GetPresetPath(int idToSearchFor)
{
var presetFolders = Directory.GetDirectories(Path.Combine(DataHandler.AppDataRoaming, "ControlPad", "Presets"));
var presetFolders = Directory.GetDirectories(Path.Combine(DataHandler.AppDataRoaming, "Slidr", "Presets"));
foreach (var folder in presetFolders)
{
if (int.TryParse(File.ReadAllText(@$"{folder}\ID.txt"), out int id))
Expand All @@ -156,16 +156,16 @@ public static List<Preset> GetPresets()

public static void CheckAppDataFolder()
{
if (!Directory.Exists(Path.Combine(AppDataRoaming, @"ControlPad\Presets")))
if (!Directory.Exists(Path.Combine(AppDataRoaming, @"Slidr\Presets")))
{
Directory.CreateDirectory(Path.Combine(AppDataRoaming, @"ControlPad\Presets\"));
Directory.CreateDirectory(Path.Combine(AppDataRoaming, @"Slidr\Presets\"));
CreatePreset(new Preset(GetPresets().GetFreeId(p => p.Id), "Preset1 (current)"));
}
}

public static bool CreatePreset(Preset preset)
{
string path = Path.Combine(AppDataRoaming, @$"ControlPad\Presets\{preset.Name}\");
string path = Path.Combine(AppDataRoaming, @$"Slidr\Presets\{preset.Name}\");
try
{
if (!Directory.Exists(path))
Expand Down
10 changes: 5 additions & 5 deletions ControlPad/Windows/MainWindow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
xmlns:local="clr-namespace:ControlPad"
mc:Ignorable="d"
Icon="pack://application:,,,/Resources/logo.ico"
Title="Control Pad"
Title="Slidr"
Width="650"
Height="600"
Closing="mainWindow_Closing"
Expand All @@ -18,12 +18,12 @@
ResizeMode="NoResize">

<DockPanel>
<tray:NotifyIcon
<tray:NotifyIcon
x:Name="NotifyIcon"
FocusOnLeftClick="True"
MenuOnRightClick="True"
MenuOnRightClick="True"
Icon="pack://application:,,,/Resources/logo.ico"
TooltipText="Control Pad">
TooltipText="Slidr">
<tray:NotifyIcon.Menu>
<ContextMenu>
<MenuItem Header="Open" Click="MI_Open_Click" />
Expand All @@ -35,7 +35,7 @@
<ui:TitleBar
DockPanel.Dock="Top"
x:Name="titleBarMainWindow"
Title="Control Pad"
Title="Slidr"
ShowMaximize="False"
CanMaximize="False"
Icon="{ui:ImageIcon 'pack://application:,,,/Resources/logo.ico'}" />
Expand Down
2 changes: 1 addition & 1 deletion ControlPad/Windows/MainWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ private void mainWindow_Closing(object sender, System.ComponentModel.CancelEvent

if (!Settings.TrayIconMessageShown)
{
new ToastContentBuilder().AddText("Control Pad minimized to System Tray").Show();
new ToastContentBuilder().AddText("Slidr minimized to System Tray").Show();
Settings.TrayIconMessageShown = true;
}
}
Expand Down
6 changes: 3 additions & 3 deletions ControlPad/Windows/PresetManagerWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ private void Btn_Apply_Click(object sender, RoutedEventArgs e)
{
try
{
Directory.Delete(Path.Combine(DataHandler.AppDataRoaming, "ControlPad", "Presets", preset.Name), true);
Directory.Delete(Path.Combine(DataHandler.AppDataRoaming, "Slidr", "Presets", preset.Name), true);
}
catch (Exception ex)
{
Expand All @@ -115,7 +115,7 @@ private void Btn_Apply_Click(object sender, RoutedEventArgs e)
foreach (Preset preset in lv_Presets.Items)
{
string? currentPath = DataHandler.GetPresetPath(preset.Id);
string newPath = Path.Combine(DataHandler.AppDataRoaming, "ControlPad", "Presets", preset.Name);
string newPath = Path.Combine(DataHandler.AppDataRoaming, "Slidr", "Presets", preset.Name);
try
{
if (currentPath != null && currentPath != newPath)
Expand Down Expand Up @@ -211,7 +211,7 @@ private void CollectionChanged()

private void ShowError(string msg)
{
System.Windows.MessageBox.Show(msg, "Control Pad", System.Windows.MessageBoxButton.OK, MessageBoxImage.Error);
System.Windows.MessageBox.Show(msg, "Slidr", System.Windows.MessageBoxButton.OK, MessageBoxImage.Error);
}
}
}
12 changes: 6 additions & 6 deletions Installer/ControlPad.iss
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
; ControlPad Inno Setup Script
; Slidr Inno Setup Script
; Requires Inno Setup 6.0+

#define MyAppName "ControlPad"
#define MyAppName "Slidr"
#define MyAppVersion "1.0.0"
#define MyAppPublisher "ControlPad"
#define MyAppExeName "ControlPad.exe"
#define MyAppPublisher "Slidr"
#define MyAppExeName "Slidr.exe"
#define MyAppURL "https://github.com/your-username/ControlPad"

; .NET 9.0 Desktop Runtime download URL (x64)
Expand All @@ -21,7 +21,7 @@ AppSupportURL={#MyAppURL}
DefaultDirName={autopf}\{#MyAppName}
DefaultGroupName={#MyAppName}
DisableProgramGroupPage=yes
OutputBaseFilename=ControlPad-Setup
OutputBaseFilename=Slidr-Setup
SetupIconFile=..\ControlPad\Resources\logo.ico
UninstallDisplayIcon={app}\{#MyAppExeName}
Compression=lzma2
Expand All @@ -39,7 +39,7 @@ Name: "english"; MessagesFile: "compiler:Default.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
Name: "autostart"; Description: "Start ControlPad with Windows"; GroupDescription: "Other options:"
Name: "autostart"; Description: "Start Slidr with Windows"; GroupDescription: "Other options:"

[Files]
; Application files from publish output
Expand Down
8 changes: 5 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
# ControlPad
# Slidr

A Windows desktop application that turns an Arduino-based control pad into a fully configurable audio mixer and macro board. Map physical sliders to per-app volume control and buttons to actions like muting, launching apps, opening websites, or simulating key presses.

> **Note for developers and AI assistants:** The C# namespaces, project file names, and internal identifiers still use `ControlPad`. Only the user-facing name has changed to **Slidr**. Do not rename namespaces, `.csproj` files, or the solution file.

## Features

- **Per-app volume control** — Assign audio streams (apps, microphones, system audio) to physical sliders
Expand Down Expand Up @@ -36,7 +38,7 @@ Flash the `InoSkript/InoSkript.ino` sketch to your Arduino. It sends slider valu

```bash
# Clone the repository
git clone https://github.com/your-username/ControlPad.git
git clone https://github.com/ControlPad/App.git
cd ControlPad

# Build
Expand All @@ -62,7 +64,7 @@ The installer is built with [Inno Setup](https://jrsoftware.org/isinfo.php) (v6+

1. Publish the app (framework-dependent or self-contained)
2. Open `Installer/ControlPad.iss` in Inno Setup Compiler
3. Compile to produce `ControlPad-Setup.exe`
3. Compile to produce `Slidr-Setup.exe`

Alternatively, use the GitHub Actions release workflow — push a version tag (`v*`) and the installer is built automatically.

Expand Down
Loading