Skip to content

Commit cd35306

Browse files
release: v4.0.0 - floating mic overlay, dark mode redesign, gain control, and runtime text replacement
1 parent 96ae264 commit cd35306

14 files changed

Lines changed: 668 additions & 159 deletions

App.xaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
11
<Application x:Class="PrimeDictate.App"
22
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
33
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
4+
<Application.Resources>
5+
<ResourceDictionary>
6+
<ResourceDictionary.MergedDictionaries>
7+
<ResourceDictionary Source="Themes/DarkTheme.xaml" />
8+
</ResourceDictionary.MergedDictionaries>
9+
</ResourceDictionary>
10+
</Application.Resources>
411
</Application>

App.xaml.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ protected override async void OnStartup(StartupEventArgs e)
7777
this.settings.EnableOllamaPostProcessing,
7878
this.settings.OllamaEndpoint,
7979
this.settings.OllamaModel,
80-
this.settings.OllamaMode);
80+
this.settings.OllamaMode,
81+
this.settings.TranscriptReplacements ?? new List<TranscriptReplacementRule>());
8182
this.dictationController.RecordingStateChanged += this.OnRecordingStateChanged;
8283
this.dictationController.ProcessingStateChanged += this.OnProcessingStateChanged;
8384
this.dictationController.ThreadStarted += this.OnThreadStarted;
@@ -253,7 +254,8 @@ private void OnSettingsSaved(AppSettings newSettings)
253254
newSettings.EnableOllamaPostProcessing,
254255
newSettings.OllamaEndpoint,
255256
newSettings.OllamaModel,
256-
newSettings.OllamaMode);
257+
newSettings.OllamaMode,
258+
newSettings.TranscriptReplacements ?? new List<TranscriptReplacementRule>());
257259
this.UpdateTranscriptionOverlay();
258260
}
259261

AppSettings.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@ internal sealed class AppSettings
5050
[JsonConverter(typeof(JsonStringEnumConverter))]
5151
public OllamaMode OllamaMode { get; set; } = OllamaMode.Default;
5252

53+
/// <summary>
54+
/// Find-and-replace pairs applied to the final transcript before optional Ollama processing and injection.
55+
/// </summary>
56+
public List<TranscriptReplacementRule> TranscriptReplacements { get; set; } = new();
57+
5358
public static AppSettings CreateDefaultForFirstRun() => new()
5459
{
5560
FirstRunCompleted = false,
@@ -71,10 +76,18 @@ internal sealed class AppSettings
7176
EnableOllamaPostProcessing = false,
7277
OllamaEndpoint = "http://localhost:11434",
7378
OllamaModel = "gemma:2b",
74-
OllamaMode = OllamaMode.Default
79+
OllamaMode = OllamaMode.Default,
80+
TranscriptReplacements = new List<TranscriptReplacementRule>()
7581
};
7682
}
7783

