diff --git a/CadSearchGui/Form1.cs b/CadSearchGui/Form1.cs index 969b6d3..38e46bd 100644 --- a/CadSearchGui/Form1.cs +++ b/CadSearchGui/Form1.cs @@ -636,7 +636,7 @@ public partial class Form1 : Form /// accoda per essere scansionati finché non restano solo PRT (foglie) o codici non presenti /// nell'indice. Usata dal bottone "Trova componenti referenziati". private (List<(string Codice, string Tipo, string Percorso)> Trovati, List NonTrovati) RisolviAlberoComponenti( - IEnumerable asmIniziali) + IEnumerable asmIniziali, IProgress<(int Fatti, int Totale)>? progress = null) { var daScansionare = new Queue(asmIniziali); var codiciVisti = new HashSet( @@ -655,9 +655,11 @@ public partial class Form1 : Form + "ORDER BY tipo_file, data_modifica DESC"; var pCodice = command.Parameters.Add("@codice", Microsoft.Data.Sqlite.SqliteType.Text); + int processati = 0; while (daScansionare.Count > 0) { var asm = daScansionare.Dequeue(); + processati++; foreach (var codice in AssemblyComponentScanner.EstraiCodiciReferenziati(asm)) { if (!codiciVisti.Add(codice)) @@ -696,12 +698,13 @@ public partial class Form1 : Form } } } + progress?.Report((processati, processati + daScansionare.Count)); } return (trovati, codiciNonTrovati); } - private void TrovaPrtReferenziati() + private async void TrovaPrtReferenziati() { if (_ultimaCartellaRaw is null || !Directory.Exists(_ultimaCartellaRaw)) return; @@ -714,8 +717,19 @@ public partial class Form1 : Form // L'assieme generale è già in raw come qualsiasi altro assieme importato (vedi // CreaCartellaRaw), quindi rientra qui senza bisogno di un caso speciale. - var asmIniziali = Directory.GetFiles(_ultimaCartellaRaw).Where(f => Path.GetFileName(f).Contains(".asm.")); - var (trovati, codiciNonTrovati) = RisolviAlberoComponenti(asmIniziali); + var asmIniziali = Directory.GetFiles(_ultimaCartellaRaw).Where(f => Path.GetFileName(f).Contains(".asm.")).ToList(); + + using var progressForm = new ProgressoComponentiForm(); + var progress = new Progress<(int Fatti, int Totale)>(p => progressForm.Aggiorna(p.Fatti, p.Totale)); + var task = Task.Run(() => RisolviAlberoComponenti(asmIniziali, progress)); + progressForm.Shown += async (_, _) => + { + await task; + progressForm.Close(); + }; + progressForm.ShowDialog(this); + + var (trovati, codiciNonTrovati) = await task; int numPrt = trovati.Count(r => r.Tipo == "prt"); int numAsm = trovati.Count(r => r.Tipo == "asm"); diff --git a/CadSearchGui/ProgressoComponentiForm.cs b/CadSearchGui/ProgressoComponentiForm.cs new file mode 100644 index 0000000..90568f4 --- /dev/null +++ b/CadSearchGui/ProgressoComponentiForm.cs @@ -0,0 +1,37 @@ +namespace CadSearchGui; + +public sealed class ProgressoComponentiForm : Form +{ + private readonly Label _lbl = new(); + private readonly ProgressBar _bar = new(); + + public ProgressoComponentiForm() + { + Text = "Ricerca componenti referenziati in corso..."; + FormBorderStyle = FormBorderStyle.FixedDialog; + StartPosition = FormStartPosition.CenterParent; + MinimizeBox = false; + MaximizeBox = false; + ControlBox = false; + ClientSize = new Size(400, 88); + + _lbl.Text = "Preparazione..."; + _lbl.AutoSize = true; + _lbl.Location = new Point(16, 16); + + _bar.Location = new Point(16, 44); + _bar.Size = new Size(368, 24); + _bar.Minimum = 0; + _bar.Maximum = 100; + + Controls.Add(_lbl); + Controls.Add(_bar); + } + + public void Aggiorna(int fatti, int totale) + { + int percento = totale > 0 ? (int)Math.Clamp(100.0 * fatti / totale, 0, 100) : 0; + _bar.Value = percento; + _lbl.Text = $"{fatti} / {totale} componenti analizzati ({percento}%)"; + } +}