1 Commits
Author SHA1 Message Date
alex 1992f2f963 added sending closing event message to settings windows 2026-08-14 02:06:40 +05:00
4 changed files with 356 additions and 344 deletions
+7 -18
View File
@@ -138,22 +138,9 @@ jobs:
- name: Build the installer - name: Build the installer
run: ./Packaging/build-installer.ps1 -Version ${{ steps.version.outputs.plain }} run: ./Packaging/build-installer.ps1 -Version ${{ steps.version.outputs.plain }}
# The artifact is where the package waits to be uploaded to Partner Center. # The artifact is where the package waits to be uploaded to Partner Center
#
# The action comes from this Gitea rather than from github.com, and it is
# a fork of actions/upload-artifact with one line changed. Upstream reads
# GITHUB_SERVER_URL, takes every host but github.com and its enterprise
# ones for a GitHub Enterprise Server — where the v4 artifact backend does
# not exist — and throws before it makes a request. Here that backend does
# exist and answers, but the check runs on the runner ahead of the network
# and never lets it prove itself; nor can the name be corrected from this
# file, as the runner sets the GITHUB_ ones over the env of a step. The
# fork carries the reasoning in full in its GITEA-PATCH.md.
#
# The tag is a fixed one. A floating tag is how this broke before: the
# action is fetched at run time, and what arrives can change on its own
- name: Keep the package - name: Keep the package
uses: https://git.alrakis.kz/actions/upload-artifact@v4-gitea uses: actions/upload-artifact@v4
with: with:
name: msix-${{ steps.version.outputs.version }} name: msix-${{ steps.version.outputs.version }}
path: artifacts/packages/ path: artifacts/packages/
@@ -162,7 +149,7 @@ jobs:
# The .wixpdb next to each installer is left out on purpose: it is of use # The .wixpdb next to each installer is left out on purpose: it is of use
# only when something has to be traced back to the WiX source # only when something has to be traced back to the WiX source
- name: Keep the installer - name: Keep the installer
uses: https://git.alrakis.kz/actions/upload-artifact@v4-gitea uses: actions/upload-artifact@v4
with: with:
name: installer-${{ steps.version.outputs.plain }} name: installer-${{ steps.version.outputs.plain }}
path: artifacts/installers/*.msi path: artifacts/installers/*.msi
@@ -180,8 +167,10 @@ jobs:
# The GITHUB_ names are what Gitea itself hands to the workflow — its # The GITHUB_ names are what Gitea itself hands to the workflow — its
# actions repeat those of GitHub, and the addresses in them point at # actions repeat those of GitHub, and the addresses in them point at
# this Gitea instance # this Gitea instance. GITHUB_API_URL used not to reach the steps at
$api = "$env:GITHUB_API_URL/repos/$env:GITHUB_REPOSITORY/releases" # all, so the address is put together from the server one when empty
$root = if ($env:GITHUB_API_URL) { $env:GITHUB_API_URL } else { "$env:GITHUB_SERVER_URL/api/v1" }
$api = "$root/repos/$env:GITHUB_REPOSITORY/releases"
$headers = @{ Authorization = "token $env:GITEA_TOKEN" } $headers = @{ Authorization = "token $env:GITEA_TOKEN" }
# Gitea makes a release of its own for a pushed tag, so the release is # Gitea makes a release of its own for a pushed tag, so the release is
@@ -1,5 +1,6 @@
using CursorLang.Core.Models; using CursorLang.Core.Models;
using CursorLang.Core.Services; using CursorLang.Core.Services;
using CursorLang.Settings.Tests.Infrastructure;
using CursorLang.Settings.ViewModels; using CursorLang.Settings.ViewModels;
using CursorLang.Tests.Shared; using CursorLang.Tests.Shared;
+346 -324
View File
@@ -8,7 +8,7 @@
mc:Ignorable="d" mc:Ignorable="d"
d:DataContext="{d:DesignInstance Type=vm:SettingsViewModel}" d:DataContext="{d:DesignInstance Type=vm:SettingsViewModel}"
Title="{Binding Title}" Title="{Binding Title}"
Width="560" SizeToContent="Height" MaxHeight="940" Width="1000" SizeToContent="Height" MaxHeight="900"
ResizeMode="CanMinimize" ResizeMode="CanMinimize"
Background="{DynamicResource Theme.WindowBackground}" Background="{DynamicResource Theme.WindowBackground}"
Foreground="{DynamicResource Theme.Foreground}"> Foreground="{DynamicResource Theme.Foreground}">
@@ -59,348 +59,370 @@
</Style> </Style>
</Window.Resources> </Window.Resources>
<!-- The settings are laid out in two columns: this way the window fits on the
screen entirely and does without scrolling. Scrolling is kept for the case of
a large system font, with which the content is taller than the monitor after all.
The left column holds what the popup does; the right one holds the single
section describing how and where the popup looks -->
<ScrollViewer VerticalScrollBarVisibility="Auto" Padding="16"> <ScrollViewer VerticalScrollBarVisibility="Auto" Padding="16">
<StackPanel> <Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<GroupBox Header="{Binding Localization[SectionInterface]}"> <StackPanel>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="164" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock Style="{StaticResource FieldLabel}" <GroupBox Header="{Binding Localization[SectionInterface]}">
Text="{Binding Localization[LanguageLabel]}" /> <Grid>
<ComboBox Grid.Column="1" <Grid.ColumnDefinitions>
ItemsSource="{Binding Localization.AvailableLanguages}" <ColumnDefinition Width="164" />
DisplayMemberPath="DisplayName" <ColumnDefinition Width="*" />
SelectedValuePath="Code" </Grid.ColumnDefinitions>
SelectedValue="{Binding Settings.Language}" /> <Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock Grid.Row="1" Margin="0,12,12,0" <TextBlock Style="{StaticResource FieldLabel}"
Style="{StaticResource FieldLabel}" Text="{Binding Localization[LanguageLabel]}" />
Text="{Binding Localization[ThemeLabel]}" /> <ComboBox Grid.Column="1"
<ComboBox Grid.Row="1" Grid.Column="1" Margin="0,12,0,0" ItemsSource="{Binding Localization.AvailableLanguages}"
ItemsSource="{Binding Themes}" DisplayMemberPath="DisplayName"
ItemTemplate="{StaticResource EnumOptionTemplate}" SelectedValuePath="Code"
SelectedValuePath="Value" SelectedValue="{Binding Settings.Language}" />
SelectedValue="{Binding Settings.Theme}" />
</Grid>
</GroupBox>
<GroupBox Header="{Binding Localization[SectionPopup]}"> <TextBlock Grid.Row="1" Margin="0,12,12,0"
<Grid> Style="{StaticResource FieldLabel}"
<Grid.ColumnDefinitions> Text="{Binding Localization[ThemeLabel]}" />
<ColumnDefinition Width="164" /> <ComboBox Grid.Row="1" Grid.Column="1" Margin="0,12,0,0"
<ColumnDefinition Width="*" /> ItemsSource="{Binding Themes}"
<ColumnDefinition Width="Auto" /> ItemTemplate="{StaticResource EnumOptionTemplate}"
</Grid.ColumnDefinitions> SelectedValuePath="Value"
<Grid.RowDefinitions> SelectedValue="{Binding Settings.Theme}" />
<RowDefinition Height="Auto" /> </Grid>
<RowDefinition Height="Auto" /> </GroupBox>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock Style="{StaticResource FieldLabel}"> <GroupBox Header="{Binding Localization[SectionBehavior]}">
<Run Text="{Binding Localization[PlacementModeLabel], Mode=OneWay}" /> <Grid>
<InlineUIContainer BaselineAlignment="Baseline"> <Grid.ColumnDefinitions>
<TextBlock Text="{Binding Localization[MoreInfoLink]}" <ColumnDefinition Width="164" />
Foreground="{DynamicResource Theme.Accent}" <ColumnDefinition Width="*" />
TextDecorations="Underline" <ColumnDefinition Width="Auto" />
Cursor="Help" </Grid.ColumnDefinitions>
ToolTipService.InitialShowDelay="200" <Grid.RowDefinitions>
ToolTipService.ShowDuration="60000"> <RowDefinition Height="Auto" />
<TextBlock.ToolTip> <RowDefinition Height="Auto" />
<ToolTip> <RowDefinition Height="Auto" />
<TextBlock TextWrapping="Wrap" MaxWidth="320" <RowDefinition Height="Auto" />
Text="{Binding Localization[PopupLookPerModeHint]}" /> <RowDefinition Height="Auto" />
</ToolTip> <RowDefinition Height="Auto" />
</TextBlock.ToolTip> </Grid.RowDefinitions>
</TextBlock>
</InlineUIContainer>
</TextBlock>
<ComboBox Grid.Column="1" Grid.ColumnSpan="2"
ItemsSource="{Binding PlacementModes}"
ItemTemplate="{StaticResource EnumOptionTemplate}"
SelectedValuePath="Value"
SelectedValue="{Binding Settings.PlacementMode}" />
<!-- The "at cursor" mode: a side and an offset of its own --> <TextBlock Style="{StaticResource FieldLabel}"
<TextBlock Grid.Row="1" Margin="0,12,12,0" Text="{Binding Localization[DurationLabel]}" />
Style="{StaticResource FieldLabel}" <Slider Grid.Column="1" Minimum="200" Maximum="5000" TickFrequency="100"
Text="{Binding Localization[CursorCornerLabel]}" Value="{Binding Settings.DurationMilliseconds}" />
Visibility="{Binding Settings.PlacementMode, <StackPanel Grid.Column="2" Orientation="Horizontal" VerticalAlignment="Center">
Converter={StaticResource EnumToVisibility}, <TextBlock Style="{StaticResource FieldValue}"
ConverterParameter=AtCursor}" /> Text="{Binding Settings.DurationMilliseconds, StringFormat={}{0:F0}}" />
<ComboBox Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" Margin="0,12,0,0" <TextBlock Margin="4,0,0,0"
ItemsSource="{Binding AnchorSides}" Foreground="{DynamicResource Theme.SecondaryForeground}"
ItemTemplate="{StaticResource EnumOptionTemplate}" Text="{Binding Localization[MillisecondsSuffix]}" />
SelectedValuePath="Value" </StackPanel>
SelectedValue="{Binding Settings.AtCursor.Side}"
Visibility="{Binding Settings.PlacementMode,
Converter={StaticResource EnumToVisibility},
ConverterParameter=AtCursor}" />
<TextBlock Grid.Row="2" Margin="0,12,12,0" <TextBlock Grid.Row="1" Margin="0,12,12,0"
Style="{StaticResource FieldLabel}" Style="{StaticResource FieldLabel}"
Text="{Binding Localization[CursorOffsetLabel]}" Text="{Binding Localization[CapsLockLabel]}" />
Visibility="{Binding Settings.PlacementMode, <CheckBox Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" Margin="0,12,0,0"
Converter={StaticResource EnumToVisibility}, IsChecked="{Binding Settings.UseCapsLockHotkey}"
ConverterParameter=AtCursor}" /> Content="{Binding Localization[CapsLockHotkeyCheck]}" />
<Slider Grid.Row="2" Grid.Column="1" Margin="0,12,0,0"
Minimum="0" Maximum="80" TickFrequency="1"
Value="{Binding Settings.AtCursor.Offset}"
Visibility="{Binding Settings.PlacementMode,
Converter={StaticResource EnumToVisibility},
ConverterParameter=AtCursor}" />
<TextBlock Grid.Row="2" Grid.Column="2" Margin="12,12,0,0"
Style="{StaticResource FieldValue}"
Text="{Binding Settings.AtCursor.Offset, StringFormat={}{0:F0}}"
Visibility="{Binding Settings.PlacementMode,
Converter={StaticResource EnumToVisibility},
ConverterParameter=AtCursor}" />
<!-- The "at caret" mode: a side and an offset of its own --> <TextBlock Grid.Row="2" Margin="0,12,12,0"
<TextBlock Grid.Row="3" Margin="0,12,12,0" Style="{StaticResource FieldLabel}"
Style="{StaticResource FieldLabel}" Text="{Binding Localization[CapsLockHoldLabel]}" />
Text="{Binding Localization[CursorCornerLabel]}" <Slider Grid.Row="2" Grid.Column="1" Margin="0,12,0,0"
Visibility="{Binding Settings.PlacementMode, Minimum="150" Maximum="1500" TickFrequency="50"
Converter={StaticResource EnumToVisibility}, Value="{Binding Settings.CapsLockHoldMilliseconds}"
ConverterParameter=AtCaret}" /> IsEnabled="{Binding Settings.UseCapsLockHotkey}" />
<ComboBox Grid.Row="3" Grid.Column="1" Grid.ColumnSpan="2" Margin="0,12,0,0" <StackPanel Grid.Row="2" Grid.Column="2" Margin="0,12,0,0"
ItemsSource="{Binding CaretSides}" Orientation="Horizontal" VerticalAlignment="Center">
ItemTemplate="{StaticResource EnumOptionTemplate}" <TextBlock Style="{StaticResource FieldValue}"
SelectedValuePath="Value" Text="{Binding Settings.CapsLockHoldMilliseconds, StringFormat={}{0:F0}}" />
SelectedValue="{Binding Settings.AtCaret.Side}" <TextBlock Margin="4,0,0,0"
Visibility="{Binding Settings.PlacementMode, Foreground="{DynamicResource Theme.SecondaryForeground}"
Converter={StaticResource EnumToVisibility}, Text="{Binding Localization[MillisecondsSuffix]}" />
ConverterParameter=AtCaret}" /> </StackPanel>
<TextBlock Grid.Row="4" Margin="0,12,12,0" <TextBlock Grid.Row="3" Grid.Column="1" Grid.ColumnSpan="2"
Style="{StaticResource FieldLabel}" Margin="0,6,0,0" TextWrapping="Wrap"
Text="{Binding Localization[CursorOffsetLabel]}" Foreground="{DynamicResource Theme.SecondaryForeground}">
Visibility="{Binding Settings.PlacementMode, <Run Text="{Binding Localization[CapsLockHoldHint], Mode=OneWay}" />
Converter={StaticResource EnumToVisibility}, <InlineUIContainer BaselineAlignment="Baseline">
ConverterParameter=AtCaret}" /> <!-- The elevation caveat lives in the tooltip to keep the section compact -->
<Slider Grid.Row="4" Grid.Column="1" Margin="0,12,0,0" <TextBlock Text="{Binding Localization[MoreInfoLink]}"
Minimum="0" Maximum="80" TickFrequency="1" Foreground="{DynamicResource Theme.Accent}"
Value="{Binding Settings.AtCaret.Offset}" TextDecorations="Underline"
Visibility="{Binding Settings.PlacementMode, Cursor="Help"
Converter={StaticResource EnumToVisibility}, ToolTipService.InitialShowDelay="200"
ConverterParameter=AtCaret}" /> ToolTipService.ShowDuration="60000"
<TextBlock Grid.Row="4" Grid.Column="2" Margin="12,12,0,0" Visibility="{Binding Settings.UseCapsLockHotkey, Converter={StaticResource BooleanToVisibility}}">
Style="{StaticResource FieldValue}" <TextBlock.ToolTip>
Text="{Binding Settings.AtCaret.Offset, StringFormat={}{0:F0}}" <ToolTip>
Visibility="{Binding Settings.PlacementMode, <TextBlock TextWrapping="Wrap"
Converter={StaticResource EnumToVisibility}, Text="{Binding Localization[CapsLockElevationHint]}" />
ConverterParameter=AtCaret}" /> </ToolTip>
</TextBlock.ToolTip>
</TextBlock>
</InlineUIContainer>
</TextBlock>
<!-- The "fixed point" mode --> <TextBlock Grid.Row="4" Margin="0,12,12,0"
<TextBlock Grid.Row="5" Margin="0,12,12,0" Style="{StaticResource FieldLabel}"
Style="{StaticResource FieldLabel}" Visibility="{Binding IsStartupAvailable, Converter={StaticResource BooleanToVisibility}}"
Text="{Binding Localization[ScreenPositionLabel]}" Text="{Binding Localization[StartupLabel]}" />
Visibility="{Binding Settings.PlacementMode, <CheckBox Grid.Row="4" Grid.Column="1" Grid.ColumnSpan="2" Margin="0,12,0,0"
Converter={StaticResource EnumToVisibility}, Visibility="{Binding IsStartupAvailable, Converter={StaticResource BooleanToVisibility}}"
ConverterParameter=FixedPoint}" /> IsEnabled="{Binding CanChangeStartup}"
<ComboBox Grid.Row="5" Grid.Column="1" Grid.ColumnSpan="2" Margin="0,12,0,0" IsChecked="{Binding RunAtStartup}"
ItemsSource="{Binding ScreenPositions}" Content="{Binding Localization[StartupCheck]}" />
ItemTemplate="{StaticResource EnumOptionTemplate}"
SelectedValuePath="Value"
SelectedValue="{Binding Settings.FixedPoint.Position}"
Visibility="{Binding Settings.PlacementMode,
Converter={StaticResource EnumToVisibility},
ConverterParameter=FixedPoint}" />
<TextBlock Grid.Row="6" Margin="0,12,12,0" <TextBlock Grid.Row="5" Grid.Column="1" Grid.ColumnSpan="2"
Style="{StaticResource FieldLabel}" Margin="0,6,0,0" TextWrapping="Wrap"
Text="{Binding Localization[ScreenMarginLabel]}" Foreground="{DynamicResource Theme.SecondaryForeground}"
IsEnabled="{Binding Settings.FixedPoint.IsAtAnEdge}" Visibility="{Binding IsStartupLocked, Converter={StaticResource BooleanToVisibility}}"
Visibility="{Binding Settings.PlacementMode, Text="{Binding Localization[StartupLockedHint]}" />
Converter={StaticResource EnumToVisibility}, </Grid>
ConverterParameter=FixedPoint}" /> </GroupBox>
<Slider Grid.Row="6" Grid.Column="1" Margin="0,12,0,0"
Minimum="0" Maximum="200" TickFrequency="1"
Value="{Binding Settings.FixedPoint.Offset}"
IsEnabled="{Binding Settings.FixedPoint.IsAtAnEdge}"
Visibility="{Binding Settings.PlacementMode,
Converter={StaticResource EnumToVisibility},
ConverterParameter=FixedPoint}" />
<TextBlock Grid.Row="6" Grid.Column="2" Margin="12,12,0,0"
Style="{StaticResource FieldValue}"
Text="{Binding Settings.FixedPoint.Offset, StringFormat={}{0:F0}}"
IsEnabled="{Binding Settings.FixedPoint.IsAtAnEdge}"
Visibility="{Binding Settings.PlacementMode,
Converter={StaticResource EnumToVisibility},
ConverterParameter=FixedPoint}" />
<Border Grid.Row="7" Grid.ColumnSpan="3" </StackPanel>
Margin="0,16,0,0" Height="1"
Background="{DynamicResource Theme.ControlBorder}" />
<TextBlock Grid.Row="8" Margin="0,12,12,0" <StackPanel Grid.Column="1" Margin="16,0,0,0">
Style="{StaticResource FieldLabel}"
Text="{Binding Localization[FontSizeLabel]}" />
<Slider Grid.Row="8" Grid.Column="1" Margin="0,12,0,0"
Minimum="10" Maximum="72" TickFrequency="1"
Value="{Binding Settings.Current.FontSize}" />
<TextBlock Grid.Row="8" Grid.Column="2" Margin="12,12,0,0"
Style="{StaticResource FieldValue}"
Text="{Binding Settings.Current.FontSize, StringFormat={}{0:F0}}" />
<TextBlock Grid.Row="9" Margin="0,12,12,0" <!-- Where the popup appears and how it looks are one question for the
Style="{StaticResource FieldLabel}" user, so both live in a single section: the rule is picked at the
Text="{Binding Localization[OpacityLabel]}" /> top and its result is seen in the preview at the bottom -->
<Slider Grid.Row="9" Grid.Column="1" Margin="0,12,0,0" <GroupBox Header="{Binding Localization[SectionPopup]}">
Minimum="0.1" Maximum="1" TickFrequency="0.05" <Grid>
Value="{Binding Settings.Current.Opacity}" /> <Grid.ColumnDefinitions>
<TextBlock Grid.Row="9" Grid.Column="2" Margin="12,12,0,0" <ColumnDefinition Width="164" />
Style="{StaticResource FieldValue}" <ColumnDefinition Width="*" />
Text="{Binding Settings.Current.Opacity, StringFormat={}{0:P0}}" /> <ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock Grid.Row="10" Margin="0,12,12,0" <TextBlock Style="{StaticResource FieldLabel}">
Style="{StaticResource FieldLabel}" <Run Text="{Binding Localization[PlacementModeLabel], Mode=OneWay}" />
Text="{Binding Localization[BackgroundColorLabel]}" /> <InlineUIContainer BaselineAlignment="Baseline">
<ComboBox Grid.Row="10" Grid.Column="1" Grid.ColumnSpan="2" Margin="0,12,0,0" <TextBlock Text="{Binding Localization[MoreInfoLink]}"
ItemsSource="{Binding BackgroundPalette}" Foreground="{DynamicResource Theme.Accent}"
ItemTemplate="{StaticResource ColorSwatchTemplate}" TextDecorations="Underline"
SelectedItem="{Binding Settings.Current.BackgroundColor}" /> Cursor="Help"
ToolTipService.InitialShowDelay="200"
ToolTipService.ShowDuration="60000">
<TextBlock.ToolTip>
<ToolTip>
<TextBlock TextWrapping="Wrap" MaxWidth="320"
Text="{Binding Localization[PopupLookPerModeHint]}" />
</ToolTip>
</TextBlock.ToolTip>
</TextBlock>
</InlineUIContainer>
</TextBlock>
<ComboBox Grid.Column="1" Grid.ColumnSpan="2"
ItemsSource="{Binding PlacementModes}"
ItemTemplate="{StaticResource EnumOptionTemplate}"
SelectedValuePath="Value"
SelectedValue="{Binding Settings.PlacementMode}" />
<TextBlock Grid.Row="11" Margin="0,12,12,0" <!-- The "at cursor" mode: a side and an offset of its own -->
Style="{StaticResource FieldLabel}" <TextBlock Grid.Row="1" Margin="0,12,12,0"
Text="{Binding Localization[TextColorLabel]}" /> Style="{StaticResource FieldLabel}"
<ComboBox Grid.Row="11" Grid.Column="1" Grid.ColumnSpan="2" Margin="0,12,0,0" Text="{Binding Localization[CursorCornerLabel]}"
ItemsSource="{Binding TextPalette}" Visibility="{Binding Settings.PlacementMode,
ItemTemplate="{StaticResource ColorSwatchTemplate}" Converter={StaticResource EnumToVisibility},
SelectedItem="{Binding Settings.Current.ForegroundColor}" /> ConverterParameter=AtCursor}" />
<ComboBox Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" Margin="0,12,0,0"
ItemsSource="{Binding AnchorSides}"
ItemTemplate="{StaticResource EnumOptionTemplate}"
SelectedValuePath="Value"
SelectedValue="{Binding Settings.AtCursor.Side}"
Visibility="{Binding Settings.PlacementMode,
Converter={StaticResource EnumToVisibility},
ConverterParameter=AtCursor}" />
<TextBlock Grid.Row="12" Margin="0,12,12,0" <TextBlock Grid.Row="2" Margin="0,12,12,0"
Style="{StaticResource FieldLabel}" Style="{StaticResource FieldLabel}"
Text="{Binding Localization[PreviewLabel]}" /> Text="{Binding Localization[CursorOffsetLabel]}"
<Border Grid.Row="12" Grid.Column="1" Grid.ColumnSpan="2" Visibility="{Binding Settings.PlacementMode,
Margin="0,12,0,0" Padding="16" Converter={StaticResource EnumToVisibility},
Height="152" ClipToBounds="True" ConverterParameter=AtCursor}" />
Background="{DynamicResource Theme.SurfaceStrong}" CornerRadius="4" <Slider Grid.Row="2" Grid.Column="1" Margin="0,12,0,0"
HorizontalAlignment="Stretch"> Minimum="0" Maximum="80" TickFrequency="1"
<Border CornerRadius="4" Padding="10,4" Value="{Binding Settings.AtCursor.Offset}"
HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="{Binding Settings.PlacementMode,
Opacity="{Binding Settings.Current.Opacity}" Converter={StaticResource EnumToVisibility},
Background="{Binding Settings.Current.BackgroundColor, ConverterParameter=AtCursor}" />
Converter={StaticResource ColorToBrush}}"> <TextBlock Grid.Row="2" Grid.Column="2" Margin="12,12,0,0"
<TextBlock Text="RU" FontWeight="SemiBold" Style="{StaticResource FieldValue}"
FontSize="{Binding Settings.Current.FontSize}" Text="{Binding Settings.AtCursor.Offset, StringFormat={}{0:F0}}"
Foreground="{Binding Settings.Current.ForegroundColor, Visibility="{Binding Settings.PlacementMode,
Converter={StaticResource ColorToBrush}}" /> Converter={StaticResource EnumToVisibility},
ConverterParameter=AtCursor}" />
<!-- The "at caret" mode: a side and an offset of its own -->
<TextBlock Grid.Row="3" Margin="0,12,12,0"
Style="{StaticResource FieldLabel}"
Text="{Binding Localization[CursorCornerLabel]}"
Visibility="{Binding Settings.PlacementMode,
Converter={StaticResource EnumToVisibility},
ConverterParameter=AtCaret}" />
<ComboBox Grid.Row="3" Grid.Column="1" Grid.ColumnSpan="2" Margin="0,12,0,0"
ItemsSource="{Binding CaretSides}"
ItemTemplate="{StaticResource EnumOptionTemplate}"
SelectedValuePath="Value"
SelectedValue="{Binding Settings.AtCaret.Side}"
Visibility="{Binding Settings.PlacementMode,
Converter={StaticResource EnumToVisibility},
ConverterParameter=AtCaret}" />
<TextBlock Grid.Row="4" Margin="0,12,12,0"
Style="{StaticResource FieldLabel}"
Text="{Binding Localization[CursorOffsetLabel]}"
Visibility="{Binding Settings.PlacementMode,
Converter={StaticResource EnumToVisibility},
ConverterParameter=AtCaret}" />
<Slider Grid.Row="4" Grid.Column="1" Margin="0,12,0,0"
Minimum="0" Maximum="80" TickFrequency="1"
Value="{Binding Settings.AtCaret.Offset}"
Visibility="{Binding Settings.PlacementMode,
Converter={StaticResource EnumToVisibility},
ConverterParameter=AtCaret}" />
<TextBlock Grid.Row="4" Grid.Column="2" Margin="12,12,0,0"
Style="{StaticResource FieldValue}"
Text="{Binding Settings.AtCaret.Offset, StringFormat={}{0:F0}}"
Visibility="{Binding Settings.PlacementMode,
Converter={StaticResource EnumToVisibility},
ConverterParameter=AtCaret}" />
<!-- The "fixed point" mode -->
<TextBlock Grid.Row="5" Margin="0,12,12,0"
Style="{StaticResource FieldLabel}"
Text="{Binding Localization[ScreenPositionLabel]}"
Visibility="{Binding Settings.PlacementMode,
Converter={StaticResource EnumToVisibility},
ConverterParameter=FixedPoint}" />
<ComboBox Grid.Row="5" Grid.Column="1" Grid.ColumnSpan="2" Margin="0,12,0,0"
ItemsSource="{Binding ScreenPositions}"
ItemTemplate="{StaticResource EnumOptionTemplate}"
SelectedValuePath="Value"
SelectedValue="{Binding Settings.FixedPoint.Position}"
Visibility="{Binding Settings.PlacementMode,
Converter={StaticResource EnumToVisibility},
ConverterParameter=FixedPoint}" />
<TextBlock Grid.Row="6" Margin="0,12,12,0"
Style="{StaticResource FieldLabel}"
Text="{Binding Localization[ScreenMarginLabel]}"
IsEnabled="{Binding Settings.FixedPoint.IsAtAnEdge}"
Visibility="{Binding Settings.PlacementMode,
Converter={StaticResource EnumToVisibility},
ConverterParameter=FixedPoint}" />
<Slider Grid.Row="6" Grid.Column="1" Margin="0,12,0,0"
Minimum="0" Maximum="200" TickFrequency="1"
Value="{Binding Settings.FixedPoint.Offset}"
IsEnabled="{Binding Settings.FixedPoint.IsAtAnEdge}"
Visibility="{Binding Settings.PlacementMode,
Converter={StaticResource EnumToVisibility},
ConverterParameter=FixedPoint}" />
<TextBlock Grid.Row="6" Grid.Column="2" Margin="12,12,0,0"
Style="{StaticResource FieldValue}"
Text="{Binding Settings.FixedPoint.Offset, StringFormat={}{0:F0}}"
IsEnabled="{Binding Settings.FixedPoint.IsAtAnEdge}"
Visibility="{Binding Settings.PlacementMode,
Converter={StaticResource EnumToVisibility},
ConverterParameter=FixedPoint}" />
<!-- A hairline between the two halves of the section: the
placement above, the look of the popup below -->
<Border Grid.Row="7" Grid.ColumnSpan="3"
Margin="0,16,0,0" Height="1"
Background="{DynamicResource Theme.ControlBorder}" />
<TextBlock Grid.Row="8" Margin="0,12,12,0"
Style="{StaticResource FieldLabel}"
Text="{Binding Localization[FontSizeLabel]}" />
<Slider Grid.Row="8" Grid.Column="1" Margin="0,12,0,0"
Minimum="10" Maximum="72" TickFrequency="1"
Value="{Binding Settings.Current.FontSize}" />
<TextBlock Grid.Row="8" Grid.Column="2" Margin="12,12,0,0"
Style="{StaticResource FieldValue}"
Text="{Binding Settings.Current.FontSize, StringFormat={}{0:F0}}" />
<TextBlock Grid.Row="9" Margin="0,12,12,0"
Style="{StaticResource FieldLabel}"
Text="{Binding Localization[OpacityLabel]}" />
<Slider Grid.Row="9" Grid.Column="1" Margin="0,12,0,0"
Minimum="0.1" Maximum="1" TickFrequency="0.05"
Value="{Binding Settings.Current.Opacity}" />
<TextBlock Grid.Row="9" Grid.Column="2" Margin="12,12,0,0"
Style="{StaticResource FieldValue}"
Text="{Binding Settings.Current.Opacity, StringFormat={}{0:P0}}" />
<TextBlock Grid.Row="10" Margin="0,12,12,0"
Style="{StaticResource FieldLabel}"
Text="{Binding Localization[BackgroundColorLabel]}" />
<ComboBox Grid.Row="10" Grid.Column="1" Grid.ColumnSpan="2" Margin="0,12,0,0"
ItemsSource="{Binding BackgroundPalette}"
ItemTemplate="{StaticResource ColorSwatchTemplate}"
SelectedItem="{Binding Settings.Current.BackgroundColor}" />
<TextBlock Grid.Row="11" Margin="0,12,12,0"
Style="{StaticResource FieldLabel}"
Text="{Binding Localization[TextColorLabel]}" />
<ComboBox Grid.Row="11" Grid.Column="1" Grid.ColumnSpan="2" Margin="0,12,0,0"
ItemsSource="{Binding TextPalette}"
ItemTemplate="{StaticResource ColorSwatchTemplate}"
SelectedItem="{Binding Settings.Current.ForegroundColor}" />
<TextBlock Grid.Row="12" Margin="0,12,12,0"
Style="{StaticResource FieldLabel}"
Text="{Binding Localization[PreviewLabel]}" />
<Border Grid.Row="12" Grid.Column="1" Grid.ColumnSpan="2"
Margin="0,12,0,0" Padding="16"
Height="152" ClipToBounds="True"
Background="{DynamicResource Theme.SurfaceStrong}" CornerRadius="4"
HorizontalAlignment="Stretch">
<Border CornerRadius="4" Padding="10,4"
HorizontalAlignment="Center" VerticalAlignment="Center"
Opacity="{Binding Settings.Current.Opacity}"
Background="{Binding Settings.Current.BackgroundColor,
Converter={StaticResource ColorToBrush}}">
<TextBlock Text="RU" FontWeight="SemiBold"
FontSize="{Binding Settings.Current.FontSize}"
Foreground="{Binding Settings.Current.ForegroundColor,
Converter={StaticResource ColorToBrush}}" />
</Border>
</Border> </Border>
</Border> </Grid>
</Grid> </GroupBox>
</GroupBox>
<GroupBox Header="{Binding Localization[SectionBehavior]}"> </StackPanel>
<Grid> </Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="164" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock Style="{StaticResource FieldLabel}"
Text="{Binding Localization[DurationLabel]}" />
<Slider Grid.Column="1" Minimum="200" Maximum="5000" TickFrequency="100"
Value="{Binding Settings.DurationMilliseconds}" />
<StackPanel Grid.Column="2" Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Style="{StaticResource FieldValue}"
Text="{Binding Settings.DurationMilliseconds, StringFormat={}{0:F0}}" />
<TextBlock Margin="4,0,0,0"
Foreground="{DynamicResource Theme.SecondaryForeground}"
Text="{Binding Localization[MillisecondsSuffix]}" />
</StackPanel>
<TextBlock Grid.Row="1" Margin="0,12,12,0"
Style="{StaticResource FieldLabel}"
Text="{Binding Localization[CapsLockLabel]}" />
<CheckBox Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" Margin="0,12,0,0"
IsChecked="{Binding Settings.UseCapsLockHotkey}"
Content="{Binding Localization[CapsLockHotkeyCheck]}" />
<TextBlock Grid.Row="2" Margin="0,12,12,0"
Style="{StaticResource FieldLabel}"
Text="{Binding Localization[CapsLockHoldLabel]}" />
<Slider Grid.Row="2" Grid.Column="1" Margin="0,12,0,0"
Minimum="150" Maximum="1500" TickFrequency="50"
Value="{Binding Settings.CapsLockHoldMilliseconds}"
IsEnabled="{Binding Settings.UseCapsLockHotkey}" />
<StackPanel Grid.Row="2" Grid.Column="2" Margin="0,12,0,0"
Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Style="{StaticResource FieldValue}"
Text="{Binding Settings.CapsLockHoldMilliseconds, StringFormat={}{0:F0}}" />
<TextBlock Margin="4,0,0,0"
Foreground="{DynamicResource Theme.SecondaryForeground}"
Text="{Binding Localization[MillisecondsSuffix]}" />
</StackPanel>
<TextBlock Grid.Row="3" Grid.Column="1" Grid.ColumnSpan="2"
Margin="0,6,0,0" TextWrapping="Wrap"
Foreground="{DynamicResource Theme.SecondaryForeground}">
<Run Text="{Binding Localization[CapsLockHoldHint], Mode=OneWay}" />
<InlineUIContainer BaselineAlignment="Baseline">
<!-- The elevation caveat lives in the tooltip to keep the section compact -->
<TextBlock Text="{Binding Localization[MoreInfoLink]}"
Foreground="{DynamicResource Theme.Accent}"
TextDecorations="Underline"
Cursor="Help"
ToolTipService.InitialShowDelay="200"
ToolTipService.ShowDuration="60000"
Visibility="{Binding Settings.UseCapsLockHotkey, Converter={StaticResource BooleanToVisibility}}">
<TextBlock.ToolTip>
<ToolTip>
<TextBlock TextWrapping="Wrap"
Text="{Binding Localization[CapsLockElevationHint]}" />
</ToolTip>
</TextBlock.ToolTip>
</TextBlock>
</InlineUIContainer>
</TextBlock>
<TextBlock Grid.Row="4" Margin="0,12,12,0"
Style="{StaticResource FieldLabel}"
Visibility="{Binding IsStartupAvailable, Converter={StaticResource BooleanToVisibility}}"
Text="{Binding Localization[StartupLabel]}" />
<CheckBox Grid.Row="4" Grid.Column="1" Grid.ColumnSpan="2" Margin="0,12,0,0"
Visibility="{Binding IsStartupAvailable, Converter={StaticResource BooleanToVisibility}}"
IsEnabled="{Binding CanChangeStartup}"
IsChecked="{Binding RunAtStartup}"
Content="{Binding Localization[StartupCheck]}" />
<TextBlock Grid.Row="5" Grid.Column="1" Grid.ColumnSpan="2"
Margin="0,6,0,0" TextWrapping="Wrap"
Foreground="{DynamicResource Theme.SecondaryForeground}"
Visibility="{Binding IsStartupLocked, Converter={StaticResource BooleanToVisibility}}"
Text="{Binding Localization[StartupLockedHint]}" />
</Grid>
</GroupBox>
</StackPanel>
</ScrollViewer> </ScrollViewer>
</Window> </Window>
+2 -2
View File
@@ -136,8 +136,8 @@
Condition="REMOVE=&quot;ALL&quot; AND NOT UPGRADINGPRODUCTCODE" /> Condition="REMOVE=&quot;ALL&quot; AND NOT UPGRADINGPRODUCTCODE" />
</InstallExecuteSequence> </InstallExecuteSequence>
<SetProperty Id="WixShellExecTarget" Value="[INSTALLFOLDER]CursorLang.exe" <!-- Offered at the end of the wizard, the way an installer usually does -->
After="CostFinalize" Sequence="ui" /> <Property Id="WixShellExecTarget" Value="[#CursorLang.exe]" />
<CustomAction Id="LaunchApplication" BinaryRef="Wix4UtilCA_$(sys.BUILDARCHSHORT)" <CustomAction Id="LaunchApplication" BinaryRef="Wix4UtilCA_$(sys.BUILDARCHSHORT)"
DllEntry="WixShellExec" Impersonate="yes" Return="ignore" /> DllEntry="WixShellExec" Impersonate="yes" Return="ignore" />