using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace CarManagerV2 { public partial class MainForm : Form { List cars = new List(); List lastCars = new List(); public MainForm() { InitializeComponent(); SafeManager.InitializeFile("cars.csv"); List _cars = SafeManager.ReadCars("cars.csv"); refreshCars(_cars); } private async void refreshCars(List _cars) { //if cars havent changed, dont refresh //bool changed = false; //foreach (Car car in _cars) //{ // Car existing = cars.FirstOrDefault(c => c.Id == car.Id); // if (existing == null) // { // Console.WriteLine($"Added: {car.Id}"); // changed = true; // break; // } // else if (existing.isChanged(car)) // { // Console.WriteLine($"Modified: {car.Id} / {existing.Id}"); // changed = true; // break; // } //} //if(!changed && cars.Count == _cars.Count) //{ // Console.WriteLine("Cars are the same, not refreshing."); // cars = _cars; // return; //} cars = _cars; //if(cars.SequenceEqual(_cars)) //{ // Console.WriteLine("Cars are the same, not refreshing."); // return; //} //else //{ // Console.WriteLine("Cars have changed, refreshing."); // Console.WriteLine($"Old cars count: {cars.Count}, New cars count: {_cars.Count}"); // //find differences // Console.WriteLine("Saved:"); // foreach (var car in cars) // { // Console.Write($"{car.Id}, {car.Make} {car.Model}, {car.Year} | "); // } // Console.WriteLine("-------------------"); // Console.WriteLine("New:"); // foreach (var car in _cars) // { // Console.Write($"{car.Id}, {car.Make} {car.Model}, {car.Year} | "); // } // Console.WriteLine(); // var addedCars = _cars.Except(cars).ToList(); // var removedCars = cars.Except(_cars).ToList(); // var modifiedCars = _cars.Where(c => cars.Any(c2 => c2.Id == c.Id && !c2.Equals(c))).ToList(); // Console.WriteLine($"Added cars: {addedCars.Count}, Removed cars: {removedCars.Count}, Modified cars: {modifiedCars.Count}"); //} // Get the cars currently in the FlowLayoutPanel to compare with _cars //flpCars.Controls.Clear(); foreach (Car car in _cars) { // not in list? add it bool isNew = flpCars.Controls.OfType().All(c => c.Car.Id != car.Id); bool isUpdated = false; // existing but changed? update it CarCard card = new CarCard(); if (!isNew) { CarCard existing = flpCars.Controls.OfType().First(c => c.Car.Id == car.Id); Car existingCar = existing.Car; if (existing == null) { Console.Error.WriteLine($"[L] Error: Existing car card not found for car ID: {car.Id}"); continue; } // compare details Console.WriteLine($"[L] Checking car: {car.Id} | Car Color: {car.Color} | Ex Color: {existingCar.Color}"); if (existingCar.IsChanged(car)) { isUpdated = true; Console.WriteLine($"[L] Updating car: {car.Id}"); // changes card = existing; } else { // no changes Console.WriteLine($"[L] No changes for car: {car.Id}"); continue; } } card.CarName = $"{car.Make} {car.Model}"; card.CarDetails = $"{car.Year}, {car.Mileage} km, ${car.Price}"; card.Car = car.Clone(); card.CarImage = await Task.Run(() => ImageManager.GetImage(car)); // clear existing event handlers to prevent multiple subscriptions card.ClearCardClickedHandlers(); card.CardClicked += (s, e) => { Console.WriteLine($"Card clicked: {car.Id}"); CarDetailsForm detailsForm = new CarDetailsForm(car); detailsForm.FormClosed += async (s2, e2) => { Console.WriteLine("Car details form closed."); // refresh cars Console.WriteLine("Refreshing cars..."); List __cars = await Task.Run(() => SafeManager.ReadCars("cars.csv")); refreshCars(__cars); }; detailsForm.ShowDialog(); }; if (isNew) { flpCars.Controls.Add(card); } } // Remove cards that are no longer in _cars var carIds = _cars.Select(c => c.Id).ToList(); var cardsToRemove = flpCars.Controls.OfType().Where(c => !carIds.Contains(c.Car.Id)).ToList(); foreach (var card in cardsToRemove) { flpCars.Controls.Remove(card); } flpCars.Invalidate(); flpCars.Refresh(); lastCars = new List(cars); } private void btnNewCar_Click(object sender, EventArgs e) { Car foocar = StateManager.CreateCar("New", "Car", 2020, "White", 0, 20000); CarDetailsForm detailsForm = new CarDetailsForm(foocar); detailsForm.FormClosed += (s2, e2) => { // refresh cars Console.WriteLine("Refreshing cars..."); cars = SafeManager.ReadCars("cars.csv"); refreshCars(cars); }; detailsForm.ShowDialog(); } void searchList(string query) { List results = new List(); foreach (Car car in cars) { if (car.Make.ToLower().Contains(query.ToLower()) || car.Model.ToLower().Contains(query.ToLower()) || car.Year.ToString().Contains(query) || car.Mileage.ToString().Contains(query) || car.Price.ToString().Contains(query)) { results.Add(car); } } refreshCars(results); } private void tbxSearch_TextChanged(object sender, EventArgs e) { string query = tbxSearch.Text; if(string.IsNullOrWhiteSpace(query)) { refreshCars(cars); } else { searchList(query); } } } }