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
11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,17 @@ is not part of this repository.
signature again. It keeps what it already knows about files whose path has not changed and
verifies only new or changed ones. F5 still verifies everything again, so a file replaced by
someone else in the meantime shows its new verdict after the next F5.
- The text on the plan sheet is sharper - it is drawn with ClearType like the rest of the window.
The sheet's shadow looks the same, but it no longer makes the whole sheet redraw with every blink
of the cursor. Where the window is drawn without the graphics card, as it is over Remote Desktop,
that cost a third to half of a processor core for as long as the box a name is typed into was
waiting.
- A plan with more than twenty commands shows them in one field that can be selected and copied,
instead of a box and a Copy button for every line. *Copy all* still takes all of them. The same
goes for the way back after a run. A plan over a whole scope opens noticeably faster.
- When a plan touches several entries this machine does not work without, the sheet names them all
in one sentence instead of one sentence each. On a plan over a whole scope those sentences used
to push every step off the sheet.

## [0.3.0] - 2026-09-25

Expand Down
80 changes: 44 additions & 36 deletions src/Bws.Gui/PlanView.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,18 @@
THE WIDTH IS A NAME SINCE 2026-09-15 and was a raw 560 here for a fortnight - the same
family as backlog 352, a dimension written where no guard reads it. The number did not
move, only where it lives.

A CELL WITH TWO THINGS IN IT SINCE 2026-09-29: the shadow under, the sheet on top, both
filling the one rectangle the cell is given - so the shadow cannot part from the sheet
at any height of the footer. Why the shadow stopped being an effect ON the sheet is
beside PlanSheetShadow in Themes/Plan.xaml, with the measurement. The place and the size
are attributes rather than a style, because the catalogue builds samples of styles and
has nothing to build a Grid from.
-->
<Border x:Name="Sheet" Style="{StaticResource PlanSheet}" Width="{StaticResource WidthPlanSheet}">
<Grid HorizontalAlignment="Center" VerticalAlignment="Center"
Margin="{StaticResource MarginPlanSheet}" Width="{StaticResource WidthPlanSheet}">
<Border Style="{StaticResource PlanSheetShadow}" />
<Border x:Name="Sheet" Style="{StaticResource PlanSheet}">

<Grid>
<Grid.RowDefinitions>
Expand Down Expand Up @@ -180,15 +190,10 @@
</StackPanel>

<!--
THE LINE ABOVE THE SCROLLING HALF, 2026-09-01, repairing what the owner called
things running into each other: the last visible line was cut through the middle by
the edge of the scrolling region with nothing saying an edge was there. A rule turns
the same pixels into "there is more below". Scrolls vertically and never sideways.
THE HALF THAT SCROLLS, under a rule - what the rule is for is beside PlanBody in
Themes/Plan.xaml. Scrolls vertically and never sideways.
-->
<Border Grid.Row="2"
BorderBrush="{StaticResource SurfacePanelEdge}"
BorderThickness="{StaticResource BorderFooterRule}"
Padding="{StaticResource PaddingFooter}">
<Border Grid.Row="2" Style="{StaticResource PlanBody}">
<!--
THE WHEEL IS TAKEN IN THE TUNNEL, since 2026-09-16, because a command's own viewer
below would otherwise keep it - the argument is beside that viewer in PlanLines.xaml.
Expand Down Expand Up @@ -290,34 +295,38 @@
THE HEADING SHARES ITS LINE WITH "COPY ALL" SINCE 2026-09-16, here and over
the commands below, and the press is caught on the SECTION rather than on
the list: the button beside each line and the one over all of them bubble
to one handler, which reads the text off whichever Tag was pressed. The
button goes when there is one line - see Planned.HasSeveralCommands.
to one handler, which reads the text off whichever Tag was pressed.

EACH SECTION'S DATA IS ITS CommandBlock SINCE 2026-09-29 - W6 - so both are
the same markup over different blocks: whether the section is there, the
button over it, the list of lines up to twenty and the one field past that.
What the button carries and when it goes are in PlanCopyAllButton, and the
field is in PlanCommandsRecess and PlanCommandsField, all in PlanLines.xaml.
-->
<StackPanel x:Name="WayBackSection"
DataContext="{Binding WayBackBlock}"
Button.Click="CopyCommandRequested"
Visibility="{Binding HasWayBack, Converter={StaticResource WhenTrue}}">
Visibility="{Binding Any, Converter={StaticResource WhenTrue}}">
<DockPanel Margin="{StaticResource MarginSection}">
<!-- The ghost box: same margin, edge and padding as a line's box, so this
button ends where the lines' buttons end. Argument in PlanLines.xaml. -->
<Border DockPanel.Dock="Right" Style="{StaticResource PlanCommandGhost}">
<Button Style="{StaticResource PlanCopyAllButton}"
AutomationProperties.AutomationId="planCopyAllWayBack"
AutomationProperties.Name="{DynamicResource gui.plan.copyAll}"
Content="{DynamicResource gui.plan.copyAll}"
ToolTip="{DynamicResource gui.plan.copyAll.hint}"
Visibility="{Binding HasSeveralWayBack, Converter={StaticResource WhenTrue}}"
Tag="{Binding AllWayBack}" />
<Button Style="{StaticResource PlanCopyAllButton}" AutomationProperties.AutomationId="planCopyAllWayBack" />
</Border>

