Migliora UI: finestra aggiornamento indice, barra nav wizard, fase Verifica
- ProgressForm: gerarchia visiva, contrasto testo, barra piatta blu al posto della ProgressBar nativa verde, footer separato dal bottone Annulla. - Barra Avanti/Indietro: footer separato con linea, padding allineato ai pannelli di ogni fase, riordinata sopra la barra di stato come convenzione standard invece che sotto. - Fase 5 (Verifica completezza): bottone principale reso primario, lista file .asm passata da griglia di icone troncate a lista a riga singola leggibile. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
5c9661eb12
commit
9ecdccb6bb
3 files changed
+131
-41
No files matched your search
+46
-17
@@ -91,15 +91,23 @@ 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.
|
||||
// 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 };
|
||||
var navSeparatore = new Panel
|
||||
{
|
||||
Dock = DockStyle.Top,
|
||||
Height = 1,
|
||||
BackColor = Color.FromArgb(220, 220, 220),
|
||||
};
|
||||
var navPanel = new FlowLayoutPanel
|
||||
{
|
||||
Dock = DockStyle.Bottom,
|
||||
// I bottoni si auto-dimensionano al testo (UiStile): l'altezza qui deve stare
|
||||
// comoda sopra al loro MinimumSize (32) più il padding, altrimenti vengono
|
||||
// tagliati sul fondo della barra invece di restarci dentro.
|
||||
Height = 56,
|
||||
Dock = DockStyle.Fill,
|
||||
FlowDirection = FlowDirection.RightToLeft,
|
||||
Padding = new Padding(12, 10, 12, 10),
|
||||
Padding = new Padding(16, 14, 16, 14),
|
||||
};
|
||||
_btnAvanti.Text = "Avanti ›";
|
||||
UiStile.Primario(_btnAvanti);
|
||||
@@ -113,6 +121,8 @@ public partial class Form1 : Form
|
||||
UiStile.Arrotonda(_btnIndietro);
|
||||
_btnIndietro.Click += (_, _) => VaiAllaFase(_faseAttuale - 1);
|
||||
navPanel.Controls.Add(_btnIndietro);
|
||||
navContainer.Controls.Add(navPanel);
|
||||
navContainer.Controls.Add(navSeparatore);
|
||||
|
||||
var statusPanel = new Panel { Dock = DockStyle.Bottom, Height = 28, BackColor = SystemColors.ControlLight };
|
||||
_lblStatus.Dock = DockStyle.Fill;
|
||||
@@ -133,9 +143,12 @@ public partial class Form1 : Form
|
||||
_faseContainer.Controls.Add(panel);
|
||||
}
|
||||
|
||||
// Ordine dei Dock.Bottom: l'ultimo aggiunto è il più esterno (il vero bordo inferiore
|
||||
// della finestra). La barra di stato va tra contenuto e azioni; i bottoni Avanti/Indietro
|
||||
// restano il footer più esterno, come in ogni wizard/dialog standard di Windows.
|
||||
Controls.Add(_faseContainer);
|
||||
Controls.Add(navPanel);
|
||||
Controls.Add(statusPanel);
|
||||
Controls.Add(navContainer);
|
||||
Controls.Add(headerPanel);
|
||||
|
||||
DragEnter += (_, e) =>
|
||||
@@ -180,7 +193,7 @@ public partial class Form1 : Form
|
||||
private void AggiornaAnteprimaAsm()
|
||||
{
|
||||
_lstAnteprimaAsm.Items.Clear();
|
||||
_lstAnteprimaAsm.LargeImageList!.Images.Clear();
|
||||
_lstAnteprimaAsm.SmallImageList!.Images.Clear();
|
||||
if (_ultimaCartellaRaw is null || !Directory.Exists(_ultimaCartellaRaw) || _righeCorrenti is null)
|
||||
return;
|
||||
|
||||
@@ -204,8 +217,8 @@ public partial class Form1 : Form
|
||||
// ponytail: file irraggiungibile (share offline) -> icona generica, non blocca gli altri
|
||||
}
|
||||
|
||||
int indice = _lstAnteprimaAsm.LargeImageList.Images.Count;
|
||||
_lstAnteprimaAsm.LargeImageList.Images.Add(icona?.ToBitmap() ?? SystemIcons.WinLogo.ToBitmap());
|
||||
int indice = _lstAnteprimaAsm.SmallImageList.Images.Count;
|
||||
_lstAnteprimaAsm.SmallImageList.Images.Add(icona?.ToBitmap() ?? SystemIcons.WinLogo.ToBitmap());
|
||||
icona?.Dispose();
|
||||
_lstAnteprimaAsm.Items.Add(new ListViewItem(Path.GetFileName(percorso), indice) { Tag = percorso });
|
||||
}
|
||||
@@ -515,9 +528,12 @@ public partial class Form1 : Form
|
||||
};
|
||||
top.Controls.Add(lblIstruzioniCompletezza);
|
||||
|
||||
// Primario: è l'azione principale di questa fase, non una scelta secondaria — prima
|
||||
// era uno stile grigio che si confondeva con lo sfondo.
|
||||
_btnCompletezza.Text = "Verifica completezza assiemi";
|
||||
_btnCompletezza.Margin = new Padding(0, 0, 0, 12);
|
||||
UiStile.Secondario(_btnCompletezza);
|
||||
UiStile.Primario(_btnCompletezza);
|
||||
UiStile.Arrotonda(_btnCompletezza);
|
||||
_btnCompletezza.Click += (_, _) => VerificaCompletezzaAssiemi();
|
||||
top.Controls.Add(_btnCompletezza);
|
||||
|
||||
@@ -530,15 +546,28 @@ public partial class Form1 : Form
|
||||
};
|
||||
top.Controls.Add(lblAnteprimaAsm);
|
||||
|
||||
// Dock=Fill invece di una Size fissa: la lista occupa tutto lo spazio verticale
|
||||
// rimasto sotto le istruzioni, così si vedono più file .asm senza scroll anche a
|
||||
// finestra ingrandita, invece dei ~160px fissi di prima.
|
||||
_lstAnteprimaAsm.View = View.LargeIcon;
|
||||
// View.Details invece di LargeIcon: con codici Pro-E lunghi e simili tra loro
|
||||
// ("9244218...", "9244228..."), le icone in griglia troncavano tutti i nomi allo stesso
|
||||
// modo (illeggibili, indistinguibili) e lasciavano un grande vuoto sotto le poche righe.
|
||||
// Una lista a riga singola mostra il nome per intero, in linea con lo stile delle altre
|
||||
// griglie dell'app (_gridImport/_gridRaw), restando comunque trascinabile.
|
||||
_lstAnteprimaAsm.View = View.Details;
|
||||
_lstAnteprimaAsm.MultiSelect = true;
|
||||
_lstAnteprimaAsm.LargeImageList = new ImageList { ImageSize = new Size(32, 32) };
|
||||
_lstAnteprimaAsm.FullRowSelect = true;
|
||||
_lstAnteprimaAsm.GridLines = false;
|
||||
_lstAnteprimaAsm.HeaderStyle = ColumnHeaderStyle.Nonclickable;
|
||||
_lstAnteprimaAsm.SmallImageList = new ImageList { ImageSize = new Size(20, 20) };
|
||||
_lstAnteprimaAsm.Columns.Add("File .asm", -2);
|
||||
_lstAnteprimaAsm.Dock = DockStyle.Fill;
|
||||
_lstAnteprimaAsm.Margin = new Padding(0, 4, 0, 12);
|
||||
_lstAnteprimaAsm.BorderStyle = BorderStyle.FixedSingle;
|
||||
_lstAnteprimaAsm.BorderStyle = BorderStyle.None;
|
||||
// La colonna unica segue sempre la larghezza disponibile (niente scroll orizzontale
|
||||
// né spazio sprecato a destra quando la finestra viene ingrandita).
|
||||
_lstAnteprimaAsm.Resize += (_, _) =>
|
||||
{
|
||||
if (_lstAnteprimaAsm.Columns.Count > 0)
|
||||
_lstAnteprimaAsm.Columns[0].Width = _lstAnteprimaAsm.ClientSize.Width;
|
||||
};
|
||||
_lstAnteprimaAsm.ItemDrag += (_, e) =>
|
||||
{
|
||||
var percorsi = _lstAnteprimaAsm.SelectedItems.Cast<ListViewItem>()
|
||||
|
||||
Reference in new issue
Block a user