Compare commits

5 Commits

Author SHA1 Message Date
1416ac4650 Aggiunto messaggio a errore connessione server 2026-01-22 08:57:30 +01:00
77f931ea3f Aggiunto vibecoding di campi 2026-01-22 08:54:11 +01:00
bd34c6ecf1 Fix file licenza aggiunto in compilazione 2026-01-22 08:41:38 +01:00
efed3dc316 Aggiunta modello Pizza 2026-01-22 08:38:56 +01:00
26fbeeee24 Aggiunta licenza 2026-01-22 08:38:11 +01:00
3 changed files with 391 additions and 1 deletions

View File

@@ -1,10 +1,355 @@
using System.Net.Http.Json;
namespace PizzaExpress_Client namespace PizzaExpress_Client
{ {
public partial class GestionePizzeForm : Form public partial class GestionePizzeForm : Form
{ {
private readonly HttpClient _httpClient;
private List<Pizza> _tutteLePizze = new();
private readonly ListBox _lstPizze;
private readonly TextBox _txtId, _txtNome, _txtPrezzo, _txtRicerca, _txtNote;
private readonly ComboBox _cmbCategoria;
private readonly Button _btnAggiungi, _btnAggiorna, _btnElimina, _btnElenco, _btnCosto;
public GestionePizzeForm() public GestionePizzeForm()
{ {
InitializeComponent(); 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
};
_btnCosto = new Button
{
Text = "Costo",
Location = new Point(900, 15),
Size = new Size(70, 30)
};
_btnCosto.Click += BtnCosto_Click;
pnlTop.Controls.Add(lblTitolo);
pnlTop.Controls.Add(_btnCosto);
// ======================================================
// 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;
pnlLeft.Controls.Add(_lstPizze);
pnlLeft.Controls.Add(_btnElenco);
pnlLeft.Controls.Add(_txtRicerca);
// ======================================================
// 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);
// ======================================================
// 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 };
_btnAggiorna = new Button { Text = "Aggiorna", Width = 120 };
_btnElimina = new Button { Text = "Elimina", Width = 120 };
_btnAggiungi.Click += async (s, e) => await AggiungiPizza();
_btnAggiorna.Click += async (s, e) => await AggiornaPizza();
_btnElimina.Click += async (s, e) => await EliminaPizza();
pnlButtons.Controls.Add(_btnAggiungi);
pnlButtons.Controls.Add(_btnAggiorna);
pnlButtons.Controls.Add(_btnElimina);
pnlRight.Controls.Add(pnlButtons, 1, 6);
// ======================================================
Controls.Add(pnlRight);
Controls.Add(pnlLeft);
Controls.Add(pnlTop);
Load += async (s, e) => await CaricaPizze();
}
// ======================================================================
private async Task CaricaPizze()
{
try
{
var pizze = await _httpClient.GetFromJsonAsync<List<Pizza>>("api/pizze");
_tutteLePizze = pizze ?? new List<Pizza>();
}
catch(Exception ex)
{
MessageBox.Show("Errore nella connessione al server.\n" + ex.Message);
_tutteLePizze = new List<Pizza>();
}
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;
}
// ======================================================================
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
};
var resp = await _httpClient.PostAsJsonAsync("api/pizze", pizza);
if (!resp.IsSuccessStatusCode)
{
var err = await resp.Content.ReadFromJsonAsync<Dictionary<string, string>>();
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
};
var resp = await _httpClient.PutAsJsonAsync($"api/pizze/{id}", pizza);
if (!resp.IsSuccessStatusCode)
{
var err = await resp.Content.ReadFromJsonAsync<Dictionary<string, string>>();
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.");
return;
}
await _httpClient.DeleteAsync($"api/pizze/{id}");
await CaricaPizze();
_lstPizze.ClearSelected();
_txtId.Clear();
_txtNome.Clear();
_txtPrezzo.Clear();
_txtNote.Clear();
_cmbCategoria.SelectedIndex = -1;
}
// ======================================================================
private void BtnCosto_Click(object? sender, EventArgs e)
{
if (_lstPizze.SelectedItem == null)
{
MessageBox.Show("Seleziona una pizza.");
return;
}
var s = _lstPizze.SelectedItem.ToString();
var parts = s.Split('-');
if (parts.Length >= 3)
{
string nome = parts[1].Trim();
string prezzo = parts[2].Replace("€", "").Trim();
MessageBox.Show($"La pizza {nome} costa {prezzo}€.");
}
} }
} }
} }

25
LICENSE Normal file
View File

@@ -0,0 +1,25 @@
GLWT(Good Luck With That) Public License
Copyright (c) Everyone, except Author
Everyone is permitted to copy, distribute, modify, merge, sell, publish,
sublicense or whatever they want with this software but at their OWN RISK.
Preamble
The author has absolutely no clue what the code in this project does.
It might just work or not, there is no third option.
GOOD LUCK WITH THAT PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION, AND MODIFICATION
0. You just DO WHATEVER YOU WANT TO as long as you NEVER LEAVE A
TRACE TO TRACK THE AUTHOR of the original product to blame for or hold
responsible.
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
Good luck and Godspeed.

20
Pizza.cs Normal file
View File

@@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PizzaExpress_Client
{
internal class Pizza
{
public int Id { get; set; }
public string Nome { get; set; } = string.Empty;
public decimal Prezzo { get; set; }
public string Categoria { get; set; } = string.Empty;
public string Note { get; set; } = string.Empty;
public int Tavolo { get; set; }
public string Stato { get; set; } = string.Empty;
}
}