Sviluppo TradingBot

This commit is contained in:
2026-06-09 18:29:41 +02:00
parent 61f1e59964
commit e3c0bd51b2
133 changed files with 24903 additions and 1 deletions
+438
View File
@@ -0,0 +1,438 @@
<UserControl x:Class="DesktopBot.Views.DashboardView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d">
<Grid Background="{StaticResource BackgroundDarkBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!-- HEADER -->
<Grid Grid.Row="0" Margin="24,20,24,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="Dashboard" Style="{StaticResource SectionTitle}" Margin="0"/>
<Border Background="#1A1A2E" BorderBrush="{StaticResource AccentGreenBrush}" BorderThickness="1" CornerRadius="4" Padding="8,3" Margin="12,0,6,0" VerticalAlignment="Center">
<TextBlock Text="PAPER" Foreground="{StaticResource AccentGreenBrush}" FontFamily="Segoe UI" FontSize="10" FontWeight="Bold"/>
</Border>
<Border Background="#1A1A2E" BorderBrush="{StaticResource BorderBrush}" BorderThickness="1" CornerRadius="4" Padding="8,3" VerticalAlignment="Center">
<TextBlock Text="{Binding AccountStatus}" Foreground="{StaticResource TextSecondaryBrush}" FontFamily="Segoe UI" FontSize="10" FontWeight="SemiBold"/>
</Border>
<TextBlock Text="{Binding AccountNumber, StringFormat=' #{0}'}" Foreground="{StaticResource TextSecondaryBrush}" FontFamily="Segoe UI Mono" FontSize="11" VerticalAlignment="Center" Margin="10,0,0,0"/>
</StackPanel>
<StackPanel Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="Caricamento..." Foreground="{StaticResource TextSecondaryBrush}" FontFamily="Segoe UI" FontSize="12" VerticalAlignment="Center" Margin="0,0,12,0" Visibility="{Binding IsLoading, Converter={StaticResource BoolToVisConverter}}"/>
<Button Content="&#8635; Aggiorna" Command="{Binding RefreshCommand}" Style="{StaticResource OutlineButton}" Padding="14,7"/>
</StackPanel>
</Grid>
<!-- KPI CARDS -->
<UniformGrid Grid.Row="1" Columns="5" Margin="24,16,24,0">
<Border Style="{StaticResource Card}" Margin="0,0,8,0">
<StackPanel>
<TextBlock Text="EQUITY" Style="{StaticResource LabelSecondary}" Margin="0,0,0,6"/>
<TextBlock Text="{Binding Equity, StringFormat='${0:N2}'}" Foreground="{StaticResource AccentGreenBrush}" FontFamily="Segoe UI" FontSize="20" FontWeight="Bold"/>
<TextBlock Text="Valore portafoglio" Style="{StaticResource LabelSecondary}" Margin="0,4,0,0"/>
</StackPanel>
</Border>
<Border Style="{StaticResource Card}" Margin="4,0">
<StackPanel>
<TextBlock Text="BUYING POWER" Style="{StaticResource LabelSecondary}" Margin="0,0,0,6"/>
<TextBlock Text="{Binding BuyingPower, StringFormat='${0:N2}'}" Foreground="{StaticResource TextPrimaryBrush}" FontFamily="Segoe UI" FontSize="20" FontWeight="Bold"/>
<TextBlock Text="Disponibile" Style="{StaticResource LabelSecondary}" Margin="0,4,0,0"/>
</StackPanel>
</Border>
<Border Style="{StaticResource Card}" Margin="4,0">
<StackPanel>
<TextBlock Text="P&amp;L GIORNALIERO" Style="{StaticResource LabelSecondary}" Margin="0,0,0,6"/>
<TextBlock Text="{Binding DailyPnL, StringFormat='{}{0:+$#,##0.00;-$#,##0.00;$0.00}'}" FontFamily="Segoe UI" FontSize="20" FontWeight="Bold">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="{StaticResource AccentRedBrush}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsPnLPositive}" Value="True">
<Setter Property="Foreground" Value="{StaticResource AccentGreenBrush}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
<TextBlock Text="{Binding DailyPnLPercent, StringFormat='{}{0:+0.00;-0.00;0.00}%'}" Style="{StaticResource LabelSecondary}" Margin="0,4,0,0"/>
</StackPanel>
</Border>
<Border Style="{StaticResource Card}" Margin="4,0">
<StackPanel>
<TextBlock Text="POSIZIONI" Style="{StaticResource LabelSecondary}" Margin="0,0,0,6"/>
<TextBlock Text="{Binding OpenPositionsCount}" Foreground="{StaticResource TextPrimaryBrush}" FontFamily="Segoe UI" FontSize="20" FontWeight="Bold"/>
<TextBlock Text="Trade aperti" Style="{StaticResource LabelSecondary}" Margin="0,4,0,0"/>
</StackPanel>
</Border>
<Border Style="{StaticResource Card}" Margin="8,0,0,0">
<StackPanel>
<TextBlock Text="ORDINI APERTI" Style="{StaticResource LabelSecondary}" Margin="0,0,0,6"/>
<TextBlock Text="{Binding OpenOrdersCount}" Foreground="{StaticResource TextPrimaryBrush}" FontFamily="Segoe UI" FontSize="20" FontWeight="Bold"/>
<TextBlock Text="In attesa esecuzione" Style="{StaticResource LabelSecondary}" Margin="0,4,0,0"/>
</StackPanel>
</Border>
</UniformGrid>
<!-- STATO BOT -->
<Border Grid.Row="2" Margin="24,14,24,0" Background="{StaticResource BackgroundPanelBrush}" BorderBrush="{StaticResource BorderBrush}" BorderThickness="1" CornerRadius="8" Padding="16,12">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0">
<TextBlock Text="STATO BOT" Style="{StaticResource LabelSecondary}" Margin="0,0,0,4"/>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<Ellipse Width="8" Height="8" Margin="0,0,7,0" VerticalAlignment="Center">
<Ellipse.Style>
<Style TargetType="Ellipse">
<Setter Property="Fill" Value="#888"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsBotRunning}" Value="True">
<Setter Property="Fill" Value="{StaticResource AccentGreenBrush}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Ellipse.Style>
</Ellipse>
<TextBlock Text="{Binding BotStatus}" FontFamily="Segoe UI" FontSize="13" FontWeight="SemiBold">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="{StaticResource TextSecondaryBrush}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsBotRunning}" Value="True">
<Setter Property="Foreground" Value="{StaticResource AccentGreenBrush}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</StackPanel>
</StackPanel>
<StackPanel Grid.Column="1">
<TextBlock Text="CONTO" Style="{StaticResource LabelSecondary}" Margin="0,0,0,4"/>
<TextBlock Text="{Binding AccountNumber, TargetNullValue='-'}" Foreground="{StaticResource TextPrimaryBrush}" FontFamily="Segoe UI Mono" FontSize="13"/>
</StackPanel>
<StackPanel Grid.Column="2">
<TextBlock Text="STATO CONTO" Style="{StaticResource LabelSecondary}" Margin="0,0,0,4"/>
<TextBlock Text="{Binding AccountStatus, TargetNullValue='-'}" Foreground="{StaticResource AccentGreenBrush}" FontFamily="Segoe UI" FontSize="13" FontWeight="SemiBold"/>
</StackPanel>
<StackPanel Grid.Column="3">
<TextBlock Text="VALUTA" Style="{StaticResource LabelSecondary}" Margin="0,0,0,4"/>
<TextBlock Text="{Binding Currency, TargetNullValue='-'}" Foreground="{StaticResource TextPrimaryBrush}" FontFamily="Segoe UI" FontSize="13"/>
</StackPanel>
</Grid>
</Border>
<!-- API COUNTER — Piano Basic gratuito: Market Data 200 req/min, Trading ~100 req/min -->
<Border Grid.Row="3" Margin="24,10,24,0" Background="{StaticResource BackgroundPanelBrush}" BorderBrush="{StaticResource BorderBrush}" BorderThickness="1" CornerRadius="8" Padding="16,10" DataContext="{Binding ApiCounter}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" Margin="0,0,8,0">
<TextBlock Text="MARKET DATA req/min" Style="{StaticResource LabelSecondary}" Margin="0,0,0,4"/>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding MarketDataRpm}" FontFamily="Segoe UI Mono" FontSize="16" FontWeight="Bold" VerticalAlignment="Center">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="{StaticResource AccentGreenBrush}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsMarketDataNearLimit}" Value="True">
<Setter Property="Foreground" Value="{StaticResource AccentRedBrush}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
<TextBlock Text=" / 200" Foreground="{StaticResource TextSecondaryBrush}" FontFamily="Segoe UI Mono" FontSize="12" VerticalAlignment="Center"/>
</StackPanel>
<ProgressBar Value="{Binding MarketDataUsagePercent, Mode=OneWay}" Maximum="100" Height="4" Margin="0,5,8,0">
<ProgressBar.Style>
<Style TargetType="ProgressBar">
<Setter Property="Foreground" Value="{StaticResource AccentGreenBrush}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsMarketDataNearLimit}" Value="True">
<Setter Property="Foreground" Value="{StaticResource AccentRedBrush}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ProgressBar.Style>
</ProgressBar>
</StackPanel>
<StackPanel Grid.Column="1" Margin="0,0,8,0">
<TextBlock Text="TRADING req/min" Style="{StaticResource LabelSecondary}" Margin="0,0,0,4"/>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding TradingRpm}" FontFamily="Segoe UI Mono" FontSize="16" FontWeight="Bold" VerticalAlignment="Center">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="{StaticResource AccentGreenBrush}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsTradingNearLimit}" Value="True">
<Setter Property="Foreground" Value="{StaticResource AccentRedBrush}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
<TextBlock Text=" / 100" Foreground="{StaticResource TextSecondaryBrush}" FontFamily="Segoe UI Mono" FontSize="12" VerticalAlignment="Center"/>
</StackPanel>
<ProgressBar Value="{Binding TradingUsagePercent, Mode=OneWay}" Maximum="100" Height="4" Margin="0,5,8,0">
<ProgressBar.Style>
<Style TargetType="ProgressBar">
<Setter Property="Foreground" Value="{StaticResource AccentGreenBrush}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsTradingNearLimit}" Value="True">
<Setter Property="Foreground" Value="{StaticResource AccentRedBrush}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ProgressBar.Style>
</ProgressBar>
</StackPanel>
<StackPanel Grid.Column="2">
<TextBlock Text="TOT MARKET DATA" Style="{StaticResource LabelSecondary}" Margin="0,0,0,4"/>
<TextBlock Text="{Binding TotalMarketDataCalls}" Foreground="{StaticResource TextPrimaryBrush}" FontFamily="Segoe UI Mono" FontSize="16" FontWeight="Bold"/>
</StackPanel>
<StackPanel Grid.Column="3">
<TextBlock Text="TOT TRADING" Style="{StaticResource LabelSecondary}" Margin="0,0,0,4"/>
<TextBlock Text="{Binding TotalTradingCalls}" Foreground="{StaticResource TextPrimaryBrush}" FontFamily="Segoe UI Mono" FontSize="16" FontWeight="Bold"/>
</StackPanel>
<StackPanel Grid.Column="4">
<TextBlock Text="RALLENTATE" Style="{StaticResource LabelSecondary}" Margin="0,0,0,4"/>
<TextBlock Text="{Binding ThrottledCalls}" Foreground="{StaticResource AccentRedBrush}" FontFamily="Segoe UI Mono" FontSize="16" FontWeight="Bold"/>
</StackPanel>
</Grid>
</Border>
<!-- ERRORE -->
<Border Grid.Row="4" Margin="24,10,24,0" Background="#2A1515" BorderBrush="{StaticResource AccentRedBrush}" BorderThickness="1" CornerRadius="6" Padding="14,8" Visibility="{Binding HasError, Converter={StaticResource BoolToVisConverter}}">
<TextBlock Text="{Binding ErrorMessage}" Foreground="{StaticResource AccentRedBrush}" FontFamily="Segoe UI" FontSize="12"/>
</Border>
<!-- POSIZIONI + ORDINI -->
<Grid Grid.Row="5" Margin="24,14,24,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="16"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Border Grid.Column="0" Background="{StaticResource BackgroundPanelBrush}" BorderBrush="{StaticResource BorderBrush}" BorderThickness="1" CornerRadius="8" Padding="0">
<DockPanel>
<Border DockPanel.Dock="Top" BorderBrush="{StaticResource BorderBrush}" BorderThickness="0,0,0,1" Padding="14,10">
<StackPanel Orientation="Horizontal">
<TextBlock Text="POSIZIONI APERTE" Foreground="{StaticResource TextSecondaryBrush}" FontFamily="Segoe UI" FontSize="11" FontWeight="SemiBold" VerticalAlignment="Center"/>
<TextBlock Text="{Binding OpenPositionsCount, StringFormat=' ({0})'}" Foreground="{StaticResource AccentGreenBrush}" FontFamily="Segoe UI" FontSize="11" FontWeight="SemiBold" VerticalAlignment="Center"/>
</StackPanel>
</Border>
<Grid DockPanel.Dock="Top" Background="{StaticResource BackgroundDarkBrush}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="60"/>
<ColumnDefinition Width="90"/>
<ColumnDefinition Width="90"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="SIMBOLO" Foreground="{StaticResource TextSecondaryBrush}" FontFamily="Segoe UI" FontSize="10" FontWeight="SemiBold" Padding="14,7,0,7"/>
<TextBlock Grid.Column="1" Text="QTY" Foreground="{StaticResource TextSecondaryBrush}" FontFamily="Segoe UI" FontSize="10" FontWeight="SemiBold" Padding="0,7" HorizontalAlignment="Right"/>
<TextBlock Grid.Column="2" Text="ENTRATA" Foreground="{StaticResource TextSecondaryBrush}" FontFamily="Segoe UI" FontSize="10" FontWeight="SemiBold" Padding="0,7" HorizontalAlignment="Right"/>
<TextBlock Grid.Column="3" Text="P&amp;L" Foreground="{StaticResource TextSecondaryBrush}" FontFamily="Segoe UI" FontSize="10" FontWeight="SemiBold" Padding="0,7,14,7" HorizontalAlignment="Right"/>
</Grid>
<ItemsControl DockPanel.Dock="Top" ItemsSource="{Binding Positions}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderBrush="{StaticResource BorderBrush}" BorderThickness="0,0,0,1" Padding="14,6">
<Border.Style>
<Style TargetType="Border">
<Setter Property="Background" Value="Transparent"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{StaticResource NavActiveBrush}"/>
</Trigger>
</Style.Triggers>
</Style>
</Border.Style>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="60"/>
<ColumnDefinition Width="90"/>
<ColumnDefinition Width="90"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding Symbol}" Foreground="{StaticResource AccentGreenBrush}" FontFamily="Segoe UI" FontWeight="SemiBold" FontSize="12" VerticalAlignment="Center"/>
<TextBlock Grid.Column="1" Text="{Binding Quantity}" Foreground="{StaticResource TextPrimaryBrush}" FontFamily="Segoe UI" FontSize="12" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<TextBlock Grid.Column="2" Text="{Binding EntryPrice}" Foreground="{StaticResource TextPrimaryBrush}" FontFamily="Segoe UI Mono" FontSize="12" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<TextBlock Grid.Column="3" Text="{Binding UnrealizedPnL}" FontFamily="Segoe UI Mono" FontSize="12" HorizontalAlignment="Right" VerticalAlignment="Center">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="{StaticResource AccentRedBrush}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsPnLPositive}" Value="True">
<Setter Property="Foreground" Value="{StaticResource AccentGreenBrush}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</Grid>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DockPanel>
</Border>
<Border Grid.Column="2" Background="{StaticResource BackgroundPanelBrush}" BorderBrush="{StaticResource BorderBrush}" BorderThickness="1" CornerRadius="8" Padding="0">
<DockPanel>
<Border DockPanel.Dock="Top" BorderBrush="{StaticResource BorderBrush}" BorderThickness="0,0,0,1" Padding="14,10">
<StackPanel Orientation="Horizontal">
<TextBlock Text="ULTIMI ORDINI" Foreground="{StaticResource TextSecondaryBrush}" FontFamily="Segoe UI" FontSize="11" FontWeight="SemiBold" VerticalAlignment="Center"/>
<TextBlock Text="{Binding OpenOrdersCount, StringFormat=' ({0} aperti)'}" Foreground="{StaticResource AccentGreenBrush}" FontFamily="Segoe UI" FontSize="11" FontWeight="SemiBold" VerticalAlignment="Center"/>
</StackPanel>
</Border>
<Grid DockPanel.Dock="Top" Background="{StaticResource BackgroundDarkBrush}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="60"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="60"/>
<ColumnDefinition Width="80"/>
<ColumnDefinition Width="100"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="LATO" Foreground="{StaticResource TextSecondaryBrush}" FontFamily="Segoe UI" FontSize="10" FontWeight="SemiBold" Padding="14,7,0,7"/>
<TextBlock Grid.Column="1" Text="SIMBOLO" Foreground="{StaticResource TextSecondaryBrush}" FontFamily="Segoe UI" FontSize="10" FontWeight="SemiBold" Padding="8,7"/>
<TextBlock Grid.Column="2" Text="QTY" Foreground="{StaticResource TextSecondaryBrush}" FontFamily="Segoe UI" FontSize="10" FontWeight="SemiBold" Padding="0,7" HorizontalAlignment="Right"/>
<TextBlock Grid.Column="3" Text="TIPO" Foreground="{StaticResource TextSecondaryBrush}" FontFamily="Segoe UI" FontSize="10" FontWeight="SemiBold" Padding="0,7" HorizontalAlignment="Center"/>
<TextBlock Grid.Column="4" Text="STATO" Foreground="{StaticResource TextSecondaryBrush}" FontFamily="Segoe UI" FontSize="10" FontWeight="SemiBold" Padding="0,7" HorizontalAlignment="Center"/>
</Grid>
<ItemsControl DockPanel.Dock="Top" ItemsSource="{Binding Orders}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderBrush="{StaticResource BorderBrush}" BorderThickness="0,0,0,1" Padding="0,4">
<Border.Style>
<Style TargetType="Border">
<Setter Property="Background" Value="Transparent"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{StaticResource NavActiveBrush}"/>
</Trigger>
</Style.Triggers>
</Style>
</Border.Style>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="60"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="60"/>
<ColumnDefinition Width="80"/>
<ColumnDefinition Width="100"/>
</Grid.ColumnDefinitions>
<Border Grid.Column="0" Background="{Binding SideBadgeColor}" CornerRadius="3" Padding="6,2" Margin="14,0,0,0" HorizontalAlignment="Left" VerticalAlignment="Center">
<TextBlock Text="{Binding Side}" Foreground="{StaticResource TextPrimaryBrush}" FontFamily="Consolas" FontSize="10" FontWeight="Bold"/>
</Border>
<TextBlock Grid.Column="1" Text="{Binding Symbol}" Foreground="{StaticResource TextPrimaryBrush}" FontFamily="Segoe UI" FontSize="12" Padding="8,0" VerticalAlignment="Center"/>
<TextBlock Grid.Column="2" Text="{Binding Qty}" Foreground="{StaticResource TextPrimaryBrush}" FontFamily="Segoe UI" FontSize="12" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<TextBlock Grid.Column="3" Text="{Binding OrderType}" Foreground="{StaticResource TextSecondaryBrush}" FontFamily="Segoe UI" FontSize="11" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<TextBlock Grid.Column="4" Text="{Binding Status}" Foreground="{StaticResource TextSecondaryBrush}" FontFamily="Segoe UI" FontSize="11" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DockPanel>
</Border>
</Grid>
<!-- LOG OPERAZIONI BOT -->
<Grid Grid.Row="6" Margin="24,14,24,20">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0" Margin="0,0,0,8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center">
<Ellipse Width="7" Height="7" Margin="0,0,8,0" VerticalAlignment="Center">
<Ellipse.Style>
<Style TargetType="Ellipse">
<Setter Property="Fill" Value="#888"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsBotRunning}" Value="True">
<Setter Property="Fill" Value="{StaticResource AccentGreenBrush}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Ellipse.Style>
</Ellipse>
<TextBlock Text="Log Operazioni Bot" Foreground="{StaticResource TextPrimaryBrush}" FontFamily="Segoe UI" FontSize="13" FontWeight="SemiBold" VerticalAlignment="Center"/>
<TextBlock Text="{Binding ActivityLog.Count, StringFormat=' ({0})'}" Foreground="{StaticResource TextSecondaryBrush}" FontFamily="Segoe UI" FontSize="12" VerticalAlignment="Center"/>
</StackPanel>
<StackPanel Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="Aggiornamento automatico in tempo reale" Foreground="{StaticResource TextSecondaryBrush}" FontFamily="Segoe UI" FontSize="11" VerticalAlignment="Center" Margin="0,0,10,0"/>
<Button Content="&#x1F4CB; Copia"
Command="{Binding CopyActivityLogCommand}"
Style="{StaticResource OutlineButton}"
Padding="10,4"
ToolTip="Copia tutti i log negli appunti"/>
</StackPanel>
</Grid>
<Border Grid.Row="1" Background="{StaticResource BackgroundPanelBrush}" BorderBrush="{StaticResource BorderBrush}" BorderThickness="1" CornerRadius="8" Padding="0">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<ItemsControl ItemsSource="{Binding ActivityLog}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderBrush="{StaticResource BorderBrush}" BorderThickness="0,0,0,1" Padding="16,7">
<Border.Style>
<Style TargetType="Border">
<Setter Property="Background" Value="Transparent"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{StaticResource NavActiveBrush}"/>
</Trigger>
</Style.Triggers>
</Style>
</Border.Style>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="140"/>
<ColumnDefinition Width="72"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding Timestamp, StringFormat='HH:mm:ss dd/MM/yy'}" Foreground="{StaticResource TextSecondaryBrush}" FontFamily="Consolas" FontSize="11" VerticalAlignment="Center"/>
<Border Grid.Column="1" Background="{Binding LevelBg}" CornerRadius="3" Padding="6,2" Margin="0,0,12,0" HorizontalAlignment="Left" VerticalAlignment="Center">
<TextBlock Text="{Binding Level}" Foreground="{Binding LevelColor}" FontFamily="Consolas" FontSize="10" FontWeight="Bold" VerticalAlignment="Center"/>
</Border>
<TextBlock Grid.Column="2" Text="{Binding Message}" Foreground="{StaticResource TextPrimaryBrush}" FontFamily="Segoe UI" FontSize="12" TextTrimming="CharacterEllipsis" VerticalAlignment="Center"/>
</Grid>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</Border>
</Grid>
</Grid>
</UserControl>