Refactoring e nuove funzionalità per AutoBidder v4.0

* Aggiornamento alla versione 4.0.0
* Refactoring architetturale: introdotte partial classes e UserControls modulari per migliorare manutenibilità e leggibilità.
* Aggiunti nuovi UserControls: `AuctionMonitorControl`, `BrowserControl`, `SettingsControl`, `StatisticsControl`.
* Introdotto supporto per WebView2 per il browser integrato.
* Migliorata gestione delle aste: aggiunta/rimozione tramite URL o ID, configurazione predefinita.
* Nuove funzionalità di esportazione: supporto CSV, JSON, XML con opzioni configurabili.
* Logging avanzato: codifica colore per severità e auto-scroll.
* Tema scuro moderno e miglioramenti UI/UX: sidebar di navigazione, griglie virtualizzate, icone emoji.
* Persistenza dati: salvataggio automatico di aste e impostazioni in file JSON.
* Documentazione aggiornata: `README.md`, `CHANGELOG.md` e nuovi file di supporto.
* Miglioramenti alla sicurezza: cookie di sessione salvati in modo sicuro con DPAPI.
* Preparazione per future estensioni: placeholder per funzionalità avanzate e struttura modulare.
This commit is contained in:
Alberto Balbo
2025-11-17 16:01:22 +01:00
parent 8717a3b6ef
commit 6036896f7d
35 changed files with 7088 additions and 2716 deletions
+566
View File
@@ -0,0 +1,566 @@
<UserControl x:Class="AutoBidder.Controls.AuctionMonitorControl"
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"
d:DesignHeight="800" d:DesignWidth="1200"
Background="#1E1E1E">
<UserControl.Resources>
<!-- Rounded Button Style -->
<Style x:Key="RoundedButton" TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border Background="{TemplateBinding Background}"
CornerRadius="8"
Padding="{TemplateBinding Padding}">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="Foreground" Value="White"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Padding" Value="15,10"/>
<Setter Property="FontSize" Value="13"/>
</Style>
<!-- Small Rounded Button -->
<Style x:Key="SmallRoundedButton" TargetType="Button" BasedOn="{StaticResource RoundedButton}">
<Setter Property="Padding" Value="12,6"/>
<Setter Property="FontSize" Value="12"/>
</Style>
<!-- Card Style -->
<Style x:Key="CardBorder" TargetType="Border">
<Setter Property="Background" Value="#252526"/>
<Setter Property="BorderBrush" Value="#3E3E42"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="CornerRadius" Value="4"/>
<Setter Property="Margin" Value="5"/>
</Style>
</UserControl.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!-- Header -->
<Border Grid.Row="0" Background="#2D2D30" Padding="15" BorderBrush="#3E3E42" BorderThickness="0,0,0,1">
<Grid>
<!-- Info Utente (Left) -->
<StackPanel Orientation="Vertical" VerticalAlignment="Center" HorizontalAlignment="Left">
<TextBlock x:Name="UsernameText"
Text="Utente: Non configurato"
Foreground="#00D800"
FontSize="13"
FontWeight="SemiBold"
Margin="0,0,0,5"/>
<StackPanel Orientation="Horizontal" Margin="0,0,0,3">
<TextBlock Text="Puntate: "
Foreground="#CCCCCC"
FontSize="12"/>
<TextBlock x:Name="RemainingBidsText"
Text="0"
Foreground="#CCCCCC"
FontSize="12"
FontWeight="Bold"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Aste vinte da confermare: "
Foreground="#FFB700"
FontSize="12"/>
<TextBlock x:Name="BannerAsteDaRiscattare"
Text="0"
Foreground="#FFB700"
FontSize="12"
FontWeight="Bold"/>
</StackPanel>
</StackPanel>
<!-- Control Buttons (Right) -->
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
<Button x:Name="StartButton"
Content="Avvia Tutti"
Background="#00D800"
Style="{StaticResource RoundedButton}"
Margin="5,0"
Click="StartButton_Click"/>
<Button x:Name="PauseAllButton"
Content="Pausa Tutti"
Background="#FFB700"
Style="{StaticResource RoundedButton}"
Margin="5,0"
Click="PauseAllButton_Click"/>
<Button x:Name="StopButton"
Content="Ferma Tutti"
Background="#E81123"
Style="{StaticResource RoundedButton}"
Margin="5,0"
Click="StopButton_Click"/>
<!-- Separator -->
<Border Width="1"
Background="#3E3E42"
Margin="10,5"/>
<!-- Export Button -->
<Button x:Name="ExportButton"
Content="Esporta"
Background="#007ACC"
Style="{StaticResource RoundedButton}"
Margin="5,0"
Click="ExportButton_Click"
ToolTip="Esporta dati aste monitorate"/>
</StackPanel>
</Grid>
</Border>
<!-- Main Layout: 2 rows -->
<Grid Grid.Row="1" Margin="5">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="5"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!-- TOP ROW: Auction Grid (2/3) + Global Log (1/3) -->
<Grid Grid.Row="0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*"/>
<ColumnDefinition Width="5"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- TOP LEFT: Auction Grid -->
<Border Grid.Column="0" Style="{StaticResource CardBorder}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!-- Grid Header -->
<Border Grid.Row="0" Background="#2D2D30" Padding="10,8" CornerRadius="4,4,0,0">
<Grid>
<TextBlock x:Name="MonitorateTitle"
Text="Aste monitorate: 0"
Foreground="#00D800"
FontSize="14"
FontWeight="Bold"
VerticalAlignment="Center"/>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
<Button Content="Aggiungi"
x:Name="AddUrlButton"
Background="#007ACC"
Style="{StaticResource SmallRoundedButton}"
Padding="10,5"
FontSize="11"
Margin="3,0"
Click="AddUrlButton_Click"/>
<Button Content="Rimuovi"
x:Name="RemoveUrlButton"
Background="#3E3E42"
Style="{StaticResource SmallRoundedButton}"
Padding="10,5"
FontSize="11"
Margin="3,0"
Click="RemoveUrlButton_Click"/>
</StackPanel>
</Grid>
</Border>
<!-- Auction DataGrid -->
<DataGrid Grid.Row="1"
x:Name="MultiAuctionsGrid"
AutoGenerateColumns="False"
SelectionMode="Single"
CanUserAddRows="False"
IsReadOnly="True"
GridLinesVisibility="Horizontal"
HeadersVisibility="Column"
Background="#1E1E1E"
Foreground="#CCCCCC"
RowBackground="#1E1E1E"
AlternatingRowBackground="#252526"
BorderThickness="0"
SelectionChanged="MultiAuctionsGrid_SelectionChanged"
KeyDown="MultiAuctionsGrid_KeyDown">
<DataGrid.ColumnHeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="Background" Value="#2D2D30"/>
<Setter Property="Foreground" Value="#CCCCCC"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Padding" Value="8,6"/>
<Setter Property="BorderThickness" Value="0,0,1,1"/>
<Setter Property="BorderBrush" Value="#3E3E42"/>
<Setter Property="FontSize" Value="11"/>
</Style>
</DataGrid.ColumnHeaderStyle>
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Padding" Value="8,4"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Foreground" Value="#CCCCCC"/>
<Setter Property="FontSize" Value="11"/>
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="#094771"/>
<Setter Property="Foreground" Value="White"/>
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.CellStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding AuctionId}" Width="90"/>
<DataGridTextColumn Header="Asta" Binding="{Binding Name}" Width="2*"/>
<DataGridTextColumn Header="Latenza" Binding="{Binding AuctionInfo.PollingLatencyMs}" Width="70"/>
<DataGridTextColumn Header="Stato" Binding="{Binding StatusDisplay}" Width="100"/>
<DataGridTextColumn Header="Timer" Binding="{Binding TimerDisplay}" Width="90"/>
<DataGridTextColumn Header="Prezzo" Binding="{Binding PriceDisplay}" Width="70"/>
<DataGridTextColumn Header="Ultimo" Binding="{Binding LastBidder}" Width="110"/>
<DataGridTextColumn Header="Clicks" Binding="{Binding MyClicks}" Width="60"/>
<DataGridTextColumn Header="Resets" Binding="{Binding ResetCount}" Width="60"/>
<DataGridTemplateColumn Header="Azioni" Width="260">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Button Content="Avvia"
Background="#00D800"
Style="{StaticResource SmallRoundedButton}"
Padding="6,3"
FontSize="10"
Margin="1"/>
<Button Content="Pausa"
Background="#FFB700"
Style="{StaticResource SmallRoundedButton}"
Padding="6,3"
FontSize="10"
Margin="1"/>
<Button Content="Ferma"
Background="#E81123"
Style="{StaticResource SmallRoundedButton}"
Padding="6,3"
FontSize="10"
Margin="1"/>
<Button Content="Punta"
Background="#9B4F96"
Style="{StaticResource SmallRoundedButton}"
Padding="6,3"
FontSize="10"
Margin="1"/>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Border>
<!-- Vertical Splitter -->
<GridSplitter Grid.Column="1"
Width="5"
HorizontalAlignment="Stretch"
Background="#3E3E42"
ResizeBehavior="PreviousAndNext"/>
<!-- TOP RIGHT: Global Log -->
<Border Grid.Column="2" Style="{StaticResource CardBorder}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!-- Header -->
<Border Grid.Row="0" Background="#2D2D30" Padding="10,8" CornerRadius="4,4,0,0">
<Grid>
<TextBlock Text="Log Globale"
Foreground="#00D800"
FontSize="13"
FontWeight="Bold"
VerticalAlignment="Center"/>
<Button x:Name="ClearGlobalLogButton"
Content="Pulisci"
HorizontalAlignment="Right"
Background="#3E3E42"
Style="{StaticResource SmallRoundedButton}"
Padding="8,4"
FontSize="10"
Click="ClearGlobalLogButton_Click"/>
</Grid>
</Border>
<!-- Log Box -->
<RichTextBox Grid.Row="1"
x:Name="LogBox"
IsReadOnly="True"
VerticalScrollBarVisibility="Auto"
Background="#1E1E1E"
Foreground="#00D800"
BorderThickness="0"
FontFamily="Consolas"
FontSize="10"
Padding="8"/>
</Grid>
</Border>
</Grid>
<!-- Horizontal Splitter -->
<GridSplitter Grid.Row="1"
Height="5"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Background="#3E3E42"
ResizeBehavior="PreviousAndNext"/>
<!-- BOTTOM ROW: Settings (1/3) + Bidders (1/3) + Auction Log (1/3) -->
<Grid Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="5"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="5"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- BOTTOM LEFT: Settings (Impostazioni) -->
<Border Grid.Column="0" Style="{StaticResource CardBorder}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- Header -->
<Border Grid.Row="0" Background="#2D2D30" Padding="10,8" CornerRadius="4,4,0,0">
<TextBlock Text="Impostazioni"
Foreground="#00D800"
FontSize="13"
FontWeight="Bold"/>
</Border>
<!-- Settings Content -->
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto">
<StackPanel Margin="10">
<TextBlock x:Name="SelectedAuctionName"
Text="Seleziona un'asta"
Foreground="White"
FontSize="13"
FontWeight="Bold"
Margin="0,0,0,8"/>
<TextBox x:Name="SelectedAuctionUrl"
IsReadOnly="True"
Background="#1E1E1E"
Foreground="#999999"
BorderBrush="#3E3E42"
BorderThickness="1"
Padding="6"
FontSize="10"
Margin="0,0,0,8"
TextWrapping="Wrap"
MaxHeight="50"/>
<UniformGrid Columns="3" Margin="0,0,0,15">
<Button Content="Apri"
Background="#007ACC"
Style="{StaticResource SmallRoundedButton}"
Padding="8,5"
FontSize="10"
Margin="0,0,3,0"/>
<Button x:Name="CopyAuctionUrlButton"
Content="Copia"
Background="#9B4F96"
Style="{StaticResource SmallRoundedButton}"
Padding="8,5"
FontSize="10"
Margin="0,0,3,0"
Click="CopyAuctionUrlButton_Click"/>
<Button Content="Esporta"
Background="#106EBE"
Style="{StaticResource SmallRoundedButton}"
Padding="8,5"
FontSize="10"/>
</UniformGrid>
<!-- Settings Grid - Campi piu larghi (100px) -->
<Grid Margin="0,0,0,8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="15"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="100"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- Row 1 -->
<TextBlock Grid.Row="0" Grid.Column="0" Text="Timer (s):" Foreground="#CCCCCC" FontSize="11" Margin="0,6" VerticalAlignment="Center"/>
<TextBox Grid.Row="0" Grid.Column="1" x:Name="SelectedTimerClick" Background="#1E1E1E" Foreground="White" BorderBrush="#3E3E42" Padding="6" Margin="5,6" FontSize="11" TextChanged="SelectedTimerClick_TextChanged"/>
<TextBlock Grid.Row="0" Grid.Column="3" Text="Delay (ms):" Foreground="#CCCCCC" FontSize="11" Margin="0,6" VerticalAlignment="Center"/>
<TextBox Grid.Row="0" Grid.Column="4" x:Name="SelectedDelayMs" Background="#1E1E1E" Foreground="White" BorderBrush="#3E3E42" Padding="6" Margin="5,6" FontSize="11" TextChanged="SelectedDelayMs_TextChanged"/>
<!-- Row 2 -->
<TextBlock Grid.Row="1" Grid.Column="0" Text="Min EUR:" Foreground="#CCCCCC" FontSize="11" Margin="0,6" VerticalAlignment="Center"/>
<TextBox Grid.Row="1" Grid.Column="1" x:Name="SelectedMinPrice" Background="#1E1E1E" Foreground="White" BorderBrush="#3E3E42" Padding="6" Margin="5,6" FontSize="11" TextChanged="SelectedMinPrice_TextChanged"/>
<TextBlock Grid.Row="1" Grid.Column="3" Text="Max EUR:" Foreground="#CCCCCC" FontSize="11" Margin="0,6" VerticalAlignment="Center"/>
<TextBox Grid.Row="1" Grid.Column="4" x:Name="SelectedMaxPrice" Background="#1E1E1E" Foreground="White" BorderBrush="#3E3E42" Padding="6" Margin="5,6" FontSize="11" TextChanged="SelectedMaxPrice_TextChanged"/>
<!-- Row 3 -->
<TextBlock Grid.Row="2" Grid.Column="0" Text="Max Clicks:" Foreground="#CCCCCC" FontSize="11" Margin="0,6" VerticalAlignment="Center"/>
<TextBox Grid.Row="2" Grid.Column="1" x:Name="SelectedMaxClicks" Background="#1E1E1E" Foreground="White" BorderBrush="#3E3E42" Padding="6" Margin="5,6" FontSize="11" TextChanged="SelectedMaxClicks_TextChanged"/>
</Grid>
</StackPanel>
</ScrollViewer>
<!-- Footer Button (bottom like other panels) -->
<Button Grid.Row="2"
x:Name="ResetSettingsButton"
Content="Reset"
Background="#3E3E42"
Style="{StaticResource SmallRoundedButton}"
HorizontalAlignment="Stretch"
Margin="5"
Click="ResetSettingsButton_Click"/>
</Grid>
</Border>
<!-- Vertical Splitter 1 -->
<GridSplitter Grid.Column="1"
Width="5"
HorizontalAlignment="Stretch"
Background="#3E3E42"
ResizeBehavior="PreviousAndNext"/>
<!-- BOTTOM CENTER: Bidders List (Utenti) -->
<Border Grid.Column="2" Style="{StaticResource CardBorder}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- Header -->
<Border Grid.Row="0" Background="#2D2D30" Padding="10,8" CornerRadius="4,4,0,0">
<TextBlock x:Name="SelectedAuctionBiddersCount"
Text="Utenti: 0"
Foreground="#00D800"
FontSize="13"
FontWeight="Bold"/>
</Border>
<!-- Bidders Grid -->
<DataGrid Grid.Row="1"
x:Name="SelectedAuctionBiddersGrid"
AutoGenerateColumns="False"
IsReadOnly="True"
Background="#1E1E1E"
Foreground="#CCCCCC"
RowBackground="#1E1E1E"
AlternatingRowBackground="#252526"
GridLinesVisibility="None"
HeadersVisibility="Column"
BorderThickness="0"
FontSize="11">
<DataGrid.ColumnHeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="Background" Value="#2D2D30"/>
<Setter Property="Foreground" Value="#CCCCCC"/>
<Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="Padding" Value="8,5"/>
<Setter Property="FontSize" Value="11"/>
</Style>
</DataGrid.ColumnHeaderStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="Utente" Binding="{Binding Username}" Width="*"/>
<DataGridTextColumn Header="Punt." Binding="{Binding BidCount}" Width="50"/>
<DataGridTextColumn Header="Ultima" Binding="{Binding LastBidTimeDisplay}" Width="70"/>
</DataGrid.Columns>
</DataGrid>
<!-- Footer Button -->
<Button Grid.Row="2"
x:Name="ClearBiddersButton"
Content="Pulisci"
Background="#3E3E42"
Style="{StaticResource SmallRoundedButton}"
HorizontalAlignment="Stretch"
Margin="5"
Click="ClearBiddersButton_Click"/>
</Grid>
</Border>
<!-- Vertical Splitter 2 -->
<GridSplitter Grid.Column="3"
Width="5"
HorizontalAlignment="Stretch"
Background="#3E3E42"
ResizeBehavior="PreviousAndNext"/>
<!-- BOTTOM RIGHT: Auction Log -->
<Border Grid.Column="4" Style="{StaticResource CardBorder}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!-- Header -->
<Border Grid.Row="0" Background="#2D2D30" Padding="10,8" CornerRadius="4,4,0,0">
<Grid>
<TextBlock Text="Log Asta"
Foreground="#00D800"
FontSize="13"
FontWeight="Bold"
VerticalAlignment="Center"/>
<Button x:Name="ClearLogButton"
Content="Pulisci"
HorizontalAlignment="Right"
Background="#3E3E42"
Style="{StaticResource SmallRoundedButton}"
Padding="8,4"
FontSize="10"
Click="ClearLogButton_Click"/>
</Grid>
</Border>
<!-- Auction Log Box -->
<RichTextBox Grid.Row="1"
x:Name="SelectedAuctionLog"
IsReadOnly="True"
VerticalScrollBarVisibility="Auto"
Background="#1E1E1E"
Foreground="#CCCCCC"
BorderThickness="0"
FontFamily="Consolas"
FontSize="10"
Padding="8"/>
</Grid>
</Border>
</Grid>
</Grid>
</Grid>
</UserControl>