Colour the message editor, and let Escape close it

The lines are coloured the way N1MM colours them: grey for a comment, blue for
the keys while running, green for the keys while searching. Anything past the
twenty-four lines that are read is red, so a file with one line too many says so
where the operator is looking rather than quietly losing a message. The colours
are the ones the rest of the program already uses for a verdict.

Avalonia's text box paints one colour, so the colours are painted on a stack of
text blocks, one per line, with the box on top holding transparent text. Both
use the same font and the same padding, so they line up, and they share one
scroll viewer, so they scroll as one.

Three things had to be true for that to work, and each of them cost a run to
find. The lines are rewritten in place rather than rebuilt, because a control
that has been shown once cannot be handed back in a fresh list. The box's own
background is forced transparent in every state through its template, not just
through the property. And the coloured lines sit above the box: a focused text
box paints over what is behind it, which is why the colours were there until the
operator clicked into the text.

Escape closes the editor and keeps what was there before, which is what Escape
does everywhere else in the program.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-28 08:28:36 +00:00
co-authored by Claude Opus 5
parent cf0166f1b2
commit 2e81191ea0
3 changed files with 87 additions and 5 deletions
+22 -4
View File
@@ -2,7 +2,15 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="Nonemm.App.Dialogs.MessagesDialog"
Title="Function key messages" Width="620" Height="520"
WindowStartupLocation="CenterOwner">
WindowStartupLocation="CenterOwner" KeyDown="OnKeyDown">
<Window.Styles>
<!-- the box holds transparent text over the coloured lines, so its own
background must stay out of the way in every state, focused included -->
<Style Selector="TextBox#TextArea /template/ Border#PART_BorderElement">
<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderThickness" Value="0" />
</Style>
</Window.Styles>
<DockPanel Margin="14">
<TextBlock DockPanel.Dock="Top" TextWrapping="Wrap" FontSize="11" Opacity="0.75"
Text="One line per key: the button label, a comma, then the message. A line starting with # is a comment. The first twelve lines are F1 to F12 while running; twelve more give the keys while searching, and the ones left out keep their running message. This is N1MM's .mc format, so a file from either program works in the other." />
@@ -17,8 +25,18 @@
<Button Content="Save" Click="OnSave" />
</StackPanel>
</Grid>
<TextBox Name="TextArea" AcceptsReturn="True" AcceptsTab="False" FontFamily="monospace"
FontSize="12" Margin="0,8,0,0" TextWrapping="NoWrap"
VerticalContentAlignment="Top" />
<!-- the colours are painted on a text block underneath, and the box on top
holds transparent text, so both use the same layout and scroll as one -->
<Border BorderThickness="1" BorderBrush="#40808080" CornerRadius="3" Margin="0,8,0,0">
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<Grid>
<StackPanel Name="Highlight" Margin="6,4" IsHitTestVisible="False" ZIndex="1" />
<TextBox Name="TextArea" AcceptsReturn="True" AcceptsTab="False" FontFamily="monospace"
FontSize="12" Padding="6,4" TextWrapping="NoWrap" BorderThickness="0"
Background="Transparent" Foreground="Transparent"
VerticalContentAlignment="Top" />
</Grid>
</ScrollViewer>
</Border>
</DockPanel>
</Window>