84+
internal sealed class TranscriptReplacementRule
85+
{
86+
public string Find { get; set; } = "";
87+
88+
public string Replace { get; set; } = "";
89+
}
90+
7891
internal enum TrayClickBehavior
7992
{
8093
SingleClickOpensSettings = 0,

Directory.Build.props

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project>
22
<PropertyGroup>
3-
<Version>3.2.0</Version>
4-
<AssemblyVersion>3.2.0.0</AssemblyVersion>
5-
<FileVersion>3.2.0.0</FileVersion>
3+
<Version>4.0.0</Version>
4+
<AssemblyVersion>4.0.0.0</AssemblyVersion>
5+
<FileVersion>4.0.0.0</FileVersion>
66
</PropertyGroup>
77
</Project>

HistoryWindow.xaml

Lines changed: 48 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,46 @@
77
Height="680"
88
MinWidth="840"
99
MinHeight="520"
10-
WindowStartupLocation="CenterScreen">
11-
<Grid Margin="12">
12-
<Grid.RowDefinitions>
13-
<RowDefinition Height="Auto" />
14-
<RowDefinition Height="*" />
15-
</Grid.RowDefinitions>
10+
WindowStartupLocation="CenterScreen"
11+
WindowStyle="None"
12+
AllowsTransparency="True"
13+
Background="Transparent"
14+
Foreground="{DynamicResource TextPrimaryBrush}">
15+
<Border Background="{DynamicResource WindowBackgroundBrush}"
16+
CornerRadius="12"
17+
BorderBrush="{StaticResource BorderBrush}"
18+
BorderThickness="1">
19+
<Grid>
20+
<Grid.RowDefinitions>
21+
<RowDefinition Height="Auto" />
22+
<RowDefinition Height="*" />
23+
</Grid.RowDefinitions>
1624

17-
<DockPanel Grid.Row="0" Margin="0,0,0,10">
18-
<TextBlock DockPanel.Dock="Left"
19-
VerticalAlignment="Center"
20-
FontSize="16"
21-
FontWeight="SemiBold"
22-
Text="Transcript History" />
23-
<StackPanel DockPanel.Dock="Right" Orientation="Horizontal">
25+
<!-- Custom Title Bar -->
26+
<Grid Background="Transparent" MouseLeftButtonDown="OnTitleBarMouseLeftButtonDown">
27+
<Grid.ColumnDefinitions>
28+
<ColumnDefinition Width="*" />
29+
<ColumnDefinition Width="Auto" />
30+
</Grid.ColumnDefinitions>
31+
<TextBlock Margin="16,12,0,12"
32+
FontSize="16"
33+
FontWeight="SemiBold"
34+
VerticalAlignment="Center"
35+
Text="Transcript History" />
36+
<StackPanel Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Top" Margin="0,8,8,0">
37+
<Button Width="32" Height="32" Content="" Background="Transparent" BorderThickness="0" Click="OnMinimizeClick" ToolTip="Minimize" />
38+
<Button Width="32" Height="32" Content="" Background="Transparent" BorderThickness="0" Click="OnCloseClick" ToolTip="Close" />
39+
</StackPanel>
40+
</Grid>
41+
42+
<Grid Grid.Row="1" Margin="12,0,12,12">
43+
<Grid.RowDefinitions>
44+
<RowDefinition Height="Auto" />
45+
<RowDefinition Height="*" />
46+
</Grid.RowDefinitions>
47+
48+
<DockPanel Grid.Row="0" Margin="0,0,0,10">
49+
<StackPanel DockPanel.Dock="Right" Orientation="Horizontal" HorizontalAlignment="Right">
2450
<TextBlock Margin="0,0,8,0"
2551
VerticalAlignment="Center"
2652
Text="Filter" />
@@ -38,7 +64,7 @@
3864
</Grid.ColumnDefinitions>
3965

4066
<Border Grid.Column="0"
41-
BorderBrush="#DDD"
67+
BorderBrush="{StaticResource BorderBrush}"
4268
BorderThickness="1"
4369
CornerRadius="6"
4470
Padding="8">
@@ -51,19 +77,19 @@
5177
<DataTemplate>
5278
<Border Margin="0,0,0,6"
5379
Padding="6"
54-
BorderBrush="#EFEFEF"
80+
BorderBrush="{StaticResource BorderSubtleBrush}"
5581
BorderThickness="1"
5682
CornerRadius="4">
5783
<StackPanel>
5884
<TextBlock FontWeight="SemiBold"
5985
Text="{Binding TimestampUtc, StringFormat={}{0:yyyy-MM-dd HH:mm:ss}}" />
6086
<TextBlock Margin="0,3,0,0"
6187
FontSize="12"
62-
Foreground="#666"
88+
Foreground="{StaticResource TextSecondaryBrush}"
6389
Text="{Binding DeliveryStatus}" />
6490
<TextBlock Margin="0,3,0,0"
6591
FontSize="12"
66-
Foreground="#333"
92+
Foreground="{StaticResource TextSecondaryBrush}"
6793
Text="{Binding TargetDisplayName, TargetNullValue=Unknown target}" />
6894
<TextBlock Margin="0,4,0,0"
6995
FontSize="12"
@@ -78,7 +104,7 @@
78104
</Border>
79105

80106
<Border Grid.Column="2"
81-
BorderBrush="#DDD"
107+
BorderBrush="{StaticResource BorderBrush}"
82108
BorderThickness="1"
83109
CornerRadius="6"
84110
Padding="10">
@@ -120,11 +146,11 @@
120146
</Style>
121147
</StackPanel.Style>
122148
<TextBlock FontWeight="SemiBold" Text="Original Transcript" Margin="0,0,0,4"/>
123-
<TextBox IsReadOnly="True" AcceptsReturn="True" TextWrapping="Wrap" Background="#FAFAFA"
149+
<TextBox IsReadOnly="True" AcceptsReturn="True" TextWrapping="Wrap"
124150
Text="{Binding SelectedEntry.OriginalTranscript}" />
125151

126152
<TextBlock FontWeight="SemiBold" Text="Ollama Context (System Prompt)" Margin="0,12,0,4"/>
127-
<TextBox IsReadOnly="True" AcceptsReturn="True" TextWrapping="Wrap" Background="#FAFAFA"
153+
<TextBox IsReadOnly="True" AcceptsReturn="True" TextWrapping="Wrap"
128154
Text="{Binding SelectedEntry.OllamaSystemPrompt}" />
129155

130156
<TextBlock FontWeight="SemiBold" Text="Final Injected Transcript" Margin="0,12,0,4"/>
@@ -151,4 +177,6 @@
151177
</Border>
152178
</Grid>
153179
</Grid>
180+
</Grid>
181+
</Border>
154182
</Window>

HistoryWindow.xaml.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,22 @@ private void OnCopyDetailsClick(object sender, RoutedEventArgs e)
5555
sb.AppendLine(entry.Transcript);
5656
System.Windows.Clipboard.SetText(sb.ToString());
5757
}
58+
59+
private void OnTitleBarMouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
60+
{
61+
if (e.ButtonState == System.Windows.Input.MouseButtonState.Pressed)
62+
{
63+
this.DragMove();
64+
}
65+
}
66+
67+
private void OnMinimizeClick(object sender, RoutedEventArgs e)
68+
{
69+
this.WindowState = WindowState.Minimized;
70+
}
71+
72+
private void OnCloseClick(object sender, RoutedEventArgs e)
73+
{
74+
this.Close();
75+
}
5876
}

