From b136e7f49ba0f83772a53c98d3068e1207ea502d Mon Sep 17 00:00:00 2001 From: Davide Grilli Date: Tue, 22 Sep 2026 10:02:14 +0200 Subject: [PATCH] Semplifica la finestra di progresso di "Aggiorna indice" Sostituita la barra disegnata a mano (colori custom, footer con separatore, pulsante Annulla arrotondato) con la ProgressBar nativa di Windows e un layout ad assoluti minimale, in stile con la barra di progresso di "Trova componenti referenziati" (ProgressoComponentiForm). Mantenuti conteggio file, dettaglio nuovi/aggiornati/invariati/rimossi, stima del tempo rimanente e il pulsante Annulla, che l'altra finestra non ha ma qui servono per uno scan lungo su tutta la share. Aggiornati due commenti in Form1.cs/UiStile.cs che facevano riferimento allo stile precedente di ProgressForm, ora rimosso. --- PrepStep/Form1.cs | 6 +-- PrepStep/ProgressForm.cs | 105 ++++++++------------------------------- PrepStep/UiStile.cs | 3 +- 3 files changed, 25 insertions(+), 89 deletions(-) diff --git a/PrepStep/Form1.cs b/PrepStep/Form1.cs index 653870c..667b829 100644 --- a/PrepStep/Form1.cs +++ b/PrepStep/Form1.cs @@ -91,9 +91,9 @@ public partial class Form1 : Form _lblFase.Font = new Font(Font, FontStyle.Bold); headerPanel.Controls.Add(_lblFase); - // Barra di navigazione come footer separato dal contenuto (stesso pattern di - // ProgressForm): linea sottile in cima + sfondo bianco, invece dei bottoni appoggiati - // direttamente sul contenuto/sulla barra di stato senza alcuna divisione visiva. + // Barra di navigazione come footer separato dal contenuto: linea sottile in cima e + // sfondo bianco, invece dei bottoni appoggiati direttamente sul contenuto/sulla barra + // di stato senza alcuna divisione visiva. // Padding destro = 16, lo stesso usato dai pannelli di ogni fase (Padding(16)): prima // era 12, quindi "Avanti" sporgeva 4px oltre il margine destro del contenuto sopra. var navContainer = new Panel { Dock = DockStyle.Bottom, Height = 64, BackColor = Color.White }; diff --git a/PrepStep/ProgressForm.cs b/PrepStep/ProgressForm.cs index 349273e..a3481fb 100644 --- a/PrepStep/ProgressForm.cs +++ b/PrepStep/ProgressForm.cs @@ -2,23 +2,15 @@ namespace PrepStep; public sealed class ProgressForm : Form { - private readonly Label _lblTitolo = new(); private readonly Label _lblCartella = new(); - private readonly Panel _barraTraccia = new(); - private readonly Panel _barraRiempimento = new(); - private readonly Label _lblPercentuale = new(); + private readonly ProgressBar _bar = new(); private readonly Label _lblConteggio = new(); private readonly Label _lblDettaglio = new(); private readonly Label _lblEta = new(); private readonly Button _btnAnnulla = new(); - private readonly Panel _separatore = new(); - private readonly Panel _piePagina = new(); private readonly ToolTip _tipCartella = new(); - private const int Margine = 24; - // SystemColors.GrayText (~3.9:1 su bianco) è sotto la soglia WCAG AA 4.5:1 per testo - // normale: usiamo un grigio più scuro, leggibile ma comunque secondario. - private static readonly Color GrigioTesto = Color.FromArgb(90, 90, 90); + private const int Margine = 16; public event EventHandler? Annullato; @@ -30,84 +22,42 @@ public sealed class ProgressForm : Form MinimizeBox = false; MaximizeBox = false; ControlBox = false; - BackColor = Color.White; - ClientSize = new Size(480, 270); - - _lblTitolo.Text = "Aggiornamento indice in corso..."; - _lblTitolo.Location = new Point(Margine, 22); - _lblTitolo.AutoSize = true; - _lblTitolo.Font = new Font(Font.FontFamily, 11f, FontStyle.Bold); + ClientSize = new Size(420, 190); _lblCartella.Text = "Preparazione..."; - _lblCartella.Location = new Point(Margine, 52); + _lblCartella.Location = new Point(Margine, Margine); // AutoSize=false + AutoEllipsis: un percorso lungo (share di rete) va troncato con "..." - // invece di sforare il bordo del dialog, che è FixedDialog e non si può allargare. - // Il testo completo resta disponibile nel tooltip (stesso pattern di Form1._lblImportStatus). + // invece di sforare il bordo del dialog, che è FixedDialog e non si può allargare. Il + // testo completo resta disponibile nel tooltip. _lblCartella.AutoSize = false; _lblCartella.AutoEllipsis = true; _lblCartella.Size = new Size(ClientSize.Width - Margine * 2, 20); - _lblCartella.ForeColor = GrigioTesto; - // Barra piatta disegnata a mano (traccia grigia + riempimento) invece della ProgressBar - // nativa: quella di Windows è verde e in stile "a blocchi", stona con il blu del resto - // dell'app (UiStile.Primario). Larghezza = margine destro reale meno lo spazio per - // "100%" in grassetto, così barra+percentuale rispettano lo stesso margine destro del - // resto del contenuto (prima finivano ~25px prima, sbilanciate rispetto al margine - // sinistro di 24px). - _barraTraccia.Location = new Point(Margine, 90); - _barraTraccia.Size = new Size(ClientSize.Width - Margine * 2 - 46, 10); - _barraTraccia.BackColor = Color.FromArgb(230, 230, 230); - _barraRiempimento.Location = Point.Empty; - _barraRiempimento.Size = new Size(0, _barraTraccia.Height); - _barraRiempimento.BackColor = UiStile.ColorePrimario; - _barraTraccia.Controls.Add(_barraRiempimento); + _bar.Location = new Point(Margine, 40); + _bar.Size = new Size(ClientSize.Width - Margine * 2, 24); + _bar.Minimum = 0; + _bar.Maximum = 100; - _lblPercentuale.AutoSize = true; - _lblPercentuale.Font = new Font(Font, FontStyle.Bold); - _lblPercentuale.TextAlign = ContentAlignment.MiddleRight; - - _lblConteggio.Location = new Point(Margine, 122); + _lblConteggio.Location = new Point(Margine, 72); _lblConteggio.AutoSize = true; - _lblDettaglio.Location = new Point(Margine, 146); + _lblDettaglio.Location = new Point(Margine, 96); _lblDettaglio.AutoSize = true; - _lblDettaglio.ForeColor = GrigioTesto; - _lblEta.Location = new Point(Margine, 174); + _lblEta.Location = new Point(Margine, 120); _lblEta.AutoSize = true; - // Footer separato dal contenuto (linea + sfondo leggermente diverso) invece del - // bottone appiccicato al bordo inferiore del dialog: ancorato in basso, quindi la - // spaziatura sopra/sotto resta corretta anche se la ClientSize cambia. Altezza footer - // 60px e ClientSize 270 scelti per lasciare sotto l'ultima riga (eta, Bottom≈189) lo - // stesso margine (~20px) usato sopra il titolo, invece dei ~7px sbilanciati di prima. - _separatore.BackColor = Color.FromArgb(230, 230, 230); - _separatore.Size = new Size(ClientSize.Width, 1); - _separatore.Location = new Point(0, ClientSize.Height - 60); - _separatore.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom; - - _piePagina.BackColor = Color.FromArgb(247, 247, 248); - _piePagina.Size = new Size(ClientSize.Width, 59); - _piePagina.Location = new Point(0, ClientSize.Height - 59); - _piePagina.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom; - _btnAnnulla.Text = "Annulla"; - UiStile.Secondario(_btnAnnulla); - UiStile.Arrotonda(_btnAnnulla); + _btnAnnulla.Size = new Size(90, 28); _btnAnnulla.Click += (_, e) => Annullato?.Invoke(this, e); - _piePagina.Controls.Add(_btnAnnulla); Controls.AddRange(new Control[] { - _lblTitolo, _lblCartella, _barraTraccia, _lblPercentuale, - _lblConteggio, _lblDettaglio, _lblEta, _separatore, _piePagina + _lblCartella, _bar, _lblConteggio, _lblDettaglio, _lblEta, _btnAnnulla }); - // Posizionato dopo l'aggiunta ai Controls: con AutoSize il Width vero si conosce - // solo a layout avvenuto, non subito dopo la creazione del bottone. - _btnAnnulla.Location = new Point(_piePagina.Width - Margine - _btnAnnulla.Width, - (_piePagina.Height - _btnAnnulla.Height) / 2); - _btnAnnulla.Anchor = AnchorStyles.Right | AnchorStyles.Top; + _btnAnnulla.Location = new Point( + ClientSize.Width - Margine - _btnAnnulla.Width, ClientSize.Height - Margine - _btnAnnulla.Height); } public void Aggiorna(ScanProgress p) @@ -115,24 +65,9 @@ public sealed class ProgressForm : Form _lblCartella.Text = $"Scansione: {p.Cartella}"; _tipCartella.SetToolTip(_lblCartella, _lblCartella.Text); - if (p.PrevistiTotali > 0) - { - double frazione = Math.Min(1.0, (double)p.FattiTotali / p.PrevistiTotali); - _barraRiempimento.Width = (int)(frazione * _barraTraccia.Width); - _lblPercentuale.Text = $"{frazione * 100:0}%"; - } - else - { - // ponytail: prima del conteggio totale (poco probabile: richiede la scansione - // precedente salvata nel DB) la barra resta vuota invece di un'animazione - // indeterminata — se serve, aggiungere un Timer che pulsa _barraRiempimento. - _barraRiempimento.Width = 0; - _lblPercentuale.Text = ""; - } - // Riallineato al margine destro reale ogni volta: AutoSize aggiorna Width non appena - // Text cambia, quindi la Location va ricalcolata qui (non solo una volta nel costruttore). - _lblPercentuale.Location = new Point( - ClientSize.Width - Margine - _lblPercentuale.Width, _barraTraccia.Top - 3); + _bar.Value = p.PrevistiTotali > 0 + ? (int)Math.Clamp(100.0 * p.FattiTotali / p.PrevistiTotali, 0, 100) + : 0; _lblConteggio.Text = p.PrevistiTotali > 0 ? $"{p.FattiTotali:N0} / ~{p.PrevistiTotali:N0} file" diff --git a/PrepStep/UiStile.cs b/PrepStep/UiStile.cs index 7fb0c57..5f3a428 100644 --- a/PrepStep/UiStile.cs +++ b/PrepStep/UiStile.cs @@ -8,7 +8,8 @@ namespace PrepStep; internal static class UiStile { /// Blu del bottone primario, esposto qui per essere riusato anche da elementi - /// non-bottone (es. la barra di avanzamento di ProgressForm) invece di duplicare l'RGB. + /// non-bottone (es. il colore di selezione delle griglie in Form1) invece di duplicare + /// l'RGB. public static readonly Color ColorePrimario = Color.FromArgb(0, 99, 177); // AutoSize+Padding invece di una Size fissa in pixel: il bottone si dimensiona sempre