using System.Net.Http.Json; namespace PizzaExpress_Client { public partial class GestionePizzeForm : Form { private readonly HttpClient _httpClient; private List _tutteLePizze = new(); private readonly ListBox _lstPizze; private readonly TextBox _txtId, _txtNome, _txtPrezzo, _txtRicerca, _txtNote; private readonly ComboBox _cmbCategoria, _cmbStato; private readonly Button _btnAggiungi, _btnAggiorna, _btnElimina, _btnElenco, _btnIngredienti, _btnNuovaPizza; public GestionePizzeForm() { Text = "Gestione Pizze (Database SQLite)"; // ============================= // DIMENSIONE FISSA DELLA FINESTRA // ============================= Size = new Size(1000, 600); MinimumSize = new Size(1000, 600); MaximumSize = new Size(1000, 600); FormBorderStyle = FormBorderStyle.FixedDialog; MaximizeBox = false; StartPosition = FormStartPosition.CenterScreen; _httpClient = new HttpClient { BaseAddress = new Uri("http://localhost:5000/") }; // ====================================================== // PANNELLO SUPERIORE // ====================================================== var pnlTop = new Panel { Dock = DockStyle.Top, Height = 60 }; var lblTitolo = new Label { Text = "Gestione Pizze", Font = new Font("Arial", 20, FontStyle.Bold), Location = new Point(10, 15), AutoSize = true }; _btnIngredienti = new Button { Text = "Ingredienti", Location = new Point(870, 15), Size = new Size(104, 30) }; _btnIngredienti.Click += BtnIngredienti_Click; pnlTop.Controls.Add(lblTitolo); pnlTop.Controls.Add(_btnIngredienti); // ====================================================== // PANNELLO SINISTRO // ====================================================== var pnlLeft = new Panel { Dock = DockStyle.Left, Width = 300, Padding = new Padding(10) }; _txtRicerca = new TextBox { PlaceholderText = "Cerca pizza...", Dock = DockStyle.Top, Height = 30 }; _txtRicerca.TextChanged += (s, e) => FiltraPizze(); _btnElenco = new Button { Text = "Ricarica elenco", Dock = DockStyle.Top, Height = 35 }; _btnElenco.Click += async (s, e) => await CaricaPizze(); _lstPizze = new ListBox { Dock = DockStyle.Fill, Font = new Font("Consolas", 10) }; _lstPizze.SelectedIndexChanged += LstPizze_SelectedIndexChanged; _btnNuovaPizza = new Button { Text = "Nuova pizza", Dock = DockStyle.Bottom, Height = 35 }; pnlLeft.Controls.Add(_lstPizze); pnlLeft.Controls.Add(_btnElenco); pnlLeft.Controls.Add(_txtRicerca); pnlLeft.Controls.Add(_btnNuovaPizza); // ====================================================== // PANNELLO DESTRO — ALLINEAMENTO PERFETTO A SINISTRA // ====================================================== var pnlRight = new TableLayoutPanel { Dock = DockStyle.Fill, ColumnCount = 2, Padding = new Padding(10), }; // Colonna etichette stretta, colonna input larga e allineata ai pulsanti pnlRight.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 18)); pnlRight.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 82)); pnlRight.Controls.Add(new Label { Text = "Modifica pizza", Font = new Font("Arial", 16, FontStyle.Bold), AutoSize = true }, 0, 0); pnlRight.SetColumnSpan(pnlRight.GetControlFromPosition(0, 0), 2); // ID _txtId = new TextBox { Visible = false }; pnlRight.Controls.Add(new Label { Text = "Id:", Visible = false }, 0, 1); pnlRight.Controls.Add(_txtId, 1, 1); // Nome pnlRight.Controls.Add(new Label { Text = "Nome:" }, 0, 2); _txtNome = new TextBox { Width = 300, Anchor = AnchorStyles.Left }; pnlRight.Controls.Add(_txtNome, 1, 2); // Prezzo pnlRight.Controls.Add(new Label { Text = "Prezzo:" }, 0, 3); _txtPrezzo = new TextBox { Width = 150, Anchor = AnchorStyles.Left }; pnlRight.Controls.Add(_txtPrezzo, 1, 3); // Categoria pnlRight.Controls.Add(new Label { Text = "Categoria:" }, 0, 4); _cmbCategoria = new ComboBox { Width = 200, DropDownStyle = ComboBoxStyle.DropDown, Anchor = AnchorStyles.Left }; _cmbCategoria.Items.AddRange(new[] { "Classica", "Speciale", "Gourmet" }); pnlRight.Controls.Add(_cmbCategoria, 1, 4); // NOTE — Campo grande e allineato pnlRight.Controls.Add(new Label { Text = "Note:" }, 0, 5); _txtNote = new TextBox { Multiline = true, Height = 230, Width = 500, ScrollBars = ScrollBars.Vertical, Anchor = AnchorStyles.Left }; pnlRight.Controls.Add(_txtNote, 1, 5); //Stato pnlRight.Controls.Add(new Label { Text = "Stato:" }, 0, 6); _cmbStato = new ComboBox { Width = 200, DropDownStyle = ComboBoxStyle.DropDown, Anchor = AnchorStyles.Left }; _cmbStato.Items.AddRange(new[] { "Rifiutata", "Ordinata", "In preparazione", "Preparata", "Servita"}); pnlRight.Controls.Add(_cmbStato, 1, 6); // ====================================================== // PANNELLO PULSANTI — ALLINEATO COL CAMPO NOME (SX) // ====================================================== var pnlButtons = new FlowLayoutPanel { FlowDirection = FlowDirection.LeftToRight, AutoSize = true, Anchor = AnchorStyles.Left, Padding = new Padding(0, 10, 0, 0) }; _btnAggiungi = new Button { Text = "Aggiungi", Width = 120, Enabled = false }; _btnAggiorna = new Button { Text = "Aggiorna", Width = 120, Enabled = false }; _btnElimina = new Button { Text = "Elimina", Width = 120, Enabled = false }; _btnAggiungi.Click += async (s, e) => await AggiungiPizza(); _btnAggiorna.Click += async (s, e) => await AggiornaPizza(); _btnElimina.Click += async (s, e) => await EliminaPizza(); _btnNuovaPizza.Click += (s, e) => PulisciCampi(); pnlButtons.Controls.Add(_btnAggiungi); pnlButtons.Controls.Add(_btnAggiorna); pnlButtons.Controls.Add(_btnElimina); pnlRight.Controls.Add(pnlButtons, 1, 7); // ====================================================== Controls.Add(pnlRight); Controls.Add(pnlLeft); Controls.Add(pnlTop); Load += async (s, e) => await CaricaPizze(); var formUrl = new UrlForm(_httpClient.BaseAddress.ToString()); formUrl.Show(); } // ====================================================================== private async Task CaricaPizze() { try { var pizze = await _httpClient.GetFromJsonAsync>("api/pizze"); _tutteLePizze = pizze ?? new List(); } catch(Exception ex) { MessageBox.Show("Errore nella connessione al server.\n" + ex.Message); _tutteLePizze = new List(); } FiltraPizze(); } private void FiltraPizze() { string filtro = _txtRicerca.Text.ToLower(); _lstPizze.Items.Clear(); foreach (var p in _tutteLePizze) { if (string.IsNullOrWhiteSpace(filtro) || p.Nome.ToLower().Contains(filtro) || p.Categoria.ToLower().Contains(filtro)) { _lstPizze.Items.Add(p.ToString()); } } } private void LstPizze_SelectedIndexChanged(object? sender, EventArgs e) { if (_lstPizze.SelectedIndex < 0) return; var p = _tutteLePizze[_lstPizze.SelectedIndex]; _txtId.Text = p.Id.ToString(); _txtNome.Text = p.Nome; _txtPrezzo.Text = p.Prezzo.ToString(); _cmbCategoria.Text = p.Categoria; _txtNote.Text = p.Note; _cmbStato.Text = p.Stato; _btnAggiungi.Enabled = false; _btnElimina.Enabled = true; _btnAggiorna.Enabled = true; _btnIngredienti.Enabled = true; } // ====================================================================== private async Task AggiungiPizza() { if (!decimal.TryParse(_txtPrezzo.Text, out decimal prezzo)) { MessageBox.Show("Prezzo non valido."); return; } var pizza = new Pizza { Nome = _txtNome.Text, Prezzo = prezzo, Categoria = _cmbCategoria.Text, Note = _txtNote.Text, Stato = _cmbStato.Text }; var resp = await _httpClient.PostAsJsonAsync("api/pizze", pizza); if (!resp.IsSuccessStatusCode) { var err = await resp.Content.ReadFromJsonAsync>(); MessageBox.Show(err["message"]); return; } await CaricaPizze(); } // ====================================================================== private async Task AggiornaPizza() { if (!int.TryParse(_txtId.Text, out int id)) { MessageBox.Show("ID non valido."); return; } if (!decimal.TryParse(_txtPrezzo.Text, out decimal prezzo)) { MessageBox.Show("Prezzo non valido."); return; } var pizza = new Pizza { Id = id, Nome = _txtNome.Text, Prezzo = prezzo, Categoria = _cmbCategoria.Text, Note = _txtNote.Text, Stato = _cmbStato.Text }; var resp = await _httpClient.PutAsJsonAsync($"api/pizze/{id}", pizza); if (!resp.IsSuccessStatusCode) { var err = await resp.Content.ReadFromJsonAsync>(); MessageBox.Show(err["message"]); return; } await CaricaPizze(); } // ====================================================================== private async Task EliminaPizza() { if (!int.TryParse(_txtId.Text, out int id)) { MessageBox.Show("Seleziona una pizza da eliminare."); } else if (MessageBox.Show("Confermi l'eliminazione della pizza selezionata?", "Conferma eliminazione", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { await _httpClient.DeleteAsync($"api/pizze/{id}"); await CaricaPizze(); _lstPizze.ClearSelected(); _txtId.Clear(); _txtNome.Clear(); _txtPrezzo.Clear(); _txtNote.Clear(); _cmbCategoria.SelectedIndex = -1; } } // ====================================================================== private void BtnIngredienti_Click(object? sender, EventArgs e) { if (_lstPizze.SelectedItem == null) { MessageBox.Show("Seleziona una pizza."); return; } MessageBox.Show("Funzionalità Ingredienti non ancora implementata."); } private void PulisciCampi() { _txtId.Clear(); _txtNome.Clear(); _txtPrezzo.Clear(); _txtNote.Clear(); _cmbCategoria.SelectedIndex = -1; _cmbStato.SelectedIndex = -1; _btnAggiungi.Enabled = true; _btnElimina.Enabled = false; _btnAggiorna.Enabled = false; _btnIngredienti.Enabled = false; } } }