MainWindow.xaml

Lines changed: 56 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -7,43 +7,55 @@
77
Height="680"
88
MinWidth="900"
99
MinHeight="560"
10-
WindowStartupLocation="CenterScreen">
11-
<Grid Margin="12">
12-
<Grid.RowDefinitions>
13-
<RowDefinition Height="Auto" />
14-
<RowDefinition Height="10" />
15-
<RowDefinition Height="*" />
16-
</Grid.RowDefinitions>
17-
<Grid.ColumnDefinitions>
18-
<ColumnDefinition Width="320" />
19-
<ColumnDefinition Width="12" />
20-
<ColumnDefinition Width="*" />
21-
</Grid.ColumnDefinitions>
10+
WindowStartupLocation="CenterScreen"
11+
WindowStyle="None"
12+
AllowsTransparency="True"
13+
Background="Transparent"
14+
Foreground="{DynamicResource TextPrimaryBrush}">
15+
<Border Background="{DynamicResource WindowBackgroundBrush}"
16+
CornerRadius="12"
17+
BorderBrush="{StaticResource BorderBrush}"
18+
BorderThickness="1">
19+
<Grid>
20+
<Grid.RowDefinitions>
21+
<RowDefinition Height="Auto" />
22+
<RowDefinition Height="*" />
23+
</Grid.RowDefinitions>
2224

23-
<DockPanel Grid.Row="0" Grid.ColumnSpan="3">
24-
<StackPanel DockPanel.Dock="Left">
25-
<TextBlock VerticalAlignment="Center"
26-
FontSize="17"
27-
FontWeight="SemiBold"
28-
Text="PrimeDictate Workspace" />
29-
<TextBlock Margin="0,4,0,0"
30-
Foreground="#555"
31-
Text="{Binding RuntimeStatusText}" />
32-
</StackPanel>
33-
<StackPanel DockPanel.Dock="Right" Orientation="Horizontal">
34-
<Button Width="88"
35-
Margin="0,0,8,0"
36-
Content="Settings"
37-
Click="OnSettingsClick" />
38-
<Button Width="88"
39-
Content="History"
40-
Click="OnHistoryClick" />
41-
</StackPanel>
42-
</DockPanel>
25+
<!-- Custom Title Bar -->
26+
<Grid Background="Transparent" MouseLeftButtonDown="OnTitleBarMouseLeftButtonDown">
27+
<Grid.ColumnDefinitions>
28+
<ColumnDefinition Width="*" />
29+
<ColumnDefinition Width="Auto" />
30+
</Grid.ColumnDefinitions>
31+
32+
<StackPanel Orientation="Horizontal" Margin="16,12,0,12" VerticalAlignment="Center">
33+
<TextBlock FontSize="16"
34+
FontWeight="SemiBold"
35+
Text="PrimeDictate Workspace" />
36+
<TextBlock Margin="12,2,0,0"
37+
Foreground="{StaticResource TextSecondaryBrush}"
38+
VerticalAlignment="Center"
39+
Text="{Binding RuntimeStatusText}" />
40+
</StackPanel>
41+
42+
<StackPanel Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Top" Margin="0,8,8,0">
43+
<Button Width="88" Margin="0,0,8,0" Content="Settings" Click="OnSettingsClick" />
44+
<Button Width="88" Margin="0,0,16,0" Content="History" Click="OnHistoryClick" />
45+
<Button Width="32" Height="32" Content="" Background="Transparent" BorderThickness="0" Click="OnMinimizeClick" ToolTip="Minimize" />
46+
<Button Width="32" Height="32" Content="" Background="Transparent" BorderThickness="0" Click="OnCloseClick" ToolTip="Close" />
47+
</StackPanel>
48+
</Grid>
4349

