<UserControl x:Class="XFEToolBox.Tools.SpaceEngineers.Views.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:XFEToolBox.WpfCore.Controls;assembly=XFEToolBox.WpfCore"
Background="{DynamicResource ToolControlBackgroundBrush}" Foreground="{DynamicResource ToolTextPrimaryBrush}" FontSize="13">
<UserControl.Resources>
<BooleanToVisibilityConverter x:Key="BooleanVisibility"/>
<Style x:Key="Card" TargetType="Border">
<Setter Property="Background" Value="{DynamicResource ToolSurfaceBrush}"/>
<Setter Property="BorderBrush" Value="{DynamicResource ToolControlBorderBrush}"/>
<Setter Property="BorderThickness" Value="1"/><Setter Property="CornerRadius" Value="12"/>
<Setter Property="Padding" Value="16"/>
</Style>
<Style x:Key="Hint" TargetType="TextBlock">
<Setter Property="Foreground" Value="{DynamicResource ToolTextSecondaryBrush}"/>
<Setter Property="TextWrapping" Value="Wrap"/>
</Style>
<Style x:Key="SectionTitle" TargetType="TextBlock">
<Setter Property="FontSize" Value="16"/><Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="Margin" Value="0,0,0,10"/>
</Style>
<Style x:Key="Action" TargetType="Button" BasedOn="{StaticResource ToolBoxButtonStyle}">
<Setter Property="Margin" Value="0,0,8,8"/><Setter Property="MinHeight" Value="32"/>
</Style>
<Style x:Key="Field" TargetType="controls:TextEditor" BasedOn="{StaticResource {x:Type controls:TextEditor}}">
<Setter Property="MinHeight" Value="34"/><Setter Property="VerticalAlignment" Value="Center"/>
</Style>
</UserControl.Resources>
<Grid Margin="16">
<Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="12"/><RowDefinition Height="*"/><RowDefinition Height="10"/><RowDefinition Height="Auto"/></Grid.RowDefinitions>
<Border Style="{StaticResource Card}" Padding="16,12">
<Grid>
<Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<StackPanel Margin="0,0,16,0">
<TextBlock Text="XFE Loader · Space Engineers" FontSize="21" FontWeight="SemiBold"/>
<TextBlock Text="{Binding ProcessStatus}" Style="{StaticResource Hint}" Margin="0,5,0,0"/>
</StackPanel>
<StackPanel Grid.Column="1" VerticalAlignment="Center">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
<Button Content="启动游戏" Command="{Binding LaunchCommand}" controls:ButtonAssist.IsPrimary="True" MinWidth="88"/>
<Button Content="正常退出" Command="{Binding CloseGameCommand}" Margin="8,0,0,0"/>
<Button Content="重启游戏" Command="{Binding RestartCommand}" Margin="8,0,0,0"/>
</StackPanel>
<TextBlock Text="退出与重启前请先保存存档" Style="{StaticResource Hint}" FontSize="11" HorizontalAlignment="Right" Margin="0,5,0,0"/>
</StackPanel>
</Grid>
</Border>
<TabControl Grid.Row="2" SelectedIndex="{Binding SelectedTab}">
<TabItem Header="插件管理">
<Grid Margin="0,12,0,0">
<Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="Auto"/><RowDefinition Height="*"/><RowDefinition Height="Auto"/></Grid.RowDefinitions>
<Grid Margin="0,0,0,10">
<Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<controls:TextEditor Text="{Binding Filter, UpdateSourceTrigger=PropertyChanged}" HintText="筛选插件名称、来源或路径" Style="{StaticResource Field}"/>
<ComboBox Grid.Column="1" ItemsSource="{Binding PluginFilters}" SelectedIndex="{Binding SelectedPluginFilter}" MinWidth="104" Margin="10,0,0,0"/>
<Button Grid.Column="2" Content="刷新清单" Command="{Binding RefreshCommand}" Margin="10,0,0,0"/>
</Grid>
<WrapPanel Grid.Row="1" IsEnabled="{Binding CanEdit}">
<Button Content="添加本地 DLL" Command="{Binding ImportDllCommand}" Style="{StaticResource Action}"/>
<Button Content="添加插件目录" Command="{Binding ImportDirectoryCommand}" Style="{StaticResource Action}" ToolTip="选择包含已编译插件 DLL 的目录,自动识别入口及依赖"/>
<Button Content="移除选中项" Command="{Binding RemovePluginCommand}" Style="{StaticResource Action}" ToolTip="从管理清单移除,保留插件文件;应用后生效"/>
</WrapPanel>
<Grid Grid.Row="2">
<Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<Border Style="{StaticResource Card}" Padding="0">
<Grid>
<DataGrid x:Name="PluginsGrid" ItemsSource="{Binding PluginsView}" SelectedItem="{Binding SelectedPlugin}"
AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False"
HeadersVisibility="Column" SelectionMode="Single" SelectionUnit="FullRow" RowHeaderWidth="0"
IsEnabled="{Binding CanEdit}" IsReadOnly="True" GridLinesVisibility="None" BorderThickness="0"
HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<DataGrid.Columns>
<DataGridTemplateColumn Header="启用" Width="64" CanUserSort="False">
<DataGridTemplateColumn.CellTemplate><DataTemplate><CheckBox IsChecked="{Binding IsEnabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource ToolBoxGridCheckBoxStyle}" AutomationProperties.Name="启用插件"/></DataTemplate></DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="插件" Width="*" MinWidth="150" SortMemberPath="Name">
<DataGridTemplateColumn.CellTemplate><DataTemplate><StackPanel Margin="8,8"><TextBlock Text="{Binding Name}" FontWeight="SemiBold" TextTrimming="CharacterEllipsis"/><TextBlock Text="{Binding Id}" Style="{StaticResource Hint}" TextWrapping="NoWrap" TextTrimming="CharacterEllipsis" FontSize="11" Margin="0,3,0,0"/></StackPanel></DataTemplate></DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="原始文件" Binding="{Binding SourcePath}" IsReadOnly="True" Width="1.3*" MinWidth="180">
<DataGridTextColumn.ElementStyle><Style TargetType="TextBlock" BasedOn="{StaticResource ToolBoxDataGridTextElementStyle}"><Setter Property="ToolTip" Value="{Binding SourcePath}"/></Style></DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
<StackPanel Visibility="{Binding ShowEmptyPlugins, Converter={StaticResource BooleanVisibility}}" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="30" IsHitTestVisible="False">
<TextBlock Text="{Binding EmptyPluginsTitle}" FontSize="18" FontWeight="SemiBold" TextAlignment="Center"/>
<TextBlock Text="{Binding EmptyPluginsHint}" Style="{StaticResource Hint}" TextAlignment="Center" MaxWidth="390" Margin="0,8,0,0"/>
</StackPanel>
</Grid>
</Border>
</Grid>
<StackPanel Grid.Row="3" Margin="0,10,0,0">
<Border Background="{DynamicResource ToolAccentSoftBrush}" CornerRadius="8" Padding="10,8" Visibility="{Binding HasSelectedPlugin, Converter={StaticResource BooleanVisibility}}" Margin="0,0,0,9">
<StackPanel><TextBlock Text="{Binding SelectedPlugin.Name}" FontWeight="SemiBold"/><TextBlock Text="{Binding SelectedPlugin.Description}" Style="{StaticResource Hint}" FontSize="12" MaxHeight="34" Margin="0,3,0,0"/><TextBlock Text="{Binding SelectedPlugin.Location}" Style="{StaticResource Hint}" FontSize="11" TextWrapping="NoWrap" TextTrimming="CharacterEllipsis" ToolTip="{Binding SelectedPlugin.Location}" Margin="0,3,0,0"/></StackPanel>
</Border>
<DockPanel LastChildFill="True">
<Button DockPanel.Dock="Right" Content="应用更改" Command="{Binding ApplyCommand}" controls:ButtonAssist.IsPrimary="True" MinWidth="112" Margin="14,0,0,0"/>
<StackPanel VerticalAlignment="Center"><TextBlock Text="{Binding PluginSummary}" FontWeight="SemiBold"/><TextBlock Text="{Binding ApplyHint}" Style="{StaticResource Hint}" FontSize="11" Margin="0,3,0,0"/></StackPanel>
</DockPanel>
</StackPanel>
</Grid>
</TabItem>
<TabItem Header="启动与环境">
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled" Margin="0,12,0,0">
<StackPanel IsEnabled="{Binding CanEdit}" Margin="0,0,8,0">
<Border Style="{StaticResource Card}">
<StackPanel>
<DockPanel><Button DockPanel.Dock="Right" Content="自动检测" Command="{Binding DetectCommand}"/><TextBlock Text="游戏与 XFE 加载器" Style="{StaticResource SectionTitle}"/></DockPanel>
<Grid><Grid.ColumnDefinitions><ColumnDefinition Width="98"/><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<TextBlock Text="游戏 Bin64" VerticalAlignment="Center" Style="{StaticResource Hint}"/>
<controls:TextEditor Grid.Column="1" Text="{Binding Bin64Path, UpdateSourceTrigger=PropertyChanged}" HintText="选择包含 SpaceEngineers.exe 的 Bin64 文件夹" Style="{StaticResource Field}"/>
<Button Grid.Column="2" Content="浏览" Command="{Binding BrowseGameCommand}" Margin="8,0,0,0"/>
</Grid>
<Grid Margin="0,10,0,0"><Grid.ColumnDefinitions><ColumnDefinition Width="98"/><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<TextBlock Text="加载组件" VerticalAlignment="Center" Style="{StaticResource Hint}"/>
<TextBlock Grid.Column="1" Text="XFE Loader" FontWeight="SemiBold" VerticalAlignment="Center"/>
<Button Grid.Column="2" Content="构建 / 更新 XFE 加载器" Command="{Binding BuildLoaderCommand}" Margin="8,0,0,0"/>
</Grid>
<TextBlock Text="{Binding LoaderStatus}" Style="{StaticResource Hint}" FontSize="12" Margin="98,7,0,0"/>
<Grid Margin="0,10,0,0"><Grid.ColumnDefinitions><ColumnDefinition Width="98"/><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<TextBlock Text="XFE 启动器" VerticalAlignment="Center" Style="{StaticResource Hint}"/>
<controls:TextEditor Grid.Column="1" Grid.ColumnSpan="2" Text="{Binding LauncherPath, Mode=OneWay}" IsReadOnly="True" HintText="构建后显示生成的启动器路径" Style="{StaticResource Field}"/>
</Grid>
<Grid Margin="0,10,0,0"><Grid.ColumnDefinitions><ColumnDefinition Width="98"/><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<TextBlock Text="插件配置" VerticalAlignment="Center" Style="{StaticResource Hint}"/>
<controls:TextEditor Grid.Column="1" Text="{Binding ProfilePath, UpdateSourceTrigger=PropertyChanged}" HintText="XFE 插件配置 JSON,留空使用工具独立配置" Style="{StaticResource Field}"/>
<Button Grid.Column="2" Content="浏览" Command="{Binding BrowseProfileCommand}" Margin="8,0,0,0"/>
</Grid>
</StackPanel>
</Border>
<Border Style="{StaticResource Card}" Margin="0,12,0,0">
<StackPanel>
<DockPanel><Button DockPanel.Dock="Right" Content="+ 添加参数" Command="{Binding AddArgumentCommand}"/><TextBlock Text="启动参数" Style="{StaticResource SectionTitle}"/></DockPanel>
<TextBlock Text="每行作为一个参数,无需自行添加引号。选项和它的值分别填写;空行保留为空字符串。" Style="{StaticResource Hint}" FontSize="12" Margin="0,0,0,10"/>
<ItemsControl ItemsSource="{Binding Arguments}">
<ItemsControl.ItemTemplate><DataTemplate><Grid Margin="0,0,0,8"><Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions><controls:TextEditor Text="{Binding Value, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource Field}"/><Button Grid.Column="1" Content="删除" Command="{Binding DataContext.RemoveArgumentCommand, RelativeSource={RelativeSource AncestorType=UserControl}}" CommandParameter="{Binding}" Margin="8,0,0,0"/></Grid></DataTemplate></ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</Border>
<Border Style="{StaticResource Card}" Margin="0,12,0,0">
<StackPanel>
<TextBlock Text="自动重启" Style="{StaticResource SectionTitle}"/>
<CheckBox Content="应用插件更改后,自动正常重启正在运行的游戏" IsChecked="{Binding AutoRestartAfterApply}" Margin="0,0,0,10"/>
<CheckBox Content="已启用插件的源文件变化后,自动同步并正常重启" IsChecked="{Binding RestartOnLocalChanges}" Margin="0,0,0,8"/>
<TextBlock Text="保存设置后开始监视。工具关闭或有未应用更改时暂停监视;请先保存存档,游戏未能正常退出时不会强制结束。" Style="{StaticResource Hint}" FontSize="12" Margin="24,0,0,10"/>
<StackPanel Orientation="Horizontal"><TextBlock Text="正常退出等待时间" Style="{StaticResource Hint}" VerticalAlignment="Center"/><controls:TextEditor Text="{Binding CloseTimeoutText, UpdateSourceTrigger=PropertyChanged}" Width="72" Margin="12,0,8,0" Style="{StaticResource Field}"/><TextBlock Text="秒" Style="{StaticResource Hint}" VerticalAlignment="Center"/></StackPanel>
</StackPanel>
</Border>
<WrapPanel Margin="0,12,0,0">
<Button Content="保存环境设置" Command="{Binding SaveSettingsCommand}" Style="{StaticResource Action}" controls:ButtonAssist.IsPrimary="True"/>
<Button Content="原版启动(不加载插件)" Command="{Binding LaunchVanillaCommand}" Style="{StaticResource Action}"/>
<Button Content="打开游戏目录" Command="{Binding OpenGameDirectoryCommand}" Style="{StaticResource Action}"/>
</WrapPanel>
</StackPanel>
</ScrollViewer>
</TabItem>
<TabItem Header="备份与日志">
<Grid Margin="0,12,0,0">
<Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="12"/><RowDefinition Height="*"/></Grid.RowDefinitions>
<Border Style="{StaticResource Card}">
<StackPanel>
<TextBlock Text="插件配置备份" Style="{StaticResource SectionTitle}"/>
<TextBlock Text="应用配置前自动备份。恢复插件清单与对应的 DLL 版本,不修改插件源文件和游戏存档。" Style="{StaticResource Hint}" FontSize="12" Margin="0,0,0,10"/>
<Grid><Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<ComboBox ItemsSource="{Binding Backups}" SelectedItem="{Binding SelectedBackup}" DisplayMemberPath="Name" MinHeight="34" ToolTip="{Binding SelectedBackup.Path}" IsEnabled="{Binding CanEdit}"/>
<Button Grid.Column="1" Content="刷新备份" Command="{Binding RefreshBackupsCommand}" Margin="8,0,0,0"/>
<Button Grid.Column="2" Content="恢复选中备份" Command="{Binding RestoreCommand}" Margin="8,0,0,0"/>
</Grid>
<TextBlock Text="{Binding BackupSummary}" Style="{StaticResource Hint}" FontSize="11" Margin="0,8,0,0"/>
</StackPanel>
</Border>
<Border Grid.Row="2" Style="{StaticResource Card}" Padding="12">
<Grid>
<Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/></Grid.RowDefinitions>
<DockPanel Margin="0,0,0,8"><StackPanel DockPanel.Dock="Right" Orientation="Horizontal"><Button Content="导出日志" Command="{Binding ExportLogCommand}"/><Button Content="清空" Command="{Binding ClearLogCommand}" Margin="8,0,0,0"/></StackPanel><TextBlock Text="运行日志" FontSize="16" FontWeight="SemiBold" VerticalAlignment="Center"/></DockPanel>
<TextBox x:Name="LogBox" Grid.Row="1" Text="{Binding LogText, Mode=OneWay}" IsReadOnly="True" AcceptsReturn="True" TextWrapping="Wrap" VerticalContentAlignment="Top" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled" BorderThickness="0" Background="Transparent" FontFamily="Cascadia Mono, Consolas" FontSize="12"/>
</Grid>
</Border>
</Grid>
</TabItem>
</TabControl>
<Grid Grid.Row="4">
<Grid.RowDefinitions><RowDefinition Height="3"/><RowDefinition Height="6"/><RowDefinition Height="Auto"/></Grid.RowDefinitions>
<ProgressBar IsIndeterminate="{Binding IsBusy}" Visibility="{Binding IsBusy, Converter={StaticResource BooleanVisibility}}" Height="3"/>
<DockPanel Grid.Row="2"><Button DockPanel.Dock="Right" Content="取消" Command="{Binding CancelCommand}" Visibility="{Binding IsBusy, Converter={StaticResource BooleanVisibility}}" Margin="12,0,0,0" Padding="10,4"/><TextBlock Text="{Binding Status}" Style="{StaticResource Hint}" VerticalAlignment="Center" MaxHeight="36" TextTrimming="CharacterEllipsis" ToolTip="{Binding Status}"/></DockPanel>
</Grid>
</Grid>
</UserControl>
<UserControl x:Class="XFEToolBox.Tools.SpaceEngineers.Views.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:XFEToolBox.WpfCore.Controls;assembly=XFEToolBox.WpfCore"
Background="{DynamicResource ToolControlBackgroundBrush}" Foreground="{DynamicResource ToolTextPrimaryBrush}" FontSize="13">
<UserControl.Resources>
<BooleanToVisibilityConverter x:Key="BooleanVisibility"/>
<Style x:Key="Card" TargetType="Border">
<Setter Property="Background" Value="{DynamicResource ToolSurfaceBrush}"/>
<Setter Property="BorderBrush" Value="{DynamicResource ToolControlBorderBrush}"/>
<Setter Property="BorderThickness" Value="1"/><Setter Property="CornerRadius" Value="12"/>
<Setter Property="Padding" Value="16"/>
</Style>
<Style x:Key="Hint" TargetType="TextBlock">
<Setter Property="Foreground" Value="{DynamicResource ToolTextSecondaryBrush}"/>
<Setter Property="TextWrapping" Value="Wrap"/>
</Style>
<Style x:Key="SectionTitle" TargetType="TextBlock">
<Setter Property="FontSize" Value="16"/><Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="Margin" Value="0,0,0,10"/>
</Style>
<Style x:Key="Action" TargetType="Button" BasedOn="{StaticResource ToolBoxButtonStyle}">
<Setter Property="Margin" Value="0,0,8,8"/><Setter Property="MinHeight" Value="32"/>
</Style>
<Style x:Key="Field" TargetType="controls:TextEditor" BasedOn="{StaticResource {x:Type controls:TextEditor}}">
<Setter Property="MinHeight" Value="34"/><Setter Property="VerticalAlignment" Value="Center"/>
</Style>
</UserControl.Resources>
<Grid Margin="16">
<Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="12"/><RowDefinition Height="*"/><RowDefinition Height="10"/><RowDefinition Height="Auto"/></Grid.RowDefinitions>
<Border Style="{StaticResource Card}" Padding="16,12">
<Grid>
<Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<StackPanel Margin="0,0,16,0">
<TextBlock Text="XFE Loader · Space Engineers" FontSize="21" FontWeight="SemiBold"/>
<TextBlock Text="{Binding ProcessStatus}" Style="{StaticResource Hint}" Margin="0,5,0,0"/>
</StackPanel>
<StackPanel Grid.Column="1" VerticalAlignment="Center">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
<Button Content="启动游戏" Command="{Binding LaunchCommand}" controls:ButtonAssist.IsPrimary="True" MinWidth="88"/>
<Button Content="正常退出" Command="{Binding CloseGameCommand}" Margin="8,0,0,0"/>
<Button Content="重启游戏" Command="{Binding RestartCommand}" Margin="8,0,0,0"/>
</StackPanel>
<TextBlock Text="退出与重启前请先保存存档" Style="{StaticResource Hint}" FontSize="11" HorizontalAlignment="Right" Margin="0,5,0,0"/>
</StackPanel>
</Grid>
</Border>
<TabControl Grid.Row="2" SelectedIndex="{Binding SelectedTab}">
<TabItem Header="插件管理">
<Grid Margin="0,12,0,0">
<Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="Auto"/><RowDefinition Height="*"/><RowDefinition Height="Auto"/></Grid.RowDefinitions>
<Grid Margin="0,0,0,10">
<Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<controls:TextEditor Text="{Binding Filter, UpdateSourceTrigger=PropertyChanged}" HintText="筛选插件名称、来源或路径" Style="{StaticResource Field}"/>
<ComboBox Grid.Column="1" ItemsSource="{Binding PluginFilters}" SelectedIndex="{Binding SelectedPluginFilter}" MinWidth="104" Margin="10,0,0,0"/>
<Button Grid.Column="2" Content="刷新清单" Command="{Binding RefreshCommand}" Margin="10,0,0,0"/>
</Grid>
<WrapPanel Grid.Row="1" IsEnabled="{Binding CanEdit}">
<Button Content="添加本地 DLL" Command="{Binding ImportDllCommand}" Style="{StaticResource Action}"/>
<Button Content="添加插件目录" Command="{Binding ImportDirectoryCommand}" Style="{StaticResource Action}" ToolTip="选择包含已编译插件 DLL 的目录,自动识别入口及依赖"/>
<Button Content="移除选中项" Command="{Binding RemovePluginCommand}" Style="{StaticResource Action}" ToolTip="从管理清单移除,保留插件文件;应用后生效"/>
</WrapPanel>
<Grid Grid.Row="2">
<Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<Border Style="{StaticResource Card}" Padding="0">
<Grid>
<DataGrid x:Name="PluginsGrid" ItemsSource="{Binding PluginsView}" SelectedItem="{Binding SelectedPlugin}"
AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False"
HeadersVisibility="Column" SelectionMode="Single" SelectionUnit="FullRow" RowHeaderWidth="0"
IsEnabled="{Binding CanEdit}" IsReadOnly="True" GridLinesVisibility="None" BorderThickness="0"
HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<DataGrid.Columns>
<DataGridTemplateColumn Header="启用" Width="64" CanUserSort="False">
<DataGridTemplateColumn.CellTemplate><DataTemplate><CheckBox IsChecked="{Binding IsEnabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource ToolBoxGridCheckBoxStyle}" AutomationProperties.Name="启用插件"/></DataTemplate></DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="插件" Width="*" MinWidth="150" SortMemberPath="Name">
<DataGridTemplateColumn.CellTemplate><DataTemplate><StackPanel Margin="8,8"><TextBlock Text="{Binding Name}" FontWeight="SemiBold" TextTrimming="CharacterEllipsis"/><TextBlock Text="{Binding Id}" Style="{StaticResource Hint}" TextWrapping="NoWrap" TextTrimming="CharacterEllipsis" FontSize="11" Margin="0,3,0,0"/></StackPanel></DataTemplate></DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="原始文件" Binding="{Binding SourcePath}" IsReadOnly="True" Width="1.3*" MinWidth="180">
<DataGridTextColumn.ElementStyle><Style TargetType="TextBlock" BasedOn="{StaticResource ToolBoxDataGridTextElementStyle}"><Setter Property="ToolTip" Value="{Binding SourcePath}"/></Style></DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
<StackPanel Visibility="{Binding ShowEmptyPlugins, Converter={StaticResource BooleanVisibility}}" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="30" IsHitTestVisible="False">
<TextBlock Text="{Binding EmptyPluginsTitle}" FontSize="18" FontWeight="SemiBold" TextAlignment="Center"/>
<TextBlock Text="{Binding EmptyPluginsHint}" Style="{StaticResource Hint}" TextAlignment="Center" MaxWidth="390" Margin="0,8,0,0"/>
</StackPanel>
</Grid>
</Border>
</Grid>
<StackPanel Grid.Row="3" Margin="0,10,0,0">
<Border Background="{DynamicResource ToolAccentSoftBrush}" CornerRadius="8" Padding="10,8" Visibility="{Binding HasSelectedPlugin, Converter={StaticResource BooleanVisibility}}" Margin="0,0,0,9">
<StackPanel><TextBlock Text="{Binding SelectedPlugin.Name}" FontWeight="SemiBold"/><TextBlock Text="{Binding SelectedPlugin.Description}" Style="{StaticResource Hint}" FontSize="12" MaxHeight="34" Margin="0,3,0,0"/><TextBlock Text="{Binding SelectedPlugin.Location}" Style="{StaticResource Hint}" FontSize="11" TextWrapping="NoWrap" TextTrimming="CharacterEllipsis" ToolTip="{Binding SelectedPlugin.Location}" Margin="0,3,0,0"/></StackPanel>
</Border>
<DockPanel LastChildFill="True">
<Button DockPanel.Dock="Right" Content="应用更改" Command="{Binding ApplyCommand}" controls:ButtonAssist.IsPrimary="True" MinWidth="112" Margin="14,0,0,0"/>
<StackPanel VerticalAlignment="Center"><TextBlock Text="{Binding PluginSummary}" FontWeight="SemiBold"/><TextBlock Text="{Binding ApplyHint}" Style="{StaticResource Hint}" FontSize="11" Margin="0,3,0,0"/></StackPanel>
</DockPanel>
</StackPanel>
</Grid>
</TabItem>
<TabItem Header="启动与环境">
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled" Margin="0,12,0,0">
<StackPanel IsEnabled="{Binding CanEdit}" Margin="0,0,8,0">
<Border Style="{StaticResource Card}">
<StackPanel>
<DockPanel><Button DockPanel.Dock="Right" Content="自动检测" Command="{Binding DetectCommand}"/><TextBlock Text="游戏与 XFE 加载器" Style="{StaticResource SectionTitle}"/></DockPanel>
<Grid><Grid.ColumnDefinitions><ColumnDefinition Width="98"/><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<TextBlock Text="游戏 Bin64" VerticalAlignment="Center" Style="{StaticResource Hint}"/>
<controls:TextEditor Grid.Column="1" Text="{Binding Bin64Path, UpdateSourceTrigger=PropertyChanged}" HintText="选择包含 SpaceEngineers.exe 的 Bin64 文件夹" Style="{StaticResource Field}"/>
<Button Grid.Column="2" Content="浏览" Command="{Binding BrowseGameCommand}" Margin="8,0,0,0"/>
</Grid>
<Grid Margin="0,10,0,0"><Grid.ColumnDefinitions><ColumnDefinition Width="98"/><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<TextBlock Text="加载组件" VerticalAlignment="Center" Style="{StaticResource Hint}"/>
<TextBlock Grid.Column="1" Text="XFE Loader" FontWeight="SemiBold" VerticalAlignment="Center"/>
<Button Grid.Column="2" Content="构建 / 更新 XFE 加载器" Command="{Binding BuildLoaderCommand}" Margin="8,0,0,0"/>
</Grid>
<TextBlock Text="{Binding LoaderStatus}" Style="{StaticResource Hint}" FontSize="12" Margin="98,7,0,0"/>
<Grid Margin="0,10,0,0"><Grid.ColumnDefinitions><ColumnDefinition Width="98"/><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<TextBlock Text="XFE 启动器" VerticalAlignment="Center" Style="{StaticResource Hint}"/>
<controls:TextEditor Grid.Column="1" Grid.ColumnSpan="2" Text="{Binding LauncherPath, Mode=OneWay}" IsReadOnly="True" HintText="构建后显示生成的启动器路径" Style="{StaticResource Field}"/>
</Grid>
<Grid Margin="0,10,0,0"><Grid.ColumnDefinitions><ColumnDefinition Width="98"/><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<TextBlock Text="插件配置" VerticalAlignment="Center" Style="{StaticResource Hint}"/>
<controls:TextEditor Grid.Column="1" Text="{Binding ProfilePath, UpdateSourceTrigger=PropertyChanged}" HintText="XFE 插件配置 JSON,留空使用工具独立配置" Style="{StaticResource Field}"/>
<Button Grid.Column="2" Content="浏览" Command="{Binding BrowseProfileCommand}" Margin="8,0,0,0"/>
</Grid>
</StackPanel>
</Border>
<Border Style="{StaticResource Card}" Margin="0,12,0,0">
<StackPanel>
<DockPanel><Button DockPanel.Dock="Right" Content="+ 添加参数" Command="{Binding AddArgumentCommand}"/><TextBlock Text="启动参数" Style="{StaticResource SectionTitle}"/></DockPanel>
<TextBlock Text="每行作为一个参数,无需自行添加引号。选项和它的值分别填写;空行保留为空字符串。" Style="{StaticResource Hint}" FontSize="12" Margin="0,0,0,10"/>
<ItemsControl ItemsSource="{Binding Arguments}">
<ItemsControl.ItemTemplate><DataTemplate><Grid Margin="0,0,0,8"><Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions><controls:TextEditor Text="{Binding Value, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource Field}"/><Button Grid.Column="1" Content="删除" Command="{Binding DataContext.RemoveArgumentCommand, RelativeSource={RelativeSource AncestorType=UserControl}}" CommandParameter="{Binding}" Margin="8,0,0,0"/></Grid></DataTemplate></ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</Border>
<Border Style="{StaticResource Card}" Margin="0,12,0,0">
<StackPanel>
<TextBlock Text="自动重启" Style="{StaticResource SectionTitle}"/>
<CheckBox Content="应用插件更改后,自动正常重启正在运行的游戏" IsChecked="{Binding AutoRestartAfterApply}" Margin="0,0,0,10"/>
<CheckBox Content="已启用插件的源文件变化后,自动同步并正常重启" IsChecked="{Binding RestartOnLocalChanges}" Margin="0,0,0,8"/>
<TextBlock Text="保存设置后开始监视。工具关闭或有未应用更改时暂停监视;请先保存存档,游戏未能正常退出时不会强制结束。" Style="{StaticResource Hint}" FontSize="12" Margin="24,0,0,10"/>
<StackPanel Orientation="Horizontal"><TextBlock Text="正常退出等待时间" Style="{StaticResource Hint}" VerticalAlignment="Center"/><controls:TextEditor Text="{Binding CloseTimeoutText, UpdateSourceTrigger=PropertyChanged}" Width="72" Margin="12,0,8,0" Style="{StaticResource Field}"/><TextBlock Text="秒" Style="{StaticResource Hint}" VerticalAlignment="Center"/></StackPanel>
</StackPanel>
</Border>
<WrapPanel Margin="0,12,0,0">
<Button Content="保存环境设置" Command="{Binding SaveSettingsCommand}" Style="{StaticResource Action}" controls:ButtonAssist.IsPrimary="True"/>
<Button Content="原版启动(不加载插件)" Command="{Binding LaunchVanillaCommand}" Style="{StaticResource Action}"/>
<Button Content="打开游戏目录" Command="{Binding OpenGameDirectoryCommand}" Style="{StaticResource Action}"/>
</WrapPanel>
</StackPanel>
</ScrollViewer>
</TabItem>
<TabItem Header="备份与日志">
<Grid Margin="0,12,0,0">
<Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="12"/><RowDefinition Height="*"/></Grid.RowDefinitions>
<Border Style="{StaticResource Card}">
<StackPanel>
<TextBlock Text="插件配置备份" Style="{StaticResource SectionTitle}"/>
<TextBlock Text="应用配置前自动备份。恢复插件清单与对应的 DLL 版本,不修改插件源文件和游戏存档。" Style="{StaticResource Hint}" FontSize="12" Margin="0,0,0,10"/>
<Grid><Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<ComboBox ItemsSource="{Binding Backups}" SelectedItem="{Binding SelectedBackup}" DisplayMemberPath="Name" MinHeight="34" ToolTip="{Binding SelectedBackup.Path}" IsEnabled="{Binding CanEdit}"/>
<Button Grid.Column="1" Content="刷新备份" Command="{Binding RefreshBackupsCommand}" Margin="8,0,0,0"/>
<Button Grid.Column="2" Content="恢复选中备份" Command="{Binding RestoreCommand}" Margin="8,0,0,0"/>
</Grid>
<TextBlock Text="{Binding BackupSummary}" Style="{StaticResource Hint}" FontSize="11" Margin="0,8,0,0"/>
</StackPanel>
</Border>
<Border Grid.Row="2" Style="{StaticResource Card}" Padding="12">
<Grid>
<Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/></Grid.RowDefinitions>
<DockPanel Margin="0,0,0,8"><StackPanel DockPanel.Dock="Right" Orientation="Horizontal"><Button Content="导出日志" Command="{Binding ExportLogCommand}"/><Button Content="清空" Command="{Binding ClearLogCommand}" Margin="8,0,0,0"/></StackPanel><TextBlock Text="运行日志" FontSize="16" FontWeight="SemiBold" VerticalAlignment="Center"/></DockPanel>
<TextBox x:Name="LogBox" Grid.Row="1" Text="{Binding LogText, Mode=OneWay}" IsReadOnly="True" AcceptsReturn="True" TextWrapping="Wrap" VerticalContentAlignment="Top" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled" BorderThickness="0" Background="Transparent" FontFamily="Cascadia Mono, Consolas" FontSize="12"/>
</Grid>
</Border>
</Grid>
</TabItem>
</TabControl>
<Grid Grid.Row="4">
<Grid.RowDefinitions><RowDefinition Height="3"/><RowDefinition Height="6"/><RowDefinition Height="Auto"/></Grid.RowDefinitions>
<ProgressBar IsIndeterminate="{Binding IsBusy}" Visibility="{Binding IsBusy, Converter={StaticResource BooleanVisibility}}" Height="3"/>
<DockPanel Grid.Row="2"><Button DockPanel.Dock="Right" Content="取消" Command="{Binding CancelCommand}" Visibility="{Binding IsBusy, Converter={StaticResource BooleanVisibility}}" Margin="12,0,0,0" Padding="10,4"/><TextBlock Text="{Binding Status}" Style="{StaticResource Hint}" VerticalAlignment="Center" MaxHeight="36" TextTrimming="CharacterEllipsis" ToolTip="{Binding Status}"/></DockPanel>
</Grid>
</Grid>
</UserControl>