2025-12-23 14:12:21 +08:00

217 lines
9.0 KiB
XML

<UserControl x:Class="AmebaPro3_ControlPanel.Views.Controls.ConsolePanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="450"
d:DesignWidth="800">
<Border Style="{StaticResource CardStyle}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/> <!-- Header with custom controls -->
<RowDefinition Height="*"/> <!-- Log -->
<RowDefinition Height="Auto"/> <!-- GridSplitter -->
<RowDefinition Height="*" MinHeight="140"/> <!-- History -->
<RowDefinition Height="Auto"/> <!-- Command buttons slot -->
<RowDefinition Height="Auto"/> <!-- Actions row -->
<RowDefinition Height="Auto"/> <!-- Input -->
</Grid.RowDefinitions>
<!-- Header -->
<Grid Grid.Row="0" Margin="0,0,0,12">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<Ellipse Width="10"
Height="10"
VerticalAlignment="Center"
Margin="0,0,10,0">
<Ellipse.Style>
<Style TargetType="Ellipse">
<Setter Property="Fill" Value="{StaticResource DangerBrush}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsConnected}" Value="True">
<Setter Property="Fill" Value="{StaticResource SuccessBrush}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Ellipse.Style>
</Ellipse>
<StackPanel>
<TextBlock Text="{Binding Title}"
FontSize="16"
FontWeight="SemiBold"/>
<TextBlock FontSize="12">
<TextBlock.Style>
<Style TargetType="TextBlock" BasedOn="{StaticResource CaptionTextStyle}">
<Setter Property="Text" Value="Disconnected"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsConnected}" Value="True">
<Setter Property="Text" Value="Connected"/>
<Setter Property="Foreground" Value="{StaticResource SuccessBrush}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</StackPanel>
</StackPanel>
<ContentPresenter Grid.Column="1"
VerticalAlignment="Center"
Content="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=HeaderContent}">
<ContentPresenter.Style>
<Style TargetType="ContentPresenter">
<Setter Property="Visibility" Value="Visible"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Content, RelativeSource={RelativeSource Self}}" Value="{x:Null}">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentPresenter.Style>
</ContentPresenter>
</Grid>
<!-- Log viewer -->
<Border Grid.Row="1"
Background="{StaticResource SurfaceAltBrush}"
BorderBrush="{StaticResource SubtleBorderBrush}"
BorderThickness="1"
CornerRadius="10">
<ListBox ItemsSource="{Binding LogLines}"
x:Name="LogListBox"
SelectionMode="Extended"
PreviewMouseWheel="LogListBox_OnPreviewMouseWheel"
PreviewMouseDown="LogListBox_OnPreviewMouseDown"
PreviewKeyDown="LogListBox_OnPreviewKeyDown"
KeyDown="LogListBox_OnKeyDown"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Recycling"
ScrollViewer.HorizontalScrollBarVisibility="Auto"
ScrollViewer.VerticalScrollBarVisibility="Auto"
ScrollViewer.CanContentScroll="True">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}"
FontFamily="Cascadia Code, Consolas, Segoe UI Mono"
FontSize="12"
TextWrapping="NoWrap"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Border>
<!-- GridSplitter for resizing history -->
<GridSplitter Grid.Row="2"
Height="4"
HorizontalAlignment="Stretch"
VerticalAlignment="Top"
Background="{StaticResource SubtleBorderBrush}"
ResizeDirection="Rows"
ResizeBehavior="PreviousAndNext"
Margin="0,10,0,0"
ShowsPreview="True"/>
<!-- Command history -->
<Border Grid.Row="3"
Margin="0,14,0,0"
Background="{StaticResource SurfaceAltBrush}"
BorderBrush="{StaticResource SubtleBorderBrush}"
BorderThickness="1"
CornerRadius="10">
<ListBox x:Name="HistoryListBox"
ItemsSource="{Binding History}"
SelectionMode="Extended"
SelectionChanged="HistoryListBox_OnSelectionChanged"
MouseDoubleClick="HistoryListBox_OnMouseDoubleClick"
PreviewMouseWheel="HistoryListBox_OnPreviewMouseWheel"
PreviewMouseDown="HistoryListBox_OnPreviewMouseDown"
PreviewKeyDown="HistoryListBox_OnPreviewKeyDown"
KeyDown="HistoryListBox_OnKeyDown"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Recycling"
ScrollViewer.VerticalScrollBarVisibility="Auto"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
ScrollViewer.CanContentScroll="True">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}" FontSize="12"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Border>
<!-- Optional command buttons slot -->
<ContentPresenter Grid.Row="4"
Margin="0,10,0,0"
Content="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=CommandButtonsContent}">
<ContentPresenter.Style>
<Style TargetType="ContentPresenter">
<Setter Property="Visibility" Value="Visible"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Content, RelativeSource={RelativeSource Self}}" Value="{x:Null}">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentPresenter.Style>
</ContentPresenter>
<!-- Actions row -->
<StackPanel Grid.Row="5"
Orientation="Horizontal"
HorizontalAlignment="Right"
Margin="0,10,0,0">
<Button Content="Clear"
Command="{Binding ClearLog}"
Style="{StaticResource GhostButtonStyle}"
Width="120"
Margin="0,0,8,0"/>
<Button Content="Save"
Command="{Binding SaveLog}"
Style="{StaticResource GhostButtonStyle}"
Width="120"
Margin="0,0,8,0"/>
<Button Content="Load Commands"
Command="{Binding LoadCommandFileCommand}"
Style="{StaticResource GhostButtonStyle}"
Width="140"/>
</StackPanel>
<!-- Input row -->
<Grid Grid.Row="6" Margin="0,10,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="8"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBox x:Name="CommandInput"
Grid.Column="0"
Text="{Binding CurrentCommand, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
KeyDown="CommandInput_OnKeyDown"/>
<Button Grid.Column="2"
Content="Send"
Command="{Binding SendCommand}"
Style="{StaticResource PrimaryButtonStyle}"
MinWidth="96"/>
</Grid>
</Grid>
</Border>
</UserControl>