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.
This commit is contained in:
davide committed 2026-09-22 10:02:14 +02:00
1 parent cf4c2e8e29
commit b136e7f49b
3 files changed
+25 -89

No files matched your search

+3 -3
View File
@@ -91,9 +91,9 @@ public partial class Form1 : Form
_lblFase.Font = new Font(Font, FontStyle.Bold); _lblFase.Font = new Font(Font, FontStyle.Bold);
headerPanel.Controls.Add(_lblFase); headerPanel.Controls.Add(_lblFase);
// Barra di navigazione come footer separato dal contenuto (stesso pattern di // Barra di navigazione come footer separato dal contenuto: linea sottile in cima e
// ProgressForm): linea sottile in cima + sfondo bianco, invece dei bottoni appoggiati // sfondo bianco, invece dei bottoni appoggiati direttamente sul contenuto/sulla barra
// direttamente sul contenuto/sulla barra di stato senza alcuna divisione visiva. // di stato senza alcuna divisione visiva.
// Padding destro = 16, lo stesso usato dai pannelli di ogni fase (Padding(16)): prima // 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. // 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 }; var navContainer = new Panel { Dock = DockStyle.Bottom, Height = 64, BackColor = Color.White };
+20 -85
View File
@@ -2,23 +2,15 @@ namespace PrepStep;
public sealed class ProgressForm : Form public sealed class ProgressForm : Form
{ {
private readonly Label _lblTitolo = new();
private readonly Label _lblCartella = new(); private readonly Label _lblCartella = new();
private readonly Panel _barraTraccia = new(); private readonly ProgressBar _bar = new();
private readonly Panel _barraRiempimento = new();
private readonly Label _lblPercentuale = new();
private readonly Label _lblConteggio = new(); private readonly Label _lblConteggio = new();
private readonly Label _lblDettaglio = new(); private readonly Label _lblDettaglio = new();
private readonly Label _lblEta = new(); private readonly Label _lblEta = new();
private readonly Button _btnAnnulla = new(); private readonly Button _btnAnnulla = new();
private readonly Panel _separatore = new();
private readonly Panel _piePagina = new();
private readonly ToolTip _tipCartella = new(); private readonly ToolTip _tipCartella = new();
private const int Margine = 24; private const int Margine = 16;
// 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);
public event EventHandler? Annullato; public event EventHandler? Annullato;
@@ -30,84 +22,42 @@ public sealed class ProgressForm : Form
MinimizeBox = false; MinimizeBox = false;
MaximizeBox = false; MaximizeBox = false;
ControlBox = false; ControlBox = false;
BackColor = Color.White; ClientSize = new Size(420, 190);
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);
_lblCartella.Text = "Preparazione..."; _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 "..." // 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. // invece di sforare il bordo del dialog, che è FixedDialog e non si può allargare. Il
// Il testo completo resta disponibile nel tooltip (stesso pattern di Form1._lblImportStatus). // testo completo resta disponibile nel tooltip.
_lblCartella.AutoSize = false; _lblCartella.AutoSize = false;
_lblCartella.AutoEllipsis = true; _lblCartella.AutoEllipsis = true;
_lblCartella.Size = new Size(ClientSize.Width - Margine * 2, 20); _lblCartella.Size = new Size(ClientSize.Width - Margine * 2, 20);
_lblCartella.ForeColor = GrigioTesto;
// Barra piatta disegnata a mano (traccia grigia + riempimento) invece della ProgressBar _bar.Location = new Point(Margine, 40);
// nativa: quella di Windows è verde e in stile "a blocchi", stona con il blu del resto _bar.Size = new Size(ClientSize.Width - Margine * 2, 24);
// dell'app (UiStile.Primario). Larghezza = margine destro reale meno lo spazio per _bar.Minimum = 0;
// "100%" in grassetto, così barra+percentuale rispettano lo stesso margine destro del _bar.Maximum = 100;
// 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);
_lblPercentuale.AutoSize = true; _lblConteggio.Location = new Point(Margine, 72);
_lblPercentuale.Font = new Font(Font, FontStyle.Bold);
_lblPercentuale.TextAlign = ContentAlignment.MiddleRight;
_lblConteggio.Location = new Point(Margine, 122);
_lblConteggio.AutoSize = true; _lblConteggio.AutoSize = true;
_lblDettaglio.Location = new Point(Margine, 146); _lblDettaglio.Location = new Point(Margine, 96);
_lblDettaglio.AutoSize = true; _lblDettaglio.AutoSize = true;
_lblDettaglio.ForeColor = GrigioTesto;
_lblEta.Location = new Point(Margine, 174); _lblEta.Location = new Point(Margine, 120);
_lblEta.AutoSize = true; _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"; _btnAnnulla.Text = "Annulla";
UiStile.Secondario(_btnAnnulla); _btnAnnulla.Size = new Size(90, 28);
UiStile.Arrotonda(_btnAnnulla);
_btnAnnulla.Click += (_, e) => Annullato?.Invoke(this, e); _btnAnnulla.Click += (_, e) => Annullato?.Invoke(this, e);
_piePagina.Controls.Add(_btnAnnulla);
Controls.AddRange(new Control[] Controls.AddRange(new Control[]
{ {
_lblTitolo, _lblCartella, _barraTraccia, _lblPercentuale, _lblCartella, _bar, _lblConteggio, _lblDettaglio, _lblEta, _btnAnnulla
_lblConteggio, _lblDettaglio, _lblEta, _separatore, _piePagina
}); });
// Posizionato dopo l'aggiunta ai Controls: con AutoSize il Width vero si conosce _btnAnnulla.Location = new Point(
// solo a layout avvenuto, non subito dopo la creazione del bottone. ClientSize.Width - Margine - _btnAnnulla.Width, ClientSize.Height - Margine - _btnAnnulla.Height);
_btnAnnulla.Location = new Point(_piePagina.Width - Margine - _btnAnnulla.Width,
(_piePagina.Height - _btnAnnulla.Height) / 2);
_btnAnnulla.Anchor = AnchorStyles.Right | AnchorStyles.Top;
} }
public void Aggiorna(ScanProgress p) public void Aggiorna(ScanProgress p)
@@ -115,24 +65,9 @@ public sealed class ProgressForm : Form
_lblCartella.Text = $"Scansione: {p.Cartella}"; _lblCartella.Text = $"Scansione: {p.Cartella}";
_tipCartella.SetToolTip(_lblCartella, _lblCartella.Text); _tipCartella.SetToolTip(_lblCartella, _lblCartella.Text);
if (p.PrevistiTotali > 0) _bar.Value = p.PrevistiTotali > 0
{ ? (int)Math.Clamp(100.0 * p.FattiTotali / p.PrevistiTotali, 0, 100)
double frazione = Math.Min(1.0, (double)p.FattiTotali / p.PrevistiTotali); : 0;
_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);
_lblConteggio.Text = p.PrevistiTotali > 0 _lblConteggio.Text = p.PrevistiTotali > 0
? $"{p.FattiTotali:N0} / ~{p.PrevistiTotali:N0} file" ? $"{p.FattiTotali:N0} / ~{p.PrevistiTotali:N0} file"
+2 -1
View File
@@ -8,7 +8,8 @@ namespace PrepStep;
internal static class UiStile internal static class UiStile
{ {
/// <summary>Blu del bottone primario, esposto qui per essere riusato anche da elementi /// <summary>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.</summary> /// non-bottone (es. il colore di selezione delle griglie in Form1) invece di duplicare
/// l'RGB.</summary>
public static readonly Color ColorePrimario = Color.FromArgb(0, 99, 177); public static readonly Color ColorePrimario = Color.FromArgb(0, 99, 177);
// AutoSize+Padding invece di una Size fissa in pixel: il bottone si dimensiona sempre // AutoSize+Padding invece di una Size fissa in pixel: il bottone si dimensiona sempre