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; + } + } +}