diff --git a/HorseRacingPredictor/HorseRacingPredictor/BettingPredictor.csproj b/HorseRacingPredictor/HorseRacingPredictor/BettingPredictor.csproj
index a289333..f373d91 100644
--- a/HorseRacingPredictor/HorseRacingPredictor/BettingPredictor.csproj
+++ b/HorseRacingPredictor/HorseRacingPredictor/BettingPredictor.csproj
@@ -200,6 +200,31 @@
+
+ Component
+
+
+ Component
+
+
+ Component
+
+
+ Component
+
+
+ Component
+
+
+ Component
+
+
+ Component
+
+
+ Component
+
+
Main.cs
diff --git a/HorseRacingPredictor/HorseRacingPredictor/Main.Designer.cs b/HorseRacingPredictor/HorseRacingPredictor/Main.Designer.cs
index 943225d..20c3b52 100644
--- a/HorseRacingPredictor/HorseRacingPredictor/Main.Designer.cs
+++ b/HorseRacingPredictor/HorseRacingPredictor/Main.Designer.cs
@@ -1,6 +1,9 @@
using System;
using System.Data;
using System.Windows.Forms;
+using System.Drawing;
+using BettingPredictor.UI.Controls;
+using BettingPredictor.UI;
namespace BettingPredictor
{
@@ -9,37 +12,29 @@ namespace BettingPredictor
// Container
private System.ComponentModel.IContainer components = null;
- // Grafica
- private TabControl tabControl;
+ // Grafica moderna
+ private ModernTabControl tabControl;
// Horse tab
private TabPage tabPageHorse;
- private TextBox textBoxFolderPath;
- private Button buttonBrowse;
- private Button buttonPredict; // New button for predictions
- private Button buttonImport; // New button for import
- private ProgressBar progressBarHorse;
- private Label labelStatusHorse;
- private DataGridView dataGridViewHorse;
+ private ModernPanel panelHorseTop;
+ private ModernTextBox textBoxFolderPath;
+ private ModernButton buttonBrowse;
+ private ModernButton buttonPredict;
+ private ModernButton buttonImport;
+ private ModernProgressBar progressBarHorse;
+ private ModernLabel labelStatusHorse;
+ private ModernDataGridView dataGridViewHorse;
- // Replace the buttonLoadFootball with buttonImportFootball and add buttonDownloadFootball
// Football tab
private TabPage tabPageFootball;
- private DateTimePicker dateTimePicker;
- private Button buttonImportFootball;
- private Button buttonDownloadFootball;
- private DataGridView dataGridViewFootball;
- private ProgressBar progressBarFootball;
- private Label labelStatusFootball;
-
- // ApiOptions class definition - rimosso GetLeagueData
- public static class ApiOptions
- {
- public const string GetLeagueFixtures = "Visualizza elenco partite alla data";
- public const string GetLeagueOdds = "Visualizza elenco quote partite";
-
- public static readonly string[] AllOptions = { GetLeagueFixtures, GetLeagueOdds };
- }
+ private ModernPanel panelFootballTop;
+ private ModernDateTimePicker dateTimePicker;
+ private ModernButton buttonImportFootball;
+ private ModernButton buttonDownloadFootball;
+ private ModernDataGridView dataGridViewFootball;
+ private ModernProgressBar progressBarFootball;
+ private ModernLabel labelStatusFootball;
protected override void Dispose(bool disposing)
{
@@ -53,308 +48,313 @@ namespace BettingPredictor
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
- this.tabControl = new System.Windows.Forms.TabControl();
-
- // Horse Tab
- this.tabPageHorse = new System.Windows.Forms.TabPage();
- this.textBoxFolderPath = new System.Windows.Forms.TextBox();
- this.buttonBrowse = new System.Windows.Forms.Button();
- this.buttonPredict = new System.Windows.Forms.Button(); // New button for predictions
- this.buttonImport = new System.Windows.Forms.Button(); // New button for import
- this.progressBarHorse = new System.Windows.Forms.ProgressBar();
- this.labelStatusHorse = new System.Windows.Forms.Label();
- this.dataGridViewHorse = new System.Windows.Forms.DataGridView();
-
- // In the InitializeComponent method, update:
- // Football Tab
- this.tabPageFootball = new System.Windows.Forms.TabPage();
- this.dateTimePicker = new System.Windows.Forms.DateTimePicker();
- this.buttonImportFootball = new System.Windows.Forms.Button();
- this.buttonDownloadFootball = new System.Windows.Forms.Button();
- this.progressBarFootball = new System.Windows.Forms.ProgressBar();
- this.labelStatusFootball = new System.Windows.Forms.Label();
- this.dataGridViewFootball = new System.Windows.Forms.DataGridView();
-
- this.tabControl.SuspendLayout();
- this.tabPageHorse.SuspendLayout();
- ((System.ComponentModel.ISupportInitialize)(this.dataGridViewHorse)).BeginInit();
- this.tabPageFootball.SuspendLayout();
- ((System.ComponentModel.ISupportInitialize)(this.dataGridViewFootball)).BeginInit();
+
+ // Form settings
this.SuspendLayout();
-
+
+ // Inizializza i componenti
+ InitializeTabControl();
+ InitializeHorseTab();
+ InitializeFootballTab();
+
+ //
+ // Main Form
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(1400, 800);
+ this.BackColor = ModernTheme.Colors.PrimaryBackground;
+ this.Controls.Add(this.tabControl);
+ this.Font = ModernTheme.Fonts.RegularFont;
+ this.Name = "Main";
+ this.Text = "Betting Predictor - Modern UI";
+ this.StartPosition = FormStartPosition.CenterScreen;
+ this.Load += new System.EventHandler(this.Main_Load);
+
+ this.ResumeLayout(false);
+ }
+
+ private void InitializeTabControl()
+ {
+ this.tabControl = new ModernTabControl();
+ this.tabPageHorse = new TabPage();
+ this.tabPageFootball = new TabPage();
+
//
// tabControl
//
this.tabControl.Controls.Add(this.tabPageHorse);
this.tabControl.Controls.Add(this.tabPageFootball);
- this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill;
- this.tabControl.Location = new System.Drawing.Point(0, 0);
+ this.tabControl.Dock = DockStyle.Fill;
+ this.tabControl.Location = new Point(0, 0);
this.tabControl.Name = "tabControl";
this.tabControl.SelectedIndex = 0;
- this.tabControl.Size = new System.Drawing.Size(800, 450);
+ this.tabControl.Size = new Size(1400, 800);
this.tabControl.TabIndex = 0;
-
+ }
+
+ private void InitializeHorseTab()
+ {
+ // Inizializza i controlli
+ this.panelHorseTop = new ModernPanel();
+ this.textBoxFolderPath = new ModernTextBox();
+ this.buttonBrowse = new ModernButton();
+ this.buttonImport = new ModernButton();
+ this.buttonPredict = new ModernButton();
+ this.progressBarHorse = new ModernProgressBar();
+ this.labelStatusHorse = new ModernLabel();
+ this.dataGridViewHorse = new ModernDataGridView();
+
+ this.tabPageHorse.SuspendLayout();
+ this.panelHorseTop.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.dataGridViewHorse)).BeginInit();
+
//
// tabPageHorse
//
+ this.tabPageHorse.BackColor = ModernTheme.Colors.PrimaryBackground;
this.tabPageHorse.Controls.Add(this.dataGridViewHorse);
this.tabPageHorse.Controls.Add(this.labelStatusHorse);
this.tabPageHorse.Controls.Add(this.progressBarHorse);
- this.tabPageHorse.Controls.Add(this.buttonPredict); // Add new button
- this.tabPageHorse.Controls.Add(this.buttonImport); // Add new button
- this.tabPageHorse.Controls.Add(this.buttonBrowse);
- this.tabPageHorse.Controls.Add(this.textBoxFolderPath);
- this.tabPageHorse.Location = new System.Drawing.Point(4, 22);
+ this.tabPageHorse.Controls.Add(this.panelHorseTop);
+ this.tabPageHorse.Location = new Point(4, 44);
this.tabPageHorse.Name = "tabPageHorse";
- this.tabPageHorse.Padding = new System.Windows.Forms.Padding(3);
- this.tabPageHorse.Size = new System.Drawing.Size(792, 424);
+ this.tabPageHorse.Padding = new Padding(ModernTheme.Spacing.Large);
+ this.tabPageHorse.Size = new Size(1392, 752);
this.tabPageHorse.TabIndex = 0;
- this.tabPageHorse.Text = "Horse";
- this.tabPageHorse.UseVisualStyleBackColor = true;
-
+ this.tabPageHorse.Text = "🏇 Horse Racing";
+
+ //
+ // panelHorseTop
+ //
+ this.panelHorseTop.BackColor = ModernTheme.Colors.SecondaryBackground;
+ this.panelHorseTop.BorderRadius = ModernTheme.BorderRadius.Large;
+ this.panelHorseTop.BorderColor = ModernTheme.Colors.BorderPrimary;
+ this.panelHorseTop.BorderWidth = 1;
+ this.panelHorseTop.Controls.Add(this.textBoxFolderPath);
+ this.panelHorseTop.Controls.Add(this.buttonBrowse);
+ this.panelHorseTop.Controls.Add(this.buttonImport);
+ this.panelHorseTop.Controls.Add(this.buttonPredict);
+ this.panelHorseTop.Dock = DockStyle.Top;
+ this.panelHorseTop.Location = new Point(15, 15);
+ this.panelHorseTop.Name = "panelHorseTop";
+ this.panelHorseTop.Padding = new Padding(ModernTheme.Spacing.Medium);
+ this.panelHorseTop.Size = new Size(1362, 60);
+ this.panelHorseTop.TabIndex = 0;
+
//
// textBoxFolderPath
//
- this.textBoxFolderPath.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
- | System.Windows.Forms.AnchorStyles.Right)));
- this.textBoxFolderPath.Location = new System.Drawing.Point(8, 8);
+ this.textBoxFolderPath.Anchor = ((AnchorStyles)(((AnchorStyles.Top | AnchorStyles.Left) | AnchorStyles.Right)));
+ this.textBoxFolderPath.Location = new Point(10, 15);
this.textBoxFolderPath.Name = "textBoxFolderPath";
this.textBoxFolderPath.ReadOnly = true;
- this.textBoxFolderPath.Size = new System.Drawing.Size(510, 20);
+ this.textBoxFolderPath.Size = new Size(920, 30);
this.textBoxFolderPath.TabIndex = 0;
-
+ this.textBoxFolderPath.Text = "Seleziona una cartella...";
+ this.textBoxFolderPath.ForeColor = ModernTheme.Colors.TextSecondary;
+
//
// buttonBrowse
//
- this.buttonBrowse.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
- this.buttonBrowse.Location = new System.Drawing.Point(524, 6); // Moved position to make room for Predict button
- this.buttonBrowse.Size = new System.Drawing.Size(80, 23);
+ this.buttonBrowse.Anchor = ((AnchorStyles)((AnchorStyles.Top | AnchorStyles.Right)));
+ this.buttonBrowse.Location = new Point(940, 15);
this.buttonBrowse.Name = "buttonBrowse";
+ this.buttonBrowse.Size = new Size(120, 30);
this.buttonBrowse.TabIndex = 1;
- this.buttonBrowse.Text = "Sfoglia...";
- this.buttonBrowse.UseVisualStyleBackColor = true;
- this.buttonBrowse.Click += new System.EventHandler(this.buttonBrowse_Click);
-
+ this.buttonBrowse.Text = "📁 Sfoglia";
+ this.buttonBrowse.NormalColor = ModernTheme.Colors.AccentPrimary;
+ this.buttonBrowse.HoverColor = ModernTheme.Colors.AccentSecondary;
+ this.buttonBrowse.Click += new EventHandler(this.buttonBrowse_Click);
+
//
// buttonImport
//
- this.buttonImport.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
- this.buttonImport.Location = new System.Drawing.Point(610, 6);
+ this.buttonImport.Anchor = ((AnchorStyles)((AnchorStyles.Top | AnchorStyles.Right)));
+ this.buttonImport.Location = new Point(1070, 15);
this.buttonImport.Name = "buttonImport";
- this.buttonImport.Size = new System.Drawing.Size(80, 23);
- this.buttonImport.TabIndex = 6;
- this.buttonImport.Text = "Importa";
- this.buttonImport.UseVisualStyleBackColor = true;
- this.buttonImport.Click += new System.EventHandler(this.buttonImport_Click);
-
+ this.buttonImport.Size = new Size(130, 30);
+ this.buttonImport.TabIndex = 2;
+ this.buttonImport.Text = "📥 Importa";
+ this.buttonImport.NormalColor = ModernTheme.Colors.AccentSuccess;
+ this.buttonImport.HoverColor = ColorTranslator.FromHtml("#6FE9D0");
+ this.buttonImport.Enabled = false;
+ this.buttonImport.Click += new EventHandler(this.buttonImport_Click);
+
//
// buttonPredict
//
- this.buttonPredict.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
- this.buttonPredict.Location = new System.Drawing.Point(696, 6);
+ this.buttonPredict.Anchor = ((AnchorStyles)((AnchorStyles.Top | AnchorStyles.Right)));
+ this.buttonPredict.Location = new Point(1210, 15);
this.buttonPredict.Name = "buttonPredict";
- this.buttonPredict.Size = new System.Drawing.Size(80, 23);
- this.buttonPredict.TabIndex = 5;
- this.buttonPredict.Text = "Predici";
- this.buttonPredict.UseVisualStyleBackColor = true;
- this.buttonPredict.Click += new System.EventHandler(this.buttonPredict_Click);
-
+ this.buttonPredict.Size = new Size(130, 30);
+ this.buttonPredict.TabIndex = 3;
+ this.buttonPredict.Text = "🎯 Predici";
+ this.buttonPredict.NormalColor = ModernTheme.Colors.AccentWarning;
+ this.buttonPredict.HoverColor = ColorTranslator.FromHtml("#E8B198");
+ this.buttonPredict.Click += new EventHandler(this.buttonPredict_Click);
+
//
// progressBarHorse
//
- this.progressBarHorse.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
- | System.Windows.Forms.AnchorStyles.Right)));
- this.progressBarHorse.Location = new System.Drawing.Point(8, 34);
+ this.progressBarHorse.Anchor = ((AnchorStyles)(((AnchorStyles.Top | AnchorStyles.Left) | AnchorStyles.Right)));
+ this.progressBarHorse.Location = new Point(15, 85);
this.progressBarHorse.Name = "progressBarHorse";
- this.progressBarHorse.Size = new System.Drawing.Size(762, 20);
- this.progressBarHorse.TabIndex = 2;
-
+ this.progressBarHorse.Size = new Size(1362, 6);
+ this.progressBarHorse.TabIndex = 1;
+
//
// labelStatusHorse
//
this.labelStatusHorse.AutoSize = true;
- this.labelStatusHorse.Location = new System.Drawing.Point(8, 57);
+ this.labelStatusHorse.ForeColor = ModernTheme.Colors.TextSecondary;
+ this.labelStatusHorse.Font = ModernTheme.Fonts.RegularFont;
+ this.labelStatusHorse.Location = new Point(15, 100);
this.labelStatusHorse.Name = "labelStatusHorse";
- this.labelStatusHorse.Size = new System.Drawing.Size(38, 13);
- this.labelStatusHorse.TabIndex = 3;
+ this.labelStatusHorse.Size = new Size(38, 13);
+ this.labelStatusHorse.TabIndex = 2;
this.labelStatusHorse.Text = "Pronto";
-
+ this.labelStatusHorse.BackColor = Color.Transparent;
+
//
// dataGridViewHorse
//
- this.dataGridViewHorse.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
- | System.Windows.Forms.AnchorStyles.Left)
- | System.Windows.Forms.AnchorStyles.Right)));
- this.dataGridViewHorse.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
- this.dataGridViewHorse.Location = new System.Drawing.Point(8, 73);
+ this.dataGridViewHorse.Anchor = ((AnchorStyles)((((AnchorStyles.Top | AnchorStyles.Bottom) | AnchorStyles.Left) | AnchorStyles.Right)));
+ this.dataGridViewHorse.Location = new Point(15, 125);
this.dataGridViewHorse.Name = "dataGridViewHorse";
- this.dataGridViewHorse.ReadOnly = true;
- this.dataGridViewHorse.Size = new System.Drawing.Size(762, 343);
- this.dataGridViewHorse.TabIndex = 4;
-
- // Update controls add to the tab page:
+ this.dataGridViewHorse.Size = new Size(1362, 612);
+ this.dataGridViewHorse.TabIndex = 3;
+
+ this.tabPageHorse.ResumeLayout(false);
+ this.tabPageHorse.PerformLayout();
+ this.panelHorseTop.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.dataGridViewHorse)).EndInit();
+ }
+
+ private void InitializeFootballTab()
+ {
+ // Inizializza i controlli
+ this.panelFootballTop = new ModernPanel();
+ this.dateTimePicker = new ModernDateTimePicker();
+ this.buttonDownloadFootball = new ModernButton();
+ this.buttonImportFootball = new ModernButton();
+ this.progressBarFootball = new ModernProgressBar();
+ this.labelStatusFootball = new ModernLabel();
+ this.dataGridViewFootball = new ModernDataGridView();
+
+ this.tabPageFootball.SuspendLayout();
+ this.panelFootballTop.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.dataGridViewFootball)).BeginInit();
+
+ //
+ // tabPageFootball
+ //
+ this.tabPageFootball.BackColor = ModernTheme.Colors.PrimaryBackground;
this.tabPageFootball.Controls.Add(this.dataGridViewFootball);
this.tabPageFootball.Controls.Add(this.labelStatusFootball);
this.tabPageFootball.Controls.Add(this.progressBarFootball);
- this.tabPageFootball.Controls.Add(this.buttonImportFootball);
- this.tabPageFootball.Controls.Add(this.buttonDownloadFootball);
- this.tabPageFootball.Controls.Add(this.dateTimePicker);
- this.tabPageFootball.Location = new System.Drawing.Point(4, 22);
+ this.tabPageFootball.Controls.Add(this.panelFootballTop);
+ this.tabPageFootball.Location = new Point(4, 44);
this.tabPageFootball.Name = "tabPageFootball";
- this.tabPageFootball.Padding = new System.Windows.Forms.Padding(3);
- this.tabPageFootball.Size = new System.Drawing.Size(792, 424);
+ this.tabPageFootball.Padding = new Padding(ModernTheme.Spacing.Large);
+ this.tabPageFootball.Size = new Size(1392, 752);
this.tabPageFootball.TabIndex = 1;
- this.tabPageFootball.Text = "Football";
- this.tabPageFootball.UseVisualStyleBackColor = true;
-
+ this.tabPageFootball.Text = "⚽ Football";
+
+ //
+ // panelFootballTop
+ //
+ this.panelFootballTop.BackColor = ModernTheme.Colors.SecondaryBackground;
+ this.panelFootballTop.BorderRadius = ModernTheme.BorderRadius.Large;
+ this.panelFootballTop.BorderColor = ModernTheme.Colors.BorderPrimary;
+ this.panelFootballTop.BorderWidth = 1;
+ this.panelFootballTop.Controls.Add(this.dateTimePicker);
+ this.panelFootballTop.Controls.Add(this.buttonDownloadFootball);
+ this.panelFootballTop.Controls.Add(this.buttonImportFootball);
+ this.panelFootballTop.Dock = DockStyle.Top;
+ this.panelFootballTop.Location = new Point(15, 15);
+ this.panelFootballTop.Name = "panelFootballTop";
+ this.panelFootballTop.Padding = new Padding(ModernTheme.Spacing.Medium);
+ this.panelFootballTop.Size = new Size(1362, 60);
+ this.panelFootballTop.TabIndex = 0;
+
//
// dateTimePicker
//
- this.dateTimePicker.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
- | System.Windows.Forms.AnchorStyles.Right)));
- this.dateTimePicker.Format = System.Windows.Forms.DateTimePickerFormat.Short;
- this.dateTimePicker.Location = new System.Drawing.Point(8, 8);
+ this.dateTimePicker.Anchor = ((AnchorStyles)(((AnchorStyles.Top | AnchorStyles.Left) | AnchorStyles.Right)));
+ this.dateTimePicker.CalendarMonthBackground = ModernTheme.Colors.TertiaryBackground;
+ this.dateTimePicker.CalendarForeColor = ModernTheme.Colors.TextPrimary;
+ this.dateTimePicker.CalendarTitleBackColor = ModernTheme.Colors.SecondaryBackground;
+ this.dateTimePicker.CalendarTitleForeColor = ModernTheme.Colors.TextPrimary;
+ this.dateTimePicker.CalendarTrailingForeColor = ModernTheme.Colors.TextDisabled;
+ this.dateTimePicker.Font = ModernTheme.Fonts.RegularFont;
+ this.dateTimePicker.Location = new Point(10, 18);
this.dateTimePicker.Name = "dateTimePicker";
- // Update dateTimePicker size to make room for two buttons
- this.dateTimePicker.Size = new System.Drawing.Size(596, 20);
- this.dateTimePicker.TabIndex = 1;
- this.dateTimePicker.Value = System.DateTime.Today;
-
- // buttonDownloadFootball properties
- this.buttonDownloadFootball.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
- this.buttonDownloadFootball.Location = new System.Drawing.Point(610, 6);
+ this.dateTimePicker.Size = new Size(1090, 25);
+ this.dateTimePicker.TabIndex = 0;
+ this.dateTimePicker.Value = DateTime.Today;
+
+ //
+ // buttonDownloadFootball
+ //
+ this.buttonDownloadFootball.Anchor = ((AnchorStyles)((AnchorStyles.Top | AnchorStyles.Right)));
+ this.buttonDownloadFootball.Location = new Point(1110, 15);
this.buttonDownloadFootball.Name = "buttonDownloadFootball";
- this.buttonDownloadFootball.Size = new System.Drawing.Size(75, 23);
- this.buttonDownloadFootball.TabIndex = 6;
- this.buttonDownloadFootball.Text = "Scarica";
- this.buttonDownloadFootball.UseVisualStyleBackColor = true;
- this.buttonDownloadFootball.Click += new System.EventHandler(this.buttonDownloadFootball_Click);
-
- // buttonImportFootball properties (replace buttonLoadFootball)
- this.buttonImportFootball.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
- this.buttonImportFootball.Location = new System.Drawing.Point(695, 6);
+ this.buttonDownloadFootball.Size = new Size(120, 30);
+ this.buttonDownloadFootball.TabIndex = 1;
+ this.buttonDownloadFootball.Text = "📥 Scarica";
+ this.buttonDownloadFootball.NormalColor = ModernTheme.Colors.AccentPrimary;
+ this.buttonDownloadFootball.HoverColor = ModernTheme.Colors.AccentSecondary;
+ this.buttonDownloadFootball.Click += new EventHandler(this.buttonDownloadFootball_Click);
+
+ //
+ // buttonImportFootball
+ //
+ this.buttonImportFootball.Anchor = ((AnchorStyles)((AnchorStyles.Top | AnchorStyles.Right)));
+ this.buttonImportFootball.Location = new Point(1240, 15);
this.buttonImportFootball.Name = "buttonImportFootball";
- this.buttonImportFootball.Size = new System.Drawing.Size(75, 23);
+ this.buttonImportFootball.Size = new Size(110, 30);
this.buttonImportFootball.TabIndex = 2;
- this.buttonImportFootball.Text = "Importa";
- this.buttonImportFootball.UseVisualStyleBackColor = true;
- this.buttonImportFootball.Click += new System.EventHandler(this.buttonImportFootball_Click);
-
+ this.buttonImportFootball.Text = "🔄 Importa";
+ this.buttonImportFootball.NormalColor = ModernTheme.Colors.AccentSuccess;
+ this.buttonImportFootball.HoverColor = ColorTranslator.FromHtml("#6FE9D0");
+ this.buttonImportFootball.Click += new EventHandler(this.buttonImportFootball_Click);
+
//
// progressBarFootball
//
- this.progressBarFootball.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
- | System.Windows.Forms.AnchorStyles.Right)));
- this.progressBarFootball.Location = new System.Drawing.Point(8, 35);
+ this.progressBarFootball.Anchor = ((AnchorStyles)(((AnchorStyles.Top | AnchorStyles.Left) | AnchorStyles.Right)));
+ this.progressBarFootball.Location = new Point(15, 85);
this.progressBarFootball.Name = "progressBarFootball";
- this.progressBarFootball.Size = new System.Drawing.Size(762, 20);
- this.progressBarFootball.TabIndex = 3;
-
+ this.progressBarFootball.Size = new Size(1362, 6);
+ this.progressBarFootball.TabIndex = 1;
+
//
// labelStatusFootball
//
this.labelStatusFootball.AutoSize = true;
- this.labelStatusFootball.Location = new System.Drawing.Point(8, 58);
+ this.labelStatusFootball.ForeColor = ModernTheme.Colors.TextSecondary;
+ this.labelStatusFootball.Font = ModernTheme.Fonts.RegularFont;
+ this.labelStatusFootball.Location = new Point(15, 100);
this.labelStatusFootball.Name = "labelStatusFootball";
- this.labelStatusFootball.Size = new System.Drawing.Size(38, 13);
- this.labelStatusFootball.TabIndex = 4;
+ this.labelStatusFootball.Size = new Size(38, 13);
+ this.labelStatusFootball.TabIndex = 2;
this.labelStatusFootball.Text = "Pronto";
-
+ this.labelStatusFootball.BackColor = Color.Transparent;
+
//
// dataGridViewFootball
//
- this.dataGridViewFootball.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
- | System.Windows.Forms.AnchorStyles.Left)
- | System.Windows.Forms.AnchorStyles.Right)));
- this.dataGridViewFootball.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
- this.dataGridViewFootball.Location = new System.Drawing.Point(8, 74);
+ this.dataGridViewFootball.Anchor = ((AnchorStyles)((((AnchorStyles.Top | AnchorStyles.Bottom) | AnchorStyles.Left) | AnchorStyles.Right)));
+ this.dataGridViewFootball.Location = new Point(15, 125);
this.dataGridViewFootball.Name = "dataGridViewFootball";
- this.dataGridViewFootball.ReadOnly = true;
- this.dataGridViewFootball.Size = new System.Drawing.Size(762, 342);
- this.dataGridViewFootball.TabIndex = 5;
-
- //
- // Main
- //
- this.ClientSize = new System.Drawing.Size(800, 450);
- this.Controls.Add(this.tabControl);
- this.Name = "Main";
- this.Text = "Betting Predictor";
- this.Load += new System.EventHandler(this.Main_Load);
- this.tabControl.ResumeLayout(false);
- this.tabPageHorse.ResumeLayout(false);
- this.tabPageHorse.PerformLayout();
- ((System.ComponentModel.ISupportInitialize)(this.dataGridViewHorse)).EndInit();
+ this.dataGridViewFootball.Size = new Size(1362, 612);
+ this.dataGridViewFootball.TabIndex = 3;
+
this.tabPageFootball.ResumeLayout(false);
this.tabPageFootball.PerformLayout();
+ this.panelFootballTop.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.dataGridViewFootball)).EndInit();
- this.ResumeLayout(false);
}
}
-
- public partial class ProgressDialog : Form
- {
- public ProgressDialog()
- {
- InitializeComponent();
- }
-
- public void UpdateProgress(int currentPage, int totalPages)
- {
- progressBar.Maximum = totalPages;
- progressBar.Value = currentPage;
- labelProgress.Text = $"Scaricamento pagina {currentPage} di {totalPages}";
- }
-
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- private void InitializeComponent()
- {
- this.progressBar = new System.Windows.Forms.ProgressBar();
- this.labelProgress = new System.Windows.Forms.Label();
- this.SuspendLayout();
- //
- // progressBar
- //
- this.progressBar.Location = new System.Drawing.Point(12, 12);
- this.progressBar.Name = "progressBar";
- this.progressBar.Size = new System.Drawing.Size(360, 23);
- this.progressBar.TabIndex = 0;
- //
- // labelProgress
- //
- this.labelProgress.AutoSize = true;
- this.labelProgress.Location = new System.Drawing.Point(12, 38);
- this.labelProgress.Name = "labelProgress";
- this.labelProgress.Size = new System.Drawing.Size(0, 13);
- this.labelProgress.TabIndex = 1;
- //
- // ProgressDialog
- //
- this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(384, 61);
- this.Controls.Add(this.labelProgress);
- this.Controls.Add(this.progressBar);
- this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
- this.MaximizeBox = false;
- this.MinimizeBox = false;
- this.Name = "ProgressDialog";
- this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
- this.Text = "Scaricamento in corso...";
- this.ResumeLayout(false);
- this.PerformLayout();
- }
-
- private System.ComponentModel.IContainer components = null;
- private ProgressBar progressBar;
- private Label labelProgress;
- }
}
diff --git a/HorseRacingPredictor/HorseRacingPredictor/Main.cs b/HorseRacingPredictor/HorseRacingPredictor/Main.cs
index 19c9114..9a03777 100644
--- a/HorseRacingPredictor/HorseRacingPredictor/Main.cs
+++ b/HorseRacingPredictor/HorseRacingPredictor/Main.cs
@@ -2,6 +2,8 @@
using HorseRacingPredictor.Football.Manager;
using HorseRacingPredictor.Horses;
using HorseRacingPredictor.Horses.ML;
+using BettingPredictor.UI;
+using BettingPredictor.UI.Controls;
using System;
using System.Data;
using System.IO;
@@ -230,7 +232,7 @@ namespace BettingPredictor
///
/// Formatta la griglia dei dati dei cavalli per una migliore visualizzazione
///
- private void FormatHorseDataGrid(DataGridView grid)
+ private void FormatHorseDataGrid(ModernDataGridView grid)
{
if (grid.Columns.Count == 0)
return;
@@ -280,44 +282,9 @@ namespace BettingPredictor
grid.Columns[columnName].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
}
- // Colora le righe in base al risultato
- grid.CellFormatting += (sender, e) =>
- {
- if (e.RowIndex >= 0 && e.ColumnIndex >= 0)
- {
- var row = grid.Rows[e.RowIndex];
- if (grid.Columns.Contains("Risultato Reale") && row.Cells["Risultato Reale"].Value != null)
- {
- string resultStr = row.Cells["Risultato Reale"].Value.ToString();
- if (int.TryParse(resultStr, out int result))
- {
- if (result == 1)
- row.DefaultCellStyle.BackColor = System.Drawing.Color.LightGreen;
- else if (result <= 3)
- row.DefaultCellStyle.BackColor = System.Drawing.Color.LightYellow;
- }
- }
- if (grid.Columns.Contains("Risultato Reale") && grid.Columns.Contains("Posizione Prevista"))
- {
- var realResultCell = row.Cells["Risultato Reale"];
- var predictedCell = row.Cells["Posizione Prevista"];
- if (realResultCell.Value != null && predictedCell.Value != null)
- {
- if (int.TryParse(realResultCell.Value.ToString(), out int realPos) &&
- float.TryParse(predictedCell.Value.ToString(), out float predictedPos))
- {
- if (Math.Abs(realPos - predictedPos) <= 0.5)
- {
- predictedCell.Style.BackColor = System.Drawing.Color.LightGreen;
- predictedCell.Style.ForeColor = System.Drawing.Color.DarkGreen;
- predictedCell.Style.Font = new System.Drawing.Font(grid.Font, System.Drawing.FontStyle.Bold);
- }
- }
- }
- }
- }
- };
-
+ // Usa il metodo della griglia moderna per evidenziare i vincitori
+ grid.HighlightWinnerRows();
+
// Abilita il riordino delle colonne
grid.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
grid.AllowUserToOrderColumns = true;
@@ -382,7 +349,7 @@ namespace BettingPredictor
///
/// Nuovo metodo per gestire l'importazione dei dati calcistici
///
- private async Task ImportFootballDataAsync(DataGridView dataGridViewFootball)
+ private async Task ImportFootballDataAsync(ModernDataGridView dataGridViewFootball)
{
try
{
@@ -442,7 +409,7 @@ namespace BettingPredictor
///
/// Metodo aggiornato per il processo completo (scaricamento + importazione)
///
- private async Task ProcessFootballDataAsync(DateTime selectedDate, DataGridView dataGridViewFootball)
+ private async Task ProcessFootballDataAsync(DateTime selectedDate, ModernDataGridView dataGridViewFootball)
{
try
{
@@ -468,7 +435,7 @@ namespace BettingPredictor
///
/// Formatta la griglia dei dati calcistici per una migliore visualizzazione
///
- private void FormatFootballDataGrid(DataGridView grid)
+ private void FormatFootballDataGrid(ModernDataGridView grid)
{
if (grid.Columns.Count == 0)
return;
@@ -505,21 +472,6 @@ namespace BettingPredictor
grid.Columns[columnName].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
}
- // Colora le righe in base al risultato della previsione
- grid.CellFormatting += (sender, e) =>
- {
- if (e.RowIndex >= 0 && grid.Columns.Contains("Risultato") && e.ColumnIndex >= 0)
- {
- var resultCell = grid.Rows[e.RowIndex].Cells["Risultato"];
- if (resultCell.Value != null)
- {
- // Se la previsione è corretta, colora di verde
- if (Convert.ToInt32(resultCell.Value) == 1)
- grid.Rows[e.RowIndex].DefaultCellStyle.BackColor = System.Drawing.Color.LightGreen;
- }
- }
- };
-
// Abilita il riordino delle colonne
grid.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
grid.AllowUserToOrderColumns = true;
diff --git a/HorseRacingPredictor/HorseRacingPredictor/UI/Controls/ModernButton.cs b/HorseRacingPredictor/HorseRacingPredictor/UI/Controls/ModernButton.cs
new file mode 100644
index 0000000..8a03a2d
--- /dev/null
+++ b/HorseRacingPredictor/HorseRacingPredictor/UI/Controls/ModernButton.cs
@@ -0,0 +1,107 @@
+using System;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Windows.Forms;
+
+namespace BettingPredictor.UI.Controls
+{
+ ///
+ /// Pulsante moderno con tema scuro e effetti hover
+ ///
+ public class ModernButton : Button
+ {
+ private bool isHovering = false;
+ private Color normalColor = ModernTheme.Colors.AccentPrimary;
+ private Color hoverColor = ModernTheme.Colors.AccentSecondary;
+ private int borderRadius = ModernTheme.BorderRadius.Medium;
+
+ public ModernButton()
+ {
+ // Configurazione base
+ FlatStyle = FlatStyle.Flat;
+ FlatAppearance.BorderSize = 0;
+ BackColor = normalColor;
+ ForeColor = ModernTheme.Colors.TextPrimary;
+ Font = ModernTheme.Fonts.ButtonFont;
+ Cursor = Cursors.Hand;
+ Size = new Size(100, 35);
+
+ // Abilita il double buffering per evitare flickering
+ SetStyle(ControlStyles.UserPaint |
+ ControlStyles.AllPaintingInWmPaint |
+ ControlStyles.OptimizedDoubleBuffer, true);
+ }
+
+ public Color NormalColor
+ {
+ get => normalColor;
+ set
+ {
+ normalColor = value;
+ if (!isHovering) BackColor = value;
+ }
+ }
+
+ public Color HoverColor
+ {
+ get => hoverColor;
+ set => hoverColor = value;
+ }
+
+ public int BorderRadius
+ {
+ get => borderRadius;
+ set
+ {
+ borderRadius = value;
+ Invalidate();
+ }
+ }
+
+ protected override void OnMouseEnter(EventArgs e)
+ {
+ base.OnMouseEnter(e);
+ isHovering = true;
+ BackColor = hoverColor;
+ }
+
+ protected override void OnMouseLeave(EventArgs e)
+ {
+ base.OnMouseLeave(e);
+ isHovering = false;
+ BackColor = normalColor;
+ }
+
+ protected override void OnPaint(PaintEventArgs e)
+ {
+ e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
+
+ // Disegna il background con bordi arrotondati
+ using (GraphicsPath path = GetRoundedRectangle(ClientRectangle, borderRadius))
+ {
+ using (SolidBrush brush = new SolidBrush(BackColor))
+ {
+ e.Graphics.FillPath(brush, path);
+ }
+ }
+
+ // Disegna il testo centrato
+ TextRenderer.DrawText(e.Graphics, Text, Font, ClientRectangle,
+ ForeColor, TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter);
+ }
+
+ private GraphicsPath GetRoundedRectangle(Rectangle rect, int radius)
+ {
+ GraphicsPath path = new GraphicsPath();
+ int diameter = radius * 2;
+
+ path.AddArc(rect.X, rect.Y, diameter, diameter, 180, 90);
+ path.AddArc(rect.Right - diameter, rect.Y, diameter, diameter, 270, 90);
+ path.AddArc(rect.Right - diameter, rect.Bottom - diameter, diameter, diameter, 0, 90);
+ path.AddArc(rect.X, rect.Bottom - diameter, diameter, diameter, 90, 90);
+ path.CloseFigure();
+
+ return path;
+ }
+ }
+}
diff --git a/HorseRacingPredictor/HorseRacingPredictor/UI/Controls/ModernDataGridView.cs b/HorseRacingPredictor/HorseRacingPredictor/UI/Controls/ModernDataGridView.cs
new file mode 100644
index 0000000..9ff5dd4
--- /dev/null
+++ b/HorseRacingPredictor/HorseRacingPredictor/UI/Controls/ModernDataGridView.cs
@@ -0,0 +1,104 @@
+using System;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace BettingPredictor.UI.Controls
+{
+ ///
+ /// DataGridView moderna con tema scuro
+ ///
+ public class ModernDataGridView : DataGridView
+ {
+ public ModernDataGridView()
+ {
+ // Configurazione base
+ BackgroundColor = ModernTheme.Colors.PrimaryBackground;
+ GridColor = ModernTheme.Colors.BorderPrimary;
+ BorderStyle = BorderStyle.None;
+
+ // Colori delle celle
+ DefaultCellStyle.BackColor = ModernTheme.Colors.GridRowEven;
+ DefaultCellStyle.ForeColor = ModernTheme.Colors.TextPrimary;
+ DefaultCellStyle.SelectionBackColor = ModernTheme.Colors.GridSelected;
+ DefaultCellStyle.SelectionForeColor = ModernTheme.Colors.TextPrimary;
+ DefaultCellStyle.Font = ModernTheme.Fonts.RegularFont;
+
+ // Alternating row color
+ AlternatingRowsDefaultCellStyle.BackColor = ModernTheme.Colors.GridRowOdd;
+ AlternatingRowsDefaultCellStyle.ForeColor = ModernTheme.Colors.TextPrimary;
+
+ // Header
+ ColumnHeadersDefaultCellStyle.BackColor = ModernTheme.Colors.GridHeader;
+ ColumnHeadersDefaultCellStyle.ForeColor = ModernTheme.Colors.TextPrimary;
+ ColumnHeadersDefaultCellStyle.Font = ModernTheme.Fonts.SubtitleFont;
+ ColumnHeadersDefaultCellStyle.SelectionBackColor = ModernTheme.Colors.GridHeader;
+ ColumnHeadersDefaultCellStyle.SelectionForeColor = ModernTheme.Colors.TextPrimary;
+ ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single;
+ ColumnHeadersHeight = 35;
+
+ // Row
+ RowHeadersDefaultCellStyle.BackColor = ModernTheme.Colors.GridHeader;
+ RowHeadersDefaultCellStyle.ForeColor = ModernTheme.Colors.TextPrimary;
+ RowHeadersDefaultCellStyle.SelectionBackColor = ModernTheme.Colors.GridHeader;
+ RowHeadersDefaultCellStyle.SelectionForeColor = ModernTheme.Colors.TextPrimary;
+ RowHeadersVisible = false;
+
+ // Altre impostazioni
+ EnableHeadersVisualStyles = false;
+ AllowUserToAddRows = false;
+ AllowUserToDeleteRows = false;
+ ReadOnly = true;
+ SelectionMode = DataGridViewSelectionMode.FullRowSelect;
+ MultiSelect = false;
+ AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
+ RowTemplate.Height = 30;
+
+ // Abilita il double buffering per evitare flickering
+ DoubleBuffered = true;
+
+ // Eventi per l'hover effect
+ CellMouseEnter += OnCellMouseEnterHandler;
+ CellMouseLeave += OnCellMouseLeaveHandler;
+ }
+
+ private void OnCellMouseEnterHandler(object sender, DataGridViewCellEventArgs e)
+ {
+ if (e.RowIndex >= 0)
+ {
+ Rows[e.RowIndex].DefaultCellStyle.BackColor = ModernTheme.Colors.GridHover;
+ }
+ }
+
+ private void OnCellMouseLeaveHandler(object sender, DataGridViewCellEventArgs e)
+ {
+ if (e.RowIndex >= 0)
+ {
+ // Ripristina il colore originale in base all'indice della riga
+ if (e.RowIndex % 2 == 0)
+ Rows[e.RowIndex].DefaultCellStyle.BackColor = ModernTheme.Colors.GridRowEven;
+ else
+ Rows[e.RowIndex].DefaultCellStyle.BackColor = ModernTheme.Colors.GridRowOdd;
+ }
+ }
+
+ public void HighlightWinnerRows()
+ {
+ if (Columns.Contains("Risultato Reale"))
+ {
+ foreach (DataGridViewRow row in Rows)
+ {
+ if (row.Cells["Risultato Reale"].Value != null &&
+ row.Cells["Risultato Reale"].Value.ToString() == "1")
+ {
+ row.DefaultCellStyle.BackColor = ModernTheme.Colors.StatusWin;
+ }
+ else if (row.Cells["Risultato Reale"].Value != null &&
+ int.TryParse(row.Cells["Risultato Reale"].Value.ToString(), out int pos) && pos <= 3)
+ {
+ row.DefaultCellStyle.BackColor = ModernTheme.Colors.StatusPlace;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/HorseRacingPredictor/HorseRacingPredictor/UI/Controls/ModernDateTimePicker.cs b/HorseRacingPredictor/HorseRacingPredictor/UI/Controls/ModernDateTimePicker.cs
new file mode 100644
index 0000000..f584784
--- /dev/null
+++ b/HorseRacingPredictor/HorseRacingPredictor/UI/Controls/ModernDateTimePicker.cs
@@ -0,0 +1,48 @@
+using System;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace BettingPredictor.UI.Controls
+{
+ ///
+ /// DateTimePicker moderna con tema scuro
+ /// Nota: Il controllo DateTimePicker di WinForms non supporta completamente il custom painting,
+ /// quindi alcuni elementi potrebbero mantenere lo stile di sistema
+ ///
+ public class ModernDateTimePicker : DateTimePicker
+ {
+ public ModernDateTimePicker()
+ {
+ // Configurazione base
+ Font = ModernTheme.Fonts.RegularFont;
+ Format = DateTimePickerFormat.Custom;
+ CustomFormat = "dd/MM/yyyy";
+
+ // Imposta i colori per il calendario
+ CalendarMonthBackground = ModernTheme.Colors.TertiaryBackground;
+ CalendarForeColor = ModernTheme.Colors.TextPrimary;
+ CalendarTitleBackColor = ModernTheme.Colors.SecondaryBackground;
+ CalendarTitleForeColor = ModernTheme.Colors.TextPrimary;
+ CalendarTrailingForeColor = ModernTheme.Colors.TextDisabled;
+
+ // Dimensioni
+ Height = 30;
+ }
+
+ ///
+ /// Imposta il formato lungo (con ora)
+ ///
+ public void SetLongFormat()
+ {
+ CustomFormat = "dd/MM/yyyy HH:mm";
+ }
+
+ ///
+ /// Imposta il formato corto (solo data)
+ ///
+ public void SetShortFormat()
+ {
+ CustomFormat = "dd/MM/yyyy";
+ }
+ }
+}
diff --git a/HorseRacingPredictor/HorseRacingPredictor/UI/Controls/ModernLabel.cs b/HorseRacingPredictor/HorseRacingPredictor/UI/Controls/ModernLabel.cs
new file mode 100644
index 0000000..7b79b0c
--- /dev/null
+++ b/HorseRacingPredictor/HorseRacingPredictor/UI/Controls/ModernLabel.cs
@@ -0,0 +1,78 @@
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace BettingPredictor.UI.Controls
+{
+ ///
+ /// Label moderna con tema scuro e testo ben visibile
+ ///
+ public class ModernLabel : Label
+ {
+ public ModernLabel()
+ {
+ // Configurazione base per visibilit su sfondo scuro
+ ForeColor = ModernTheme.Colors.TextSecondary;
+ Font = ModernTheme.Fonts.RegularFont;
+ BackColor = Color.Transparent;
+ AutoSize = true;
+
+ // Abilita anti-aliasing per testo pi leggibile
+ SetStyle(ControlStyles.OptimizedDoubleBuffer |
+ ControlStyles.AllPaintingInWmPaint, true);
+ }
+
+ ///
+ /// Imposta lo stile del label come titolo
+ ///
+ public void SetAsTitleLabel()
+ {
+ Font = ModernTheme.Fonts.TitleFont;
+ ForeColor = ModernTheme.Colors.TextPrimary;
+ }
+
+ ///
+ /// Imposta lo stile del label come sottotitolo
+ ///
+ public void SetAsSubtitleLabel()
+ {
+ Font = ModernTheme.Fonts.SubtitleFont;
+ ForeColor = ModernTheme.Colors.TextPrimary;
+ }
+
+ ///
+ /// Imposta lo stile del label come testo di stato
+ ///
+ public void SetAsStatusLabel()
+ {
+ Font = ModernTheme.Fonts.RegularFont;
+ ForeColor = ModernTheme.Colors.TextSecondary;
+ }
+
+ ///
+ /// Imposta lo stile del label come testo di successo
+ ///
+ public void SetAsSuccessLabel()
+ {
+ Font = ModernTheme.Fonts.RegularFont;
+ ForeColor = ModernTheme.Colors.AccentSuccess;
+ }
+
+ ///
+ /// Imposta lo stile del label come testo di errore
+ ///
+ public void SetAsErrorLabel()
+ {
+ Font = ModernTheme.Fonts.RegularFont;
+ ForeColor = ModernTheme.Colors.AccentError;
+ }
+
+ ///
+ /// Imposta lo stile del label come testo di warning
+ ///
+ public void SetAsWarningLabel()
+ {
+ Font = ModernTheme.Fonts.RegularFont;
+ ForeColor = ModernTheme.Colors.AccentWarning;
+ }
+ }
+}
diff --git a/HorseRacingPredictor/HorseRacingPredictor/UI/Controls/ModernPanel.cs b/HorseRacingPredictor/HorseRacingPredictor/UI/Controls/ModernPanel.cs
new file mode 100644
index 0000000..328de84
--- /dev/null
+++ b/HorseRacingPredictor/HorseRacingPredictor/UI/Controls/ModernPanel.cs
@@ -0,0 +1,99 @@
+using System;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Windows.Forms;
+
+namespace BettingPredictor.UI.Controls
+{
+ ///
+ /// Panel moderno con tema scuro e bordi arrotondati
+ ///
+ public class ModernPanel : Panel
+ {
+ private int borderRadius = ModernTheme.BorderRadius.Medium;
+ private Color borderColor = ModernTheme.Colors.BorderPrimary;
+ private int borderWidth = 1;
+
+ public ModernPanel()
+ {
+ BackColor = ModernTheme.Colors.SecondaryBackground;
+
+ // Abilita il double buffering
+ SetStyle(ControlStyles.UserPaint |
+ ControlStyles.AllPaintingInWmPaint |
+ ControlStyles.OptimizedDoubleBuffer |
+ ControlStyles.ResizeRedraw, true);
+ }
+
+ public int BorderRadius
+ {
+ get => borderRadius;
+ set
+ {
+ borderRadius = value;
+ Invalidate();
+ }
+ }
+
+ public Color BorderColor
+ {
+ get => borderColor;
+ set
+ {
+ borderColor = value;
+ Invalidate();
+ }
+ }
+
+ public int BorderWidth
+ {
+ get => borderWidth;
+ set
+ {
+ borderWidth = value;
+ Invalidate();
+ }
+ }
+
+ protected override void OnPaint(PaintEventArgs e)
+ {
+ base.OnPaint(e);
+ e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
+
+ // Disegna il background con bordi arrotondati
+ using (GraphicsPath path = GetRoundedRectangle(ClientRectangle, borderRadius))
+ {
+ // Background
+ using (SolidBrush brush = new SolidBrush(BackColor))
+ {
+ e.Graphics.FillPath(brush, path);
+ }
+
+ // Bordo
+ if (borderWidth > 0)
+ {
+ using (Pen pen = new Pen(borderColor, borderWidth))
+ {
+ e.Graphics.DrawPath(pen, path);
+ }
+ }
+ }
+ }
+
+ private GraphicsPath GetRoundedRectangle(Rectangle rect, int radius)
+ {
+ GraphicsPath path = new GraphicsPath();
+ int diameter = radius * 2;
+
+ rect.Inflate(-borderWidth / 2, -borderWidth / 2);
+
+ path.AddArc(rect.X, rect.Y, diameter, diameter, 180, 90);
+ path.AddArc(rect.Right - diameter, rect.Y, diameter, diameter, 270, 90);
+ path.AddArc(rect.Right - diameter, rect.Bottom - diameter, diameter, diameter, 0, 90);
+ path.AddArc(rect.X, rect.Bottom - diameter, diameter, diameter, 90, 90);
+ path.CloseFigure();
+
+ return path;
+ }
+ }
+}
diff --git a/HorseRacingPredictor/HorseRacingPredictor/UI/Controls/ModernProgressBar.cs b/HorseRacingPredictor/HorseRacingPredictor/UI/Controls/ModernProgressBar.cs
new file mode 100644
index 0000000..33fde74
--- /dev/null
+++ b/HorseRacingPredictor/HorseRacingPredictor/UI/Controls/ModernProgressBar.cs
@@ -0,0 +1,54 @@
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace BettingPredictor.UI.Controls
+{
+ ///
+ /// ProgressBar moderna con tema scuro e animazioni fluide
+ ///
+ public class ModernProgressBar : ProgressBar
+ {
+ public ModernProgressBar()
+ {
+ // Configurazione base
+ SetStyle(ControlStyles.UserPaint |
+ ControlStyles.AllPaintingInWmPaint |
+ ControlStyles.OptimizedDoubleBuffer, true);
+
+ Height = 6;
+ BackColor = ModernTheme.Colors.TertiaryBackground;
+ ForeColor = ModernTheme.Colors.AccentPrimary;
+ }
+
+ protected override void OnPaint(PaintEventArgs e)
+ {
+ Rectangle rect = ClientRectangle;
+ Graphics g = e.Graphics;
+
+ // Disegna il background
+ using (SolidBrush brush = new SolidBrush(ModernTheme.Colors.TertiaryBackground))
+ {
+ g.FillRectangle(brush, rect);
+ }
+
+ // Calcola la larghezza del progresso
+ int progressWidth = (int)(rect.Width * ((double)Value / Maximum));
+
+ // Disegna la barra di progresso
+ if (progressWidth > 0)
+ {
+ Rectangle progressRect = new Rectangle(rect.X, rect.Y, progressWidth, rect.Height);
+ using (SolidBrush brush = new SolidBrush(ForeColor))
+ {
+ g.FillRectangle(brush, progressRect);
+ }
+ }
+ }
+
+ public void SetProgressColor(Color color)
+ {
+ ForeColor = color;
+ Invalidate();
+ }
+ }
+}
diff --git a/HorseRacingPredictor/HorseRacingPredictor/UI/Controls/ModernTabControl.cs b/HorseRacingPredictor/HorseRacingPredictor/UI/Controls/ModernTabControl.cs
new file mode 100644
index 0000000..96288b9
--- /dev/null
+++ b/HorseRacingPredictor/HorseRacingPredictor/UI/Controls/ModernTabControl.cs
@@ -0,0 +1,98 @@
+using System;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Windows.Forms;
+
+namespace BettingPredictor.UI.Controls
+{
+ ///
+ /// TabControl moderna con tema scuro
+ ///
+ public class ModernTabControl : TabControl
+ {
+ public ModernTabControl()
+ {
+ SetStyle(ControlStyles.UserPaint |
+ ControlStyles.AllPaintingInWmPaint |
+ ControlStyles.OptimizedDoubleBuffer |
+ ControlStyles.ResizeRedraw, true);
+
+ DrawMode = TabDrawMode.OwnerDrawFixed;
+ SizeMode = TabSizeMode.Fixed;
+ ItemSize = new Size(120, 40);
+ Padding = new Point(20, 0);
+ }
+
+ protected override void OnPaint(PaintEventArgs e)
+ {
+ e.Graphics.Clear(ModernTheme.Colors.PrimaryBackground);
+ e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
+
+ // Disegna il background del tab panel
+ Rectangle tabPanelRect = new Rectangle(0, ItemSize.Height, Width, Height - ItemSize.Height);
+ using (SolidBrush brush = new SolidBrush(ModernTheme.Colors.SecondaryBackground))
+ {
+ e.Graphics.FillRectangle(brush, tabPanelRect);
+ }
+ }
+
+ protected override void OnDrawItem(DrawItemEventArgs e)
+ {
+ Graphics g = e.Graphics;
+ g.SmoothingMode = SmoothingMode.AntiAlias;
+
+ // Get tab rectangle
+ Rectangle tabRect = GetTabRect(e.Index);
+
+ bool isSelected = (e.Index == SelectedIndex);
+
+ // Disegna il background della tab
+ Color backColor = isSelected ? ModernTheme.Colors.SecondaryBackground : ModernTheme.Colors.PrimaryBackground;
+ using (SolidBrush brush = new SolidBrush(backColor))
+ {
+ g.FillRectangle(brush, tabRect);
+ }
+
+ // Disegna la linea di selezione in alto
+ if (isSelected)
+ {
+ Rectangle accentRect = new Rectangle(tabRect.X, tabRect.Y, tabRect.Width, 3);
+ using (SolidBrush brush = new SolidBrush(ModernTheme.Colors.AccentPrimary))
+ {
+ g.FillRectangle(brush, accentRect);
+ }
+ }
+
+ // Disegna il testo della tab
+ string tabText = TabPages[e.Index].Text;
+ Color textColor = isSelected ? ModernTheme.Colors.TextPrimary : ModernTheme.Colors.TextSecondary;
+ Font tabFont = isSelected ? ModernTheme.Fonts.SubtitleFont : ModernTheme.Fonts.RegularFont;
+
+ StringFormat sf = new StringFormat
+ {
+ Alignment = StringAlignment.Center,
+ LineAlignment = StringAlignment.Center
+ };
+
+ using (SolidBrush brush = new SolidBrush(textColor))
+ {
+ g.DrawString(tabText, tabFont, brush, tabRect, sf);
+ }
+
+ // Disegna il bordo tra le tabs
+ if (e.Index < TabCount - 1)
+ {
+ using (Pen pen = new Pen(ModernTheme.Colors.BorderPrimary, 1))
+ {
+ g.DrawLine(pen, tabRect.Right, tabRect.Top + 10, tabRect.Right, tabRect.Bottom - 10);
+ }
+ }
+ }
+
+ protected override void OnSelectedIndexChanged(EventArgs e)
+ {
+ base.OnSelectedIndexChanged(e);
+ Invalidate();
+ }
+ }
+}
diff --git a/HorseRacingPredictor/HorseRacingPredictor/UI/Controls/ModernTextBox.cs b/HorseRacingPredictor/HorseRacingPredictor/UI/Controls/ModernTextBox.cs
new file mode 100644
index 0000000..86f91a7
--- /dev/null
+++ b/HorseRacingPredictor/HorseRacingPredictor/UI/Controls/ModernTextBox.cs
@@ -0,0 +1,139 @@
+using System;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Windows.Forms;
+
+namespace BettingPredictor.UI.Controls
+{
+ ///
+ /// TextBox moderno con tema scuro e bordi arrotondati
+ ///
+ public class ModernTextBox : TextBox
+ {
+ private Color borderColor = ModernTheme.Colors.BorderPrimary;
+ private Color focusBorderColor = ModernTheme.Colors.BorderAccent;
+ private bool isFocused = false;
+ private int borderRadius = ModernTheme.BorderRadius.Medium;
+
+ public ModernTextBox()
+ {
+ // Configurazione base
+ BorderStyle = BorderStyle.None;
+ BackColor = ModernTheme.Colors.TertiaryBackground;
+ ForeColor = ModernTheme.Colors.TextPrimary;
+ Font = ModernTheme.Fonts.RegularFont;
+ Padding = new Padding(8, 8, 8, 8);
+
+ // Abilita il double buffering
+ SetStyle(ControlStyles.UserPaint |
+ ControlStyles.AllPaintingInWmPaint |
+ ControlStyles.OptimizedDoubleBuffer, true);
+ }
+
+ public Color BorderColor
+ {
+ get => borderColor;
+ set
+ {
+ borderColor = value;
+ Invalidate();
+ }
+ }
+
+ public Color FocusBorderColor
+ {
+ get => focusBorderColor;
+ set
+ {
+ focusBorderColor = value;
+ Invalidate();
+ }
+ }
+
+ public int BorderRadius
+ {
+ get => borderRadius;
+ set
+ {
+ borderRadius = value;
+ Invalidate();
+ }
+ }
+
+ protected override void OnEnter(EventArgs e)
+ {
+ base.OnEnter(e);
+ isFocused = true;
+ Invalidate();
+ }
+
+ protected override void OnLeave(EventArgs e)
+ {
+ base.OnLeave(e);
+ isFocused = false;
+ Invalidate();
+ }
+
+ protected override void OnReadOnlyChanged(EventArgs e)
+ {
+ base.OnReadOnlyChanged(e);
+ // Cambia il colore del testo per i campi read-only
+ if (ReadOnly)
+ {
+ ForeColor = ModernTheme.Colors.TextSecondary;
+ BackColor = ModernTheme.Colors.SecondaryBackground;
+ }
+ else
+ {
+ ForeColor = ModernTheme.Colors.TextPrimary;
+ BackColor = ModernTheme.Colors.TertiaryBackground;
+ }
+ Invalidate();
+ }
+
+ protected override void OnPaint(PaintEventArgs e)
+ {
+ e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
+
+ // Disegna il background
+ using (GraphicsPath path = GetRoundedRectangle(ClientRectangle, borderRadius))
+ {
+ using (SolidBrush brush = new SolidBrush(BackColor))
+ {
+ e.Graphics.FillPath(brush, path);
+ }
+
+ // Disegna il bordo
+ Color currentBorderColor = isFocused ? focusBorderColor : borderColor;
+ using (Pen pen = new Pen(currentBorderColor, 1.5f))
+ {
+ e.Graphics.DrawPath(pen, path);
+ }
+ }
+
+ // Disegna il testo
+ if (!string.IsNullOrEmpty(Text))
+ {
+ TextRenderer.DrawText(e.Graphics, Text, Font,
+ new Rectangle(8, 0, Width - 16, Height),
+ ForeColor, TextFormatFlags.Left | TextFormatFlags.VerticalCenter);
+ }
+ }
+
+ private GraphicsPath GetRoundedRectangle(Rectangle rect, int radius)
+ {
+ GraphicsPath path = new GraphicsPath();
+ int diameter = radius * 2;
+
+ rect.Inflate(-1, -1);
+
+ path.AddArc(rect.X, rect.Y, diameter, diameter, 180, 90);
+ path.AddArc(rect.Right - diameter, rect.Y, diameter, diameter, 270, 90);
+ path.AddArc(rect.Right - diameter, rect.Bottom - diameter, diameter, diameter, 0, 90);
+ path.AddArc(rect.X, rect.Bottom - diameter, diameter, diameter, 90, 90);
+ path.CloseFigure();
+
+ return path;
+ }
+ }
+}
diff --git a/HorseRacingPredictor/HorseRacingPredictor/UI/ModernTheme.cs b/HorseRacingPredictor/HorseRacingPredictor/UI/ModernTheme.cs
new file mode 100644
index 0000000..b81e894
--- /dev/null
+++ b/HorseRacingPredictor/HorseRacingPredictor/UI/ModernTheme.cs
@@ -0,0 +1,74 @@
+using System.Drawing;
+
+namespace BettingPredictor.UI
+{
+ ///
+ /// Gestione del tema scuro moderno per l'applicazione
+ ///
+ public static class ModernTheme
+ {
+ // Colori principali del tema scuro
+ public static class Colors
+ {
+ // Background colors
+ public static readonly Color PrimaryBackground = ColorTranslator.FromHtml("#1E1E1E");
+ public static readonly Color SecondaryBackground = ColorTranslator.FromHtml("#252526");
+ public static readonly Color TertiaryBackground = ColorTranslator.FromHtml("#2D2D30");
+ public static readonly Color HoverBackground = ColorTranslator.FromHtml("#3E3E42");
+
+ // Accent colors
+ public static readonly Color AccentPrimary = ColorTranslator.FromHtml("#007ACC");
+ public static readonly Color AccentSecondary = ColorTranslator.FromHtml("#00A8E8");
+ public static readonly Color AccentSuccess = ColorTranslator.FromHtml("#4EC9B0");
+ public static readonly Color AccentWarning = ColorTranslator.FromHtml("#CE9178");
+ public static readonly Color AccentError = ColorTranslator.FromHtml("#F48771");
+
+ // Text colors
+ public static readonly Color TextPrimary = ColorTranslator.FromHtml("#FFFFFF");
+ public static readonly Color TextSecondary = ColorTranslator.FromHtml("#CCCCCC");
+ public static readonly Color TextDisabled = ColorTranslator.FromHtml("#808080");
+
+ // Border colors
+ public static readonly Color BorderPrimary = ColorTranslator.FromHtml("#3F3F46");
+ public static readonly Color BorderAccent = ColorTranslator.FromHtml("#007ACC");
+
+ // Grid colors
+ public static readonly Color GridHeader = ColorTranslator.FromHtml("#2D2D30");
+ public static readonly Color GridRowEven = ColorTranslator.FromHtml("#252526");
+ public static readonly Color GridRowOdd = ColorTranslator.FromHtml("#1E1E1E");
+ public static readonly Color GridSelected = ColorTranslator.FromHtml("#094771");
+ public static readonly Color GridHover = ColorTranslator.FromHtml("#2A2D2E");
+
+ // Status colors
+ public static readonly Color StatusWin = ColorTranslator.FromHtml("#4EC9B0");
+ public static readonly Color StatusPlace = ColorTranslator.FromHtml("#CE9178");
+ public static readonly Color StatusNormal = ColorTranslator.FromHtml("#3E3E42");
+ }
+
+ // Font configurations
+ public static class Fonts
+ {
+ public static readonly Font TitleFont = new Font("Segoe UI", 16F, FontStyle.Bold);
+ public static readonly Font SubtitleFont = new Font("Segoe UI", 12F, FontStyle.Bold);
+ public static readonly Font RegularFont = new Font("Segoe UI", 9.75F, FontStyle.Regular);
+ public static readonly Font SmallFont = new Font("Segoe UI", 8.25F, FontStyle.Regular);
+ public static readonly Font ButtonFont = new Font("Segoe UI", 9.75F, FontStyle.Regular);
+ }
+
+ // Spacing and sizing
+ public static class Spacing
+ {
+ public const int Small = 5;
+ public const int Medium = 10;
+ public const int Large = 15;
+ public const int ExtraLarge = 20;
+ }
+
+ public static class BorderRadius
+ {
+ public const int Small = 3;
+ public const int Medium = 5;
+ public const int Large = 8;
+ }
+ }
+}