using System; using System.Collections.Generic; using System.Linq; namespace AssetStoreTools.Uploader.Data { internal class PackageGroup : IPackageGroup { private class FilteredPackage { public IPackage Package; public bool IsInFilter; } public string Name { get; private set; } public List Packages { get; private set; } private List _filteredPackages; public event Action> OnPackagesSorted; public event Action> OnPackagesFiltered; public PackageGroup(string name, List packages) { Name = name; Packages = packages; _filteredPackages = new List(); foreach (var package in Packages) _filteredPackages.Add(new FilteredPackage() { Package = package, IsInFilter = true }); } public void Sort(PackageSorting sortingType) { switch (sortingType) { case PackageSorting.Name: _filteredPackages = _filteredPackages.OrderBy(x => x.Package.Name).ToList(); break; case PackageSorting.Date: _filteredPackages = _filteredPackages.OrderByDescending(x => x.Package.Modified).ToList(); break; case PackageSorting.Category: _filteredPackages = _filteredPackages.OrderBy(x => x.Package.Category).ThenBy(x => x.Package.Name).ToList(); break; default: throw new NotImplementedException("Undefined sorting type"); } OnPackagesSorted?.Invoke(_filteredPackages.Where(x => x.IsInFilter).Select(x => x.Package).ToList()); } public void Filter(string filter) { foreach (var package in _filteredPackages) { bool inFilter = package.Package.Name.ToLower().Contains(filter.ToLower()); package.IsInFilter = inFilter; } OnPackagesFiltered?.Invoke(_filteredPackages.Where(x => x.IsInFilter).Select(x => x.Package).ToList()); } } }