feat(ui): spinners for ConPTY session start and task refine

Both actions previously gave no feedback: opening a ConPTY session only created
the tile after the launch-spec roundtrip (which may build a worktree), and the
refine button just disappeared while the run was in flight.

Add a shared Ellipse.spinner style, and let ConPtyPaneViewModel resolve its own
launch spec so the tile shows up immediately with a starting overlay. A failed
launch now keeps the tile with its inline error banner instead of never
appearing — Start() is separated from the ctor so the host can subscribe to
ErrorReported before the launch begins.
This commit is contained in:
Mika Kuns
2026-07-27 15:02:51 +02:00
parent 6c8de4aef3
commit 1466d0fbab
9 changed files with 150 additions and 90 deletions
+17 -11
View File
@@ -207,17 +207,23 @@
</StackPanel>
</StackPanel>
<!-- Refine button -->
<Button Grid.Column="5" Classes="icon-btn refine-btn"
IsVisible="{Binding CanRefine}"
VerticalAlignment="Top" Margin="0,2,0,0"
Command="{Binding $parent[ItemsControl].((vm:TasksIslandViewModel)DataContext).RefineTaskCommand}"
CommandParameter="{Binding}"
ToolTip.Tip="{loc:Tr tasks.refineTip}">
<Viewbox Width="16" Height="16">
<Path Classes="plan-icon" Data="{StaticResource Icon.Refine}"/>
</Viewbox>
</Button>
<!-- Refine button, replaced by a spinner while the refine run is in flight -->
<Panel Grid.Column="5">
<Button Classes="icon-btn refine-btn"
IsVisible="{Binding CanRefine}"
VerticalAlignment="Top" Margin="0,2,0,0"
Command="{Binding $parent[ItemsControl].((vm:TasksIslandViewModel)DataContext).RefineTaskCommand}"
CommandParameter="{Binding}"
ToolTip.Tip="{loc:Tr tasks.refineTip}">
<Viewbox Width="16" Height="16">
<Path Classes="plan-icon" Data="{StaticResource Icon.Refine}"/>
</Viewbox>
</Button>
<Ellipse Classes="spinner"
IsVisible="{Binding IsRefining}"
VerticalAlignment="Top" Margin="0,4,2,0"
ToolTip.Tip="{loc:Tr tasks.refiningTip}"/>
</Panel>
<!-- Star toggle -->
<Button Grid.Column="6" Classes="icon-btn star-btn"
@@ -44,8 +44,20 @@
TextWrapping="Wrap" />
</Border>
<!-- Embedded ConPTY terminal -->
<views:InteractiveTerminalView DataContext="{Binding Terminal}" />
<!-- Embedded ConPTY terminal, with a starting overlay until the session is spawned -->
<Panel>
<views:InteractiveTerminalView DataContext="{Binding Terminal}" />
<Border IsVisible="{Binding Terminal.IsStarting}"
Background="{DynamicResource VoidBrush}">
<StackPanel Orientation="Horizontal" Spacing="10"
HorizontalAlignment="Center" VerticalAlignment="Center">
<Ellipse Classes="spinner"/>
<TextBlock Classes="meta" Text="{loc:Tr missionControl.conptyStarting}"
Foreground="{DynamicResource TextDimBrush}"
VerticalAlignment="Center"/>
</StackPanel>
</Border>
</Panel>
</DockPanel>
</Border>