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
8 changes: 8 additions & 0 deletions .cursor/hooks/state/continual-learning.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"version": 1,
"lastRunAtMs": 0,
"turnsSinceLastRun": 2,
"lastTranscriptMtimeMs": null,
"lastProcessedGenerationId": "b78a342b-b9bc-4cac-86c8-92e073a516a6",
"trialStartedAtMs": null
}
18 changes: 18 additions & 0 deletions .specstory/history/2026-03-13_11-23Z-untitled.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<!-- Generated by SpecStory, Markdown v2.1.0 -->

<!-- cursor Session ca3e6634-5472-4749-bc8f-1cd824b4bbe3 (2026-03-13 11:23Z) -->

# Untitled (2026-03-13 11:23Z)

_**User**_

"C:\Users\Dev\AppData\Local\Programs\Inno Setup 6\ISCC.exe" installer.iss

---

_**Agent (model composer-1.5, mode Agent)**_



---

220 changes: 220 additions & 0 deletions .specstory/history/2026-03-13_13-06Z-inno-setup-installer-script.md

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions Audiomatic/.cursorindexingignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@

# Don't index SpecStory auto-save files, but allow explicit context inclusion via @ references
.specstory/**
4 changes: 4 additions & 0 deletions Audiomatic/.specstory/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# SpecStory project identity file
/.project.json
# SpecStory explanation file
/.what-is-this.md
101 changes: 101 additions & 0 deletions Audiomatic/LibraryWindow.xaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
<?xml version="1.0" encoding="utf-8"?>
<Window
x:Class="Audiomatic.LibraryWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Library">

<Grid x:Name="RootGrid" KeyDown="RootGrid_KeyDown">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>

<Grid x:Name="CustomTitleBar" Grid.Row="0" Padding="10,6">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>

<TextBlock Grid.Column="0"
Text="Library"
FontSize="13"
VerticalAlignment="Center"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"/>

<Button Grid.Column="1"
Background="Transparent"
BorderThickness="0"
Padding="8,4"
Click="Close_Click">
<FontIcon Glyph="&#xE711;" FontSize="12"/>
</Button>
</Grid>

<Grid Grid.Row="1" Margin="12,8,12,0" ColumnSpacing="12">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*"/>
<ColumnDefinition Width="3*"/>
</Grid.ColumnDefinitions>

<Button Grid.Column="0"
Padding="0,2"
Background="Transparent"
BorderThickness="0"
HorizontalAlignment="Left"
Click="TitleHeader_Click">
<TextBlock x:Name="TitleHeaderText"
Text="Titre"
FontSize="12"
FontWeight="SemiBold"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"/>
</Button>

<Button Grid.Column="1"
Padding="0,2"
Background="Transparent"
BorderThickness="0"
HorizontalAlignment="Left"
Click="FolderHeader_Click">
<TextBlock x:Name="FolderHeaderText"
Text="Dossier"
FontSize="12"
FontWeight="SemiBold"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"/>
</Button>
</Grid>

<Grid Grid.Row="2" Margin="12,4,12,12">
<ListView x:Name="RowsList"
SelectionMode="None"
IsItemClickEnabled="False">
<ListView.ItemTemplate>
<DataTemplate>
<Grid Padding="0,4" ColumnSpacing="12">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*"/>
<ColumnDefinition Width="3*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0"
Text="{Binding Title}"
TextWrapping="Wrap"/>
<TextBlock Grid.Column="1"
Text="{Binding FolderPath}"
TextWrapping="Wrap"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"/>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>

<TextBlock x:Name="EmptyStateText"
Text="No tracks in library."
FontSize="12"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Visibility="Collapsed"
Foreground="{ThemeResource TextFillColorTertiaryBrush}"/>
</Grid>
</Grid>
</Window>
118 changes: 118 additions & 0 deletions Audiomatic/LibraryWindow.xaml.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
using Microsoft.UI.Windowing;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Input;

namespace Audiomatic;

public sealed partial class LibraryWindow : Window
{
private IReadOnlyList<LibraryRow> _allRows = [];
private LibrarySortColumn _sortColumn = LibrarySortColumn.Title;
private bool _sortAscending = true;

public LibraryWindow()
{
InitializeComponent();
ExtendsContentIntoTitleBar = true;
SetTitleBar(CustomTitleBar);
WindowShadow.Apply(this);

if (AppWindow.Presenter is OverlappedPresenter presenter)
{
presenter.IsMaximizable = false;
}

ApplyTheme(SettingsManager.LoadTheme());
UpdateHeaderTexts();
}

public void SetRows(IReadOnlyList<LibraryRow> rows)
{
_allRows = rows;
ApplySort();
}

private void ApplyTheme(string theme)
{
if (Content is not FrameworkElement root) return;

root.RequestedTheme = theme switch
{
"light" => ElementTheme.Light,
"dark" => ElementTheme.Dark,
_ => ElementTheme.Default
};
}

private void RootGrid_KeyDown(object sender, KeyRoutedEventArgs e)
{
if (e.Key == Windows.System.VirtualKey.Escape)
{
Close();
e.Handled = true;
}
}

private void TitleHeader_Click(object sender, RoutedEventArgs e) =>
ChangeSort(LibrarySortColumn.Title);

private void FolderHeader_Click(object sender, RoutedEventArgs e) =>
ChangeSort(LibrarySortColumn.Folder);

private void ChangeSort(LibrarySortColumn column)
{
if (_sortColumn == column)
_sortAscending = !_sortAscending;
else
{
_sortColumn = column;
_sortAscending = true;
}

ApplySort();
}

private void ApplySort()
{
IEnumerable<LibraryRow> sorted = _sortColumn switch
{
LibrarySortColumn.Folder => _sortAscending
? _allRows.OrderBy(r => r.FolderPath, StringComparer.OrdinalIgnoreCase)
.ThenBy(r => r.Title, StringComparer.OrdinalIgnoreCase)
: _allRows.OrderByDescending(r => r.FolderPath, StringComparer.OrdinalIgnoreCase)
.ThenByDescending(r => r.Title, StringComparer.OrdinalIgnoreCase),
_ => _sortAscending
? _allRows.OrderBy(r => r.Title, StringComparer.OrdinalIgnoreCase)
.ThenBy(r => r.FolderPath, StringComparer.OrdinalIgnoreCase)
: _allRows.OrderByDescending(r => r.Title, StringComparer.OrdinalIgnoreCase)
.ThenByDescending(r => r.FolderPath, StringComparer.OrdinalIgnoreCase)
};

RowsList.ItemsSource = sorted.ToList();
EmptyStateText.Visibility = _allRows.Count == 0 ? Visibility.Visible : Visibility.Collapsed;
UpdateHeaderTexts();
}

private void UpdateHeaderTexts()
{
TitleHeaderText.Text = BuildHeader("Titre", _sortColumn == LibrarySortColumn.Title);
FolderHeaderText.Text = BuildHeader("Dossier", _sortColumn == LibrarySortColumn.Folder);
}

private string BuildHeader(string label, bool isActive)
{
if (!isActive) return label;
return _sortAscending ? $"{label} ▲" : $"{label} ▼";
}

private void Close_Click(object sender, RoutedEventArgs e) => Close();
}

public sealed record LibraryRow(string Title, string FolderPath);

internal enum LibrarySortColumn
{
Title,
Folder
}
6 changes: 6 additions & 0 deletions Audiomatic/MainWindow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -446,6 +446,12 @@
</ListView>
</Grid>

<!-- Row 7: Equalizer (shown when Equalizer view is active) -->
<ScrollViewer x:Name="EqualizerContainer" Grid.Row="7" Visibility="Collapsed"
Padding="14,0">
<StackPanel x:Name="EqualizerPanel" Spacing="10"/>
</ScrollViewer>

<!-- Row 7: Media control (shown when Media view is active) -->
<ScrollViewer x:Name="MediaContainer" Grid.Row="7" Visibility="Collapsed"
Padding="6,0">
Expand Down
Loading