<TextBlock Text="{DynamicResource gui.plan.wayBack}"
VerticalAlignment="Center"
Style="{StaticResource SectionHeadingText}" />
<TextBlock Text="{DynamicResource gui.plan.wayBack}" Style="{StaticResource PlanCommandsHeading}" />
</DockPanel>

<ItemsControl x:Name="WayBackList"
AutomationProperties.AutomationId="planWayBack"
ItemsSource="{Binding WayBack}"
ItemsSource="{Binding Listed}"
ItemTemplate="{StaticResource PlanCommandTemplate}" />

<Border Style="{StaticResource PlanCommandsRecess}">
<TextBox x:Name="WayBackField" Style="{StaticResource PlanCommandsField}"
AutomationProperties.AutomationId="planWayBackField"
AutomationProperties.Name="{DynamicResource gui.plan.wayBack}" />
</Border>
</StackPanel>

<!--
Expand All @@ -334,29 +343,27 @@
first.
-->
<StackPanel x:Name="CommandSection"
DataContext="{Binding CommandBlock}"
Button.Click="CopyCommandRequested"
Visibility="{Binding HasCommands, Converter={StaticResource WhenTrue}}">
Visibility="{Binding Any, Converter={StaticResource WhenTrue}}">
<DockPanel Margin="{StaticResource MarginSection}">
<Border DockPanel.Dock="Right" Style="{StaticResource PlanCommandGhost}">
<Button x:Name="CopyAllButton"
Style="{StaticResource PlanCopyAllButton}"
AutomationProperties.AutomationId="planCopyAll"
AutomationProperties.Name="{DynamicResource gui.plan.copyAll}"
Content="{DynamicResource gui.plan.copyAll}"
ToolTip="{DynamicResource gui.plan.copyAll.hint}"
Visibility="{Binding HasSeveralCommands, Converter={StaticResource WhenTrue}}"
Tag="{Binding AllCommands}" />
<Button x:Name="CopyAllButton" Style="{StaticResource PlanCopyAllButton}" AutomationProperties.AutomationId="planCopyAll" />
</Border>

<TextBlock Text="{DynamicResource gui.plan.commands}"
VerticalAlignment="Center"
Style="{StaticResource SectionHeadingText}" />
<TextBlock Text="{DynamicResource gui.plan.commands}" Style="{StaticResource PlanCommandsHeading}" />
</DockPanel>

<ItemsControl x:Name="CommandList"
AutomationProperties.AutomationId="planCommands"
ItemsSource="{Binding Commands}"
ItemsSource="{Binding Listed}"
ItemTemplate="{StaticResource PlanCommandTemplate}" />

<Border Style="{StaticResource PlanCommandsRecess}">
<TextBox x:Name="CommandField" Style="{StaticResource PlanCommandsField}"
AutomationProperties.AutomationId="planCommandsField"
AutomationProperties.Name="{DynamicResource gui.plan.commands}" />
</Border>
</StackPanel>
</StackPanel>
</ScrollViewer>
Expand All @@ -371,5 +378,6 @@
<local:PlanFooter Grid.Row="3" x:Name="Footer" />
</Grid>
</Border>
</Grid>
</Grid>
</UserControl>
21 changes: 17 additions & 4 deletions src/Bws.Gui/PlanView.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -358,8 +358,11 @@ internal void TakeTheKeyboard() =>
/// <summary>The entries that got no plan, as they reach the screen.</summary>
internal IReadOnlyList<string> ProblemLines => [.. ProblemList.Items.OfType<string>()];

/// <summary>The command lines, as they reach the screen. `E5`.</summary>
internal IReadOnlyList<string> CommandLines => [.. CommandList.Items.OfType<string>()];
/// <summary>
/// The command lines, as they reach the screen - one box each up to twenty, one field past that
/// (W6, see CommandBlock). `E5`.
/// </summary>
internal IReadOnlyList<string> CommandLines => Shown(CommandList, CommandField);

/// <summary>What did not work, as it reaches the screen.</summary>
internal IReadOnlyList<string> FailureLines =>
Expand All @@ -377,8 +380,18 @@ internal void TakeTheKeyboard() =>
[.. FailureList.Items.OfType<PlanFailure>().Where(failure => failure.HasOffer)
.Select(failure => failure.Label)];

/// <summary>The way back, as it reaches the screen.</summary>
internal IReadOnlyList<string> WayBackLines => [.. WayBackList.Items.OfType<string>()];
/// <summary>The way back, as it reaches the screen, in either of the two shapes above.</summary>
internal IReadOnlyList<string> WayBackLines => Shown(WayBackList, WayBackField);

/// <summary>
/// The lines of one block of commands off whichever of its two shapes holds them: the list's own
/// items, or - when the list is empty - the field's text cut back into lines. Read off the
/// controls rather than the model, for the reason <see cref="StepLines"/> gives.
/// </summary>
private static IReadOnlyList<string> Shown(ItemsControl list, TextBox field) =>
list.Items.Count == 0 && field.Text.Length > 0
? field.Text.Split(Environment.NewLine)
: [.. list.Items.OfType<string>()];

/// <summary>What is worth knowing, as it reaches the screen.</summary>
internal IReadOnlyList<string> WarningLines =>
Expand Down
Loading
Loading