fix(ui): render Output log directly on the console, not as a nested card
The Output tab embedded SessionTerminalView, which is itself a bordered terminal card with its own header — a card inside the console card. Render the log lines directly on the console body instead (the console already provides the terminal chrome, traffic lights, and status chip), with auto-scroll moved to code-behind. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -1,7 +1,6 @@
|
|||||||
<UserControl xmlns="https://github.com/avaloniaui"
|
<UserControl xmlns="https://github.com/avaloniaui"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:vm="using:ClaudeDo.Ui.ViewModels.Islands"
|
xmlns:vm="using:ClaudeDo.Ui.ViewModels.Islands"
|
||||||
xmlns:islands="using:ClaudeDo.Ui.Views.Islands"
|
|
||||||
xmlns:loc="using:ClaudeDo.Ui.Localization"
|
xmlns:loc="using:ClaudeDo.Ui.Localization"
|
||||||
x:DataType="vm:DetailsIslandViewModel"
|
x:DataType="vm:DetailsIslandViewModel"
|
||||||
x:Class="ClaudeDo.Ui.Views.Islands.Detail.WorkConsole">
|
x:Class="ClaudeDo.Ui.Views.Islands.Detail.WorkConsole">
|
||||||
@@ -139,15 +138,28 @@
|
|||||||
<!-- ── Tab body ── -->
|
<!-- ── Tab body ── -->
|
||||||
<Grid>
|
<Grid>
|
||||||
|
|
||||||
<!-- Output: embedded terminal, inset so it reads as its own card -->
|
<!-- Output: log rendered directly on the console body (no nested card) -->
|
||||||
<islands:SessionTerminalView
|
<ScrollViewer Name="LogScroll"
|
||||||
IsVisible="{Binding IsOutputTab}"
|
IsVisible="{Binding IsOutputTab}"
|
||||||
Margin="10,8,10,10"
|
VerticalScrollBarVisibility="Visible"
|
||||||
Entries="{Binding Log}"
|
AllowAutoHide="False"
|
||||||
Label="{Binding SessionLabel}"
|
Padding="12,8,12,12">
|
||||||
IsRunning="{Binding IsRunning}"
|
<ItemsControl ItemsSource="{Binding Log}">
|
||||||
IsDone="{Binding IsDone}"
|
<ItemsControl.ItemTemplate>
|
||||||
IsFailed="{Binding IsFailed}" />
|
<DataTemplate DataType="vm:LogLineViewModel">
|
||||||
|
<Grid ColumnDefinitions="60,*" Margin="0,1">
|
||||||
|
<TextBlock Grid.Column="0"
|
||||||
|
Classes="log-ts"
|
||||||
|
Text="{Binding TimestampFormatted}" />
|
||||||
|
<SelectableTextBlock Grid.Column="1"
|
||||||
|
Text="{Binding Text}" Tag="{Binding ClassName}"
|
||||||
|
Foreground="{DynamicResource TextDimBrush}"
|
||||||
|
TextWrapping="Wrap" />
|
||||||
|
</Grid>
|
||||||
|
</DataTemplate>
|
||||||
|
</ItemsControl.ItemTemplate>
|
||||||
|
</ItemsControl>
|
||||||
|
</ScrollViewer>
|
||||||
|
|
||||||
<!-- Session: review (top) + merge/worktree + outcomes — each gated on state -->
|
<!-- Session: review (top) + merge/worktree + outcomes — each gated on state -->
|
||||||
<ScrollViewer IsVisible="{Binding IsSessionTab}" Padding="14,10">
|
<ScrollViewer IsVisible="{Binding IsSessionTab}" Padding="14,10">
|
||||||
|
|||||||
@@ -1,8 +1,40 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Specialized;
|
||||||
using Avalonia.Controls;
|
using Avalonia.Controls;
|
||||||
|
using ClaudeDo.Ui.ViewModels.Islands;
|
||||||
|
|
||||||
namespace ClaudeDo.Ui.Views.Islands.Detail;
|
namespace ClaudeDo.Ui.Views.Islands.Detail;
|
||||||
|
|
||||||
public partial class WorkConsole : UserControl
|
public partial class WorkConsole : UserControl
|
||||||
{
|
{
|
||||||
public WorkConsole() => InitializeComponent();
|
private INotifyCollectionChanged? _log;
|
||||||
|
|
||||||
|
public WorkConsole()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
DataContextChanged += OnDataContextChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDataContextChanged(object? sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (_log is not null)
|
||||||
|
_log.CollectionChanged -= OnLogChanged;
|
||||||
|
|
||||||
|
_log = (DataContext as DetailsIslandViewModel)?.Log;
|
||||||
|
|
||||||
|
if (_log is not null)
|
||||||
|
_log.CollectionChanged += OnLogChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnLogChanged(object? sender, NotifyCollectionChangedEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.Action != NotifyCollectionChangedAction.Add) return;
|
||||||
|
EventHandler? handler = null;
|
||||||
|
handler = (_, _) =>
|
||||||
|
{
|
||||||
|
LogScroll.LayoutUpdated -= handler;
|
||||||
|
LogScroll.ScrollToEnd();
|
||||||
|
};
|
||||||
|
LogScroll.LayoutUpdated += handler;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user