44-
<Border Grid.Row="2"
45-
Grid.Column="0"
46-
BorderBrush="#DDD"
50+
<Grid Grid.Row="1" Margin="12,0,12,12">
51+
<Grid.ColumnDefinitions>
52+
<ColumnDefinition Width="320" />
53+
<ColumnDefinition Width="12" />
54+
<ColumnDefinition Width="*" />
55+
</Grid.ColumnDefinitions>
56+
57+
<Border Grid.Column="0"
58+
BorderBrush="{StaticResource BorderBrush}"
4759
BorderThickness="1"
4860
CornerRadius="6"
4961
Padding="10">
@@ -62,7 +74,7 @@
6274
<DataTemplate>
6375
<Border Margin="0,0,0,6"
6476
Padding="6"
65-
BorderBrush="#EFEFEF"
77+
BorderBrush="{StaticResource BorderSubtleBrush}"
6678
BorderThickness="1"
6779
CornerRadius="4">
6880
<Grid>
@@ -75,12 +87,12 @@
7587
<TextBlock Grid.Row="1"
7688
Margin="0,2,0,0"
7789
FontSize="12"
78-
Foreground="#666"
90+
Foreground="{StaticResource TextSecondaryBrush}"
7991
Text="{Binding Summary}" />
8092
<TextBlock Grid.Row="2"
8193
Margin="0,4,0,0"
8294
FontSize="12"
83-
Foreground="#333"
95+
Foreground="{StaticResource TextSecondaryBrush}"
8496
Text="{Binding LatestTranscript}"
8597
TextTrimming="CharacterEllipsis"
8698
ToolTip="{Binding LatestTranscript}" />
@@ -92,9 +104,8 @@
92104
</DockPanel>
93105
</Border>
94106

95-
<Border Grid.Row="2"
96-
Grid.Column="2"
97-
BorderBrush="#DDD"
107+
<Border Grid.Column="2"
108+
BorderBrush="{StaticResource BorderBrush}"
98109
BorderThickness="1"
99110
CornerRadius="6"
100111
Padding="10">
@@ -123,7 +134,7 @@
123134
<GridViewColumn.CellTemplate>
124135
<DataTemplate>
125136
<TextBlock FontFamily="Consolas"
126-
Foreground="#666"
137+
Foreground="{StaticResource TextSecondaryBrush}"
127138
Text="{Binding TimestampUtc, StringFormat={}{0:HH:mm:ss}}" />
128139
</DataTemplate>
129140
</GridViewColumn.CellTemplate>
@@ -160,7 +171,7 @@
160171
<GridViewColumn.CellTemplate>
161172
<DataTemplate>
162173
<TextBlock FontFamily="Consolas"
163-
Foreground="#666"
174+
Foreground="{StaticResource TextSecondaryBrush}"
164175
Text="{Binding TimestampUtc, StringFormat={}{0:HH:mm:ss}}" />
165176
</DataTemplate>
166177
</GridViewColumn.CellTemplate>
@@ -181,4 +192,6 @@
181192
</Grid>
182193
</Border>
183194
</Grid>
195+
</Grid>
196+
</Border>
184197
</Window>

MainWindow.xaml.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,22 @@ private void OnHistoryClick(object sender, RoutedEventArgs e)
2525
app.ShowHistory();
2626
}
2727
}
28+
29+
private void OnTitleBarMouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
30+
{
31+
if (e.ButtonState == System.Windows.Input.MouseButtonState.Pressed)
32+
{
33+
this.DragMove();
34+
}
35+
}
36+
37+
private void OnMinimizeClick(object sender, RoutedEventArgs e)
38+
{
39+
this.WindowState = WindowState.Minimized;
40+
}
41+
42+
private void OnCloseClick(object sender, RoutedEventArgs e)
43+
{
44+
this.Close();
45+
}
2846
}

0 commit comments

Comments
 (0)