/
romashov.z
/
PPAGame
Обзор
Документация
Войти
/
romashov.z
/
PPAGame
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
gameUI-clean
PPAGameUI/Views/BattleView.axaml
367 строк
20 KB
Artemiy Ivanov
fix: панель с армией
02 июн 2026, 14:14
02 июн 2026, 14:14
d2ad2a0
Код
Авторство
О чём код?
<UserControl xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:vm="using:PPAGameUI.ViewModels" xmlns:conv="using:PPAGameUI.Converters" x:Class="PPAGameUI.Views.BattleView" x:DataType="vm:BattleViewModel"> <UserControl.Resources> <conv:HealthToColorConverter x:Key="HealthToColor" /> <conv:AliveToOpacityConverter x:Key="AliveToOpacity" /> <conv:LogEntryColorConverter x:Key="LogEntryColor" /> </UserControl.Resources> <!-- Подсветка передовой линии --> <UserControl.Styles> <Style Selector="Border.frontunit"> <Setter Property="BorderBrush" Value="#A6E3A1"/> <Setter Property="BorderThickness" Value="1.5"/> </Style> </UserControl.Styles> <Panel> <Grid RowDefinitions="Auto,*,Auto" Margin="16"> <!-- Статус бар --> <Border Grid.Row="0" Background="#313244" CornerRadius="10" Padding="14,8" Margin="0,0,0,8"> <Grid ColumnDefinitions="*,Auto"> <StackPanel Spacing="4"> <StackPanel Orientation="Horizontal" Spacing="16"> <TextBlock Text="{Binding StatusText}" FontSize="14" Foreground="#CDD6F4" VerticalAlignment="Center" /> <TextBlock Text="|" Foreground="#45475A" VerticalAlignment="Center" /> <TextBlock Text="{Binding CurrentStrategy}" FontSize="13" Foreground="#89B4FA" VerticalAlignment="Center" /> </StackPanel> <TextBlock Text="{Binding LastActionText}" FontSize="13" Foreground="#F9E2AF" FontWeight="SemiBold" IsVisible="{Binding LastActionText, Converter={x:Static StringConverters.IsNotNullOrEmpty}}" /> </StackPanel> <Button Grid.Column="1" Content="💾 Сохранить и выйти" Command="{Binding SaveAndExitCommand}" Background="#45475A" Foreground="#CDD6F4" CornerRadius="6" Padding="12,6" VerticalAlignment="Top" /> </Grid> </Border> <!-- Армии + лог --> <!-- Col 0: Армия 1 | Col 1: Армия 2 | Col 2: Лог --> <Grid Grid.Row="1" ColumnDefinitions="*,*,215"> <!-- ══════════════ АРМИЯ 1 ══════════════ --> <Border Grid.Column="0" Background="#1E3A5F" CornerRadius="10" Padding="12" Margin="0,0,6,0"> <Grid RowDefinitions="Auto,Auto,*"> <TextBlock Grid.Row="0" Text="{Binding Army1.Name}" FontSize="18" FontWeight="Bold" Foreground="#89B4FA" Margin="0,0,0,2" /> <TextBlock Grid.Row="1" FontSize="12" Foreground="#6C7086" Margin="0,0,0,8"> <Run Text="Живых: " /> <Run Text="{Binding Army1.AliveCount}" /> <Run Text=" · ряд 0 = передовая ▼" /> </TextBlock> <ScrollViewer Grid.Row="2" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> <ItemsControl ItemsSource="{Binding Army1.Grid}"> <ItemsControl.ItemTemplate> <DataTemplate> <ItemsControl ItemsSource="{Binding}" Margin="0,0,0,4"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <StackPanel Orientation="Horizontal" Spacing="4" /> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> <ItemsControl.ItemTemplate> <DataTemplate DataType="{x:Type vm:UnitViewModel}"> <Border Classes.frontunit="{Binding IsFrontRow}" Background="#313244" CornerRadius="8" Padding="10,8" MinWidth="120" Opacity="{Binding IsAlive, Converter={StaticResource AliveToOpacity}}" ToolTip.Tip="{Binding Tooltip}"> <StackPanel Spacing="4"> <StackPanel Orientation="Horizontal" Spacing="6"> <TextBlock Text="{Binding Icon}" FontSize="14" /> <TextBlock Text="{Binding Name}" FontSize="12" Foreground="#CDD6F4" FontWeight="SemiBold" /> </StackPanel> <ProgressBar Value="{Binding Health}" Minimum="0" Maximum="{Binding MaxHealth}" Height="6" Foreground="{Binding HealthRatio, Converter={StaticResource HealthToColor}}" Background="#2A2A3E" CornerRadius="3" /> <TextBlock FontSize="10" Foreground="#6C7086"> <Run Text="{Binding Health, StringFormat='{}{0:F0}'}" /> <Run Text="/" /> <Run Text="{Binding MaxHealth, StringFormat='{}{0:F0}'}" /> </TextBlock> </StackPanel> </Border> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </ScrollViewer> </Grid> </Border> <!-- ══════════════ АРМИЯ 2 ══════════════ --> <Border Grid.Column="1" Background="#3A1E2E" CornerRadius="10" Padding="12" Margin="0,0,6,0"> <Grid RowDefinitions="Auto,Auto,*"> <TextBlock Grid.Row="0" Text="{Binding Army2.Name}" FontSize="18" FontWeight="Bold" Foreground="#F38BA8" Margin="0,0,0,2" /> <TextBlock Grid.Row="1" FontSize="12" Foreground="#6C7086" Margin="0,0,0,8"> <Run Text="Живых: " /> <Run Text="{Binding Army2.AliveCount}" /> <Run Text=" · ряд 0 = передовая ▼" /> </TextBlock> <ScrollViewer Grid.Row="2" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> <ItemsControl ItemsSource="{Binding Army2.Grid}"> <ItemsControl.ItemTemplate> <DataTemplate> <ItemsControl ItemsSource="{Binding}" Margin="0,0,0,4"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <StackPanel Orientation="Horizontal" Spacing="4" /> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> <ItemsControl.ItemTemplate> <DataTemplate DataType="{x:Type vm:UnitViewModel}"> <Border Classes.frontunit="{Binding IsFrontRow}" Background="#313244" CornerRadius="8" Padding="10,8" MinWidth="120" Opacity="{Binding IsAlive, Converter={StaticResource AliveToOpacity}}" ToolTip.Tip="{Binding Tooltip}"> <StackPanel Spacing="4"> <StackPanel Orientation="Horizontal" Spacing="6"> <TextBlock Text="{Binding Icon}" FontSize="14" /> <TextBlock Text="{Binding Name}" FontSize="12" Foreground="#CDD6F4" FontWeight="SemiBold" /> </StackPanel> <ProgressBar Value="{Binding Health}" Minimum="0" Maximum="{Binding MaxHealth}" Height="6" Foreground="{Binding HealthRatio, Converter={StaticResource HealthToColor}}" Background="#2A2A3E" CornerRadius="3" /> <TextBlock FontSize="10" Foreground="#6C7086"> <Run Text="{Binding Health, StringFormat='{}{0:F0}'}" /> <Run Text="/" /> <Run Text="{Binding MaxHealth, StringFormat='{}{0:F0}'}" /> </TextBlock> </StackPanel> </Border> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </ScrollViewer> </Grid> </Border> <!-- ══════════════ ЛОГ БОЯ ══════════════ --> <Border Grid.Column="2" Background="#313244" CornerRadius="10" Padding="12"> <Grid RowDefinitions="Auto,*"> <!-- Заголовок с кнопкой копирования --> <Grid Grid.Row="0" ColumnDefinitions="*,Auto" Margin="0,0,0,8"> <TextBlock Grid.Column="0" Text="📋 Лог боя" FontSize="14" FontWeight="Bold" Foreground="#CDD6F4" VerticalAlignment="Center" /> <Button Grid.Column="1" Content="⎘ Копировать" Command="{Binding CopyLogCommand}" Background="#45475A" Foreground="#CDD6F4" CornerRadius="5" Padding="6,3" FontSize="11" ToolTip.Tip="Скопировать весь лог в буфер обмена" /> </Grid> <!-- Записи лога (SelectableTextBlock позволяет выделять текст) --> <ScrollViewer Grid.Row="1"> <ItemsControl ItemsSource="{Binding BattleLog}"> <ItemsControl.ItemTemplate> <DataTemplate> <SelectableTextBlock Text="{Binding}" FontSize="11" Foreground="{Binding Converter={StaticResource LogEntryColor}}" TextWrapping="Wrap" Margin="0,1" /> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </ScrollViewer> </Grid> </Border> </Grid> <!-- Панель управления --> <Border Grid.Row="2" Background="#313244" CornerRadius="10" Padding="16,10" Margin="0,12,0,0"> <StackPanel Orientation="Horizontal" Spacing="8"> <Button Content="▶ Ход" Command="{Binding MakeMoveCommand}" IsEnabled="{Binding CanAct}" Background="#A6E3A1" Foreground="#1E1E2E" CornerRadius="6" Padding="16,8" FontSize="14" FontWeight="Bold" /> <Button Content="⏩ До конца" Command="{Binding FightToEndCommand}" IsEnabled="{Binding CanAct}" Background="#313244" Foreground="#CDD6F4" CornerRadius="6" Padding="12,8" /> <Rectangle Width="1" Fill="#45475A" Margin="4,0" /> <Button Content="↩ Отмена" Command="{Binding UndoCommand}" IsEnabled="{Binding CanUndo}" Background="#313244" Foreground="#CDD6F4" CornerRadius="6" Padding="12,8" /> <Button Content="↪ Повтор" Command="{Binding RedoCommand}" IsEnabled="{Binding CanRedo}" Background="#313244" Foreground="#CDD6F4" CornerRadius="6" Padding="12,8" /> <Button Content="⟳ Сброс" Command="{Binding ResetCommand}" Background="#313244" Foreground="#FAB387" CornerRadius="6" Padding="12,8" /> <Rectangle Width="1" Fill="#45475A" Margin="4,0" /> <TextBlock Text="Построение:" Foreground="#6C7086" VerticalAlignment="Center" FontSize="13" /> <Button Content="Узкий мост" Command="{Binding ChangeStrategyCommand}" CommandParameter="NarrowBridge" Background="#1E3A5F" Foreground="#89B4FA" CornerRadius="6" Padding="10,8" FontSize="12" /> <Button Content="Широкий мост" Command="{Binding ChangeStrategyCommand}" CommandParameter="WideBridge" Background="#1E3A5F" Foreground="#89B4FA" CornerRadius="6" Padding="10,8" FontSize="12" /> <Button Content="Стенка" Command="{Binding ChangeStrategyCommand}" CommandParameter="Wall" Background="#1E3A5F" Foreground="#89B4FA" CornerRadius="6" Padding="10,8" FontSize="12" /> </StackPanel> </Border> </Grid> <!-- Оверлей победы --> <Border IsVisible="{Binding BattleEnded}" Background="#CC000000" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> <Border Background="#1E1E2E" CornerRadius="20" Padding="60,48" HorizontalAlignment="Center" VerticalAlignment="Center" BorderBrush="#A6E3A1" BorderThickness="2" MinWidth="380"> <StackPanel HorizontalAlignment="Center" Spacing="16"> <TextBlock Text="{Binding WinnerEmoji}" FontSize="72" HorizontalAlignment="Center" /> <TextBlock Text="{Binding WinnerText}" FontSize="34" FontWeight="Bold" Foreground="#A6E3A1" HorizontalAlignment="Center" TextAlignment="Center" /> <TextBlock Text="Бой завершён" FontSize="14" Foreground="#6C7086" HorizontalAlignment="Center" Margin="0,0,0,16" /> <Button Content="← В главное меню" Command="{Binding SaveAndExitCommand}" HorizontalAlignment="Center" Background="#A6E3A1" Foreground="#1E1E2E" CornerRadius="10" Padding="32,12" FontSize="16" FontWeight="Bold" /> </StackPanel> </Border> </Border> </Panel> </UserControl>