From b26a453ac4bd5ad703af103aa62d41b053056340 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Wed, 19 Jun 2024 23:13:22 +0200 Subject: [PATCH 01/21] Create a base PackageLoader --- .../BasePackageLoader.cs | 174 ++++++++++++++++++ ...niGetUI.PackageEngine.PackageLoader.csproj | 41 +++++ src/UniGetUI.sln | 133 +++++++++++++ 3 files changed, 348 insertions(+) create mode 100644 src/UniGetUI.PackageEngine.PackageLoader/BasePackageLoader.cs create mode 100644 src/UniGetUI.PackageEngine.PackageLoader/UniGetUI.PackageEngine.PackageLoader.csproj diff --git a/src/UniGetUI.PackageEngine.PackageLoader/BasePackageLoader.cs b/src/UniGetUI.PackageEngine.PackageLoader/BasePackageLoader.cs new file mode 100644 index 000000000..ba101287b --- /dev/null +++ b/src/UniGetUI.PackageEngine.PackageLoader/BasePackageLoader.cs @@ -0,0 +1,174 @@ +using System.Collections.ObjectModel; +using UniGetUI.Core.Logging; +using UniGetUI.PackageEngine.PackageClasses; + +namespace UniGetUI.PackageEngine.PackageLoader +{ + public abstract class BasePackageLoader + { + /// + /// Checks if the loader has loaded packages + /// + public bool IsLoaded { get; private set; } + + /// + /// Checks if the loader is fetching new packages right now + /// + public bool IsLoading { get; private set; } + + /// + /// The collection of currently available packages + /// + public ObservableCollection Packages { get; private set; } + private Dictionary PackageReference; + + /// + /// Fires when a block of packages (one package or more) is added or removed to the loader + /// + public event EventHandler? PackagesChanged; + + /// + /// Fires when the loader finishes fetching packages + /// + public event EventHandler? FinishedLoading; + + /// + /// Fires when the manager starts fetching packages + /// + public event EventHandler? StartedLoading; + + bool ALLOW_MULTIPLE_PACKAGE_VERSIONS = false; + string LOADER_IDENTIFIER; + + public BasePackageLoader(bool AllowMultiplePackageVersions = false) + { + Packages = new ObservableCollection(); + PackageReference = new Dictionary(); + IsLoaded = false; + IsLoading = false; + LOADER_IDENTIFIER = "ABSTRACT"; + } + + /// + /// Will trigger a forceful reload of the packages + /// + /// + public async Task ReloadPackages() + { + IsLoading = true; + StartedLoading?.Invoke(this, new EventArgs()); + await LoadPackagesFromManagers(); + IsLoading = false; + FinishedLoading?.Invoke(this, new EventArgs()); + IsLoaded = true; + } + + /// + /// Resets the packages available on the loader + /// + public void ClearPackages() + { + Packages.Clear(); + PackageReference.Clear(); + IsLoaded = false; + PackagesChanged?.Invoke(this, new EventArgs()); + } + + /// + /// Loads the packages from the PackageManager + /// + /// + protected abstract Task LoadPackagesFromManagers(); + + /// + /// Checks wether a package is contained on the current Loader + /// + /// The package to check against + /// + public bool Contains(Package package) + { + return PackageReference.ContainsKey(HashPackage(package)); + } + + /// + /// Returns the appropiate hash of the package, according to the current loader configuration + /// + /// The pakage to hash + /// A long int containing the hash + protected long HashPackage(Package package) + { + return ALLOW_MULTIPLE_PACKAGE_VERSIONS ? package.GetVersionedHash() : package.GetHash(); + } + + protected void AddPackage(Package package) + { + if(Contains(package)) + { + Logger.Error($"ABORTED (Package loader {LOADER_IDENTIFIER}): Internally trying to add package {package.Id} was already found in PackageHash!"); + return; + } + + Packages.Add(package); + PackageReference.Add(HashPackage(package), package); + } + + /// + /// Adds a foreign package to the current loader. Perhaps a package has been recently installed and it needs to be added to the installed packages loader + /// + /// The package to add + public void AddForeign(Package? package) + { + if(package == null) return; + if(Contains(package)) return; + AddPackage(package); + PackagesChanged?.Invoke(this, new EventArgs()); + } + + /// + /// Removes the given package from the list. + /// + /// + public void Remove(Package? package) + { + if (package == null) return; + if (!Contains(package)) return; + Packages.Remove(package); + PackageReference.Remove(HashPackage(package)); + PackagesChanged?.Invoke(this, new EventArgs()); + } + + /// + /// Gets the corresponding package on the current loader. + /// This method follows the equivalence settings for this loader + /// + /// + /// A Package? object + public Package? GetEquivalentPackage(Package? package) + { + if(package == null) return null; + if(!Contains(package)) return null; + return PackageReference[HashPackage(package)]; + } + + /// + /// Gets ALL of the equivalent packages on this loader. + /// This method does NOT follow the equivalence settings for this loader + /// + /// The package for which to find the equivalent packages + /// A IEnumerable object + public IEnumerable GetEquivalentPackages(Package? package) + { + if (package == null) return []; + List result = new List(); + long hash_to_match = package.GetHash(); + foreach (Package local_package in Packages) + { + if (local_package.GetHash() == hash_to_match) + { + result.Add(local_package); + } + } + return result; + } + } +} diff --git a/src/UniGetUI.PackageEngine.PackageLoader/UniGetUI.PackageEngine.PackageLoader.csproj b/src/UniGetUI.PackageEngine.PackageLoader/UniGetUI.PackageEngine.PackageLoader.csproj new file mode 100644 index 000000000..016fe8ce5 --- /dev/null +++ b/src/UniGetUI.PackageEngine.PackageLoader/UniGetUI.PackageEngine.PackageLoader.csproj @@ -0,0 +1,41 @@ + + + net8.0-windows10.0.19041.0 + enable + win-x64;win-arm64 + win-$(Platform) + ARM64;x64 + 10.0.19041.0 + 10.0.19041.0 + 8.0.204 + true + true + 3.1.0.0 + 3.1.0-alpha0 + UniGetUI + Martí Climent and the contributors + Martí Climent + 3.1.0-alpha0 + 2024, Martí Climent + enable + + + + + + + + + + + + + + + + + + + + + diff --git a/src/UniGetUI.sln b/src/UniGetUI.sln index e59ff9893..70a66f6e6 100644 --- a/src/UniGetUI.sln +++ b/src/UniGetUI.sln @@ -82,132 +82,264 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Solution.props = Solution.props EndProjectSection EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UniGetUI.PackageEngine.PackageLoader", "UniGetUI.PackageEngine.PackageLoader\UniGetUI.PackageEngine.PackageLoader.csproj", "{27E0B288-7DFF-468D-9360-035E8CE123CB}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU Debug|x64 = Debug|x64 + Release|Any CPU = Release|Any CPU Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {80305A17-2534-48DC-8F75-41F70FCCEAAF}.Debug|Any CPU.ActiveCfg = Debug|x64 + {80305A17-2534-48DC-8F75-41F70FCCEAAF}.Debug|Any CPU.Build.0 = Debug|x64 {80305A17-2534-48DC-8F75-41F70FCCEAAF}.Debug|x64.ActiveCfg = Debug|x64 {80305A17-2534-48DC-8F75-41F70FCCEAAF}.Debug|x64.Build.0 = Debug|x64 + {80305A17-2534-48DC-8F75-41F70FCCEAAF}.Release|Any CPU.ActiveCfg = Release|x64 + {80305A17-2534-48DC-8F75-41F70FCCEAAF}.Release|Any CPU.Build.0 = Release|x64 {80305A17-2534-48DC-8F75-41F70FCCEAAF}.Release|x64.ActiveCfg = Release|x64 {80305A17-2534-48DC-8F75-41F70FCCEAAF}.Release|x64.Build.0 = Release|x64 + {52AC982E-7382-4746-BB66-4003698FCC02}.Debug|Any CPU.ActiveCfg = Debug|x64 + {52AC982E-7382-4746-BB66-4003698FCC02}.Debug|Any CPU.Build.0 = Debug|x64 {52AC982E-7382-4746-BB66-4003698FCC02}.Debug|x64.ActiveCfg = Debug|x64 {52AC982E-7382-4746-BB66-4003698FCC02}.Debug|x64.Build.0 = Debug|x64 + {52AC982E-7382-4746-BB66-4003698FCC02}.Release|Any CPU.ActiveCfg = Release|x64 + {52AC982E-7382-4746-BB66-4003698FCC02}.Release|Any CPU.Build.0 = Release|x64 {52AC982E-7382-4746-BB66-4003698FCC02}.Release|x64.ActiveCfg = Release|x64 {52AC982E-7382-4746-BB66-4003698FCC02}.Release|x64.Build.0 = Release|x64 + {5F5EF76B-D755-4C12-ADAE-11F08CE3D936}.Debug|Any CPU.ActiveCfg = Debug|x64 + {5F5EF76B-D755-4C12-ADAE-11F08CE3D936}.Debug|Any CPU.Build.0 = Debug|x64 {5F5EF76B-D755-4C12-ADAE-11F08CE3D936}.Debug|x64.ActiveCfg = Debug|x64 {5F5EF76B-D755-4C12-ADAE-11F08CE3D936}.Debug|x64.Build.0 = Debug|x64 + {5F5EF76B-D755-4C12-ADAE-11F08CE3D936}.Release|Any CPU.ActiveCfg = Release|x64 + {5F5EF76B-D755-4C12-ADAE-11F08CE3D936}.Release|Any CPU.Build.0 = Release|x64 {5F5EF76B-D755-4C12-ADAE-11F08CE3D936}.Release|x64.ActiveCfg = Release|x64 {5F5EF76B-D755-4C12-ADAE-11F08CE3D936}.Release|x64.Build.0 = Release|x64 + {B70A6F17-08C8-4194-BBE8-668CA920CFF3}.Debug|Any CPU.ActiveCfg = Debug|x64 + {B70A6F17-08C8-4194-BBE8-668CA920CFF3}.Debug|Any CPU.Build.0 = Debug|x64 {B70A6F17-08C8-4194-BBE8-668CA920CFF3}.Debug|x64.ActiveCfg = Debug|x64 {B70A6F17-08C8-4194-BBE8-668CA920CFF3}.Debug|x64.Build.0 = Debug|x64 + {B70A6F17-08C8-4194-BBE8-668CA920CFF3}.Release|Any CPU.ActiveCfg = Release|x64 + {B70A6F17-08C8-4194-BBE8-668CA920CFF3}.Release|Any CPU.Build.0 = Release|x64 {B70A6F17-08C8-4194-BBE8-668CA920CFF3}.Release|x64.ActiveCfg = Release|x64 {B70A6F17-08C8-4194-BBE8-668CA920CFF3}.Release|x64.Build.0 = Release|x64 + {72180B0C-3D20-4AAD-B015-A9337B91406E}.Debug|Any CPU.ActiveCfg = Debug|x64 + {72180B0C-3D20-4AAD-B015-A9337B91406E}.Debug|Any CPU.Build.0 = Debug|x64 {72180B0C-3D20-4AAD-B015-A9337B91406E}.Debug|x64.ActiveCfg = Debug|x64 {72180B0C-3D20-4AAD-B015-A9337B91406E}.Debug|x64.Build.0 = Debug|x64 + {72180B0C-3D20-4AAD-B015-A9337B91406E}.Release|Any CPU.ActiveCfg = Release|x64 + {72180B0C-3D20-4AAD-B015-A9337B91406E}.Release|Any CPU.Build.0 = Release|x64 {72180B0C-3D20-4AAD-B015-A9337B91406E}.Release|x64.ActiveCfg = Release|x64 {72180B0C-3D20-4AAD-B015-A9337B91406E}.Release|x64.Build.0 = Release|x64 + {1977360F-2E42-45E6-9369-AB1EE59CC5C5}.Debug|Any CPU.ActiveCfg = Debug|x64 + {1977360F-2E42-45E6-9369-AB1EE59CC5C5}.Debug|Any CPU.Build.0 = Debug|x64 {1977360F-2E42-45E6-9369-AB1EE59CC5C5}.Debug|x64.ActiveCfg = Debug|x64 {1977360F-2E42-45E6-9369-AB1EE59CC5C5}.Debug|x64.Build.0 = Debug|x64 + {1977360F-2E42-45E6-9369-AB1EE59CC5C5}.Release|Any CPU.ActiveCfg = Release|x64 + {1977360F-2E42-45E6-9369-AB1EE59CC5C5}.Release|Any CPU.Build.0 = Release|x64 {1977360F-2E42-45E6-9369-AB1EE59CC5C5}.Release|x64.ActiveCfg = Release|x64 {1977360F-2E42-45E6-9369-AB1EE59CC5C5}.Release|x64.Build.0 = Release|x64 + {25C6CE64-2D61-4832-B6D2-45AFC52E2447}.Debug|Any CPU.ActiveCfg = Debug|x64 + {25C6CE64-2D61-4832-B6D2-45AFC52E2447}.Debug|Any CPU.Build.0 = Debug|x64 {25C6CE64-2D61-4832-B6D2-45AFC52E2447}.Debug|x64.ActiveCfg = Debug|x64 {25C6CE64-2D61-4832-B6D2-45AFC52E2447}.Debug|x64.Build.0 = Debug|x64 + {25C6CE64-2D61-4832-B6D2-45AFC52E2447}.Release|Any CPU.ActiveCfg = Release|x64 + {25C6CE64-2D61-4832-B6D2-45AFC52E2447}.Release|Any CPU.Build.0 = Release|x64 {25C6CE64-2D61-4832-B6D2-45AFC52E2447}.Release|x64.ActiveCfg = Release|x64 {25C6CE64-2D61-4832-B6D2-45AFC52E2447}.Release|x64.Build.0 = Release|x64 + {8156B6D8-BD7E-4201-BD8B-8C9B00177F88}.Debug|Any CPU.ActiveCfg = Debug|x64 + {8156B6D8-BD7E-4201-BD8B-8C9B00177F88}.Debug|Any CPU.Build.0 = Debug|x64 {8156B6D8-BD7E-4201-BD8B-8C9B00177F88}.Debug|x64.ActiveCfg = Debug|x64 {8156B6D8-BD7E-4201-BD8B-8C9B00177F88}.Debug|x64.Build.0 = Debug|x64 + {8156B6D8-BD7E-4201-BD8B-8C9B00177F88}.Release|Any CPU.ActiveCfg = Release|x64 + {8156B6D8-BD7E-4201-BD8B-8C9B00177F88}.Release|Any CPU.Build.0 = Release|x64 {8156B6D8-BD7E-4201-BD8B-8C9B00177F88}.Release|x64.ActiveCfg = Release|x64 {8156B6D8-BD7E-4201-BD8B-8C9B00177F88}.Release|x64.Build.0 = Release|x64 + {990F5AFF-ABF6-4019-865D-604D2B23DE2C}.Debug|Any CPU.ActiveCfg = Debug|x64 + {990F5AFF-ABF6-4019-865D-604D2B23DE2C}.Debug|Any CPU.Build.0 = Debug|x64 {990F5AFF-ABF6-4019-865D-604D2B23DE2C}.Debug|x64.ActiveCfg = Debug|x64 {990F5AFF-ABF6-4019-865D-604D2B23DE2C}.Debug|x64.Build.0 = Debug|x64 + {990F5AFF-ABF6-4019-865D-604D2B23DE2C}.Release|Any CPU.ActiveCfg = Release|x64 + {990F5AFF-ABF6-4019-865D-604D2B23DE2C}.Release|Any CPU.Build.0 = Release|x64 {990F5AFF-ABF6-4019-865D-604D2B23DE2C}.Release|x64.ActiveCfg = Release|x64 {990F5AFF-ABF6-4019-865D-604D2B23DE2C}.Release|x64.Build.0 = Release|x64 + {380E9F5A-23DE-4F5A-9644-EFA51AD1D8E8}.Debug|Any CPU.ActiveCfg = Debug|x64 + {380E9F5A-23DE-4F5A-9644-EFA51AD1D8E8}.Debug|Any CPU.Build.0 = Debug|x64 {380E9F5A-23DE-4F5A-9644-EFA51AD1D8E8}.Debug|x64.ActiveCfg = Debug|x64 {380E9F5A-23DE-4F5A-9644-EFA51AD1D8E8}.Debug|x64.Build.0 = Debug|x64 + {380E9F5A-23DE-4F5A-9644-EFA51AD1D8E8}.Release|Any CPU.ActiveCfg = Release|x64 + {380E9F5A-23DE-4F5A-9644-EFA51AD1D8E8}.Release|Any CPU.Build.0 = Release|x64 {380E9F5A-23DE-4F5A-9644-EFA51AD1D8E8}.Release|x64.ActiveCfg = Release|x64 {380E9F5A-23DE-4F5A-9644-EFA51AD1D8E8}.Release|x64.Build.0 = Release|x64 + {5A48C2FD-16E4-4B44-BC2C-D793C50E66F2}.Debug|Any CPU.ActiveCfg = Debug|x64 + {5A48C2FD-16E4-4B44-BC2C-D793C50E66F2}.Debug|Any CPU.Build.0 = Debug|x64 {5A48C2FD-16E4-4B44-BC2C-D793C50E66F2}.Debug|x64.ActiveCfg = Debug|x64 {5A48C2FD-16E4-4B44-BC2C-D793C50E66F2}.Debug|x64.Build.0 = Debug|x64 + {5A48C2FD-16E4-4B44-BC2C-D793C50E66F2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5A48C2FD-16E4-4B44-BC2C-D793C50E66F2}.Release|Any CPU.Build.0 = Release|Any CPU {5A48C2FD-16E4-4B44-BC2C-D793C50E66F2}.Release|x64.ActiveCfg = Release|x64 {5A48C2FD-16E4-4B44-BC2C-D793C50E66F2}.Release|x64.Build.0 = Release|x64 + {9AD1DEC9-1561-4753-AB4B-E81FBDBA5C9E}.Debug|Any CPU.ActiveCfg = Debug|x64 + {9AD1DEC9-1561-4753-AB4B-E81FBDBA5C9E}.Debug|Any CPU.Build.0 = Debug|x64 {9AD1DEC9-1561-4753-AB4B-E81FBDBA5C9E}.Debug|x64.ActiveCfg = Debug|x64 {9AD1DEC9-1561-4753-AB4B-E81FBDBA5C9E}.Debug|x64.Build.0 = Debug|x64 + {9AD1DEC9-1561-4753-AB4B-E81FBDBA5C9E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9AD1DEC9-1561-4753-AB4B-E81FBDBA5C9E}.Release|Any CPU.Build.0 = Release|Any CPU {9AD1DEC9-1561-4753-AB4B-E81FBDBA5C9E}.Release|x64.ActiveCfg = Release|x64 {9AD1DEC9-1561-4753-AB4B-E81FBDBA5C9E}.Release|x64.Build.0 = Release|x64 + {E40BFCBB-7A02-4E2C-AFDB-A717359EF4FC}.Debug|Any CPU.ActiveCfg = Debug|x64 + {E40BFCBB-7A02-4E2C-AFDB-A717359EF4FC}.Debug|Any CPU.Build.0 = Debug|x64 {E40BFCBB-7A02-4E2C-AFDB-A717359EF4FC}.Debug|x64.ActiveCfg = Debug|x64 {E40BFCBB-7A02-4E2C-AFDB-A717359EF4FC}.Debug|x64.Build.0 = Debug|x64 + {E40BFCBB-7A02-4E2C-AFDB-A717359EF4FC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E40BFCBB-7A02-4E2C-AFDB-A717359EF4FC}.Release|Any CPU.Build.0 = Release|Any CPU {E40BFCBB-7A02-4E2C-AFDB-A717359EF4FC}.Release|x64.ActiveCfg = Release|x64 {E40BFCBB-7A02-4E2C-AFDB-A717359EF4FC}.Release|x64.Build.0 = Release|x64 + {562B4814-2A78-4692-90BE-A727AABCEC85}.Debug|Any CPU.ActiveCfg = Debug|x64 + {562B4814-2A78-4692-90BE-A727AABCEC85}.Debug|Any CPU.Build.0 = Debug|x64 {562B4814-2A78-4692-90BE-A727AABCEC85}.Debug|x64.ActiveCfg = Debug|x64 {562B4814-2A78-4692-90BE-A727AABCEC85}.Debug|x64.Build.0 = Debug|x64 + {562B4814-2A78-4692-90BE-A727AABCEC85}.Release|Any CPU.ActiveCfg = Release|x64 + {562B4814-2A78-4692-90BE-A727AABCEC85}.Release|Any CPU.Build.0 = Release|x64 {562B4814-2A78-4692-90BE-A727AABCEC85}.Release|x64.ActiveCfg = Release|x64 {562B4814-2A78-4692-90BE-A727AABCEC85}.Release|x64.Build.0 = Release|x64 + {1A51EA31-6D78-4E98-B767-41A02C6E34D8}.Debug|Any CPU.ActiveCfg = Debug|x64 + {1A51EA31-6D78-4E98-B767-41A02C6E34D8}.Debug|Any CPU.Build.0 = Debug|x64 {1A51EA31-6D78-4E98-B767-41A02C6E34D8}.Debug|x64.ActiveCfg = Debug|x64 {1A51EA31-6D78-4E98-B767-41A02C6E34D8}.Debug|x64.Build.0 = Debug|x64 + {1A51EA31-6D78-4E98-B767-41A02C6E34D8}.Release|Any CPU.ActiveCfg = Release|x64 + {1A51EA31-6D78-4E98-B767-41A02C6E34D8}.Release|Any CPU.Build.0 = Release|x64 {1A51EA31-6D78-4E98-B767-41A02C6E34D8}.Release|x64.ActiveCfg = Release|x64 {1A51EA31-6D78-4E98-B767-41A02C6E34D8}.Release|x64.Build.0 = Release|x64 + {230BF08C-C039-473B-933F-3BF647440E0E}.Debug|Any CPU.ActiveCfg = Debug|x64 + {230BF08C-C039-473B-933F-3BF647440E0E}.Debug|Any CPU.Build.0 = Debug|x64 {230BF08C-C039-473B-933F-3BF647440E0E}.Debug|x64.ActiveCfg = Debug|x64 {230BF08C-C039-473B-933F-3BF647440E0E}.Debug|x64.Build.0 = Debug|x64 + {230BF08C-C039-473B-933F-3BF647440E0E}.Release|Any CPU.ActiveCfg = Release|x64 + {230BF08C-C039-473B-933F-3BF647440E0E}.Release|Any CPU.Build.0 = Release|x64 {230BF08C-C039-473B-933F-3BF647440E0E}.Release|x64.ActiveCfg = Release|x64 {230BF08C-C039-473B-933F-3BF647440E0E}.Release|x64.Build.0 = Release|x64 + {C55F4BA7-BBDD-42A4-88C1-FD3C411EB234}.Debug|Any CPU.ActiveCfg = Debug|x64 + {C55F4BA7-BBDD-42A4-88C1-FD3C411EB234}.Debug|Any CPU.Build.0 = Debug|x64 {C55F4BA7-BBDD-42A4-88C1-FD3C411EB234}.Debug|x64.ActiveCfg = Debug|x64 {C55F4BA7-BBDD-42A4-88C1-FD3C411EB234}.Debug|x64.Build.0 = Debug|x64 + {C55F4BA7-BBDD-42A4-88C1-FD3C411EB234}.Release|Any CPU.ActiveCfg = Release|x64 + {C55F4BA7-BBDD-42A4-88C1-FD3C411EB234}.Release|Any CPU.Build.0 = Release|x64 {C55F4BA7-BBDD-42A4-88C1-FD3C411EB234}.Release|x64.ActiveCfg = Release|x64 {C55F4BA7-BBDD-42A4-88C1-FD3C411EB234}.Release|x64.Build.0 = Release|x64 + {2979E556-5859-4E88-A1D4-EAB72F82294E}.Debug|Any CPU.ActiveCfg = Debug|x64 + {2979E556-5859-4E88-A1D4-EAB72F82294E}.Debug|Any CPU.Build.0 = Debug|x64 {2979E556-5859-4E88-A1D4-EAB72F82294E}.Debug|x64.ActiveCfg = Debug|x64 {2979E556-5859-4E88-A1D4-EAB72F82294E}.Debug|x64.Build.0 = Debug|x64 + {2979E556-5859-4E88-A1D4-EAB72F82294E}.Release|Any CPU.ActiveCfg = Release|x64 + {2979E556-5859-4E88-A1D4-EAB72F82294E}.Release|Any CPU.Build.0 = Release|x64 {2979E556-5859-4E88-A1D4-EAB72F82294E}.Release|x64.ActiveCfg = Release|x64 {2979E556-5859-4E88-A1D4-EAB72F82294E}.Release|x64.Build.0 = Release|x64 + {7E098666-DE8C-4ABF-B709-4CE7B1A491B0}.Debug|Any CPU.ActiveCfg = Debug|x64 + {7E098666-DE8C-4ABF-B709-4CE7B1A491B0}.Debug|Any CPU.Build.0 = Debug|x64 {7E098666-DE8C-4ABF-B709-4CE7B1A491B0}.Debug|x64.ActiveCfg = Debug|x64 {7E098666-DE8C-4ABF-B709-4CE7B1A491B0}.Debug|x64.Build.0 = Debug|x64 + {7E098666-DE8C-4ABF-B709-4CE7B1A491B0}.Release|Any CPU.ActiveCfg = Release|x64 + {7E098666-DE8C-4ABF-B709-4CE7B1A491B0}.Release|Any CPU.Build.0 = Release|x64 {7E098666-DE8C-4ABF-B709-4CE7B1A491B0}.Release|x64.ActiveCfg = Release|x64 {7E098666-DE8C-4ABF-B709-4CE7B1A491B0}.Release|x64.Build.0 = Release|x64 + {B5E11AAA-B800-455E-9C64-051FFEFD6C0B}.Debug|Any CPU.ActiveCfg = Debug|x64 + {B5E11AAA-B800-455E-9C64-051FFEFD6C0B}.Debug|Any CPU.Build.0 = Debug|x64 {B5E11AAA-B800-455E-9C64-051FFEFD6C0B}.Debug|x64.ActiveCfg = Debug|x64 {B5E11AAA-B800-455E-9C64-051FFEFD6C0B}.Debug|x64.Build.0 = Debug|x64 + {B5E11AAA-B800-455E-9C64-051FFEFD6C0B}.Release|Any CPU.ActiveCfg = Release|x64 + {B5E11AAA-B800-455E-9C64-051FFEFD6C0B}.Release|Any CPU.Build.0 = Release|x64 {B5E11AAA-B800-455E-9C64-051FFEFD6C0B}.Release|x64.ActiveCfg = Release|x64 {B5E11AAA-B800-455E-9C64-051FFEFD6C0B}.Release|x64.Build.0 = Release|x64 + {D47CC16E-466B-4D58-A8FC-ECAE5C9606FC}.Debug|Any CPU.ActiveCfg = Debug|x64 + {D47CC16E-466B-4D58-A8FC-ECAE5C9606FC}.Debug|Any CPU.Build.0 = Debug|x64 {D47CC16E-466B-4D58-A8FC-ECAE5C9606FC}.Debug|x64.ActiveCfg = Debug|x64 {D47CC16E-466B-4D58-A8FC-ECAE5C9606FC}.Debug|x64.Build.0 = Debug|x64 + {D47CC16E-466B-4D58-A8FC-ECAE5C9606FC}.Release|Any CPU.ActiveCfg = Release|x64 + {D47CC16E-466B-4D58-A8FC-ECAE5C9606FC}.Release|Any CPU.Build.0 = Release|x64 {D47CC16E-466B-4D58-A8FC-ECAE5C9606FC}.Release|x64.ActiveCfg = Release|x64 {D47CC16E-466B-4D58-A8FC-ECAE5C9606FC}.Release|x64.Build.0 = Release|x64 + {1143176D-B7F0-477C-90BB-72289068D927}.Debug|Any CPU.ActiveCfg = Debug|x64 + {1143176D-B7F0-477C-90BB-72289068D927}.Debug|Any CPU.Build.0 = Debug|x64 {1143176D-B7F0-477C-90BB-72289068D927}.Debug|x64.ActiveCfg = Debug|x64 {1143176D-B7F0-477C-90BB-72289068D927}.Debug|x64.Build.0 = Debug|x64 + {1143176D-B7F0-477C-90BB-72289068D927}.Release|Any CPU.ActiveCfg = Release|x64 + {1143176D-B7F0-477C-90BB-72289068D927}.Release|Any CPU.Build.0 = Release|x64 {1143176D-B7F0-477C-90BB-72289068D927}.Release|x64.ActiveCfg = Release|x64 {1143176D-B7F0-477C-90BB-72289068D927}.Release|x64.Build.0 = Release|x64 + {E454D3A5-C5C6-4291-BE96-220CF0D5CFFD}.Debug|Any CPU.ActiveCfg = Debug|x64 + {E454D3A5-C5C6-4291-BE96-220CF0D5CFFD}.Debug|Any CPU.Build.0 = Debug|x64 {E454D3A5-C5C6-4291-BE96-220CF0D5CFFD}.Debug|x64.ActiveCfg = Debug|x64 {E454D3A5-C5C6-4291-BE96-220CF0D5CFFD}.Debug|x64.Build.0 = Debug|x64 + {E454D3A5-C5C6-4291-BE96-220CF0D5CFFD}.Release|Any CPU.ActiveCfg = Release|x64 + {E454D3A5-C5C6-4291-BE96-220CF0D5CFFD}.Release|Any CPU.Build.0 = Release|x64 {E454D3A5-C5C6-4291-BE96-220CF0D5CFFD}.Release|x64.ActiveCfg = Release|x64 {E454D3A5-C5C6-4291-BE96-220CF0D5CFFD}.Release|x64.Build.0 = Release|x64 + {57D094C1-6913-46BF-A657-84A5F46D4EE7}.Debug|Any CPU.ActiveCfg = Debug|x64 + {57D094C1-6913-46BF-A657-84A5F46D4EE7}.Debug|Any CPU.Build.0 = Debug|x64 {57D094C1-6913-46BF-A657-84A5F46D4EE7}.Debug|x64.ActiveCfg = Debug|x64 {57D094C1-6913-46BF-A657-84A5F46D4EE7}.Debug|x64.Build.0 = Debug|x64 + {57D094C1-6913-46BF-A657-84A5F46D4EE7}.Release|Any CPU.ActiveCfg = Release|x64 + {57D094C1-6913-46BF-A657-84A5F46D4EE7}.Release|Any CPU.Build.0 = Release|x64 {57D094C1-6913-46BF-A657-84A5F46D4EE7}.Release|x64.ActiveCfg = Release|x64 {57D094C1-6913-46BF-A657-84A5F46D4EE7}.Release|x64.Build.0 = Release|x64 + {740E2894-903D-4B94-9C32-B630593BEB16}.Debug|Any CPU.ActiveCfg = Debug|x64 + {740E2894-903D-4B94-9C32-B630593BEB16}.Debug|Any CPU.Build.0 = Debug|x64 {740E2894-903D-4B94-9C32-B630593BEB16}.Debug|x64.ActiveCfg = Debug|x64 {740E2894-903D-4B94-9C32-B630593BEB16}.Debug|x64.Build.0 = Debug|x64 + {740E2894-903D-4B94-9C32-B630593BEB16}.Release|Any CPU.ActiveCfg = Release|x64 + {740E2894-903D-4B94-9C32-B630593BEB16}.Release|Any CPU.Build.0 = Release|x64 {740E2894-903D-4B94-9C32-B630593BEB16}.Release|x64.ActiveCfg = Release|x64 {740E2894-903D-4B94-9C32-B630593BEB16}.Release|x64.Build.0 = Release|x64 + {D401F706-A182-46E3-A25C-B0BF5AA0D07E}.Debug|Any CPU.ActiveCfg = Debug|x64 + {D401F706-A182-46E3-A25C-B0BF5AA0D07E}.Debug|Any CPU.Build.0 = Debug|x64 {D401F706-A182-46E3-A25C-B0BF5AA0D07E}.Debug|x64.ActiveCfg = Debug|x64 {D401F706-A182-46E3-A25C-B0BF5AA0D07E}.Debug|x64.Build.0 = Debug|x64 + {D401F706-A182-46E3-A25C-B0BF5AA0D07E}.Release|Any CPU.ActiveCfg = Release|x64 + {D401F706-A182-46E3-A25C-B0BF5AA0D07E}.Release|Any CPU.Build.0 = Release|x64 {D401F706-A182-46E3-A25C-B0BF5AA0D07E}.Release|x64.ActiveCfg = Release|x64 {D401F706-A182-46E3-A25C-B0BF5AA0D07E}.Release|x64.Build.0 = Release|x64 + {0FFA3F96-A68A-453F-A5FE-0C281EC371C7}.Debug|Any CPU.ActiveCfg = Debug|x64 + {0FFA3F96-A68A-453F-A5FE-0C281EC371C7}.Debug|Any CPU.Build.0 = Debug|x64 {0FFA3F96-A68A-453F-A5FE-0C281EC371C7}.Debug|x64.ActiveCfg = Debug|x64 {0FFA3F96-A68A-453F-A5FE-0C281EC371C7}.Debug|x64.Build.0 = Debug|x64 + {0FFA3F96-A68A-453F-A5FE-0C281EC371C7}.Release|Any CPU.ActiveCfg = Release|x64 + {0FFA3F96-A68A-453F-A5FE-0C281EC371C7}.Release|Any CPU.Build.0 = Release|x64 {0FFA3F96-A68A-453F-A5FE-0C281EC371C7}.Release|x64.ActiveCfg = Release|x64 {0FFA3F96-A68A-453F-A5FE-0C281EC371C7}.Release|x64.Build.0 = Release|x64 + {5FA79592-DE5B-46FF-9E05-34A2E72A7AF7}.Debug|Any CPU.ActiveCfg = Debug|x64 + {5FA79592-DE5B-46FF-9E05-34A2E72A7AF7}.Debug|Any CPU.Build.0 = Debug|x64 {5FA79592-DE5B-46FF-9E05-34A2E72A7AF7}.Debug|x64.ActiveCfg = Debug|x64 {5FA79592-DE5B-46FF-9E05-34A2E72A7AF7}.Debug|x64.Build.0 = Debug|x64 + {5FA79592-DE5B-46FF-9E05-34A2E72A7AF7}.Release|Any CPU.ActiveCfg = Release|x64 + {5FA79592-DE5B-46FF-9E05-34A2E72A7AF7}.Release|Any CPU.Build.0 = Release|x64 {5FA79592-DE5B-46FF-9E05-34A2E72A7AF7}.Release|x64.ActiveCfg = Release|x64 {5FA79592-DE5B-46FF-9E05-34A2E72A7AF7}.Release|x64.Build.0 = Release|x64 + {09FD3D3A-1EFC-4AEE-B3D7-096D238E0D1A}.Debug|Any CPU.ActiveCfg = Debug|x64 + {09FD3D3A-1EFC-4AEE-B3D7-096D238E0D1A}.Debug|Any CPU.Build.0 = Debug|x64 {09FD3D3A-1EFC-4AEE-B3D7-096D238E0D1A}.Debug|x64.ActiveCfg = Debug|x64 {09FD3D3A-1EFC-4AEE-B3D7-096D238E0D1A}.Debug|x64.Build.0 = Debug|x64 + {09FD3D3A-1EFC-4AEE-B3D7-096D238E0D1A}.Release|Any CPU.ActiveCfg = Release|x64 + {09FD3D3A-1EFC-4AEE-B3D7-096D238E0D1A}.Release|Any CPU.Build.0 = Release|x64 {09FD3D3A-1EFC-4AEE-B3D7-096D238E0D1A}.Release|x64.ActiveCfg = Release|x64 {09FD3D3A-1EFC-4AEE-B3D7-096D238E0D1A}.Release|x64.Build.0 = Release|x64 + {BDB7A8F3-87A6-4B77-9E0F-6BC785CBCF2B}.Debug|Any CPU.ActiveCfg = Debug|x64 + {BDB7A8F3-87A6-4B77-9E0F-6BC785CBCF2B}.Debug|Any CPU.Build.0 = Debug|x64 {BDB7A8F3-87A6-4B77-9E0F-6BC785CBCF2B}.Debug|x64.ActiveCfg = Debug|x64 {BDB7A8F3-87A6-4B77-9E0F-6BC785CBCF2B}.Debug|x64.Build.0 = Debug|x64 + {BDB7A8F3-87A6-4B77-9E0F-6BC785CBCF2B}.Release|Any CPU.ActiveCfg = Release|x64 + {BDB7A8F3-87A6-4B77-9E0F-6BC785CBCF2B}.Release|Any CPU.Build.0 = Release|x64 {BDB7A8F3-87A6-4B77-9E0F-6BC785CBCF2B}.Release|x64.ActiveCfg = Release|x64 {BDB7A8F3-87A6-4B77-9E0F-6BC785CBCF2B}.Release|x64.Build.0 = Release|x64 + {27E0B288-7DFF-468D-9360-035E8CE123CB}.Debug|Any CPU.ActiveCfg = Debug|x64 + {27E0B288-7DFF-468D-9360-035E8CE123CB}.Debug|Any CPU.Build.0 = Debug|x64 + {27E0B288-7DFF-468D-9360-035E8CE123CB}.Debug|x64.ActiveCfg = Debug|x64 + {27E0B288-7DFF-468D-9360-035E8CE123CB}.Debug|x64.Build.0 = Debug|x64 + {27E0B288-7DFF-468D-9360-035E8CE123CB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {27E0B288-7DFF-468D-9360-035E8CE123CB}.Release|Any CPU.Build.0 = Release|Any CPU + {27E0B288-7DFF-468D-9360-035E8CE123CB}.Release|x64.ActiveCfg = Release|Any CPU + {27E0B288-7DFF-468D-9360-035E8CE123CB}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -245,6 +377,7 @@ Global {5FA79592-DE5B-46FF-9E05-34A2E72A7AF7} = {9BF1CD59-1A2C-4023-9C8D-171DCB728078} {09FD3D3A-1EFC-4AEE-B3D7-096D238E0D1A} = {5B9575EA-B4F9-46E4-A75E-59D430779EC7} {BDB7A8F3-87A6-4B77-9E0F-6BC785CBCF2B} = {5B9575EA-B4F9-46E4-A75E-59D430779EC7} + {27E0B288-7DFF-468D-9360-035E8CE123CB} = {7940E867-EEBA-4AFD-9904-1536F003239C} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {D044BB14-0B37-47E5-A579-8B30FCBA1F9F} From 089475e29cd023d493f21278237514c348f627b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Wed, 19 Jun 2024 23:25:56 +0200 Subject: [PATCH 02/21] Disable a test that randomly fails --- src/UniGetUI.Core.Language.Tests/LanguageEngineTests.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/UniGetUI.Core.Language.Tests/LanguageEngineTests.cs b/src/UniGetUI.Core.Language.Tests/LanguageEngineTests.cs index 1ed1be4ec..2f6cb860a 100644 --- a/src/UniGetUI.Core.Language.Tests/LanguageEngineTests.cs +++ b/src/UniGetUI.Core.Language.Tests/LanguageEngineTests.cs @@ -62,6 +62,7 @@ public void TestStaticallyLoadedLanguages() Assert.Equal(PackageScope.Local, CommonTranslations.InvertedScopeNames["Usuari | Local"]); } + /* [Fact] public async Task TestDownloadUpdatedTranslationsAsync() { @@ -76,5 +77,6 @@ public async Task TestDownloadUpdatedTranslationsAsync() Assert.True(File.Exists(expected_file), "The updated file was not created"); File.Delete(expected_file); } + */ } } From 6f25eb5748eb851335d490922f755ac9c0a7d64b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Wed, 19 Jun 2024 23:28:24 +0200 Subject: [PATCH 03/21] add base new loaders --- .../DiscoveredPackagesLoader.cs | 12 ++++++++++++ .../InstalledPackagesLoader.cs | 12 ++++++++++++ .../UpgradablePackagesLoader.cs | 12 ++++++++++++ 3 files changed, 36 insertions(+) create mode 100644 src/UniGetUI.PackageEngine.PackageLoader/DiscoveredPackagesLoader.cs create mode 100644 src/UniGetUI.PackageEngine.PackageLoader/InstalledPackagesLoader.cs create mode 100644 src/UniGetUI.PackageEngine.PackageLoader/UpgradablePackagesLoader.cs diff --git a/src/UniGetUI.PackageEngine.PackageLoader/DiscoveredPackagesLoader.cs b/src/UniGetUI.PackageEngine.PackageLoader/DiscoveredPackagesLoader.cs new file mode 100644 index 000000000..736169406 --- /dev/null +++ b/src/UniGetUI.PackageEngine.PackageLoader/DiscoveredPackagesLoader.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace UniGetUI.PackageEngine.PackageLoader +{ + public class DiscoveredPackagesLoader // : BasePackageLoader + { + } +} diff --git a/src/UniGetUI.PackageEngine.PackageLoader/InstalledPackagesLoader.cs b/src/UniGetUI.PackageEngine.PackageLoader/InstalledPackagesLoader.cs new file mode 100644 index 000000000..8afaa3acf --- /dev/null +++ b/src/UniGetUI.PackageEngine.PackageLoader/InstalledPackagesLoader.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace UniGetUI.PackageEngine.PackageLoader +{ + public class InstalledPackagesLoader // : BasePackageLoader + { + } +} diff --git a/src/UniGetUI.PackageEngine.PackageLoader/UpgradablePackagesLoader.cs b/src/UniGetUI.PackageEngine.PackageLoader/UpgradablePackagesLoader.cs new file mode 100644 index 000000000..406037fa2 --- /dev/null +++ b/src/UniGetUI.PackageEngine.PackageLoader/UpgradablePackagesLoader.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace UniGetUI.PackageEngine.PackageLoader +{ + public class UpgradablePackagesLoader // : BasePackageLoader + { + } +} From 2eb81633a1e8b5c33fae71f8e0091fc01c964fea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Thu, 20 Jun 2024 22:47:46 +0200 Subject: [PATCH 04/21] PackageManagers and Packages are initialized and handled by a new class named PEInterface, rather than by MainApplication --- .../PEInterface.cs | 59 ++++++++ .../UniGetUI.PackageEngine.PEInterface.csproj | 45 ++++++ .../BasePackageLoader.cs | 69 ++++++++- .../DiscoverablePackagesLoader.cs | 50 +++++++ .../DiscoveredPackagesLoader.cs | 12 -- .../InstalledPackagesLoader.cs | 37 ++++- ...niGetUI.PackageEngine.PackageLoader.csproj | 2 +- .../UpgradablePackagesLoader.cs | 32 +++- .../Packages/Package.cs | 1 - src/UniGetUI.sln | 137 ++---------------- src/UniGetUI/App.xaml.cs | 78 +--------- .../Interface/Dialogs/IgnoredUpdates.xaml.cs | 5 +- src/UniGetUI/Interface/Pages/LogPage.xaml.cs | 5 +- .../Pages/PackageDetailsPage.xaml.cs | 3 +- .../Interface/Pages/SettingsPage.xaml.cs | 23 +-- .../AbstractPackagesPage.xaml.cs | 114 ++++++--------- .../SoftwarePages/NewDiscoverSoftwarePage.cs | 32 +--- .../SoftwarePages/NewInstalledPackagesPage.cs | 42 +----- .../SoftwarePages/NewSoftwareUpdatesPage.cs | 36 ++--- .../SoftwarePages/PackageBundle.xaml.cs | 5 +- .../PackageEngine/Classes/ImportExport.cs | 2 +- .../Operations/PackageOperations.cs | 8 +- src/UniGetUI/UniGetUI.csproj | 2 + 23 files changed, 388 insertions(+), 411 deletions(-) create mode 100644 src/UniGetUI.PackageEngine.PackageEngine/PEInterface.cs create mode 100644 src/UniGetUI.PackageEngine.PackageEngine/UniGetUI.PackageEngine.PEInterface.csproj create mode 100644 src/UniGetUI.PackageEngine.PackageLoader/DiscoverablePackagesLoader.cs delete mode 100644 src/UniGetUI.PackageEngine.PackageLoader/DiscoveredPackagesLoader.cs diff --git a/src/UniGetUI.PackageEngine.PackageEngine/PEInterface.cs b/src/UniGetUI.PackageEngine.PackageEngine/PEInterface.cs new file mode 100644 index 000000000..a404a301f --- /dev/null +++ b/src/UniGetUI.PackageEngine.PackageEngine/PEInterface.cs @@ -0,0 +1,59 @@ +using UniGetUI.PackageEngine.ManagerClasses.Manager; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UniGetUI.PackageEngine.Managers.WingetManager; +using UniGetUI.PackageEngine.Managers.ScoopManager; +using UniGetUI.PackageEngine.Managers.ChocolateyManager; +using UniGetUI.PackageEngine.Managers.DotNetManager; +using UniGetUI.PackageEngine.Managers.NpmManager; +using UniGetUI.PackageEngine.Managers.PowerShellManager; +using UniGetUI.PackageEngine.Managers.PipManager; +using UniGetUI.PackageEngine.PackageLoader; +using UniGetUI.Core.Logging; + +namespace UniGetUI.PackageEngine +{ + public static class PEInterface + { + private const int ManagerLoadTimeout = 10000; // 10 seconds timeout for Package Manager initialization + + public static WinGet WinGet = new WinGet(); + public static Scoop Scoop = new Scoop(); + public static Chocolatey Chocolatey = new Chocolatey(); + public static Npm Npm = new Npm(); + public static Pip Pip = new Pip(); + public static DotNet DotNet = new DotNet(); + public static PowerShell PowerShell = new PowerShell(); + + public static PackageManager[] Managers = [WinGet, Scoop, Chocolatey, Npm, Pip, DotNet, PowerShell]; + + public static DiscoverablePackagesLoader DiscoveredPackagesLoader = new(Managers); + public static UpgradablePackagesLoader UpgradablePackagesLoader = new(Managers); + public static InstalledPackagesLoader InstalledPackagesLoader = new(Managers); + + public static async Task Initialize() + { + List initializeTasks = new(); + + foreach (PackageManager manager in Managers) + { + initializeTasks.Add(manager.InitializeAsync()); + } + + Task ManagersMetaTask = Task.WhenAll(initializeTasks); + try + { + await ManagersMetaTask.WaitAsync(TimeSpan.FromMilliseconds(ManagerLoadTimeout)); + } + catch (Exception e) + { + Logger.Error(e); + } + if (ManagersMetaTask.IsCompletedSuccessfully == false) + Logger.Warn("Timeout: Not all package managers have finished initializing."); + } + } +} diff --git a/src/UniGetUI.PackageEngine.PackageEngine/UniGetUI.PackageEngine.PEInterface.csproj b/src/UniGetUI.PackageEngine.PackageEngine/UniGetUI.PackageEngine.PEInterface.csproj new file mode 100644 index 000000000..5a8afb10b --- /dev/null +++ b/src/UniGetUI.PackageEngine.PackageEngine/UniGetUI.PackageEngine.PEInterface.csproj @@ -0,0 +1,45 @@ + + + + net8.0-windows10.0.19041.0 + enable + win-x64;win-arm64 + win-$(Platform) + x64 + 10.0.19041.0 + 10.0.19041.0 + 8.0.204 + true + true + 3.1.0.0 + 3.1.0-alpha0 + UniGetUI + Martí Climent and the contributors + Martí Climent + 3.1.0-alpha0 + 2024, Martí Climent + enable + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/UniGetUI.PackageEngine.PackageLoader/BasePackageLoader.cs b/src/UniGetUI.PackageEngine.PackageLoader/BasePackageLoader.cs index ba101287b..73e64516f 100644 --- a/src/UniGetUI.PackageEngine.PackageLoader/BasePackageLoader.cs +++ b/src/UniGetUI.PackageEngine.PackageLoader/BasePackageLoader.cs @@ -1,5 +1,7 @@ using System.Collections.ObjectModel; +using System.Threading.Tasks; using UniGetUI.Core.Logging; +using UniGetUI.PackageEngine.ManagerClasses.Manager; using UniGetUI.PackageEngine.PackageClasses; namespace UniGetUI.PackageEngine.PackageLoader @@ -38,10 +40,12 @@ public abstract class BasePackageLoader public event EventHandler? StartedLoading; bool ALLOW_MULTIPLE_PACKAGE_VERSIONS = false; - string LOADER_IDENTIFIER; + protected string LOADER_IDENTIFIER; + protected IEnumerable Managers { get; private set; } - public BasePackageLoader(bool AllowMultiplePackageVersions = false) - { + public BasePackageLoader(IEnumerable managers, bool AllowMultiplePackageVersions = false) + { + Managers = managers; Packages = new ObservableCollection(); PackageReference = new Dictionary(); IsLoaded = false; @@ -57,7 +61,45 @@ public async Task ReloadPackages() { IsLoading = true; StartedLoading?.Invoke(this, new EventArgs()); - await LoadPackagesFromManagers(); + + List> tasks = new(); + + foreach (PackageManager manager in Managers) + { + if (manager.IsEnabled() && manager.Status.Found) + { + Task task = LoadPackagesFromManager(manager); + tasks.Add(task); + } + } + + while (tasks.Count > 0) + { + foreach (Task task in tasks.ToArray()) + { + if (!task.IsCompleted) + await Task.Delay(100); + + if (task.IsCompleted) + { + if (task.IsCompletedSuccessfully) + { + int InitialCount = Packages.Count; + foreach (Package package in task.Result) + { + if (Contains(package) || !await IsPackageValid(package)) + continue; + + AddPackage(package); + await WhenAddingPackage(package); + // TODO: AddPackageToSourcesList(package); + } + } + tasks.Remove(task); + } + } + } + IsLoading = false; FinishedLoading?.Invoke(this, new EventArgs()); IsLoaded = true; @@ -75,10 +117,25 @@ public void ClearPackages() } /// - /// Loads the packages from the PackageManager + /// Loads the packages from the given manager + /// + /// The manager from which to load packages + /// A task that will load the packages + protected abstract Task LoadPackagesFromManager(PackageManager manager); + + /// + /// Checks whether the package is valid or must be skipped + /// + /// The package to check + /// True if the package can be added, false otherwhise + protected abstract Task IsPackageValid(Package package); + + /// + /// A method to post-process packages after they have been added. /// + /// The package to process /// - protected abstract Task LoadPackagesFromManagers(); + protected abstract Task WhenAddingPackage(Package package); /// /// Checks wether a package is contained on the current Loader diff --git a/src/UniGetUI.PackageEngine.PackageLoader/DiscoverablePackagesLoader.cs b/src/UniGetUI.PackageEngine.PackageLoader/DiscoverablePackagesLoader.cs new file mode 100644 index 000000000..481455a34 --- /dev/null +++ b/src/UniGetUI.PackageEngine.PackageLoader/DiscoverablePackagesLoader.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UniGetUI.Core.Tools; +using UniGetUI.Interface.Enums; +using UniGetUI.PackageEngine.ManagerClasses.Manager; +using UniGetUI.PackageEngine.PackageClasses; + +namespace UniGetUI.PackageEngine.PackageLoader +{ + public class DiscoverablePackagesLoader : BasePackageLoader + { + private string QUERY_TEXT = string.Empty; + + public DiscoverablePackagesLoader(IEnumerable managers) + : base(managers, AllowMultiplePackageVersions: false) + { + LOADER_IDENTIFIER = "DISCOVERABLE_PACKAGES"; + } + +#pragma warning disable + protected override async Task IsPackageValid(Package package) + { + return true; + } +#pragma warning restore + + protected override Task LoadPackagesFromManager(PackageManager manager) + { + string text = QUERY_TEXT; + text = CoreTools.EnsureSafeQueryString(text); + if (text == string.Empty) + return new Task(() => { return []; }); + else + return manager.FindPackages(text); + } + +#pragma warning disable + protected override async Task WhenAddingPackage(Package package) + { + if (package.GetUpgradablePackage() != null) + package.SetTag(PackageTag.IsUpgradable); + else if (package.GetInstalledPackage() != null) + package.SetTag(PackageTag.AlreadyInstalled); + } +#pragma warning restore + } +} diff --git a/src/UniGetUI.PackageEngine.PackageLoader/DiscoveredPackagesLoader.cs b/src/UniGetUI.PackageEngine.PackageLoader/DiscoveredPackagesLoader.cs deleted file mode 100644 index 736169406..000000000 --- a/src/UniGetUI.PackageEngine.PackageLoader/DiscoveredPackagesLoader.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace UniGetUI.PackageEngine.PackageLoader -{ - public class DiscoveredPackagesLoader // : BasePackageLoader - { - } -} diff --git a/src/UniGetUI.PackageEngine.PackageLoader/InstalledPackagesLoader.cs b/src/UniGetUI.PackageEngine.PackageLoader/InstalledPackagesLoader.cs index 8afaa3acf..2f61b4299 100644 --- a/src/UniGetUI.PackageEngine.PackageLoader/InstalledPackagesLoader.cs +++ b/src/UniGetUI.PackageEngine.PackageLoader/InstalledPackagesLoader.cs @@ -1,12 +1,37 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using UniGetUI.Interface.Enums; +using UniGetUI.PackageEngine.ManagerClasses.Manager; +using UniGetUI.PackageEngine.PackageClasses; namespace UniGetUI.PackageEngine.PackageLoader { - public class InstalledPackagesLoader // : BasePackageLoader + public class InstalledPackagesLoader : BasePackageLoader { + public InstalledPackagesLoader(IEnumerable managers) + : base(managers, AllowMultiplePackageVersions: true) + { + LOADER_IDENTIFIER = "INSTALLED_PACKAGES"; + } + +#pragma warning disable + protected override async Task IsPackageValid(Package package) + { + return true; + } +#pragma warning restore + + protected override Task LoadPackagesFromManager(PackageManager manager) + { + return manager.GetInstalledPackages(); + } + + protected override async Task WhenAddingPackage(Package package) + { + if (await package.HasUpdatesIgnoredAsync(Version: "*")) + package.Tag = PackageTag.Pinned; + else if (package.GetUpgradablePackage() != null) + package.Tag = PackageTag.IsUpgradable; + + package.GetAvailablePackage()?.SetTag(PackageTag.AlreadyInstalled); + } } } diff --git a/src/UniGetUI.PackageEngine.PackageLoader/UniGetUI.PackageEngine.PackageLoader.csproj b/src/UniGetUI.PackageEngine.PackageLoader/UniGetUI.PackageEngine.PackageLoader.csproj index 016fe8ce5..249365773 100644 --- a/src/UniGetUI.PackageEngine.PackageLoader/UniGetUI.PackageEngine.PackageLoader.csproj +++ b/src/UniGetUI.PackageEngine.PackageLoader/UniGetUI.PackageEngine.PackageLoader.csproj @@ -4,7 +4,7 @@ enable win-x64;win-arm64 win-$(Platform) - ARM64;x64 + x64 10.0.19041.0 10.0.19041.0 8.0.204 diff --git a/src/UniGetUI.PackageEngine.PackageLoader/UpgradablePackagesLoader.cs b/src/UniGetUI.PackageEngine.PackageLoader/UpgradablePackagesLoader.cs index 406037fa2..57a57d338 100644 --- a/src/UniGetUI.PackageEngine.PackageLoader/UpgradablePackagesLoader.cs +++ b/src/UniGetUI.PackageEngine.PackageLoader/UpgradablePackagesLoader.cs @@ -3,10 +3,40 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using UniGetUI.Interface.Enums; +using UniGetUI.PackageEngine.ManagerClasses.Manager; +using UniGetUI.PackageEngine.PackageClasses; namespace UniGetUI.PackageEngine.PackageLoader { - public class UpgradablePackagesLoader // : BasePackageLoader + public class UpgradablePackagesLoader : BasePackageLoader { + public UpgradablePackagesLoader(IEnumerable managers) + : base(managers, AllowMultiplePackageVersions: false) + { + LOADER_IDENTIFIER = "DISCOVERABLE_PACKAGES"; + } + protected override async Task IsPackageValid(Package package) + { + if (await package.HasUpdatesIgnoredAsync(package.NewVersion)) + return false; + + if (package.IsUpgradable && package.NewerVersionIsInstalled()) + return false; + + return true; + } + + protected override Task LoadPackagesFromManager(PackageManager manager) + { + return manager.GetAvailableUpdates(); + } +#pragma warning disable + protected override async Task WhenAddingPackage(Package package) + { + package.GetAvailablePackage()?.SetTag(PackageTag.IsUpgradable); + package.GetInstalledPackage()?.SetTag(PackageTag.IsUpgradable); + } +#pragma warning restore } } diff --git a/src/UniGetUI.PackageEngine.PackageManagerClasses/Packages/Package.cs b/src/UniGetUI.PackageEngine.PackageManagerClasses/Packages/Package.cs index c95406ef7..2669d817c 100644 --- a/src/UniGetUI.PackageEngine.PackageManagerClasses/Packages/Package.cs +++ b/src/UniGetUI.PackageEngine.PackageManagerClasses/Packages/Package.cs @@ -193,7 +193,6 @@ public Package(string name, string id, string installed_version, string new_vers IsUpgradable = true; NewVersion = new_version; NewVersionAsFloat = CoreTools.GetVersionStringAsFloat(new_version); - __versioned_hash = CoreTools.HashStringAsLong(Manager.Name + "\\" + Source.Name + "\\" + Id + "\\" + Version + "->" + NewVersion); // Packages in the updates tab are checked by default IsChecked = true; diff --git a/src/UniGetUI.sln b/src/UniGetUI.sln index 70a66f6e6..a35f43895 100644 --- a/src/UniGetUI.sln +++ b/src/UniGetUI.sln @@ -84,262 +84,142 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UniGetUI.PackageEngine.PackageLoader", "UniGetUI.PackageEngine.PackageLoader\UniGetUI.PackageEngine.PackageLoader.csproj", "{27E0B288-7DFF-468D-9360-035E8CE123CB}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UniGetUI.PackageEngine.PEInterface", "UniGetUI.PackageEngine.PackageEngine\UniGetUI.PackageEngine.PEInterface.csproj", "{20F43119-EA00-440D-B3B5-44F96592F4C8}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU Debug|x64 = Debug|x64 - Release|Any CPU = Release|Any CPU Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {80305A17-2534-48DC-8F75-41F70FCCEAAF}.Debug|Any CPU.ActiveCfg = Debug|x64 - {80305A17-2534-48DC-8F75-41F70FCCEAAF}.Debug|Any CPU.Build.0 = Debug|x64 {80305A17-2534-48DC-8F75-41F70FCCEAAF}.Debug|x64.ActiveCfg = Debug|x64 {80305A17-2534-48DC-8F75-41F70FCCEAAF}.Debug|x64.Build.0 = Debug|x64 - {80305A17-2534-48DC-8F75-41F70FCCEAAF}.Release|Any CPU.ActiveCfg = Release|x64 - {80305A17-2534-48DC-8F75-41F70FCCEAAF}.Release|Any CPU.Build.0 = Release|x64 {80305A17-2534-48DC-8F75-41F70FCCEAAF}.Release|x64.ActiveCfg = Release|x64 {80305A17-2534-48DC-8F75-41F70FCCEAAF}.Release|x64.Build.0 = Release|x64 - {52AC982E-7382-4746-BB66-4003698FCC02}.Debug|Any CPU.ActiveCfg = Debug|x64 - {52AC982E-7382-4746-BB66-4003698FCC02}.Debug|Any CPU.Build.0 = Debug|x64 {52AC982E-7382-4746-BB66-4003698FCC02}.Debug|x64.ActiveCfg = Debug|x64 {52AC982E-7382-4746-BB66-4003698FCC02}.Debug|x64.Build.0 = Debug|x64 - {52AC982E-7382-4746-BB66-4003698FCC02}.Release|Any CPU.ActiveCfg = Release|x64 - {52AC982E-7382-4746-BB66-4003698FCC02}.Release|Any CPU.Build.0 = Release|x64 {52AC982E-7382-4746-BB66-4003698FCC02}.Release|x64.ActiveCfg = Release|x64 {52AC982E-7382-4746-BB66-4003698FCC02}.Release|x64.Build.0 = Release|x64 - {5F5EF76B-D755-4C12-ADAE-11F08CE3D936}.Debug|Any CPU.ActiveCfg = Debug|x64 - {5F5EF76B-D755-4C12-ADAE-11F08CE3D936}.Debug|Any CPU.Build.0 = Debug|x64 {5F5EF76B-D755-4C12-ADAE-11F08CE3D936}.Debug|x64.ActiveCfg = Debug|x64 {5F5EF76B-D755-4C12-ADAE-11F08CE3D936}.Debug|x64.Build.0 = Debug|x64 - {5F5EF76B-D755-4C12-ADAE-11F08CE3D936}.Release|Any CPU.ActiveCfg = Release|x64 - {5F5EF76B-D755-4C12-ADAE-11F08CE3D936}.Release|Any CPU.Build.0 = Release|x64 {5F5EF76B-D755-4C12-ADAE-11F08CE3D936}.Release|x64.ActiveCfg = Release|x64 {5F5EF76B-D755-4C12-ADAE-11F08CE3D936}.Release|x64.Build.0 = Release|x64 - {B70A6F17-08C8-4194-BBE8-668CA920CFF3}.Debug|Any CPU.ActiveCfg = Debug|x64 - {B70A6F17-08C8-4194-BBE8-668CA920CFF3}.Debug|Any CPU.Build.0 = Debug|x64 {B70A6F17-08C8-4194-BBE8-668CA920CFF3}.Debug|x64.ActiveCfg = Debug|x64 {B70A6F17-08C8-4194-BBE8-668CA920CFF3}.Debug|x64.Build.0 = Debug|x64 - {B70A6F17-08C8-4194-BBE8-668CA920CFF3}.Release|Any CPU.ActiveCfg = Release|x64 - {B70A6F17-08C8-4194-BBE8-668CA920CFF3}.Release|Any CPU.Build.0 = Release|x64 {B70A6F17-08C8-4194-BBE8-668CA920CFF3}.Release|x64.ActiveCfg = Release|x64 {B70A6F17-08C8-4194-BBE8-668CA920CFF3}.Release|x64.Build.0 = Release|x64 - {72180B0C-3D20-4AAD-B015-A9337B91406E}.Debug|Any CPU.ActiveCfg = Debug|x64 - {72180B0C-3D20-4AAD-B015-A9337B91406E}.Debug|Any CPU.Build.0 = Debug|x64 {72180B0C-3D20-4AAD-B015-A9337B91406E}.Debug|x64.ActiveCfg = Debug|x64 {72180B0C-3D20-4AAD-B015-A9337B91406E}.Debug|x64.Build.0 = Debug|x64 - {72180B0C-3D20-4AAD-B015-A9337B91406E}.Release|Any CPU.ActiveCfg = Release|x64 - {72180B0C-3D20-4AAD-B015-A9337B91406E}.Release|Any CPU.Build.0 = Release|x64 {72180B0C-3D20-4AAD-B015-A9337B91406E}.Release|x64.ActiveCfg = Release|x64 {72180B0C-3D20-4AAD-B015-A9337B91406E}.Release|x64.Build.0 = Release|x64 - {1977360F-2E42-45E6-9369-AB1EE59CC5C5}.Debug|Any CPU.ActiveCfg = Debug|x64 - {1977360F-2E42-45E6-9369-AB1EE59CC5C5}.Debug|Any CPU.Build.0 = Debug|x64 {1977360F-2E42-45E6-9369-AB1EE59CC5C5}.Debug|x64.ActiveCfg = Debug|x64 {1977360F-2E42-45E6-9369-AB1EE59CC5C5}.Debug|x64.Build.0 = Debug|x64 - {1977360F-2E42-45E6-9369-AB1EE59CC5C5}.Release|Any CPU.ActiveCfg = Release|x64 - {1977360F-2E42-45E6-9369-AB1EE59CC5C5}.Release|Any CPU.Build.0 = Release|x64 {1977360F-2E42-45E6-9369-AB1EE59CC5C5}.Release|x64.ActiveCfg = Release|x64 {1977360F-2E42-45E6-9369-AB1EE59CC5C5}.Release|x64.Build.0 = Release|x64 - {25C6CE64-2D61-4832-B6D2-45AFC52E2447}.Debug|Any CPU.ActiveCfg = Debug|x64 - {25C6CE64-2D61-4832-B6D2-45AFC52E2447}.Debug|Any CPU.Build.0 = Debug|x64 {25C6CE64-2D61-4832-B6D2-45AFC52E2447}.Debug|x64.ActiveCfg = Debug|x64 {25C6CE64-2D61-4832-B6D2-45AFC52E2447}.Debug|x64.Build.0 = Debug|x64 - {25C6CE64-2D61-4832-B6D2-45AFC52E2447}.Release|Any CPU.ActiveCfg = Release|x64 - {25C6CE64-2D61-4832-B6D2-45AFC52E2447}.Release|Any CPU.Build.0 = Release|x64 {25C6CE64-2D61-4832-B6D2-45AFC52E2447}.Release|x64.ActiveCfg = Release|x64 {25C6CE64-2D61-4832-B6D2-45AFC52E2447}.Release|x64.Build.0 = Release|x64 - {8156B6D8-BD7E-4201-BD8B-8C9B00177F88}.Debug|Any CPU.ActiveCfg = Debug|x64 - {8156B6D8-BD7E-4201-BD8B-8C9B00177F88}.Debug|Any CPU.Build.0 = Debug|x64 {8156B6D8-BD7E-4201-BD8B-8C9B00177F88}.Debug|x64.ActiveCfg = Debug|x64 {8156B6D8-BD7E-4201-BD8B-8C9B00177F88}.Debug|x64.Build.0 = Debug|x64 - {8156B6D8-BD7E-4201-BD8B-8C9B00177F88}.Release|Any CPU.ActiveCfg = Release|x64 - {8156B6D8-BD7E-4201-BD8B-8C9B00177F88}.Release|Any CPU.Build.0 = Release|x64 {8156B6D8-BD7E-4201-BD8B-8C9B00177F88}.Release|x64.ActiveCfg = Release|x64 {8156B6D8-BD7E-4201-BD8B-8C9B00177F88}.Release|x64.Build.0 = Release|x64 - {990F5AFF-ABF6-4019-865D-604D2B23DE2C}.Debug|Any CPU.ActiveCfg = Debug|x64 - {990F5AFF-ABF6-4019-865D-604D2B23DE2C}.Debug|Any CPU.Build.0 = Debug|x64 {990F5AFF-ABF6-4019-865D-604D2B23DE2C}.Debug|x64.ActiveCfg = Debug|x64 {990F5AFF-ABF6-4019-865D-604D2B23DE2C}.Debug|x64.Build.0 = Debug|x64 - {990F5AFF-ABF6-4019-865D-604D2B23DE2C}.Release|Any CPU.ActiveCfg = Release|x64 - {990F5AFF-ABF6-4019-865D-604D2B23DE2C}.Release|Any CPU.Build.0 = Release|x64 {990F5AFF-ABF6-4019-865D-604D2B23DE2C}.Release|x64.ActiveCfg = Release|x64 {990F5AFF-ABF6-4019-865D-604D2B23DE2C}.Release|x64.Build.0 = Release|x64 - {380E9F5A-23DE-4F5A-9644-EFA51AD1D8E8}.Debug|Any CPU.ActiveCfg = Debug|x64 - {380E9F5A-23DE-4F5A-9644-EFA51AD1D8E8}.Debug|Any CPU.Build.0 = Debug|x64 {380E9F5A-23DE-4F5A-9644-EFA51AD1D8E8}.Debug|x64.ActiveCfg = Debug|x64 {380E9F5A-23DE-4F5A-9644-EFA51AD1D8E8}.Debug|x64.Build.0 = Debug|x64 - {380E9F5A-23DE-4F5A-9644-EFA51AD1D8E8}.Release|Any CPU.ActiveCfg = Release|x64 - {380E9F5A-23DE-4F5A-9644-EFA51AD1D8E8}.Release|Any CPU.Build.0 = Release|x64 {380E9F5A-23DE-4F5A-9644-EFA51AD1D8E8}.Release|x64.ActiveCfg = Release|x64 {380E9F5A-23DE-4F5A-9644-EFA51AD1D8E8}.Release|x64.Build.0 = Release|x64 - {5A48C2FD-16E4-4B44-BC2C-D793C50E66F2}.Debug|Any CPU.ActiveCfg = Debug|x64 - {5A48C2FD-16E4-4B44-BC2C-D793C50E66F2}.Debug|Any CPU.Build.0 = Debug|x64 {5A48C2FD-16E4-4B44-BC2C-D793C50E66F2}.Debug|x64.ActiveCfg = Debug|x64 {5A48C2FD-16E4-4B44-BC2C-D793C50E66F2}.Debug|x64.Build.0 = Debug|x64 - {5A48C2FD-16E4-4B44-BC2C-D793C50E66F2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5A48C2FD-16E4-4B44-BC2C-D793C50E66F2}.Release|Any CPU.Build.0 = Release|Any CPU {5A48C2FD-16E4-4B44-BC2C-D793C50E66F2}.Release|x64.ActiveCfg = Release|x64 {5A48C2FD-16E4-4B44-BC2C-D793C50E66F2}.Release|x64.Build.0 = Release|x64 - {9AD1DEC9-1561-4753-AB4B-E81FBDBA5C9E}.Debug|Any CPU.ActiveCfg = Debug|x64 - {9AD1DEC9-1561-4753-AB4B-E81FBDBA5C9E}.Debug|Any CPU.Build.0 = Debug|x64 {9AD1DEC9-1561-4753-AB4B-E81FBDBA5C9E}.Debug|x64.ActiveCfg = Debug|x64 {9AD1DEC9-1561-4753-AB4B-E81FBDBA5C9E}.Debug|x64.Build.0 = Debug|x64 - {9AD1DEC9-1561-4753-AB4B-E81FBDBA5C9E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9AD1DEC9-1561-4753-AB4B-E81FBDBA5C9E}.Release|Any CPU.Build.0 = Release|Any CPU {9AD1DEC9-1561-4753-AB4B-E81FBDBA5C9E}.Release|x64.ActiveCfg = Release|x64 {9AD1DEC9-1561-4753-AB4B-E81FBDBA5C9E}.Release|x64.Build.0 = Release|x64 - {E40BFCBB-7A02-4E2C-AFDB-A717359EF4FC}.Debug|Any CPU.ActiveCfg = Debug|x64 - {E40BFCBB-7A02-4E2C-AFDB-A717359EF4FC}.Debug|Any CPU.Build.0 = Debug|x64 {E40BFCBB-7A02-4E2C-AFDB-A717359EF4FC}.Debug|x64.ActiveCfg = Debug|x64 {E40BFCBB-7A02-4E2C-AFDB-A717359EF4FC}.Debug|x64.Build.0 = Debug|x64 - {E40BFCBB-7A02-4E2C-AFDB-A717359EF4FC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E40BFCBB-7A02-4E2C-AFDB-A717359EF4FC}.Release|Any CPU.Build.0 = Release|Any CPU {E40BFCBB-7A02-4E2C-AFDB-A717359EF4FC}.Release|x64.ActiveCfg = Release|x64 {E40BFCBB-7A02-4E2C-AFDB-A717359EF4FC}.Release|x64.Build.0 = Release|x64 - {562B4814-2A78-4692-90BE-A727AABCEC85}.Debug|Any CPU.ActiveCfg = Debug|x64 - {562B4814-2A78-4692-90BE-A727AABCEC85}.Debug|Any CPU.Build.0 = Debug|x64 {562B4814-2A78-4692-90BE-A727AABCEC85}.Debug|x64.ActiveCfg = Debug|x64 {562B4814-2A78-4692-90BE-A727AABCEC85}.Debug|x64.Build.0 = Debug|x64 - {562B4814-2A78-4692-90BE-A727AABCEC85}.Release|Any CPU.ActiveCfg = Release|x64 - {562B4814-2A78-4692-90BE-A727AABCEC85}.Release|Any CPU.Build.0 = Release|x64 {562B4814-2A78-4692-90BE-A727AABCEC85}.Release|x64.ActiveCfg = Release|x64 {562B4814-2A78-4692-90BE-A727AABCEC85}.Release|x64.Build.0 = Release|x64 - {1A51EA31-6D78-4E98-B767-41A02C6E34D8}.Debug|Any CPU.ActiveCfg = Debug|x64 - {1A51EA31-6D78-4E98-B767-41A02C6E34D8}.Debug|Any CPU.Build.0 = Debug|x64 {1A51EA31-6D78-4E98-B767-41A02C6E34D8}.Debug|x64.ActiveCfg = Debug|x64 {1A51EA31-6D78-4E98-B767-41A02C6E34D8}.Debug|x64.Build.0 = Debug|x64 - {1A51EA31-6D78-4E98-B767-41A02C6E34D8}.Release|Any CPU.ActiveCfg = Release|x64 - {1A51EA31-6D78-4E98-B767-41A02C6E34D8}.Release|Any CPU.Build.0 = Release|x64 {1A51EA31-6D78-4E98-B767-41A02C6E34D8}.Release|x64.ActiveCfg = Release|x64 {1A51EA31-6D78-4E98-B767-41A02C6E34D8}.Release|x64.Build.0 = Release|x64 - {230BF08C-C039-473B-933F-3BF647440E0E}.Debug|Any CPU.ActiveCfg = Debug|x64 - {230BF08C-C039-473B-933F-3BF647440E0E}.Debug|Any CPU.Build.0 = Debug|x64 {230BF08C-C039-473B-933F-3BF647440E0E}.Debug|x64.ActiveCfg = Debug|x64 {230BF08C-C039-473B-933F-3BF647440E0E}.Debug|x64.Build.0 = Debug|x64 - {230BF08C-C039-473B-933F-3BF647440E0E}.Release|Any CPU.ActiveCfg = Release|x64 - {230BF08C-C039-473B-933F-3BF647440E0E}.Release|Any CPU.Build.0 = Release|x64 {230BF08C-C039-473B-933F-3BF647440E0E}.Release|x64.ActiveCfg = Release|x64 {230BF08C-C039-473B-933F-3BF647440E0E}.Release|x64.Build.0 = Release|x64 - {C55F4BA7-BBDD-42A4-88C1-FD3C411EB234}.Debug|Any CPU.ActiveCfg = Debug|x64 - {C55F4BA7-BBDD-42A4-88C1-FD3C411EB234}.Debug|Any CPU.Build.0 = Debug|x64 {C55F4BA7-BBDD-42A4-88C1-FD3C411EB234}.Debug|x64.ActiveCfg = Debug|x64 {C55F4BA7-BBDD-42A4-88C1-FD3C411EB234}.Debug|x64.Build.0 = Debug|x64 - {C55F4BA7-BBDD-42A4-88C1-FD3C411EB234}.Release|Any CPU.ActiveCfg = Release|x64 - {C55F4BA7-BBDD-42A4-88C1-FD3C411EB234}.Release|Any CPU.Build.0 = Release|x64 {C55F4BA7-BBDD-42A4-88C1-FD3C411EB234}.Release|x64.ActiveCfg = Release|x64 {C55F4BA7-BBDD-42A4-88C1-FD3C411EB234}.Release|x64.Build.0 = Release|x64 - {2979E556-5859-4E88-A1D4-EAB72F82294E}.Debug|Any CPU.ActiveCfg = Debug|x64 - {2979E556-5859-4E88-A1D4-EAB72F82294E}.Debug|Any CPU.Build.0 = Debug|x64 {2979E556-5859-4E88-A1D4-EAB72F82294E}.Debug|x64.ActiveCfg = Debug|x64 {2979E556-5859-4E88-A1D4-EAB72F82294E}.Debug|x64.Build.0 = Debug|x64 - {2979E556-5859-4E88-A1D4-EAB72F82294E}.Release|Any CPU.ActiveCfg = Release|x64 - {2979E556-5859-4E88-A1D4-EAB72F82294E}.Release|Any CPU.Build.0 = Release|x64 {2979E556-5859-4E88-A1D4-EAB72F82294E}.Release|x64.ActiveCfg = Release|x64 {2979E556-5859-4E88-A1D4-EAB72F82294E}.Release|x64.Build.0 = Release|x64 - {7E098666-DE8C-4ABF-B709-4CE7B1A491B0}.Debug|Any CPU.ActiveCfg = Debug|x64 - {7E098666-DE8C-4ABF-B709-4CE7B1A491B0}.Debug|Any CPU.Build.0 = Debug|x64 {7E098666-DE8C-4ABF-B709-4CE7B1A491B0}.Debug|x64.ActiveCfg = Debug|x64 {7E098666-DE8C-4ABF-B709-4CE7B1A491B0}.Debug|x64.Build.0 = Debug|x64 - {7E098666-DE8C-4ABF-B709-4CE7B1A491B0}.Release|Any CPU.ActiveCfg = Release|x64 - {7E098666-DE8C-4ABF-B709-4CE7B1A491B0}.Release|Any CPU.Build.0 = Release|x64 {7E098666-DE8C-4ABF-B709-4CE7B1A491B0}.Release|x64.ActiveCfg = Release|x64 {7E098666-DE8C-4ABF-B709-4CE7B1A491B0}.Release|x64.Build.0 = Release|x64 - {B5E11AAA-B800-455E-9C64-051FFEFD6C0B}.Debug|Any CPU.ActiveCfg = Debug|x64 - {B5E11AAA-B800-455E-9C64-051FFEFD6C0B}.Debug|Any CPU.Build.0 = Debug|x64 {B5E11AAA-B800-455E-9C64-051FFEFD6C0B}.Debug|x64.ActiveCfg = Debug|x64 {B5E11AAA-B800-455E-9C64-051FFEFD6C0B}.Debug|x64.Build.0 = Debug|x64 - {B5E11AAA-B800-455E-9C64-051FFEFD6C0B}.Release|Any CPU.ActiveCfg = Release|x64 - {B5E11AAA-B800-455E-9C64-051FFEFD6C0B}.Release|Any CPU.Build.0 = Release|x64 {B5E11AAA-B800-455E-9C64-051FFEFD6C0B}.Release|x64.ActiveCfg = Release|x64 {B5E11AAA-B800-455E-9C64-051FFEFD6C0B}.Release|x64.Build.0 = Release|x64 - {D47CC16E-466B-4D58-A8FC-ECAE5C9606FC}.Debug|Any CPU.ActiveCfg = Debug|x64 - {D47CC16E-466B-4D58-A8FC-ECAE5C9606FC}.Debug|Any CPU.Build.0 = Debug|x64 {D47CC16E-466B-4D58-A8FC-ECAE5C9606FC}.Debug|x64.ActiveCfg = Debug|x64 {D47CC16E-466B-4D58-A8FC-ECAE5C9606FC}.Debug|x64.Build.0 = Debug|x64 - {D47CC16E-466B-4D58-A8FC-ECAE5C9606FC}.Release|Any CPU.ActiveCfg = Release|x64 - {D47CC16E-466B-4D58-A8FC-ECAE5C9606FC}.Release|Any CPU.Build.0 = Release|x64 {D47CC16E-466B-4D58-A8FC-ECAE5C9606FC}.Release|x64.ActiveCfg = Release|x64 {D47CC16E-466B-4D58-A8FC-ECAE5C9606FC}.Release|x64.Build.0 = Release|x64 - {1143176D-B7F0-477C-90BB-72289068D927}.Debug|Any CPU.ActiveCfg = Debug|x64 - {1143176D-B7F0-477C-90BB-72289068D927}.Debug|Any CPU.Build.0 = Debug|x64 {1143176D-B7F0-477C-90BB-72289068D927}.Debug|x64.ActiveCfg = Debug|x64 {1143176D-B7F0-477C-90BB-72289068D927}.Debug|x64.Build.0 = Debug|x64 - {1143176D-B7F0-477C-90BB-72289068D927}.Release|Any CPU.ActiveCfg = Release|x64 - {1143176D-B7F0-477C-90BB-72289068D927}.Release|Any CPU.Build.0 = Release|x64 {1143176D-B7F0-477C-90BB-72289068D927}.Release|x64.ActiveCfg = Release|x64 {1143176D-B7F0-477C-90BB-72289068D927}.Release|x64.Build.0 = Release|x64 - {E454D3A5-C5C6-4291-BE96-220CF0D5CFFD}.Debug|Any CPU.ActiveCfg = Debug|x64 - {E454D3A5-C5C6-4291-BE96-220CF0D5CFFD}.Debug|Any CPU.Build.0 = Debug|x64 {E454D3A5-C5C6-4291-BE96-220CF0D5CFFD}.Debug|x64.ActiveCfg = Debug|x64 {E454D3A5-C5C6-4291-BE96-220CF0D5CFFD}.Debug|x64.Build.0 = Debug|x64 - {E454D3A5-C5C6-4291-BE96-220CF0D5CFFD}.Release|Any CPU.ActiveCfg = Release|x64 - {E454D3A5-C5C6-4291-BE96-220CF0D5CFFD}.Release|Any CPU.Build.0 = Release|x64 {E454D3A5-C5C6-4291-BE96-220CF0D5CFFD}.Release|x64.ActiveCfg = Release|x64 {E454D3A5-C5C6-4291-BE96-220CF0D5CFFD}.Release|x64.Build.0 = Release|x64 - {57D094C1-6913-46BF-A657-84A5F46D4EE7}.Debug|Any CPU.ActiveCfg = Debug|x64 - {57D094C1-6913-46BF-A657-84A5F46D4EE7}.Debug|Any CPU.Build.0 = Debug|x64 {57D094C1-6913-46BF-A657-84A5F46D4EE7}.Debug|x64.ActiveCfg = Debug|x64 {57D094C1-6913-46BF-A657-84A5F46D4EE7}.Debug|x64.Build.0 = Debug|x64 - {57D094C1-6913-46BF-A657-84A5F46D4EE7}.Release|Any CPU.ActiveCfg = Release|x64 - {57D094C1-6913-46BF-A657-84A5F46D4EE7}.Release|Any CPU.Build.0 = Release|x64 {57D094C1-6913-46BF-A657-84A5F46D4EE7}.Release|x64.ActiveCfg = Release|x64 {57D094C1-6913-46BF-A657-84A5F46D4EE7}.Release|x64.Build.0 = Release|x64 - {740E2894-903D-4B94-9C32-B630593BEB16}.Debug|Any CPU.ActiveCfg = Debug|x64 - {740E2894-903D-4B94-9C32-B630593BEB16}.Debug|Any CPU.Build.0 = Debug|x64 {740E2894-903D-4B94-9C32-B630593BEB16}.Debug|x64.ActiveCfg = Debug|x64 {740E2894-903D-4B94-9C32-B630593BEB16}.Debug|x64.Build.0 = Debug|x64 - {740E2894-903D-4B94-9C32-B630593BEB16}.Release|Any CPU.ActiveCfg = Release|x64 - {740E2894-903D-4B94-9C32-B630593BEB16}.Release|Any CPU.Build.0 = Release|x64 {740E2894-903D-4B94-9C32-B630593BEB16}.Release|x64.ActiveCfg = Release|x64 {740E2894-903D-4B94-9C32-B630593BEB16}.Release|x64.Build.0 = Release|x64 - {D401F706-A182-46E3-A25C-B0BF5AA0D07E}.Debug|Any CPU.ActiveCfg = Debug|x64 - {D401F706-A182-46E3-A25C-B0BF5AA0D07E}.Debug|Any CPU.Build.0 = Debug|x64 {D401F706-A182-46E3-A25C-B0BF5AA0D07E}.Debug|x64.ActiveCfg = Debug|x64 {D401F706-A182-46E3-A25C-B0BF5AA0D07E}.Debug|x64.Build.0 = Debug|x64 - {D401F706-A182-46E3-A25C-B0BF5AA0D07E}.Release|Any CPU.ActiveCfg = Release|x64 - {D401F706-A182-46E3-A25C-B0BF5AA0D07E}.Release|Any CPU.Build.0 = Release|x64 {D401F706-A182-46E3-A25C-B0BF5AA0D07E}.Release|x64.ActiveCfg = Release|x64 {D401F706-A182-46E3-A25C-B0BF5AA0D07E}.Release|x64.Build.0 = Release|x64 - {0FFA3F96-A68A-453F-A5FE-0C281EC371C7}.Debug|Any CPU.ActiveCfg = Debug|x64 - {0FFA3F96-A68A-453F-A5FE-0C281EC371C7}.Debug|Any CPU.Build.0 = Debug|x64 {0FFA3F96-A68A-453F-A5FE-0C281EC371C7}.Debug|x64.ActiveCfg = Debug|x64 {0FFA3F96-A68A-453F-A5FE-0C281EC371C7}.Debug|x64.Build.0 = Debug|x64 - {0FFA3F96-A68A-453F-A5FE-0C281EC371C7}.Release|Any CPU.ActiveCfg = Release|x64 - {0FFA3F96-A68A-453F-A5FE-0C281EC371C7}.Release|Any CPU.Build.0 = Release|x64 {0FFA3F96-A68A-453F-A5FE-0C281EC371C7}.Release|x64.ActiveCfg = Release|x64 {0FFA3F96-A68A-453F-A5FE-0C281EC371C7}.Release|x64.Build.0 = Release|x64 - {5FA79592-DE5B-46FF-9E05-34A2E72A7AF7}.Debug|Any CPU.ActiveCfg = Debug|x64 - {5FA79592-DE5B-46FF-9E05-34A2E72A7AF7}.Debug|Any CPU.Build.0 = Debug|x64 {5FA79592-DE5B-46FF-9E05-34A2E72A7AF7}.Debug|x64.ActiveCfg = Debug|x64 {5FA79592-DE5B-46FF-9E05-34A2E72A7AF7}.Debug|x64.Build.0 = Debug|x64 - {5FA79592-DE5B-46FF-9E05-34A2E72A7AF7}.Release|Any CPU.ActiveCfg = Release|x64 - {5FA79592-DE5B-46FF-9E05-34A2E72A7AF7}.Release|Any CPU.Build.0 = Release|x64 {5FA79592-DE5B-46FF-9E05-34A2E72A7AF7}.Release|x64.ActiveCfg = Release|x64 {5FA79592-DE5B-46FF-9E05-34A2E72A7AF7}.Release|x64.Build.0 = Release|x64 - {09FD3D3A-1EFC-4AEE-B3D7-096D238E0D1A}.Debug|Any CPU.ActiveCfg = Debug|x64 - {09FD3D3A-1EFC-4AEE-B3D7-096D238E0D1A}.Debug|Any CPU.Build.0 = Debug|x64 {09FD3D3A-1EFC-4AEE-B3D7-096D238E0D1A}.Debug|x64.ActiveCfg = Debug|x64 {09FD3D3A-1EFC-4AEE-B3D7-096D238E0D1A}.Debug|x64.Build.0 = Debug|x64 - {09FD3D3A-1EFC-4AEE-B3D7-096D238E0D1A}.Release|Any CPU.ActiveCfg = Release|x64 - {09FD3D3A-1EFC-4AEE-B3D7-096D238E0D1A}.Release|Any CPU.Build.0 = Release|x64 {09FD3D3A-1EFC-4AEE-B3D7-096D238E0D1A}.Release|x64.ActiveCfg = Release|x64 {09FD3D3A-1EFC-4AEE-B3D7-096D238E0D1A}.Release|x64.Build.0 = Release|x64 - {BDB7A8F3-87A6-4B77-9E0F-6BC785CBCF2B}.Debug|Any CPU.ActiveCfg = Debug|x64 - {BDB7A8F3-87A6-4B77-9E0F-6BC785CBCF2B}.Debug|Any CPU.Build.0 = Debug|x64 {BDB7A8F3-87A6-4B77-9E0F-6BC785CBCF2B}.Debug|x64.ActiveCfg = Debug|x64 {BDB7A8F3-87A6-4B77-9E0F-6BC785CBCF2B}.Debug|x64.Build.0 = Debug|x64 - {BDB7A8F3-87A6-4B77-9E0F-6BC785CBCF2B}.Release|Any CPU.ActiveCfg = Release|x64 - {BDB7A8F3-87A6-4B77-9E0F-6BC785CBCF2B}.Release|Any CPU.Build.0 = Release|x64 {BDB7A8F3-87A6-4B77-9E0F-6BC785CBCF2B}.Release|x64.ActiveCfg = Release|x64 {BDB7A8F3-87A6-4B77-9E0F-6BC785CBCF2B}.Release|x64.Build.0 = Release|x64 - {27E0B288-7DFF-468D-9360-035E8CE123CB}.Debug|Any CPU.ActiveCfg = Debug|x64 - {27E0B288-7DFF-468D-9360-035E8CE123CB}.Debug|Any CPU.Build.0 = Debug|x64 {27E0B288-7DFF-468D-9360-035E8CE123CB}.Debug|x64.ActiveCfg = Debug|x64 {27E0B288-7DFF-468D-9360-035E8CE123CB}.Debug|x64.Build.0 = Debug|x64 - {27E0B288-7DFF-468D-9360-035E8CE123CB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {27E0B288-7DFF-468D-9360-035E8CE123CB}.Release|Any CPU.Build.0 = Release|Any CPU - {27E0B288-7DFF-468D-9360-035E8CE123CB}.Release|x64.ActiveCfg = Release|Any CPU - {27E0B288-7DFF-468D-9360-035E8CE123CB}.Release|x64.Build.0 = Release|Any CPU + {27E0B288-7DFF-468D-9360-035E8CE123CB}.Release|x64.ActiveCfg = Release|x64 + {27E0B288-7DFF-468D-9360-035E8CE123CB}.Release|x64.Build.0 = Release|x64 + {20F43119-EA00-440D-B3B5-44F96592F4C8}.Debug|x64.ActiveCfg = Debug|x64 + {20F43119-EA00-440D-B3B5-44F96592F4C8}.Debug|x64.Build.0 = Debug|x64 + {20F43119-EA00-440D-B3B5-44F96592F4C8}.Release|x64.ActiveCfg = Release|x64 + {20F43119-EA00-440D-B3B5-44F96592F4C8}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -378,6 +258,7 @@ Global {09FD3D3A-1EFC-4AEE-B3D7-096D238E0D1A} = {5B9575EA-B4F9-46E4-A75E-59D430779EC7} {BDB7A8F3-87A6-4B77-9E0F-6BC785CBCF2B} = {5B9575EA-B4F9-46E4-A75E-59D430779EC7} {27E0B288-7DFF-468D-9360-035E8CE123CB} = {7940E867-EEBA-4AFD-9904-1536F003239C} + {20F43119-EA00-440D-B3B5-44F96592F4C8} = {7940E867-EEBA-4AFD-9904-1536F003239C} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {D044BB14-0B37-47E5-A579-8B30FCBA1F9F} diff --git a/src/UniGetUI/App.xaml.cs b/src/UniGetUI/App.xaml.cs index 13b79ff8f..044f55f0f 100644 --- a/src/UniGetUI/App.xaml.cs +++ b/src/UniGetUI/App.xaml.cs @@ -11,14 +11,7 @@ using UniGetUI.Core.SettingsEngine; using UniGetUI.Core.Tools; using UniGetUI.Interface; -using UniGetUI.PackageEngine.ManagerClasses.Manager; -using UniGetUI.PackageEngine.Managers.ChocolateyManager; -using UniGetUI.PackageEngine.Managers.DotNetManager; -using UniGetUI.PackageEngine.Managers.NpmManager; -using UniGetUI.PackageEngine.Managers.PipManager; -using UniGetUI.PackageEngine.Managers.PowerShellManager; -using UniGetUI.PackageEngine.Managers.ScoopManager; -using UniGetUI.PackageEngine.Managers.WingetManager; +using UniGetUI.PackageEngine; using UniGetUI.PackageEngine.Operations; using Windows.Foundation.Collections; @@ -37,18 +30,10 @@ public class __tooltip_options private int _available_updates = 0; public int AvailableUpdates { get { return _available_updates; } set { _available_updates = value; MainApp.Instance.MainWindow.UpdateSystemTrayStatus(); } } } -#pragma warning disable CS8618 - public static Scoop Scoop; - public static WinGet Winget; - public static Chocolatey Choco; - public static Pip Pip; - public static Npm Npm; - public static DotNet Dotnet; - public static PowerShell PowerShell; + public List OperationQueue = new(); public bool RaiseExceptionAsFatal = true; - public readonly List PackageManagerList = new(); public Interface.SettingsInterface settings; public MainWindow MainWindow; @@ -57,32 +42,16 @@ public class __tooltip_options private BackgroundApiRunner BackgroundApi = new(); private const int ManagerLoadTimeout = 10000; // 10 seconds timeout for Package Manager initialization +#pragma warning disable CS8618 public static MainApp Instance; public __tooltip_options TooltipStatus = new(); public MainApp() : base() { +#pragma warning restore CS8618 try { Instance = this; - Scoop = new(); - Winget = new(); - Choco = new(); - Pip = new(); - Npm = new(); - Dotnet = new(); - PowerShell = new(); - - PackageManagerList.AddRange(new PackageManager[] - { - Winget, - Scoop, - Choco, - Pip, - Npm, - Dotnet, - PowerShell - }); InitializeComponent(); @@ -259,8 +228,6 @@ private async Task LoadComponentsAsync() { try { - InitializePackageManagers(); - // Run other initializations asynchronously if(!Settings.Get("DisableAutoUpdateWingetUI")) UpdateUniGetUIIfPossible(); @@ -273,7 +240,7 @@ private async Task LoadComponentsAsync() _ = MainWindow.DoEntryTextAnimationAsync(); - await InitializeAllManagersAsync(); + await PEInterface.Initialize(); Logger.Info("LoadComponentsAsync finished executing. All managers loaded. Proceeding to interface."); MainWindow.SwitchToInterface(); @@ -288,41 +255,6 @@ private async Task LoadComponentsAsync() } } - /// - /// Constructs Package Manager objects - /// - private void InitializePackageManagers() - { - - } - - /// - /// Initializes Package Manager objects (asynchronously) - /// - /// - private async Task InitializeAllManagersAsync() - { - List initializeTasks = new(); - - foreach (PackageManager manager in PackageManagerList) - { - initializeTasks.Add(manager.InitializeAsync()); - } - - - Task ManagersMetaTask = Task.WhenAll(initializeTasks); - try - { - await ManagersMetaTask.WaitAsync(TimeSpan.FromMilliseconds(ManagerLoadTimeout)); - } - catch (Exception e) - { - Logger.Error(e); - } - if (ManagersMetaTask.IsCompletedSuccessfully == false) - Logger.Warn("Timeout: Not all package managers have finished initializing."); - } - protected override async void OnLaunched(LaunchActivatedEventArgs args) { if (!CoreData.IsDaemon) diff --git a/src/UniGetUI/Interface/Dialogs/IgnoredUpdates.xaml.cs b/src/UniGetUI/Interface/Dialogs/IgnoredUpdates.xaml.cs index 8f3a34b5f..ca80fd5fc 100644 --- a/src/UniGetUI/Interface/Dialogs/IgnoredUpdates.xaml.cs +++ b/src/UniGetUI/Interface/Dialogs/IgnoredUpdates.xaml.cs @@ -6,6 +6,7 @@ using UniGetUI.Core.Logging; using UniGetUI.Core.Tools; using UniGetUI.Interface.Enums; +using UniGetUI.PackageEngine; using UniGetUI.PackageEngine.ManagerClasses.Manager; using UniGetUI.PackageEngine.PackageClasses; @@ -33,7 +34,7 @@ public async Task UpdateData() Dictionary ManagerNameReference = new(); - foreach (PackageManager Manager in MainApp.Instance.PackageManagerList) + foreach (PackageManager Manager in PEInterface.Managers) { ManagerNameReference.Add(Manager.Name.ToLower(), Manager); } @@ -49,7 +50,7 @@ public async Task UpdateData() foreach (KeyValuePair keypair in IgnoredUpdatesJson) { - PackageManager manager = MainApp.Winget; // Manager by default + PackageManager manager = PEInterface.WinGet; // Manager by default if (ManagerNameReference.ContainsKey(keypair.Key.Split("\\")[0])) manager = ManagerNameReference[keypair.Key.Split("\\")[0]]; diff --git a/src/UniGetUI/Interface/Pages/LogPage.xaml.cs b/src/UniGetUI/Interface/Pages/LogPage.xaml.cs index cf570988d..2726d379f 100644 --- a/src/UniGetUI/Interface/Pages/LogPage.xaml.cs +++ b/src/UniGetUI/Interface/Pages/LogPage.xaml.cs @@ -8,6 +8,7 @@ using UniGetUI.Core.Logging; using UniGetUI.Core.SettingsEngine; using UniGetUI.Core.Tools; +using UniGetUI.PackageEngine; using Windows.Storage; using Windows.Storage.Pickers; using Windows.UI; @@ -51,7 +52,7 @@ public Logger_LogPage(Logger_LogType logger_LogType = Logger_LogType.UniGetUILog } else if (Logger_LogType == Logger_LogType.ManagerLogs) { LogLevelCombo.Items.Clear(); - foreach (var manager in MainApp.Instance.PackageManagerList) + foreach (var manager in PEInterface.Managers) { LogLevelCombo.Items.Add(manager.Name); LogLevelCombo.Items.Add($"{manager.Name} ({CoreTools.Translate("Verbose")})"); @@ -183,7 +184,7 @@ public void LoadLog() else if (Logger_LogType == Logger_LogType.ManagerLogs) { bool verbose = LogLevelCombo.SelectedValue?.ToString()?.Contains("(") ?? false; - foreach (var manager in MainApp.Instance.PackageManagerList) + foreach (var manager in PEInterface.Managers) if (manager.Name.Contains(LogLevelCombo.SelectedValue?.ToString()?.Split(' ')[0] ?? "uncontained_word")) { var TaskLogger = manager.TaskLogger; diff --git a/src/UniGetUI/Interface/Pages/PackageDetailsPage.xaml.cs b/src/UniGetUI/Interface/Pages/PackageDetailsPage.xaml.cs index 27c479a75..7764d7ddf 100644 --- a/src/UniGetUI/Interface/Pages/PackageDetailsPage.xaml.cs +++ b/src/UniGetUI/Interface/Pages/PackageDetailsPage.xaml.cs @@ -7,6 +7,7 @@ using UniGetUI.Core.Data; using UniGetUI.Core.Logging; using UniGetUI.Core.Tools; +using UniGetUI.PackageEngine; using UniGetUI.PackageEngine.Enums; using UniGetUI.PackageEngine.Operations; using UniGetUI.PackageEngine.PackageClasses; @@ -184,7 +185,7 @@ public async Task LoadInformation() // Extended details section SetTextToItem(ManifestUrl_Content, details.ManifestUrl); - if (Package.Manager == MainApp.Choco) + if (Package.Manager == PEInterface.Chocolatey) SetTextToItem(InstallerHash_Label, CoreTools.Translate("Installer SHA512") + ": "); else SetTextToItem(InstallerHash_Label, CoreTools.Translate("Installer SHA256") + ": "); diff --git a/src/UniGetUI/Interface/Pages/SettingsPage.xaml.cs b/src/UniGetUI/Interface/Pages/SettingsPage.xaml.cs index 21acbb6a9..a952789d1 100644 --- a/src/UniGetUI/Interface/Pages/SettingsPage.xaml.cs +++ b/src/UniGetUI/Interface/Pages/SettingsPage.xaml.cs @@ -11,6 +11,7 @@ using UniGetUI.Core.SettingsEngine; using UniGetUI.Core.Tools; using UniGetUI.Interface.Widgets; +using UniGetUI.PackageEngine; using UniGetUI.PackageEngine.ManagerClasses.Manager; // To learn more about WinUI, the WinUI project structure, @@ -93,7 +94,7 @@ public SettingsInterface() // Admin Settings Section int index = 2; - foreach (PackageManager manager in MainApp.Instance.PackageManagerList) + foreach (PackageManager manager in PEInterface.Managers) { } @@ -105,7 +106,7 @@ public SettingsInterface() Dictionary PackageManagerExpanders = new(); Dictionary> ExtraSettingsCards = new(); - foreach (PackageManager Manager in MainApp.Instance.PackageManagerList) + foreach (PackageManager Manager in PEInterface.Managers) { ExtraSettingsCards.Add(Manager, new List()); } @@ -117,19 +118,19 @@ public SettingsInterface() CoreTools.LaunchBatchFile(Path.Join(CoreData.UniGetUIExecutableDirectory, "Assets", "Utilities", "reset_winget_sources.cmd"), CoreTools.Translate("Resetting Winget sources - WingetUI"), RunAsAdmin: true); }; - ExtraSettingsCards[MainApp.Winget].Add(Winget_ResetSources); + ExtraSettingsCards[PEInterface.WinGet].Add(Winget_ResetSources); ButtonCard Scoop_Install = new() { Text = CoreTools.AutoTranslated("Install Scoop"), ButtonText = CoreTools.AutoTranslated("Install") }; Scoop_Install.Click += (s, e) => { CoreTools.LaunchBatchFile(Path.Join(CoreData.UniGetUIExecutableDirectory, "Assets", "Utilities", "install_scoop.cmd"), CoreTools.Translate("Scoop Installer - WingetUI")); - PackageManagerExpanders[MainApp.Scoop].ShowRestartRequiredBanner(); + PackageManagerExpanders[PEInterface.Scoop].ShowRestartRequiredBanner(); }; ButtonCard Scoop_Uninstall = new() { Text = CoreTools.AutoTranslated("Uninstall Scoop (and its packages)"), ButtonText = CoreTools.AutoTranslated("Uninstall") }; Scoop_Uninstall.Click += (s, e) => { CoreTools.LaunchBatchFile(Path.Join(CoreData.UniGetUIExecutableDirectory, "Assets", "Utilities", "uninstall_scoop.cmd"), CoreTools.Translate("Scoop Uninstaller - WingetUI")); - PackageManagerExpanders[MainApp.Scoop].ShowRestartRequiredBanner(); + PackageManagerExpanders[PEInterface.Scoop].ShowRestartRequiredBanner(); }; ButtonCard Scoop_ResetAppCache = new() { Text = CoreTools.AutoTranslated("Run cleanup and clear cache"), ButtonText = CoreTools.AutoTranslated("Run") }; Scoop_ResetAppCache.Click += (s, e) => @@ -137,21 +138,21 @@ public SettingsInterface() CoreTools.LaunchBatchFile(Path.Join(CoreData.UniGetUIExecutableDirectory, "Assets", "Utilities", "scoop_cleanup.cmd"), CoreTools.Translate("Clearing Scoop cache - WingetUI"), RunAsAdmin: true); }; - ExtraSettingsCards[MainApp.Scoop].Add(Scoop_Install); - ExtraSettingsCards[MainApp.Scoop].Add(Scoop_Uninstall); - ExtraSettingsCards[MainApp.Scoop].Add(Scoop_ResetAppCache); + ExtraSettingsCards[PEInterface.Scoop].Add(Scoop_Install); + ExtraSettingsCards[PEInterface.Scoop].Add(Scoop_Uninstall); + ExtraSettingsCards[PEInterface.Scoop].Add(Scoop_ResetAppCache); CheckboxCard Chocolatey_SystemChoco = new() { Text = CoreTools.AutoTranslated("Use system Chocolatey"), SettingName = "UseSystemChocolatey" }; Chocolatey_SystemChoco.StateChanged += (s, e) => { - PackageManagerExpanders[MainApp.Choco].ShowRestartRequiredBanner(); + PackageManagerExpanders[PEInterface.Chocolatey].ShowRestartRequiredBanner(); }; - ExtraSettingsCards[MainApp.Choco].Add(Chocolatey_SystemChoco); + ExtraSettingsCards[PEInterface.Chocolatey].Add(Chocolatey_SystemChoco); - foreach (PackageManager Manager in MainApp.Instance.PackageManagerList) + foreach (PackageManager Manager in PEInterface.Managers) { SettingsEntry ManagerExpander = new() diff --git a/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs b/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs index 2219c401a..640784b1c 100644 --- a/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs +++ b/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs @@ -10,11 +10,13 @@ using UniGetUI.Interface.Enums; using UniGetUI.Interface.Pages; using UniGetUI.Interface.Widgets; +using UniGetUI.PackageEngine; using UniGetUI.PackageEngine.Classes.Manager.ManagerHelpers; using UniGetUI.PackageEngine.Enums; using UniGetUI.PackageEngine.ManagerClasses.Manager; using UniGetUI.PackageEngine.Operations; using UniGetUI.PackageEngine.PackageClasses; +using UniGetUI.PackageEngine.PackageLoader; using Windows.UI.Core; // To learn more about WinUI, the WinUI project structure, @@ -29,6 +31,8 @@ public abstract partial class AbstractPackagesPage : Page, IPageWithKeyboardShor protected bool MEGA_QUERY_BOX_ENABLED = false; protected bool SHOW_LAST_CHECKED_TIME = false; + protected BasePackageLoader Loader; + protected enum ReloadReason { FirstRun, @@ -74,11 +78,6 @@ protected enum FilterReason public bool RoleIsUpdateLike { get { return PageRole == OperationType.Update; } } - - - protected abstract Task LoadPackagesFromManager(PackageManager manager); - protected abstract Task IsPackageValid(Package package); - protected abstract Task WhenAddingPackage(Package package); protected abstract Task WhenPackagesLoaded(ReloadReason reason); protected abstract void WhenPackageCountUpdated(); protected abstract void WhenShowingContextMenu(Package package); @@ -119,8 +118,15 @@ protected string NoMatches_SubtitleText - public AbstractPackagesPage() + public AbstractPackagesPage(BasePackageLoader loader) { + Loader = loader; + Packages = Loader.Packages; + + Loader.StartedLoading += Loader_StartedLoading; + Loader.FinishedLoading += Loader_FinishedLoading; + Loader.PackagesChanged += Loader_PackagesChanged; + InitializeComponent(); LastPackageLoadTime = DateTime.Now; QueryBothRadio.IsChecked = true; @@ -132,6 +138,7 @@ public AbstractPackagesPage() MegaQueryBlockGrid.Visibility = Visibility.Collapsed; FilterPackages(QueryBlock.Text); }; + QueryBlock.TextChanged += (s, e) => { if (InstantSearchCheckbox.IsChecked == true) FilterPackages(QueryBlock.Text); }; QueryBlock.KeyUp += (s, e) => { if (e.Key == Windows.System.VirtualKey.Enter) @@ -275,6 +282,28 @@ public AbstractPackagesPage() MegaQueryBlock.PlaceholderText = CoreTools.Translate("Search for packages"); } + private void Loader_PackagesChanged(object? sender, EventArgs e) + { + foreach (var package in Packages) + AddPackageToSourcesList(package); + + UpdatePackageCount(); + FilterPackages(QueryBlock.Text); + } + + private void Loader_FinishedLoading(object? sender, EventArgs e) + { + LoadingProgressBar.Visibility = Visibility.Collapsed; + UpdatePackageCount(); + FilterPackages(QueryBlock.Text); + } + + private void Loader_StartedLoading(object? sender, EventArgs e) + { + LoadingProgressBar.Visibility = Visibility.Visible; + UpdatePackageCount(); + } + public void SearchTriggered() { QueryBlock.Focus(FocusState.Pointer); @@ -391,71 +420,12 @@ protected void ClearPackageList() protected async Task LoadPackages(ReloadReason reason) { - if (!Initialized) - return; - - if (LoadingProgressBar.Visibility == Visibility.Visible) - return; // If already loading, don't load again - - if (DISABLE_AUTOMATIC_PACKAGE_LOAD_ON_START && reason == ReloadReason.FirstRun) - return; - - MainSubtitle.Text = MainSubtitle_StillLoading; - BackgroundText.Text = MainSubtitle_StillLoading; - BackgroundText.Visibility = Visibility.Visible; - LoadingProgressBar.Visibility = Visibility.Visible; - SourcesPlaceholderText.Visibility = Visibility.Visible; - SourcesPlaceholderText.Text = MainSubtitle_StillLoading; - SourcesTreeViewGrid.Visibility = Visibility.Collapsed; - - ClearPackageList(); - - await Task.Delay(100); - - List> tasks = new(); - - foreach (PackageManager manager in MainApp.Instance.PackageManagerList) - { - if (manager.IsEnabled() && manager.Status.Found) - { - Task task = LoadPackagesFromManager(manager); - tasks.Add(task); - } - } - - while (tasks.Count > 0) + if(!(Loader.IsLoading) && (Loader.IsLoaded || reason == ReloadReason.External || reason == ReloadReason.Manual || reason == ReloadReason.Automated)) { - foreach (Task task in tasks.ToArray()) - { - if (!task.IsCompleted) - await Task.Delay(100); - - if (task.IsCompleted) - { - if (task.IsCompletedSuccessfully) - { - int InitialCount = Packages.Count; - foreach (Package package in task.Result) - { - if (!await IsPackageValid(package)) - continue; - - Packages.Add(package); - await WhenAddingPackage(package); - AddPackageToSourcesList(package); - } - if (InitialCount < Packages.Count) - FilterPackages(QueryBlock.Text.Trim(), StillLoading: true); - } - tasks.Remove(task); - } - } + Loader.ClearPackages(); + await Loader.ReloadPackages(); } - - LoadingProgressBar.Visibility = Visibility.Collapsed; - LastPackageLoadTime = DateTime.Now; - FilterPackages(QueryBlock.Text, StillLoading: false); - await WhenPackagesLoaded(reason); + Loader_PackagesChanged(this, EventArgs.Empty); } public void FilterPackages(string query, bool StillLoading = false) @@ -533,7 +503,6 @@ public void FilterPackages(string query, bool StillLoading = false) FilteredPackages.Sort(); UpdatePackageCount(); } - public void UpdatePackageCount() { if (FilteredPackages.Count() == 0) @@ -582,7 +551,6 @@ public void UpdatePackageCount() WhenPackageCountUpdated(); } - public void SortPackages(string Sorter) { if (!Initialized) @@ -687,7 +655,7 @@ protected void ClearItemSelection() AllSelected = false; } - public void RemoveCorrespondingPackages(Package foreignPackage) + /*public void RemoveCorrespondingPackages(Package foreignPackage) { foreach (Package package in Packages.ToArray()) if (package == foreignPackage || package.IsEquivalentTo(foreignPackage)) @@ -699,7 +667,7 @@ public void RemoveCorrespondingPackages(Package foreignPackage) FilteredPackages.Remove(package); } UpdatePackageCount(); - } + }*/ private void SidepanelWidth_SizeChanged(object sender, SizeChangedEventArgs e) { diff --git a/src/UniGetUI/Interface/SoftwarePages/NewDiscoverSoftwarePage.cs b/src/UniGetUI/Interface/SoftwarePages/NewDiscoverSoftwarePage.cs index 6311cda04..aa8cdd023 100644 --- a/src/UniGetUI/Interface/SoftwarePages/NewDiscoverSoftwarePage.cs +++ b/src/UniGetUI/Interface/SoftwarePages/NewDiscoverSoftwarePage.cs @@ -4,6 +4,7 @@ using UniGetUI.Core.Tools; using UniGetUI.Interface.Enums; using UniGetUI.Interface.Widgets; +using UniGetUI.PackageEngine; using UniGetUI.PackageEngine.Enums; using UniGetUI.PackageEngine.ManagerClasses.Manager; using UniGetUI.PackageEngine.Operations; @@ -16,6 +17,10 @@ public class NewDiscoverSoftwarePage : AbstractPackagesPage BetterMenuItem? MenuAsAdmin; BetterMenuItem? MenuInteractive; BetterMenuItem? MenuSkipHash; + public NewDiscoverSoftwarePage() + : base(PEInterface.DiscoveredPackagesLoader) + { + } public override BetterMenu GenerateContextMenu() { @@ -260,33 +265,6 @@ public override void GenerateUIText() QueryOptionsGroup.SelectedItem = QueryBothRadio; } -#pragma warning disable - protected override async Task IsPackageValid(Package package) - { - return true; - } -#pragma warning restore - - protected override Task LoadPackagesFromManager(PackageManager manager) - { - string text = QueryBlock.Text; - text = CoreTools.EnsureSafeQueryString(text); - if (text == string.Empty) - return new Task(() => { return []; }); - else - return manager.FindPackages(text); - } - -#pragma warning disable - protected override async Task WhenAddingPackage(Package package) - { - if (package.GetUpgradablePackage() != null) - package.SetTag(PackageTag.IsUpgradable); - else if (package.GetInstalledPackage() != null) - package.SetTag(PackageTag.AlreadyInstalled); - } -#pragma warning restore - protected override void WhenPackageCountUpdated() { return; diff --git a/src/UniGetUI/Interface/SoftwarePages/NewInstalledPackagesPage.cs b/src/UniGetUI/Interface/SoftwarePages/NewInstalledPackagesPage.cs index 40bf48e2f..d3f2de149 100644 --- a/src/UniGetUI/Interface/SoftwarePages/NewInstalledPackagesPage.cs +++ b/src/UniGetUI/Interface/SoftwarePages/NewInstalledPackagesPage.cs @@ -6,6 +6,7 @@ using UniGetUI.Core.Tools; using UniGetUI.Interface.Enums; using UniGetUI.Interface.Widgets; +using UniGetUI.PackageEngine; using UniGetUI.PackageEngine.Classes; using UniGetUI.PackageEngine.Enums; using UniGetUI.PackageEngine.ManagerClasses.Manager; @@ -22,6 +23,11 @@ public class NewInstalledPackagesPage : AbstractPackagesPage BetterMenuItem? MenuInteractive; BetterMenuItem? MenuRemoveData; + public NewInstalledPackagesPage() + : base(PEInterface.InstalledPackagesLoader) + { + } + public override BetterMenu GenerateContextMenu() { BetterMenu menu = new(); @@ -226,7 +232,7 @@ public override void GenerateToolBar() { foreach (Package package in FilteredPackages.ToArray()) if (package.IsChecked) { - MainApp.Instance.MainWindow.NavigationPage.UpdatesPage.RemoveCorrespondingPackages(package); + PEInterface.UpgradablePackagesLoader.Remove(package); await package.AddToIgnoredUpdatesAsync(); } }; @@ -268,28 +274,6 @@ public override void GenerateUIText() QueryOptionsGroup.SelectedItem = QueryBothRadio; } -#pragma warning disable - protected override async Task IsPackageValid(Package package) - { - return true; - } -#pragma warning restore - - protected override Task LoadPackagesFromManager(PackageManager manager) - { - return manager.GetInstalledPackages(); - } - - protected override async Task WhenAddingPackage(Package package) - { - if (await package.HasUpdatesIgnoredAsync(Version: "*")) - package.Tag = PackageTag.Pinned; - else if (package.GetUpgradablePackage() != null) - package.Tag = PackageTag.IsUpgradable; - - package.GetAvailablePackage()?.SetTag(PackageTag.AlreadyInstalled); - } - protected override void WhenPackageCountUpdated() { return; @@ -481,7 +465,7 @@ private void MenuIgnorePackage_Invoked(object sender, RoutedEventArgs args) if (!Initialized || package == null) return; _ = package.AddToIgnoredUpdatesAsync(); - MainApp.Instance.MainWindow.NavigationPage.UpdatesPage.RemoveCorrespondingPackages(package); + PEInterface.UpgradablePackagesLoader.Remove(package); } private void MenuShare_Invoked(object sender, RoutedEventArgs args) @@ -505,15 +489,5 @@ await MainApp.Instance.MainWindow.NavigationPage.ShowInstallationSettingsForPack ConfirmAndUninstall(package, await InstallationOptions.FromPackageAsync(package)); } } - - public async void AddInstalledPackage(Package foreignPackage) - { - foreach (Package package in Packages.ToArray()) - if (package == foreignPackage || package.IsEquivalentTo(foreignPackage)) - return; - await WhenAddingPackage(foreignPackage); - Packages.Add(foreignPackage); - UpdatePackageCount(); - } } } \ No newline at end of file diff --git a/src/UniGetUI/Interface/SoftwarePages/NewSoftwareUpdatesPage.cs b/src/UniGetUI/Interface/SoftwarePages/NewSoftwareUpdatesPage.cs index e1a40d0dd..995aaa667 100644 --- a/src/UniGetUI/Interface/SoftwarePages/NewSoftwareUpdatesPage.cs +++ b/src/UniGetUI/Interface/SoftwarePages/NewSoftwareUpdatesPage.cs @@ -7,6 +7,7 @@ using UniGetUI.Core.Tools; using UniGetUI.Interface.Enums; using UniGetUI.Interface.Widgets; +using UniGetUI.PackageEngine; using UniGetUI.PackageEngine.Enums; using UniGetUI.PackageEngine.ManagerClasses.Manager; using UniGetUI.PackageEngine.Operations; @@ -20,6 +21,12 @@ public class NewSoftwareUpdatesPage : AbstractPackagesPage private BetterMenuItem? MenuInteractive; private BetterMenuItem? MenuskipHash; + public NewSoftwareUpdatesPage() + : base(PEInterface.UpgradablePackagesLoader) + { + + } + public override void GenerateUIText() { PAGE_NAME = "Updates"; @@ -264,7 +271,7 @@ public override void GenerateToolBar() foreach (Package package in FilteredPackages.ToArray()) if (package.IsChecked) { await package.AddToIgnoredUpdatesAsync(); - MainApp.Instance.MainWindow.NavigationPage.UpdatesPage.RemoveCorrespondingPackages(package); + PEInterface.UpgradablePackagesLoader.Remove(package); } }; @@ -303,29 +310,6 @@ public override void GenerateToolBar() } - protected override async Task IsPackageValid(Package package) - { - if (await package.HasUpdatesIgnoredAsync(package.NewVersion)) - return false; - - if (package.IsUpgradable && package.NewerVersionIsInstalled()) - return false; - - return true; - } - - protected override Task LoadPackagesFromManager(PackageManager manager) - { - return manager.GetAvailableUpdates(); - } -#pragma warning disable - protected override async Task WhenAddingPackage(Package package) - { - package.GetAvailablePackage()?.SetTag(PackageTag.IsUpgradable); - package.GetInstalledPackage()?.SetTag(PackageTag.IsUpgradable); - } -#pragma warning restore - protected override void WhenPackageCountUpdated() { try @@ -508,7 +492,7 @@ private void MenuIgnorePackage_Invoked(object sender, RoutedEventArgs e) if (!Initialized || package == null) return; _ = package.AddToIgnoredUpdatesAsync(); - MainApp.Instance.MainWindow.NavigationPage.UpdatesPage.RemoveCorrespondingPackages(package); + PEInterface.UpgradablePackagesLoader.Remove(package); } private void MenuSkipVersion_Invoked(object sender, RoutedEventArgs e) @@ -517,7 +501,7 @@ private void MenuSkipVersion_Invoked(object sender, RoutedEventArgs e) if (!Initialized || package == null) return; _ = package.AddToIgnoredUpdatesAsync((package).NewVersion); - MainApp.Instance.MainWindow.NavigationPage.UpdatesPage.RemoveCorrespondingPackages(package); + PEInterface.UpgradablePackagesLoader.Remove(package); } public void UpdatePackageForId(string id) diff --git a/src/UniGetUI/Interface/SoftwarePages/PackageBundle.xaml.cs b/src/UniGetUI/Interface/SoftwarePages/PackageBundle.xaml.cs index 8e149274e..435273044 100644 --- a/src/UniGetUI/Interface/SoftwarePages/PackageBundle.xaml.cs +++ b/src/UniGetUI/Interface/SoftwarePages/PackageBundle.xaml.cs @@ -14,6 +14,7 @@ using UniGetUI.Core.Tools; using UniGetUI.Interface.Pages; using UniGetUI.Interface.Widgets; +using UniGetUI.PackageEngine; using UniGetUI.PackageEngine.Classes; using UniGetUI.PackageEngine.Classes.Manager.ManagerHelpers; using UniGetUI.PackageEngine.Enums; @@ -322,7 +323,7 @@ public void FilterPackages(string query, bool StillLoading = false) int HiddenPackagesDueToSource = 0; foreach (BundledPackage match in MatchingList) { - if ((VisibleManagers.Contains(match.Package.Manager) && match.Package.Manager != MainApp.Winget) || VisibleSources.Contains(match.Package.Source)) + if ((VisibleManagers.Contains(match.Package.Manager) && match.Package.Manager != PEInterface.WinGet) || VisibleSources.Contains(match.Package.Source)) FilteredPackages.Add(match); else HiddenPackagesDueToSource++; @@ -714,7 +715,7 @@ public async Task AddPackagesFromBundleString(string content, BundleFormatType f // Get a list of all managers Dictionary ManagerSourceReference = new(); - foreach (PackageManager manager in MainApp.Instance.PackageManagerList) + foreach (PackageManager manager in PEInterface.Managers) { ManagerSourceReference.Add(manager.Name, manager); } diff --git a/src/UniGetUI/PackageEngine/Classes/ImportExport.cs b/src/UniGetUI/PackageEngine/Classes/ImportExport.cs index 3a9a71c1b..7bbbe6d54 100644 --- a/src/UniGetUI/PackageEngine/Classes/ImportExport.cs +++ b/src/UniGetUI/PackageEngine/Classes/ImportExport.cs @@ -231,7 +231,7 @@ public override string IconId } } - public InvalidBundledPackage(string name, string id, string version, string source, string manager) : this(new Package(name, id, version, MainApp.Winget.DefaultSource, MainApp.Winget)) + public InvalidBundledPackage(string name, string id, string version, string source, string manager) : this(new Package(name, id, version, PEInterface.WinGet.DefaultSource, PEInterface.WinGet)) { IsValid = false; DrawOpacity = 0.5; diff --git a/src/UniGetUI/PackageEngine/Operations/PackageOperations.cs b/src/UniGetUI/PackageEngine/Operations/PackageOperations.cs index a6b173d7c..85d6505e2 100644 --- a/src/UniGetUI/PackageEngine/Operations/PackageOperations.cs +++ b/src/UniGetUI/PackageEngine/Operations/PackageOperations.cs @@ -151,7 +151,7 @@ protected override async Task HandleSuccess() LineInfoText = CoreTools.Translate("{package} was installed successfully", new Dictionary{ { "package", Package.Name } }); Package.SetTag(PackageTag.AlreadyInstalled); - MainApp.Instance.MainWindow.NavigationPage.InstalledPage.AddInstalledPackage(Package); + PEInterface.InstalledPackagesLoader.AddForeign(Package); if (!Settings.Get("DisableSuccessNotifications") && !Settings.Get("DisableNotifications")) @@ -267,7 +267,7 @@ protected override async Task HandleSuccess() if(await Package.HasUpdatesIgnoredAsync() && await Package.GetIgnoredUpdatesVersionAsync() != "*") await Package.RemoveFromIgnoredUpdatesAsync(); - MainApp.Instance.MainWindow.NavigationPage.UpdatesPage.RemoveCorrespondingPackages(Package); + PEInterface.UpgradablePackagesLoader.Remove(Package); if (!Settings.Get("DisableSuccessNotifications") && !Settings.Get("DisableNotifications")) try @@ -379,8 +379,8 @@ protected override async Task HandleSuccess() LineInfoText = CoreTools.Translate("{package} was uninstalled successfully", new Dictionary{ { "package", Package.Name } }); Package.GetAvailablePackage()?.SetTag(PackageTag.Default); - MainApp.Instance.MainWindow.NavigationPage.UpdatesPage.RemoveCorrespondingPackages(Package); - MainApp.Instance.MainWindow.NavigationPage.InstalledPage.RemoveCorrespondingPackages(Package); + PEInterface.UpgradablePackagesLoader.Remove(Package); + PEInterface.InstalledPackagesLoader.Remove(Package); if (!Settings.Get("DisableSuccessNotifications") && !Settings.Get("DisableNotifications")) try diff --git a/src/UniGetUI/UniGetUI.csproj b/src/UniGetUI/UniGetUI.csproj index 518365d6a..07552f60b 100644 --- a/src/UniGetUI/UniGetUI.csproj +++ b/src/UniGetUI/UniGetUI.csproj @@ -285,6 +285,8 @@ + + From ed327779170ec4a04d4d9380397068875a66b673 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Thu, 20 Jun 2024 22:59:39 +0200 Subject: [PATCH 05/21] Remove intermediate PaackagesPage.Packages attribute and use PaackagesPage.Loader.Packages instead --- .../BasePackageLoader.cs | 1 + .../Interface/Dialogs/IgnoredUpdates.xaml.cs | 3 +- .../AbstractPackagesPage.xaml.cs | 77 +++++-------------- .../SoftwarePages/NewInstalledPackagesPage.cs | 2 +- .../SoftwarePages/NewSoftwareUpdatesPage.cs | 12 +-- 5 files changed, 31 insertions(+), 64 deletions(-) diff --git a/src/UniGetUI.PackageEngine.PackageLoader/BasePackageLoader.cs b/src/UniGetUI.PackageEngine.PackageLoader/BasePackageLoader.cs index 73e64516f..1207d8336 100644 --- a/src/UniGetUI.PackageEngine.PackageLoader/BasePackageLoader.cs +++ b/src/UniGetUI.PackageEngine.PackageLoader/BasePackageLoader.cs @@ -94,6 +94,7 @@ public async Task ReloadPackages() await WhenAddingPackage(package); // TODO: AddPackageToSourcesList(package); } + PackagesChanged?.Invoke(this, EventArgs.Empty); } tasks.Remove(task); } diff --git a/src/UniGetUI/Interface/Dialogs/IgnoredUpdates.xaml.cs b/src/UniGetUI/Interface/Dialogs/IgnoredUpdates.xaml.cs index ca80fd5fc..ddbca2d46 100644 --- a/src/UniGetUI/Interface/Dialogs/IgnoredUpdates.xaml.cs +++ b/src/UniGetUI/Interface/Dialogs/IgnoredUpdates.xaml.cs @@ -97,6 +97,7 @@ public IgnoredPackage(string id, string version, PackageManager manager, ListVie Manager = manager; List = list; } + public async Task RemoveFromIgnoredUpdates() { string IgnoredId = $"{Manager.Properties.Name.ToLower()}\\{Id}"; @@ -107,7 +108,7 @@ public async Task RemoveFromIgnoredUpdates() await File.WriteAllTextAsync(CoreData.IgnoredUpdatesDatabaseFile, IgnoredUpdatesJson.ToString()); } - foreach (Package package in MainApp.Instance.MainWindow.NavigationPage.InstalledPage.Packages) + foreach (Package package in PEInterface.InstalledPackagesLoader.Packages) if (package.Id == Id && Manager == package.Manager) { package.SetTag(PackageTag.Default); diff --git a/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs b/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs index 640784b1c..f52a24003 100644 --- a/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs +++ b/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs @@ -52,7 +52,6 @@ protected enum FilterReason public DateTime LastPackageLoadTime { get; protected set; } - public ObservableCollection Packages = new(); public SortableObservableCollection FilteredPackages = new() { SortingSelector = (a) => (a.Name) }; protected List UsedManagers = new(); protected Dictionary> UsedSourcesForManager = new(); @@ -106,7 +105,7 @@ protected string NoMatches_SubtitleText get { return CoreTools.Translate("{0} packages were found, {1} of which match the specified filters.", - Packages.Count.ToString(), FilteredPackages.Count()) + Loader.Packages.Count.ToString(), FilteredPackages.Count()) + " " + (SHOW_LAST_CHECKED_TIME? CoreTools.Translate("(Last checked: {0})", LastPackageLoadTime.ToString()): ""); } } @@ -121,7 +120,6 @@ protected string NoMatches_SubtitleText public AbstractPackagesPage(BasePackageLoader loader) { Loader = loader; - Packages = Loader.Packages; Loader.StartedLoading += Loader_StartedLoading; Loader.FinishedLoading += Loader_FinishedLoading; @@ -284,8 +282,15 @@ public AbstractPackagesPage(BasePackageLoader loader) private void Loader_PackagesChanged(object? sender, EventArgs e) { - foreach (var package in Packages) - AddPackageToSourcesList(package); + if (Loader.Packages.Count == 0) + { + ClearPackageList(); + } + else + { + foreach (var package in Loader.Packages) + AddPackageToSourcesList(package); + } UpdatePackageCount(); FilterPackages(QueryBlock.Text); @@ -303,17 +308,14 @@ private void Loader_StartedLoading(object? sender, EventArgs e) LoadingProgressBar.Visibility = Visibility.Visible; UpdatePackageCount(); } - public void SearchTriggered() { QueryBlock.Focus(FocusState.Pointer); } - public void ReloadTriggered() { _ = LoadPackages(ReloadReason.Manual); } - public void SelectAllTriggered() { if (AllSelected) @@ -321,7 +323,6 @@ public void SelectAllTriggered() else SelectAllItems(); } - protected void AddPackageToSourcesList(Package package) { if (!Initialized) @@ -368,7 +369,6 @@ protected void AddPackageToSourcesList(Package package) RootNodeForManager[source.Manager].Children.Add(item); } } - private void PackageContextMenu_AboutToShow(object sender, Package package) { if (!Initialized) @@ -394,14 +394,6 @@ private void SourcesTreeView_SelectionChanged(TreeView sender, TreeViewSelection FilterPackages(QueryBlock.Text); } - /* - * - * - * DO NOT MODIFY THE UPPER PART OF THIS FILE - * - * - */ - public virtual async Task LoadPackages() { await LoadPackages(ReloadReason.External); @@ -409,7 +401,6 @@ public virtual async Task LoadPackages() protected void ClearPackageList() { - Packages.Clear(); FilteredPackages.Clear(); UsedManagers.Clear(); SourcesTreeView.RootNodes.Clear(); @@ -420,7 +411,7 @@ protected void ClearPackageList() protected async Task LoadPackages(ReloadReason reason) { - if(!(Loader.IsLoading) && (Loader.IsLoaded || reason == ReloadReason.External || reason == ReloadReason.Manual || reason == ReloadReason.Automated)) + if(!(Loader.IsLoading) && (!Loader.IsLoaded || reason == ReloadReason.External || reason == ReloadReason.Manual || reason == ReloadReason.Automated)) { Loader.ClearPackages(); await Loader.ReloadPackages(); @@ -483,15 +474,15 @@ public void FilterPackages(string query, bool StillLoading = false) CharsFunc = (x) => { return CaseFunc(x); }; if (QueryIdRadio.IsChecked == true) - MatchingList = Packages.Where(x => CharsFunc(x.Name).Contains(CharsFunc(query))).ToArray(); + MatchingList = Loader.Packages.Where(x => CharsFunc(x.Name).Contains(CharsFunc(query))).ToArray(); else if (QueryNameRadio.IsChecked == true) - MatchingList = Packages.Where(x => CharsFunc(x.Id).Contains(CharsFunc(query))).ToArray(); + MatchingList = Loader.Packages.Where(x => CharsFunc(x.Id).Contains(CharsFunc(query))).ToArray(); else if (QueryBothRadio.IsChecked == true) - MatchingList = Packages.Where(x => CharsFunc(x.Name).Contains(CharsFunc(query)) | CharsFunc(x.Id).Contains(CharsFunc(query))).ToArray(); + MatchingList = Loader.Packages.Where(x => CharsFunc(x.Name).Contains(CharsFunc(query)) | CharsFunc(x.Id).Contains(CharsFunc(query))).ToArray(); else if (QueryExactMatch.IsChecked == true) - MatchingList = Packages.Where(x => CharsFunc(x.Name) == CharsFunc(query) | CharsFunc(x.Id) == CharsFunc(query)).ToArray(); + MatchingList = Loader.Packages.Where(x => CharsFunc(x.Name) == CharsFunc(query) | CharsFunc(x.Id) == CharsFunc(query)).ToArray(); else // QuerySimilarResultsRadio == true - MatchingList = Packages.ToArray(); + MatchingList = Loader.Packages.ToArray(); FilteredPackages.BlockSorting = true; foreach (Package match in MatchingList) @@ -509,7 +500,7 @@ public void UpdatePackageCount() { if(LoadingProgressBar.Visibility == Visibility.Collapsed) { - if (Packages.Count() == 0) + if (Loader.Packages.Count() == 0) { BackgroundText.Text = NoPackages_BackgroundText; SourcesPlaceholderText.Text = NoPackages_SourcesText; @@ -527,7 +518,7 @@ public void UpdatePackageCount() { BackgroundText.Visibility = PackageList.Items.Count > 0 ? Visibility.Collapsed : Visibility.Visible; BackgroundText.Text = MainSubtitle_StillLoading; - SourcesPlaceholderText.Visibility = Packages.Count > 0 ? Visibility.Collapsed : Visibility.Visible; + SourcesPlaceholderText.Visibility = Loader.Packages.Count > 0 ? Visibility.Collapsed : Visibility.Visible; SourcesPlaceholderText.Text = MainSubtitle_StillLoading; MainSubtitle.Text = MainSubtitle_StillLoading; } @@ -536,14 +527,14 @@ public void UpdatePackageCount() else { BackgroundText.Text = NoPackages_BackgroundText; - BackgroundText.Visibility = Packages.Count > 0? Visibility.Collapsed: Visibility.Visible; + BackgroundText.Visibility = Loader.Packages.Count > 0? Visibility.Collapsed: Visibility.Visible; MainSubtitle.Text = FoundPackages_SubtitleText; } if (ExternalCountBadge != null) { - ExternalCountBadge.Visibility = Packages.Count() == 0 ? Visibility.Collapsed : Visibility.Visible; - ExternalCountBadge.Value = Packages.Count(); + ExternalCountBadge.Visibility = Loader.Packages.Count() == 0 ? Visibility.Collapsed : Visibility.Visible; + ExternalCountBadge.Value = Loader.Packages.Count(); } if (MegaQueryBlockGrid.Visibility == Visibility.Visible) @@ -567,7 +558,6 @@ public void SortPackages(string Sorter) if (FilteredPackages.Count > 0) PackageList.ScrollIntoView(FilteredPackages[0]); } - public void LoadInterface() { if (!Initialized) @@ -603,19 +593,15 @@ public void LoadInterface() SourceHeader.Click += (s, e) => { SortPackages("SourceAsString"); }; PackageList.ContextFlyout = GenerateContextMenu(); } - - protected void SelectAllSourcesButton_Click(object sender, RoutedEventArgs e) { SourcesTreeView.SelectAll(); } - protected void ClearSourceSelectionButton_Click(object sender, RoutedEventArgs e) { SourcesTreeView.SelectedItems.Clear(); FilterPackages(QueryBlock.Text.Trim()); } - protected async void ShowDetailsForPackage(Package? package) { if (package == null) @@ -624,14 +610,12 @@ protected async void ShowDetailsForPackage(Package? package) Logger.Warn(PageRole.ToString()); await MainApp.Instance.MainWindow.NavigationPage.ShowPackageDetails(package, PageRole); } - protected void SharePackage(Package? package) { if(package == null) return; MainApp.Instance.MainWindow.SharePackage(package); } - protected async void ShowInstallationOptionsForPackage(Package? package) { if(package == null) @@ -640,35 +624,18 @@ protected async void ShowInstallationOptionsForPackage(Package? package) if (await MainApp.Instance.MainWindow.NavigationPage.ShowInstallationSettingsForPackageAndContinue(package, PageRole)) PerformMainPackageAction(package); } - protected void SelectAllItems() { foreach (Package package in FilteredPackages) package.IsChecked = true; AllSelected = true; } - protected void ClearItemSelection() { foreach (Package package in FilteredPackages) package.IsChecked = false; AllSelected = false; } - - /*public void RemoveCorrespondingPackages(Package foreignPackage) - { - foreach (Package package in Packages.ToArray()) - if (package == foreignPackage || package.IsEquivalentTo(foreignPackage)) - { - package.Tag = PackageTag.Default; - Packages.Remove(package); - package.Tag = PackageTag.Default; - if (FilteredPackages.Contains(package)) - FilteredPackages.Remove(package); - } - UpdatePackageCount(); - }*/ - private void SidepanelWidth_SizeChanged(object sender, SizeChangedEventArgs e) { if (e.NewSize.Width == ((int)(e.NewSize.Width / 10)) || e.NewSize.Width == 25) @@ -681,7 +648,6 @@ private void SidepanelWidth_SizeChanged(object sender, SizeChangedEventArgs e) control.Visibility = e.NewSize.Width > 20 ? Visibility.Visible : Visibility.Collapsed; } } - protected void PerformMainPackageAction(Package? package) { if(package == null) return; @@ -693,6 +659,5 @@ protected void PerformMainPackageAction(Package? package) else // if (PageRole == OperationType.Uninstall) MainApp.Instance.AddOperationToList(new UninstallPackageOperation(package)); } - } } diff --git a/src/UniGetUI/Interface/SoftwarePages/NewInstalledPackagesPage.cs b/src/UniGetUI/Interface/SoftwarePages/NewInstalledPackagesPage.cs index d3f2de149..14f7a80d9 100644 --- a/src/UniGetUI/Interface/SoftwarePages/NewInstalledPackagesPage.cs +++ b/src/UniGetUI/Interface/SoftwarePages/NewInstalledPackagesPage.cs @@ -377,7 +377,7 @@ public async Task BackupPackages() { Logger.Debug("Starting package backup"); List packagestoExport = new(); - foreach (Package package in Packages) + foreach (Package package in Loader.Packages) packagestoExport.Add(await BundledPackage.FromPackageAsync(package)); string BackupContents = await PackageBundlePage.GetBundleStringFromPackages(packagestoExport.ToArray(), BundleFormatType.JSON); diff --git a/src/UniGetUI/Interface/SoftwarePages/NewSoftwareUpdatesPage.cs b/src/UniGetUI/Interface/SoftwarePages/NewSoftwareUpdatesPage.cs index 995aaa667..5ba3364e0 100644 --- a/src/UniGetUI/Interface/SoftwarePages/NewSoftwareUpdatesPage.cs +++ b/src/UniGetUI/Interface/SoftwarePages/NewSoftwareUpdatesPage.cs @@ -314,7 +314,7 @@ protected override void WhenPackageCountUpdated() { try { - MainApp.Instance.TooltipStatus.AvailableUpdates = Packages.Count(); + MainApp.Instance.TooltipStatus.AvailableUpdates = Loader.Packages.Count(); } catch (Exception) { } @@ -322,7 +322,7 @@ protected override void WhenPackageCountUpdated() public void UpdateAll() { - foreach (Package package in Packages) + foreach (Package package in Loader.Packages) { if (package.Tag != PackageTag.BeingProcessed && package.Tag != PackageTag.OnQueue) MainApp.Instance.AddOperationToList(new UpdatePackageOperation(package)); @@ -332,7 +332,7 @@ public void UpdateAll() protected override async Task WhenPackagesLoaded(ReloadReason reason) { List upgradablePackages = new(); - foreach (Package package in Packages) + foreach (Package package in Loader.Packages) { if (package.Tag != PackageTag.OnQueue && package.Tag != PackageTag.BeingProcessed) upgradablePackages.Add(package); @@ -506,7 +506,7 @@ private void MenuSkipVersion_Invoked(object sender, RoutedEventArgs e) public void UpdatePackageForId(string id) { - foreach (Package package in Packages) + foreach (Package package in Loader.Packages) { if (package.Id == id) { @@ -520,7 +520,7 @@ public void UpdatePackageForId(string id) public void UpdateAllPackagesForManager(string manager) { - foreach (Package package in Packages) + foreach (Package package in Loader.Packages) if (package.Tag != PackageTag.OnQueue && package.Tag != PackageTag.BeingProcessed) if (package.Manager.Name == manager) MainApp.Instance.AddOperationToList(new UpdatePackageOperation(package)); @@ -528,7 +528,7 @@ public void UpdateAllPackagesForManager(string manager) public Package? GetPackageForId(string id, string? sourceName = null) { - foreach (var package in Packages) + foreach (var package in Loader.Packages) if (package.Id == id && (sourceName == null || package.Source.Name == sourceName)) return package; From cb4412ca33e1c8b63f5c482708559336e45ada0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Thu, 20 Jun 2024 23:00:04 +0200 Subject: [PATCH 06/21] Update BackgroundApi.cs --- src/UniGetUI/Interface/BackgroundApi.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/UniGetUI/Interface/BackgroundApi.cs b/src/UniGetUI/Interface/BackgroundApi.cs index 2fafce666..d9c39d8ee 100644 --- a/src/UniGetUI/Interface/BackgroundApi.cs +++ b/src/UniGetUI/Interface/BackgroundApi.cs @@ -5,6 +5,7 @@ using UniGetUI.Core.SettingsEngine; using UniGetUI.Core.Tools; using UniGetUI.Interface.Enums; +using UniGetUI.PackageEngine; using UniGetUI.PackageEngine.PackageClasses; namespace UniGetUI.Interface @@ -164,7 +165,7 @@ public void BuildV1WidgetsApi() return 401; string packages = ""; - foreach (Package package in MainApp.Instance.MainWindow.NavigationPage.UpdatesPage.Packages) + foreach (Package package in PEInterface.UpgradablePackagesLoader.Packages) { if (package.Tag == PackageTag.OnQueue || package.Tag == PackageTag.BeingProcessed) continue; // Do not show already processed packages on queue From 5cbcf1f1d82defc524ee215c2c39f02d8fe28661 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Thu, 20 Jun 2024 23:04:01 +0200 Subject: [PATCH 07/21] Simplify package cache structure --- .../Packages/PackageCacher.cs | 44 ++++++------------- 1 file changed, 14 insertions(+), 30 deletions(-) diff --git a/src/UniGetUI.PackageEngine.PackageManagerClasses/Packages/PackageCacher.cs b/src/UniGetUI.PackageEngine.PackageManagerClasses/Packages/PackageCacher.cs index aefac60b5..880167129 100644 --- a/src/UniGetUI.PackageEngine.PackageManagerClasses/Packages/PackageCacher.cs +++ b/src/UniGetUI.PackageEngine.PackageManagerClasses/Packages/PackageCacher.cs @@ -5,9 +5,9 @@ namespace UniGetUI.PackageEngine.Classes.Packages { internal static class PackageCacher { - private static Dictionary> __available_pkgs = new(); - private static Dictionary> __upgradable_pkgs = new(); - private static Dictionary> __installed_pkgs = new(); + private static Dictionary __available_pkgs = new(); + private static Dictionary __upgradable_pkgs = new(); + private static Dictionary __installed_pkgs = new(); /// /// Will check if a given Package is already in the cache. If not, it will be added to it @@ -56,12 +56,9 @@ public static Package GetInstalledPackage(Package p) /// The already existing package if any, otherwhise null public static Package? GetAvailablePackageOrNull(Package other) { - if (__available_pkgs.TryGetValue(other.Manager, out var manager_pkgs)) + if(__available_pkgs.TryGetValue(other.GetHash(), out Package? equivalent_package)) { - if(manager_pkgs.TryGetValue(other.GetHash(), out Package? equivalent_package)) - { - return equivalent_package; - } + return equivalent_package; } return null; } @@ -74,12 +71,9 @@ public static Package GetInstalledPackage(Package p) /// The already existing package if any, otherwhise null public static Package? GetUpgradablePackageOrNull(Package other) { - if (__upgradable_pkgs.TryGetValue(other.Manager, out var manager_pkgs)) + if (__upgradable_pkgs.TryGetValue(other.GetHash(), out Package? equivalent_package)) { - if (manager_pkgs.TryGetValue(other.GetHash(), out Package? equivalent_package)) - { - return equivalent_package; - } + return equivalent_package; } return null; } @@ -92,12 +86,9 @@ public static Package GetInstalledPackage(Package p) /// The already existing package if any, otherwhise null public static Package? GetInstalledPackageOrNull(Package other) { - if (__installed_pkgs.TryGetValue(other.Manager, out var manager_pkgs)) + if (__installed_pkgs.TryGetValue(other.GetVersionedHash(), out Package? equivalent_package)) { - if (manager_pkgs.TryGetValue(other.GetVersionedHash(), out Package? equivalent_package)) - { - return equivalent_package; - } + return equivalent_package; } return null; } @@ -109,28 +100,21 @@ public static Package GetInstalledPackage(Package p) /// True if a newer version was found, false otherwhise public static bool NewerVersionIsInstalled(Package other) { - if (__installed_pkgs.TryGetValue(other.Manager, out var manager_pkgs)) + foreach (Package found in __installed_pkgs.Values) { - foreach (Package found in manager_pkgs.Values) + if (found.IsEquivalentTo(other) && found.VersionAsFloat == other.NewVersionAsFloat) { - if (found.IsEquivalentTo(other) && found.Version == other.NewVersion) - { - return true; - } + return true; } } return false; } - private static void AddPackageToCache(Package package, Dictionary> map) + private static void AddPackageToCache(Package package, Dictionary map) { - if(!map.ContainsKey(package.Manager)) - { - map.Add(package.Manager, new()); - } var hash = map == __installed_pkgs ? package.GetVersionedHash() : package.GetHash(); - map[package.Manager].Add(hash, package); + map.Add(hash, package); } } } From 6e686c83e5acdc8a4df537db250b7a7b9ed0f830 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Thu, 20 Jun 2024 23:04:41 +0200 Subject: [PATCH 08/21] Better naming --- .../UniGetUI.PackageEngine.PEInterface.csproj | 2 +- .../{BasePackageLoader.cs => AbstractPackageLoader.cs} | 4 ++-- .../InstalledPackagesLoader.cs | 2 +- ...er.csproj => UniGetUI.PackageEngine.PackageLoaders.csproj} | 0 .../UpgradablePackagesLoader.cs | 2 +- src/UniGetUI.sln | 2 +- .../Interface/SoftwarePages/AbstractPackagesPage.xaml.cs | 4 ++-- src/UniGetUI/UniGetUI.csproj | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) rename src/UniGetUI.PackageEngine.PackageLoader/{BasePackageLoader.cs => AbstractPackageLoader.cs} (98%) rename src/UniGetUI.PackageEngine.PackageLoader/{UniGetUI.PackageEngine.PackageLoader.csproj => UniGetUI.PackageEngine.PackageLoaders.csproj} (100%) diff --git a/src/UniGetUI.PackageEngine.PackageEngine/UniGetUI.PackageEngine.PEInterface.csproj b/src/UniGetUI.PackageEngine.PackageEngine/UniGetUI.PackageEngine.PEInterface.csproj index 5a8afb10b..54a6a13bc 100644 --- a/src/UniGetUI.PackageEngine.PackageEngine/UniGetUI.PackageEngine.PEInterface.csproj +++ b/src/UniGetUI.PackageEngine.PackageEngine/UniGetUI.PackageEngine.PEInterface.csproj @@ -38,7 +38,7 @@ - + diff --git a/src/UniGetUI.PackageEngine.PackageLoader/BasePackageLoader.cs b/src/UniGetUI.PackageEngine.PackageLoader/AbstractPackageLoader.cs similarity index 98% rename from src/UniGetUI.PackageEngine.PackageLoader/BasePackageLoader.cs rename to src/UniGetUI.PackageEngine.PackageLoader/AbstractPackageLoader.cs index 1207d8336..b838d297b 100644 --- a/src/UniGetUI.PackageEngine.PackageLoader/BasePackageLoader.cs +++ b/src/UniGetUI.PackageEngine.PackageLoader/AbstractPackageLoader.cs @@ -6,7 +6,7 @@ namespace UniGetUI.PackageEngine.PackageLoader { - public abstract class BasePackageLoader + public abstract class AbstractPackageLoader { /// /// Checks if the loader has loaded packages @@ -43,7 +43,7 @@ public abstract class BasePackageLoader protected string LOADER_IDENTIFIER; protected IEnumerable Managers { get; private set; } - public BasePackageLoader(IEnumerable managers, bool AllowMultiplePackageVersions = false) + public AbstractPackageLoader(IEnumerable managers, bool AllowMultiplePackageVersions = false) { Managers = managers; Packages = new ObservableCollection(); diff --git a/src/UniGetUI.PackageEngine.PackageLoader/InstalledPackagesLoader.cs b/src/UniGetUI.PackageEngine.PackageLoader/InstalledPackagesLoader.cs index 2f61b4299..10f04f437 100644 --- a/src/UniGetUI.PackageEngine.PackageLoader/InstalledPackagesLoader.cs +++ b/src/UniGetUI.PackageEngine.PackageLoader/InstalledPackagesLoader.cs @@ -4,7 +4,7 @@ namespace UniGetUI.PackageEngine.PackageLoader { - public class InstalledPackagesLoader : BasePackageLoader + public class InstalledPackagesLoader : AbstractPackageLoader { public InstalledPackagesLoader(IEnumerable managers) : base(managers, AllowMultiplePackageVersions: true) diff --git a/src/UniGetUI.PackageEngine.PackageLoader/UniGetUI.PackageEngine.PackageLoader.csproj b/src/UniGetUI.PackageEngine.PackageLoader/UniGetUI.PackageEngine.PackageLoaders.csproj similarity index 100% rename from src/UniGetUI.PackageEngine.PackageLoader/UniGetUI.PackageEngine.PackageLoader.csproj rename to src/UniGetUI.PackageEngine.PackageLoader/UniGetUI.PackageEngine.PackageLoaders.csproj diff --git a/src/UniGetUI.PackageEngine.PackageLoader/UpgradablePackagesLoader.cs b/src/UniGetUI.PackageEngine.PackageLoader/UpgradablePackagesLoader.cs index 57a57d338..772e79736 100644 --- a/src/UniGetUI.PackageEngine.PackageLoader/UpgradablePackagesLoader.cs +++ b/src/UniGetUI.PackageEngine.PackageLoader/UpgradablePackagesLoader.cs @@ -9,7 +9,7 @@ namespace UniGetUI.PackageEngine.PackageLoader { - public class UpgradablePackagesLoader : BasePackageLoader + public class UpgradablePackagesLoader : AbstractPackageLoader { public UpgradablePackagesLoader(IEnumerable managers) : base(managers, AllowMultiplePackageVersions: false) diff --git a/src/UniGetUI.sln b/src/UniGetUI.sln index a35f43895..222929c4b 100644 --- a/src/UniGetUI.sln +++ b/src/UniGetUI.sln @@ -82,7 +82,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Solution.props = Solution.props EndProjectSection EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UniGetUI.PackageEngine.PackageLoader", "UniGetUI.PackageEngine.PackageLoader\UniGetUI.PackageEngine.PackageLoader.csproj", "{27E0B288-7DFF-468D-9360-035E8CE123CB}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UniGetUI.PackageEngine.PackageLoaders", "UniGetUI.PackageEngine.PackageLoader\UniGetUI.PackageEngine.PackageLoaders.csproj", "{27E0B288-7DFF-468D-9360-035E8CE123CB}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UniGetUI.PackageEngine.PEInterface", "UniGetUI.PackageEngine.PackageEngine\UniGetUI.PackageEngine.PEInterface.csproj", "{20F43119-EA00-440D-B3B5-44F96592F4C8}" EndProject diff --git a/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs b/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs index f52a24003..4aeece836 100644 --- a/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs +++ b/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs @@ -31,7 +31,7 @@ public abstract partial class AbstractPackagesPage : Page, IPageWithKeyboardShor protected bool MEGA_QUERY_BOX_ENABLED = false; protected bool SHOW_LAST_CHECKED_TIME = false; - protected BasePackageLoader Loader; + protected AbstractPackageLoader Loader; protected enum ReloadReason { @@ -117,7 +117,7 @@ protected string NoMatches_SubtitleText - public AbstractPackagesPage(BasePackageLoader loader) + public AbstractPackagesPage(AbstractPackageLoader loader) { Loader = loader; diff --git a/src/UniGetUI/UniGetUI.csproj b/src/UniGetUI/UniGetUI.csproj index 07552f60b..0d26d7b35 100644 --- a/src/UniGetUI/UniGetUI.csproj +++ b/src/UniGetUI/UniGetUI.csproj @@ -286,7 +286,7 @@ - + From e4b6d3d2dac568a1624aeb9cab9b1ec2693d695d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Thu, 20 Jun 2024 23:45:29 +0200 Subject: [PATCH 09/21] Decouple the background API from the main interface --- .../BackgroundApi.cs | 89 ++++++----- .../UniGetUI.Interface.BackgroundApi.csproj | 44 ++++++ .../AbstractPackageLoader.cs | 9 ++ .../DiscoverablePackagesLoader.cs | 2 +- src/UniGetUI.sln | 146 +++++++++++++++++- src/UniGetUI/App.xaml.cs | 37 ++++- src/UniGetUI/Interface/MainWindow.xaml.cs | 2 - .../SoftwarePages/NewSoftwareUpdatesPage.cs | 9 -- src/UniGetUI/UniGetUI.csproj | 5 +- 9 files changed, 281 insertions(+), 62 deletions(-) rename src/{UniGetUI/Interface => UniGetUI.Interface.BackgroundApi}/BackgroundApi.cs (72%) create mode 100644 src/UniGetUI.Interface.BackgroundApi/UniGetUI.Interface.BackgroundApi.csproj diff --git a/src/UniGetUI/Interface/BackgroundApi.cs b/src/UniGetUI.Interface.BackgroundApi/BackgroundApi.cs similarity index 72% rename from src/UniGetUI/Interface/BackgroundApi.cs rename to src/UniGetUI.Interface.BackgroundApi/BackgroundApi.cs index d9c39d8ee..1f91890f3 100644 --- a/src/UniGetUI/Interface/BackgroundApi.cs +++ b/src/UniGetUI.Interface.BackgroundApi/BackgroundApi.cs @@ -1,5 +1,6 @@ using Nancy; using Nancy.Hosting.Self; +using System.Text; using UniGetUI.Core.Data; using UniGetUI.Core.Logging; using UniGetUI.Core.SettingsEngine; @@ -17,9 +18,24 @@ internal static class ApiTokenHolder public class BackgroundApiRunner { + public event EventHandler? OnOpenWindow; + public event EventHandler? OnOpenUpdatesPage; + public event EventHandler>? OnShowSharedPackage; + public event EventHandler? OnUpgradeAll; + public event EventHandler? OnUpgradeAllForManager; + public event EventHandler? OnUpgradePackage; private bool __running = false; + public BackgroundApiRunner() { + BackgroundApi.OnOpenWindow += (s, e) => OnOpenWindow?.Invoke(s, e); + BackgroundApi.OnOpenUpdatesPage += (s, e) => OnOpenUpdatesPage?.Invoke(s, e); + BackgroundApi.OnShowSharedPackage += (s, e) => OnShowSharedPackage?.Invoke(s, e); + BackgroundApi.OnUpgradeAll += (s, e) => OnUpgradeAll?.Invoke(s, e); + BackgroundApi.OnUpgradeAllForManager += (s, e) => OnUpgradeAllForManager?.Invoke(s, e); + BackgroundApi.OnUpgradePackage += (s, e) => OnUpgradePackage?.Invoke(s, e); + } + public static bool AuthenticateToken(string token) { return token == ApiTokenHolder.Token; @@ -40,7 +56,6 @@ public async Task Start() return; } - ApiTokenHolder.Token = CoreTools.RandomString(64); Settings.SetValue("CurrentSessionToken", ApiTokenHolder.Token); Logger.Info("Api auth token: " + ApiTokenHolder.Token); @@ -88,12 +103,15 @@ public void Stop() /// public class BackgroundApi : NancyModule { - - static Dictionary PackageIconsPathReference = new(); + public static event EventHandler? OnOpenWindow; + public static event EventHandler? OnOpenUpdatesPage; + public static event EventHandler>? OnShowSharedPackage; + public static event EventHandler? OnUpgradeAll; + public static event EventHandler? OnUpgradeAllForManager; + public static event EventHandler? OnUpgradePackage; public BackgroundApi() { - // Enable CORS After.AddItemToEndOfPipeline((ctx) => { @@ -105,26 +123,20 @@ public BackgroundApi() BuildV1WidgetsApi(); } - - /// /// Build the endpoints required for the Share Interface /// public void BuildShareApi() { // Show package from https://marticliment.com/unigetui/share - Get("/v2/show-package", async (parameters) => + Get("/v2/show-package", (parameters) => { try { if (Request.Query.@pid == "" || Request.Query.@psource == "") return 400; - while (MainApp.Instance.MainWindow is null) await Task.Delay(100); - while (MainApp.Instance.MainWindow.NavigationPage is null) await Task.Delay(100); - while (MainApp.Instance.MainWindow.NavigationPage.DiscoverPage is null) await Task.Delay(100); - - MainApp.Instance.MainWindow.NavigationPage.DiscoverPage.ShowSharedPackage_ThreadSafe(Request.Query.@pid.ToString(), Request.Query.@psource.ToString()); + OnShowSharedPackage?.Invoke(this, new KeyValuePair(Request.Query.@pid.ToString(), Request.Query.@psource.ToString())); return "{\"status\": \"success\"}"; } @@ -159,25 +171,37 @@ public void BuildV1WidgetsApi() }); // Return found updates - Get("/widgets/v1/get_updates", (parameters) => + Get("/widgets/v1/get_updates", async (parameters) => { if (!BackgroundApiRunner.AuthenticateToken(Request.Query.@token)) return 401; - string packages = ""; + if (!PEInterface.UpgradablePackagesLoader.IsLoaded && !PEInterface.UpgradablePackagesLoader.IsLoading) + { + _ = PEInterface.UpgradablePackagesLoader.ReloadPackages(); // Actually begin loading the updates if not loaded or loading + } + + while (PEInterface.UpgradablePackagesLoader.IsLoading) + { + await Task.Delay(500); // Wait for the updates to be reported before showing anything + } + + StringBuilder packages = new(); foreach (Package package in PEInterface.UpgradablePackagesLoader.Packages) { if (package.Tag == PackageTag.OnQueue || package.Tag == PackageTag.BeingProcessed) continue; // Do not show already processed packages on queue string icon = $"http://localhost:7058/widgets/v2/get_icon_for_package?packageId={package.Id}&packageSource={package.Source.Name}&token={ApiTokenHolder.Token}"; - packages += $"{package.Name.Replace('|', '-')}|{package.Id}|{package.Version}|{package.NewVersion}|{package.Source}|{package.Manager.Name}|{icon}&&"; + packages.Append($"{package.Name.Replace('|', '-')}|{package.Id}|{package.Version}|{package.NewVersion}|{package.Source}|{package.Manager.Name}|{icon}&&"); } - if (packages.Length > 2) - packages = packages[..(packages.Length - 2)]; + var pkgs_ = packages.ToString(); + + if (pkgs_.Length > 2) + pkgs_ = pkgs_[..(pkgs_.Length - 2)]; - return packages; + return pkgs_; }); // Open UniGetUI (as it was) @@ -185,8 +209,8 @@ public void BuildV1WidgetsApi() { if (!BackgroundApiRunner.AuthenticateToken(Request.Query.@token)) return 401; - - MainApp.Instance.MainWindow.DispatcherQueue.TryEnqueue(() => { MainApp.Instance.MainWindow.Activate(); }); + + OnOpenWindow?.Invoke(this, EventArgs.Empty); return 200; }); @@ -196,11 +220,7 @@ public void BuildV1WidgetsApi() if (!BackgroundApiRunner.AuthenticateToken(Request.Query.@token)) return 401; - MainApp.Instance.MainWindow.DispatcherQueue.TryEnqueue(() => - { - MainApp.Instance.MainWindow.NavigationPage.UpdatesNavButton.ForceClick(); - MainApp.Instance.MainWindow.Activate(); - }); + OnOpenUpdatesPage?.Invoke(this, EventArgs.Empty); return 200; }); @@ -213,10 +233,7 @@ public void BuildV1WidgetsApi() if (Request.Query.@id == "") return 400; - MainApp.Instance.MainWindow.DispatcherQueue.TryEnqueue(() => - { - MainApp.Instance.MainWindow.NavigationPage.UpdatesPage.UpdatePackageForId(Request.Query.@id); - }); + OnUpgradePackage?.Invoke(this, Request.Query.@id); return 200; }); @@ -226,11 +243,8 @@ public void BuildV1WidgetsApi() if (!BackgroundApiRunner.AuthenticateToken(Request.Query.@token)) return 401; - MainApp.Instance.MainWindow.DispatcherQueue.TryEnqueue(() => - { - Logger.Info("[WIDGETS] Updating all packages"); - MainApp.Instance.MainWindow.NavigationPage.UpdatesPage.UpdateAll(); - }); + Logger.Info("[WIDGETS] Updating all packages"); + OnUpgradeAll?.Invoke(this, EventArgs.Empty); return 200; }); @@ -243,11 +257,8 @@ public void BuildV1WidgetsApi() if (Request.Query.@source == "") return 400; - MainApp.Instance.MainWindow.DispatcherQueue.TryEnqueue(() => - { Logger.Info($"[WIDGETS] Updating all packages for manager {Request.Query.@source}"); - MainApp.Instance.MainWindow.NavigationPage.UpdatesPage.UpdateAllPackagesForManager(Request.Query.@source); - }); + OnUpgradeAllForManager?.Invoke(this, Request.Query.@source); return 200; }); @@ -261,7 +272,7 @@ public void BuildV1WidgetsApi() return 400; string iconPath = Path.Join(CoreData.UniGetUIExecutableDirectory, "Assets", "Images", "package_color.png"); - Package? package = MainApp.Instance.MainWindow.NavigationPage.UpdatesPage.GetPackageForId(Request.Query.@packageId, Request.Query.@packageSource); + Package? package = PEInterface.UpgradablePackagesLoader.GetPackageForId(Request.Query.@packageId, Request.Query.@packageSource); if (package != null) { Uri iconUrl = await package.GetIconUrl(); diff --git a/src/UniGetUI.Interface.BackgroundApi/UniGetUI.Interface.BackgroundApi.csproj b/src/UniGetUI.Interface.BackgroundApi/UniGetUI.Interface.BackgroundApi.csproj new file mode 100644 index 000000000..3992e5637 --- /dev/null +++ b/src/UniGetUI.Interface.BackgroundApi/UniGetUI.Interface.BackgroundApi.csproj @@ -0,0 +1,44 @@ + + + + net8.0-windows10.0.19041.0 + enable + win-x64;win-arm64 + win-$(Platform) + x64 + 10.0.19041.0 + 10.0.19041.0 + 8.0.204 + true + true + 3.1.0.0 + 3.1.0-alpha0 + UniGetUI + Martí Climent and the contributors + Martí Climent + 3.1.0-alpha0 + 2024, Martí Climent + enable + + + + + + NU1701 + + + + + + + + + + + + + + + + + diff --git a/src/UniGetUI.PackageEngine.PackageLoader/AbstractPackageLoader.cs b/src/UniGetUI.PackageEngine.PackageLoader/AbstractPackageLoader.cs index b838d297b..7e056a624 100644 --- a/src/UniGetUI.PackageEngine.PackageLoader/AbstractPackageLoader.cs +++ b/src/UniGetUI.PackageEngine.PackageLoader/AbstractPackageLoader.cs @@ -228,5 +228,14 @@ public IEnumerable GetEquivalentPackages(Package? package) } return result; } + + public Package? GetPackageForId(string id, string? sourceName = null) + { + foreach (var package in Packages) + if (package.Id == id && (sourceName == null || package.Source.Name == sourceName)) + return package; + + return null; + } } } diff --git a/src/UniGetUI.PackageEngine.PackageLoader/DiscoverablePackagesLoader.cs b/src/UniGetUI.PackageEngine.PackageLoader/DiscoverablePackagesLoader.cs index 481455a34..4b8455a52 100644 --- a/src/UniGetUI.PackageEngine.PackageLoader/DiscoverablePackagesLoader.cs +++ b/src/UniGetUI.PackageEngine.PackageLoader/DiscoverablePackagesLoader.cs @@ -10,7 +10,7 @@ namespace UniGetUI.PackageEngine.PackageLoader { - public class DiscoverablePackagesLoader : BasePackageLoader + public class DiscoverablePackagesLoader : AbstractPackageLoader { private string QUERY_TEXT = string.Empty; diff --git a/src/UniGetUI.sln b/src/UniGetUI.sln index 222929c4b..34e1ef7f6 100644 --- a/src/UniGetUI.sln +++ b/src/UniGetUI.sln @@ -77,149 +77,284 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UniGetUI.Core.Settings.Test EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UniGetUI.Core.Tools.Tests", "UniGetUI.Core.Tools.Tests\UniGetUI.Core.Tools.Tests.csproj", "{BDB7A8F3-87A6-4B77-9E0F-6BC785CBCF2B}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{F5F6CFEE-0E1E-42F6-A0F9-6D663F130A10}" - ProjectSection(SolutionItems) = preProject - Solution.props = Solution.props - EndProjectSection -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UniGetUI.PackageEngine.PackageLoaders", "UniGetUI.PackageEngine.PackageLoader\UniGetUI.PackageEngine.PackageLoaders.csproj", "{27E0B288-7DFF-468D-9360-035E8CE123CB}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UniGetUI.PackageEngine.PEInterface", "UniGetUI.PackageEngine.PackageEngine\UniGetUI.PackageEngine.PEInterface.csproj", "{20F43119-EA00-440D-B3B5-44F96592F4C8}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UniGetUI.Interface.BackgroundApi", "UniGetUI.Interface.BackgroundApi\UniGetUI.Interface.BackgroundApi.csproj", "{CC400751-216E-4BB2-8103-495B4E273477}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU Debug|x64 = Debug|x64 + Release|Any CPU = Release|Any CPU Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {80305A17-2534-48DC-8F75-41F70FCCEAAF}.Debug|Any CPU.ActiveCfg = Debug|x64 + {80305A17-2534-48DC-8F75-41F70FCCEAAF}.Debug|Any CPU.Build.0 = Debug|x64 {80305A17-2534-48DC-8F75-41F70FCCEAAF}.Debug|x64.ActiveCfg = Debug|x64 {80305A17-2534-48DC-8F75-41F70FCCEAAF}.Debug|x64.Build.0 = Debug|x64 + {80305A17-2534-48DC-8F75-41F70FCCEAAF}.Release|Any CPU.ActiveCfg = Release|x64 + {80305A17-2534-48DC-8F75-41F70FCCEAAF}.Release|Any CPU.Build.0 = Release|x64 {80305A17-2534-48DC-8F75-41F70FCCEAAF}.Release|x64.ActiveCfg = Release|x64 {80305A17-2534-48DC-8F75-41F70FCCEAAF}.Release|x64.Build.0 = Release|x64 + {52AC982E-7382-4746-BB66-4003698FCC02}.Debug|Any CPU.ActiveCfg = Debug|x64 + {52AC982E-7382-4746-BB66-4003698FCC02}.Debug|Any CPU.Build.0 = Debug|x64 {52AC982E-7382-4746-BB66-4003698FCC02}.Debug|x64.ActiveCfg = Debug|x64 {52AC982E-7382-4746-BB66-4003698FCC02}.Debug|x64.Build.0 = Debug|x64 + {52AC982E-7382-4746-BB66-4003698FCC02}.Release|Any CPU.ActiveCfg = Release|x64 + {52AC982E-7382-4746-BB66-4003698FCC02}.Release|Any CPU.Build.0 = Release|x64 {52AC982E-7382-4746-BB66-4003698FCC02}.Release|x64.ActiveCfg = Release|x64 {52AC982E-7382-4746-BB66-4003698FCC02}.Release|x64.Build.0 = Release|x64 + {5F5EF76B-D755-4C12-ADAE-11F08CE3D936}.Debug|Any CPU.ActiveCfg = Debug|x64 + {5F5EF76B-D755-4C12-ADAE-11F08CE3D936}.Debug|Any CPU.Build.0 = Debug|x64 {5F5EF76B-D755-4C12-ADAE-11F08CE3D936}.Debug|x64.ActiveCfg = Debug|x64 {5F5EF76B-D755-4C12-ADAE-11F08CE3D936}.Debug|x64.Build.0 = Debug|x64 + {5F5EF76B-D755-4C12-ADAE-11F08CE3D936}.Release|Any CPU.ActiveCfg = Release|x64 + {5F5EF76B-D755-4C12-ADAE-11F08CE3D936}.Release|Any CPU.Build.0 = Release|x64 {5F5EF76B-D755-4C12-ADAE-11F08CE3D936}.Release|x64.ActiveCfg = Release|x64 {5F5EF76B-D755-4C12-ADAE-11F08CE3D936}.Release|x64.Build.0 = Release|x64 + {B70A6F17-08C8-4194-BBE8-668CA920CFF3}.Debug|Any CPU.ActiveCfg = Debug|x64 + {B70A6F17-08C8-4194-BBE8-668CA920CFF3}.Debug|Any CPU.Build.0 = Debug|x64 {B70A6F17-08C8-4194-BBE8-668CA920CFF3}.Debug|x64.ActiveCfg = Debug|x64 {B70A6F17-08C8-4194-BBE8-668CA920CFF3}.Debug|x64.Build.0 = Debug|x64 + {B70A6F17-08C8-4194-BBE8-668CA920CFF3}.Release|Any CPU.ActiveCfg = Release|x64 + {B70A6F17-08C8-4194-BBE8-668CA920CFF3}.Release|Any CPU.Build.0 = Release|x64 {B70A6F17-08C8-4194-BBE8-668CA920CFF3}.Release|x64.ActiveCfg = Release|x64 {B70A6F17-08C8-4194-BBE8-668CA920CFF3}.Release|x64.Build.0 = Release|x64 + {72180B0C-3D20-4AAD-B015-A9337B91406E}.Debug|Any CPU.ActiveCfg = Debug|x64 + {72180B0C-3D20-4AAD-B015-A9337B91406E}.Debug|Any CPU.Build.0 = Debug|x64 {72180B0C-3D20-4AAD-B015-A9337B91406E}.Debug|x64.ActiveCfg = Debug|x64 {72180B0C-3D20-4AAD-B015-A9337B91406E}.Debug|x64.Build.0 = Debug|x64 + {72180B0C-3D20-4AAD-B015-A9337B91406E}.Release|Any CPU.ActiveCfg = Release|x64 + {72180B0C-3D20-4AAD-B015-A9337B91406E}.Release|Any CPU.Build.0 = Release|x64 {72180B0C-3D20-4AAD-B015-A9337B91406E}.Release|x64.ActiveCfg = Release|x64 {72180B0C-3D20-4AAD-B015-A9337B91406E}.Release|x64.Build.0 = Release|x64 + {1977360F-2E42-45E6-9369-AB1EE59CC5C5}.Debug|Any CPU.ActiveCfg = Debug|x64 + {1977360F-2E42-45E6-9369-AB1EE59CC5C5}.Debug|Any CPU.Build.0 = Debug|x64 {1977360F-2E42-45E6-9369-AB1EE59CC5C5}.Debug|x64.ActiveCfg = Debug|x64 {1977360F-2E42-45E6-9369-AB1EE59CC5C5}.Debug|x64.Build.0 = Debug|x64 + {1977360F-2E42-45E6-9369-AB1EE59CC5C5}.Release|Any CPU.ActiveCfg = Release|x64 + {1977360F-2E42-45E6-9369-AB1EE59CC5C5}.Release|Any CPU.Build.0 = Release|x64 {1977360F-2E42-45E6-9369-AB1EE59CC5C5}.Release|x64.ActiveCfg = Release|x64 {1977360F-2E42-45E6-9369-AB1EE59CC5C5}.Release|x64.Build.0 = Release|x64 + {25C6CE64-2D61-4832-B6D2-45AFC52E2447}.Debug|Any CPU.ActiveCfg = Debug|x64 + {25C6CE64-2D61-4832-B6D2-45AFC52E2447}.Debug|Any CPU.Build.0 = Debug|x64 {25C6CE64-2D61-4832-B6D2-45AFC52E2447}.Debug|x64.ActiveCfg = Debug|x64 {25C6CE64-2D61-4832-B6D2-45AFC52E2447}.Debug|x64.Build.0 = Debug|x64 + {25C6CE64-2D61-4832-B6D2-45AFC52E2447}.Release|Any CPU.ActiveCfg = Release|x64 + {25C6CE64-2D61-4832-B6D2-45AFC52E2447}.Release|Any CPU.Build.0 = Release|x64 {25C6CE64-2D61-4832-B6D2-45AFC52E2447}.Release|x64.ActiveCfg = Release|x64 {25C6CE64-2D61-4832-B6D2-45AFC52E2447}.Release|x64.Build.0 = Release|x64 + {8156B6D8-BD7E-4201-BD8B-8C9B00177F88}.Debug|Any CPU.ActiveCfg = Debug|x64 + {8156B6D8-BD7E-4201-BD8B-8C9B00177F88}.Debug|Any CPU.Build.0 = Debug|x64 {8156B6D8-BD7E-4201-BD8B-8C9B00177F88}.Debug|x64.ActiveCfg = Debug|x64 {8156B6D8-BD7E-4201-BD8B-8C9B00177F88}.Debug|x64.Build.0 = Debug|x64 + {8156B6D8-BD7E-4201-BD8B-8C9B00177F88}.Release|Any CPU.ActiveCfg = Release|x64 + {8156B6D8-BD7E-4201-BD8B-8C9B00177F88}.Release|Any CPU.Build.0 = Release|x64 {8156B6D8-BD7E-4201-BD8B-8C9B00177F88}.Release|x64.ActiveCfg = Release|x64 {8156B6D8-BD7E-4201-BD8B-8C9B00177F88}.Release|x64.Build.0 = Release|x64 + {990F5AFF-ABF6-4019-865D-604D2B23DE2C}.Debug|Any CPU.ActiveCfg = Debug|x64 + {990F5AFF-ABF6-4019-865D-604D2B23DE2C}.Debug|Any CPU.Build.0 = Debug|x64 {990F5AFF-ABF6-4019-865D-604D2B23DE2C}.Debug|x64.ActiveCfg = Debug|x64 {990F5AFF-ABF6-4019-865D-604D2B23DE2C}.Debug|x64.Build.0 = Debug|x64 + {990F5AFF-ABF6-4019-865D-604D2B23DE2C}.Release|Any CPU.ActiveCfg = Release|x64 + {990F5AFF-ABF6-4019-865D-604D2B23DE2C}.Release|Any CPU.Build.0 = Release|x64 {990F5AFF-ABF6-4019-865D-604D2B23DE2C}.Release|x64.ActiveCfg = Release|x64 {990F5AFF-ABF6-4019-865D-604D2B23DE2C}.Release|x64.Build.0 = Release|x64 + {380E9F5A-23DE-4F5A-9644-EFA51AD1D8E8}.Debug|Any CPU.ActiveCfg = Debug|x64 + {380E9F5A-23DE-4F5A-9644-EFA51AD1D8E8}.Debug|Any CPU.Build.0 = Debug|x64 {380E9F5A-23DE-4F5A-9644-EFA51AD1D8E8}.Debug|x64.ActiveCfg = Debug|x64 {380E9F5A-23DE-4F5A-9644-EFA51AD1D8E8}.Debug|x64.Build.0 = Debug|x64 + {380E9F5A-23DE-4F5A-9644-EFA51AD1D8E8}.Release|Any CPU.ActiveCfg = Release|x64 + {380E9F5A-23DE-4F5A-9644-EFA51AD1D8E8}.Release|Any CPU.Build.0 = Release|x64 {380E9F5A-23DE-4F5A-9644-EFA51AD1D8E8}.Release|x64.ActiveCfg = Release|x64 {380E9F5A-23DE-4F5A-9644-EFA51AD1D8E8}.Release|x64.Build.0 = Release|x64 + {5A48C2FD-16E4-4B44-BC2C-D793C50E66F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5A48C2FD-16E4-4B44-BC2C-D793C50E66F2}.Debug|Any CPU.Build.0 = Debug|Any CPU {5A48C2FD-16E4-4B44-BC2C-D793C50E66F2}.Debug|x64.ActiveCfg = Debug|x64 {5A48C2FD-16E4-4B44-BC2C-D793C50E66F2}.Debug|x64.Build.0 = Debug|x64 + {5A48C2FD-16E4-4B44-BC2C-D793C50E66F2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5A48C2FD-16E4-4B44-BC2C-D793C50E66F2}.Release|Any CPU.Build.0 = Release|Any CPU {5A48C2FD-16E4-4B44-BC2C-D793C50E66F2}.Release|x64.ActiveCfg = Release|x64 {5A48C2FD-16E4-4B44-BC2C-D793C50E66F2}.Release|x64.Build.0 = Release|x64 + {9AD1DEC9-1561-4753-AB4B-E81FBDBA5C9E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9AD1DEC9-1561-4753-AB4B-E81FBDBA5C9E}.Debug|Any CPU.Build.0 = Debug|Any CPU {9AD1DEC9-1561-4753-AB4B-E81FBDBA5C9E}.Debug|x64.ActiveCfg = Debug|x64 {9AD1DEC9-1561-4753-AB4B-E81FBDBA5C9E}.Debug|x64.Build.0 = Debug|x64 + {9AD1DEC9-1561-4753-AB4B-E81FBDBA5C9E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9AD1DEC9-1561-4753-AB4B-E81FBDBA5C9E}.Release|Any CPU.Build.0 = Release|Any CPU {9AD1DEC9-1561-4753-AB4B-E81FBDBA5C9E}.Release|x64.ActiveCfg = Release|x64 {9AD1DEC9-1561-4753-AB4B-E81FBDBA5C9E}.Release|x64.Build.0 = Release|x64 + {E40BFCBB-7A02-4E2C-AFDB-A717359EF4FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E40BFCBB-7A02-4E2C-AFDB-A717359EF4FC}.Debug|Any CPU.Build.0 = Debug|Any CPU {E40BFCBB-7A02-4E2C-AFDB-A717359EF4FC}.Debug|x64.ActiveCfg = Debug|x64 {E40BFCBB-7A02-4E2C-AFDB-A717359EF4FC}.Debug|x64.Build.0 = Debug|x64 + {E40BFCBB-7A02-4E2C-AFDB-A717359EF4FC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E40BFCBB-7A02-4E2C-AFDB-A717359EF4FC}.Release|Any CPU.Build.0 = Release|Any CPU {E40BFCBB-7A02-4E2C-AFDB-A717359EF4FC}.Release|x64.ActiveCfg = Release|x64 {E40BFCBB-7A02-4E2C-AFDB-A717359EF4FC}.Release|x64.Build.0 = Release|x64 + {562B4814-2A78-4692-90BE-A727AABCEC85}.Debug|Any CPU.ActiveCfg = Debug|x64 + {562B4814-2A78-4692-90BE-A727AABCEC85}.Debug|Any CPU.Build.0 = Debug|x64 {562B4814-2A78-4692-90BE-A727AABCEC85}.Debug|x64.ActiveCfg = Debug|x64 {562B4814-2A78-4692-90BE-A727AABCEC85}.Debug|x64.Build.0 = Debug|x64 + {562B4814-2A78-4692-90BE-A727AABCEC85}.Release|Any CPU.ActiveCfg = Release|x64 + {562B4814-2A78-4692-90BE-A727AABCEC85}.Release|Any CPU.Build.0 = Release|x64 {562B4814-2A78-4692-90BE-A727AABCEC85}.Release|x64.ActiveCfg = Release|x64 {562B4814-2A78-4692-90BE-A727AABCEC85}.Release|x64.Build.0 = Release|x64 + {1A51EA31-6D78-4E98-B767-41A02C6E34D8}.Debug|Any CPU.ActiveCfg = Debug|x64 + {1A51EA31-6D78-4E98-B767-41A02C6E34D8}.Debug|Any CPU.Build.0 = Debug|x64 {1A51EA31-6D78-4E98-B767-41A02C6E34D8}.Debug|x64.ActiveCfg = Debug|x64 {1A51EA31-6D78-4E98-B767-41A02C6E34D8}.Debug|x64.Build.0 = Debug|x64 + {1A51EA31-6D78-4E98-B767-41A02C6E34D8}.Release|Any CPU.ActiveCfg = Release|x64 + {1A51EA31-6D78-4E98-B767-41A02C6E34D8}.Release|Any CPU.Build.0 = Release|x64 {1A51EA31-6D78-4E98-B767-41A02C6E34D8}.Release|x64.ActiveCfg = Release|x64 {1A51EA31-6D78-4E98-B767-41A02C6E34D8}.Release|x64.Build.0 = Release|x64 + {230BF08C-C039-473B-933F-3BF647440E0E}.Debug|Any CPU.ActiveCfg = Debug|x64 + {230BF08C-C039-473B-933F-3BF647440E0E}.Debug|Any CPU.Build.0 = Debug|x64 {230BF08C-C039-473B-933F-3BF647440E0E}.Debug|x64.ActiveCfg = Debug|x64 {230BF08C-C039-473B-933F-3BF647440E0E}.Debug|x64.Build.0 = Debug|x64 + {230BF08C-C039-473B-933F-3BF647440E0E}.Release|Any CPU.ActiveCfg = Release|x64 + {230BF08C-C039-473B-933F-3BF647440E0E}.Release|Any CPU.Build.0 = Release|x64 {230BF08C-C039-473B-933F-3BF647440E0E}.Release|x64.ActiveCfg = Release|x64 {230BF08C-C039-473B-933F-3BF647440E0E}.Release|x64.Build.0 = Release|x64 + {C55F4BA7-BBDD-42A4-88C1-FD3C411EB234}.Debug|Any CPU.ActiveCfg = Debug|x64 + {C55F4BA7-BBDD-42A4-88C1-FD3C411EB234}.Debug|Any CPU.Build.0 = Debug|x64 {C55F4BA7-BBDD-42A4-88C1-FD3C411EB234}.Debug|x64.ActiveCfg = Debug|x64 {C55F4BA7-BBDD-42A4-88C1-FD3C411EB234}.Debug|x64.Build.0 = Debug|x64 + {C55F4BA7-BBDD-42A4-88C1-FD3C411EB234}.Release|Any CPU.ActiveCfg = Release|x64 + {C55F4BA7-BBDD-42A4-88C1-FD3C411EB234}.Release|Any CPU.Build.0 = Release|x64 {C55F4BA7-BBDD-42A4-88C1-FD3C411EB234}.Release|x64.ActiveCfg = Release|x64 {C55F4BA7-BBDD-42A4-88C1-FD3C411EB234}.Release|x64.Build.0 = Release|x64 + {2979E556-5859-4E88-A1D4-EAB72F82294E}.Debug|Any CPU.ActiveCfg = Debug|x64 + {2979E556-5859-4E88-A1D4-EAB72F82294E}.Debug|Any CPU.Build.0 = Debug|x64 {2979E556-5859-4E88-A1D4-EAB72F82294E}.Debug|x64.ActiveCfg = Debug|x64 {2979E556-5859-4E88-A1D4-EAB72F82294E}.Debug|x64.Build.0 = Debug|x64 + {2979E556-5859-4E88-A1D4-EAB72F82294E}.Release|Any CPU.ActiveCfg = Release|x64 + {2979E556-5859-4E88-A1D4-EAB72F82294E}.Release|Any CPU.Build.0 = Release|x64 {2979E556-5859-4E88-A1D4-EAB72F82294E}.Release|x64.ActiveCfg = Release|x64 {2979E556-5859-4E88-A1D4-EAB72F82294E}.Release|x64.Build.0 = Release|x64 + {7E098666-DE8C-4ABF-B709-4CE7B1A491B0}.Debug|Any CPU.ActiveCfg = Debug|x64 + {7E098666-DE8C-4ABF-B709-4CE7B1A491B0}.Debug|Any CPU.Build.0 = Debug|x64 {7E098666-DE8C-4ABF-B709-4CE7B1A491B0}.Debug|x64.ActiveCfg = Debug|x64 {7E098666-DE8C-4ABF-B709-4CE7B1A491B0}.Debug|x64.Build.0 = Debug|x64 + {7E098666-DE8C-4ABF-B709-4CE7B1A491B0}.Release|Any CPU.ActiveCfg = Release|x64 + {7E098666-DE8C-4ABF-B709-4CE7B1A491B0}.Release|Any CPU.Build.0 = Release|x64 {7E098666-DE8C-4ABF-B709-4CE7B1A491B0}.Release|x64.ActiveCfg = Release|x64 {7E098666-DE8C-4ABF-B709-4CE7B1A491B0}.Release|x64.Build.0 = Release|x64 + {B5E11AAA-B800-455E-9C64-051FFEFD6C0B}.Debug|Any CPU.ActiveCfg = Debug|x64 + {B5E11AAA-B800-455E-9C64-051FFEFD6C0B}.Debug|Any CPU.Build.0 = Debug|x64 {B5E11AAA-B800-455E-9C64-051FFEFD6C0B}.Debug|x64.ActiveCfg = Debug|x64 {B5E11AAA-B800-455E-9C64-051FFEFD6C0B}.Debug|x64.Build.0 = Debug|x64 + {B5E11AAA-B800-455E-9C64-051FFEFD6C0B}.Release|Any CPU.ActiveCfg = Release|x64 + {B5E11AAA-B800-455E-9C64-051FFEFD6C0B}.Release|Any CPU.Build.0 = Release|x64 {B5E11AAA-B800-455E-9C64-051FFEFD6C0B}.Release|x64.ActiveCfg = Release|x64 {B5E11AAA-B800-455E-9C64-051FFEFD6C0B}.Release|x64.Build.0 = Release|x64 + {D47CC16E-466B-4D58-A8FC-ECAE5C9606FC}.Debug|Any CPU.ActiveCfg = Debug|x64 + {D47CC16E-466B-4D58-A8FC-ECAE5C9606FC}.Debug|Any CPU.Build.0 = Debug|x64 {D47CC16E-466B-4D58-A8FC-ECAE5C9606FC}.Debug|x64.ActiveCfg = Debug|x64 {D47CC16E-466B-4D58-A8FC-ECAE5C9606FC}.Debug|x64.Build.0 = Debug|x64 + {D47CC16E-466B-4D58-A8FC-ECAE5C9606FC}.Release|Any CPU.ActiveCfg = Release|x64 + {D47CC16E-466B-4D58-A8FC-ECAE5C9606FC}.Release|Any CPU.Build.0 = Release|x64 {D47CC16E-466B-4D58-A8FC-ECAE5C9606FC}.Release|x64.ActiveCfg = Release|x64 {D47CC16E-466B-4D58-A8FC-ECAE5C9606FC}.Release|x64.Build.0 = Release|x64 + {1143176D-B7F0-477C-90BB-72289068D927}.Debug|Any CPU.ActiveCfg = Debug|x64 + {1143176D-B7F0-477C-90BB-72289068D927}.Debug|Any CPU.Build.0 = Debug|x64 {1143176D-B7F0-477C-90BB-72289068D927}.Debug|x64.ActiveCfg = Debug|x64 {1143176D-B7F0-477C-90BB-72289068D927}.Debug|x64.Build.0 = Debug|x64 + {1143176D-B7F0-477C-90BB-72289068D927}.Release|Any CPU.ActiveCfg = Release|x64 + {1143176D-B7F0-477C-90BB-72289068D927}.Release|Any CPU.Build.0 = Release|x64 {1143176D-B7F0-477C-90BB-72289068D927}.Release|x64.ActiveCfg = Release|x64 {1143176D-B7F0-477C-90BB-72289068D927}.Release|x64.Build.0 = Release|x64 + {E454D3A5-C5C6-4291-BE96-220CF0D5CFFD}.Debug|Any CPU.ActiveCfg = Debug|x64 + {E454D3A5-C5C6-4291-BE96-220CF0D5CFFD}.Debug|Any CPU.Build.0 = Debug|x64 {E454D3A5-C5C6-4291-BE96-220CF0D5CFFD}.Debug|x64.ActiveCfg = Debug|x64 {E454D3A5-C5C6-4291-BE96-220CF0D5CFFD}.Debug|x64.Build.0 = Debug|x64 + {E454D3A5-C5C6-4291-BE96-220CF0D5CFFD}.Release|Any CPU.ActiveCfg = Release|x64 + {E454D3A5-C5C6-4291-BE96-220CF0D5CFFD}.Release|Any CPU.Build.0 = Release|x64 {E454D3A5-C5C6-4291-BE96-220CF0D5CFFD}.Release|x64.ActiveCfg = Release|x64 {E454D3A5-C5C6-4291-BE96-220CF0D5CFFD}.Release|x64.Build.0 = Release|x64 + {57D094C1-6913-46BF-A657-84A5F46D4EE7}.Debug|Any CPU.ActiveCfg = Debug|x64 + {57D094C1-6913-46BF-A657-84A5F46D4EE7}.Debug|Any CPU.Build.0 = Debug|x64 {57D094C1-6913-46BF-A657-84A5F46D4EE7}.Debug|x64.ActiveCfg = Debug|x64 {57D094C1-6913-46BF-A657-84A5F46D4EE7}.Debug|x64.Build.0 = Debug|x64 + {57D094C1-6913-46BF-A657-84A5F46D4EE7}.Release|Any CPU.ActiveCfg = Release|x64 + {57D094C1-6913-46BF-A657-84A5F46D4EE7}.Release|Any CPU.Build.0 = Release|x64 {57D094C1-6913-46BF-A657-84A5F46D4EE7}.Release|x64.ActiveCfg = Release|x64 {57D094C1-6913-46BF-A657-84A5F46D4EE7}.Release|x64.Build.0 = Release|x64 + {740E2894-903D-4B94-9C32-B630593BEB16}.Debug|Any CPU.ActiveCfg = Debug|x64 + {740E2894-903D-4B94-9C32-B630593BEB16}.Debug|Any CPU.Build.0 = Debug|x64 {740E2894-903D-4B94-9C32-B630593BEB16}.Debug|x64.ActiveCfg = Debug|x64 {740E2894-903D-4B94-9C32-B630593BEB16}.Debug|x64.Build.0 = Debug|x64 + {740E2894-903D-4B94-9C32-B630593BEB16}.Release|Any CPU.ActiveCfg = Release|x64 + {740E2894-903D-4B94-9C32-B630593BEB16}.Release|Any CPU.Build.0 = Release|x64 {740E2894-903D-4B94-9C32-B630593BEB16}.Release|x64.ActiveCfg = Release|x64 {740E2894-903D-4B94-9C32-B630593BEB16}.Release|x64.Build.0 = Release|x64 + {D401F706-A182-46E3-A25C-B0BF5AA0D07E}.Debug|Any CPU.ActiveCfg = Debug|x64 + {D401F706-A182-46E3-A25C-B0BF5AA0D07E}.Debug|Any CPU.Build.0 = Debug|x64 {D401F706-A182-46E3-A25C-B0BF5AA0D07E}.Debug|x64.ActiveCfg = Debug|x64 {D401F706-A182-46E3-A25C-B0BF5AA0D07E}.Debug|x64.Build.0 = Debug|x64 + {D401F706-A182-46E3-A25C-B0BF5AA0D07E}.Release|Any CPU.ActiveCfg = Release|x64 + {D401F706-A182-46E3-A25C-B0BF5AA0D07E}.Release|Any CPU.Build.0 = Release|x64 {D401F706-A182-46E3-A25C-B0BF5AA0D07E}.Release|x64.ActiveCfg = Release|x64 {D401F706-A182-46E3-A25C-B0BF5AA0D07E}.Release|x64.Build.0 = Release|x64 + {0FFA3F96-A68A-453F-A5FE-0C281EC371C7}.Debug|Any CPU.ActiveCfg = Debug|x64 + {0FFA3F96-A68A-453F-A5FE-0C281EC371C7}.Debug|Any CPU.Build.0 = Debug|x64 {0FFA3F96-A68A-453F-A5FE-0C281EC371C7}.Debug|x64.ActiveCfg = Debug|x64 {0FFA3F96-A68A-453F-A5FE-0C281EC371C7}.Debug|x64.Build.0 = Debug|x64 + {0FFA3F96-A68A-453F-A5FE-0C281EC371C7}.Release|Any CPU.ActiveCfg = Release|x64 + {0FFA3F96-A68A-453F-A5FE-0C281EC371C7}.Release|Any CPU.Build.0 = Release|x64 {0FFA3F96-A68A-453F-A5FE-0C281EC371C7}.Release|x64.ActiveCfg = Release|x64 {0FFA3F96-A68A-453F-A5FE-0C281EC371C7}.Release|x64.Build.0 = Release|x64 + {5FA79592-DE5B-46FF-9E05-34A2E72A7AF7}.Debug|Any CPU.ActiveCfg = Debug|x64 + {5FA79592-DE5B-46FF-9E05-34A2E72A7AF7}.Debug|Any CPU.Build.0 = Debug|x64 {5FA79592-DE5B-46FF-9E05-34A2E72A7AF7}.Debug|x64.ActiveCfg = Debug|x64 {5FA79592-DE5B-46FF-9E05-34A2E72A7AF7}.Debug|x64.Build.0 = Debug|x64 + {5FA79592-DE5B-46FF-9E05-34A2E72A7AF7}.Release|Any CPU.ActiveCfg = Release|x64 + {5FA79592-DE5B-46FF-9E05-34A2E72A7AF7}.Release|Any CPU.Build.0 = Release|x64 {5FA79592-DE5B-46FF-9E05-34A2E72A7AF7}.Release|x64.ActiveCfg = Release|x64 {5FA79592-DE5B-46FF-9E05-34A2E72A7AF7}.Release|x64.Build.0 = Release|x64 + {09FD3D3A-1EFC-4AEE-B3D7-096D238E0D1A}.Debug|Any CPU.ActiveCfg = Debug|x64 + {09FD3D3A-1EFC-4AEE-B3D7-096D238E0D1A}.Debug|Any CPU.Build.0 = Debug|x64 {09FD3D3A-1EFC-4AEE-B3D7-096D238E0D1A}.Debug|x64.ActiveCfg = Debug|x64 {09FD3D3A-1EFC-4AEE-B3D7-096D238E0D1A}.Debug|x64.Build.0 = Debug|x64 + {09FD3D3A-1EFC-4AEE-B3D7-096D238E0D1A}.Release|Any CPU.ActiveCfg = Release|x64 + {09FD3D3A-1EFC-4AEE-B3D7-096D238E0D1A}.Release|Any CPU.Build.0 = Release|x64 {09FD3D3A-1EFC-4AEE-B3D7-096D238E0D1A}.Release|x64.ActiveCfg = Release|x64 {09FD3D3A-1EFC-4AEE-B3D7-096D238E0D1A}.Release|x64.Build.0 = Release|x64 + {BDB7A8F3-87A6-4B77-9E0F-6BC785CBCF2B}.Debug|Any CPU.ActiveCfg = Debug|x64 + {BDB7A8F3-87A6-4B77-9E0F-6BC785CBCF2B}.Debug|Any CPU.Build.0 = Debug|x64 {BDB7A8F3-87A6-4B77-9E0F-6BC785CBCF2B}.Debug|x64.ActiveCfg = Debug|x64 {BDB7A8F3-87A6-4B77-9E0F-6BC785CBCF2B}.Debug|x64.Build.0 = Debug|x64 + {BDB7A8F3-87A6-4B77-9E0F-6BC785CBCF2B}.Release|Any CPU.ActiveCfg = Release|x64 + {BDB7A8F3-87A6-4B77-9E0F-6BC785CBCF2B}.Release|Any CPU.Build.0 = Release|x64 {BDB7A8F3-87A6-4B77-9E0F-6BC785CBCF2B}.Release|x64.ActiveCfg = Release|x64 {BDB7A8F3-87A6-4B77-9E0F-6BC785CBCF2B}.Release|x64.Build.0 = Release|x64 + {27E0B288-7DFF-468D-9360-035E8CE123CB}.Debug|Any CPU.ActiveCfg = Debug|x64 + {27E0B288-7DFF-468D-9360-035E8CE123CB}.Debug|Any CPU.Build.0 = Debug|x64 {27E0B288-7DFF-468D-9360-035E8CE123CB}.Debug|x64.ActiveCfg = Debug|x64 {27E0B288-7DFF-468D-9360-035E8CE123CB}.Debug|x64.Build.0 = Debug|x64 + {27E0B288-7DFF-468D-9360-035E8CE123CB}.Release|Any CPU.ActiveCfg = Release|x64 + {27E0B288-7DFF-468D-9360-035E8CE123CB}.Release|Any CPU.Build.0 = Release|x64 {27E0B288-7DFF-468D-9360-035E8CE123CB}.Release|x64.ActiveCfg = Release|x64 {27E0B288-7DFF-468D-9360-035E8CE123CB}.Release|x64.Build.0 = Release|x64 + {20F43119-EA00-440D-B3B5-44F96592F4C8}.Debug|Any CPU.ActiveCfg = Debug|x64 + {20F43119-EA00-440D-B3B5-44F96592F4C8}.Debug|Any CPU.Build.0 = Debug|x64 {20F43119-EA00-440D-B3B5-44F96592F4C8}.Debug|x64.ActiveCfg = Debug|x64 {20F43119-EA00-440D-B3B5-44F96592F4C8}.Debug|x64.Build.0 = Debug|x64 + {20F43119-EA00-440D-B3B5-44F96592F4C8}.Release|Any CPU.ActiveCfg = Release|x64 + {20F43119-EA00-440D-B3B5-44F96592F4C8}.Release|Any CPU.Build.0 = Release|x64 {20F43119-EA00-440D-B3B5-44F96592F4C8}.Release|x64.ActiveCfg = Release|x64 {20F43119-EA00-440D-B3B5-44F96592F4C8}.Release|x64.Build.0 = Release|x64 + {CC400751-216E-4BB2-8103-495B4E273477}.Debug|Any CPU.ActiveCfg = Debug|x64 + {CC400751-216E-4BB2-8103-495B4E273477}.Debug|Any CPU.Build.0 = Debug|x64 + {CC400751-216E-4BB2-8103-495B4E273477}.Debug|x64.ActiveCfg = Debug|x64 + {CC400751-216E-4BB2-8103-495B4E273477}.Debug|x64.Build.0 = Debug|x64 + {CC400751-216E-4BB2-8103-495B4E273477}.Release|Any CPU.ActiveCfg = Release|x64 + {CC400751-216E-4BB2-8103-495B4E273477}.Release|Any CPU.Build.0 = Release|x64 + {CC400751-216E-4BB2-8103-495B4E273477}.Release|x64.ActiveCfg = Release|x64 + {CC400751-216E-4BB2-8103-495B4E273477}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -259,6 +394,7 @@ Global {BDB7A8F3-87A6-4B77-9E0F-6BC785CBCF2B} = {5B9575EA-B4F9-46E4-A75E-59D430779EC7} {27E0B288-7DFF-468D-9360-035E8CE123CB} = {7940E867-EEBA-4AFD-9904-1536F003239C} {20F43119-EA00-440D-B3B5-44F96592F4C8} = {7940E867-EEBA-4AFD-9904-1536F003239C} + {CC400751-216E-4BB2-8103-495B4E273477} = {8CF74C87-534F-4017-A4ED-F2918025E31A} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {D044BB14-0B37-47E5-A579-8B30FCBA1F9F} diff --git a/src/UniGetUI/App.xaml.cs b/src/UniGetUI/App.xaml.cs index 044f55f0f..19f7b8b6d 100644 --- a/src/UniGetUI/App.xaml.cs +++ b/src/UniGetUI/App.xaml.cs @@ -234,9 +234,42 @@ private async Task LoadComponentsAsync() IconDatabase.InitializeInstance(); IconDatabase.Instance.LoadIconAndScreenshotsDatabase(); + + // Bind the background api to the main interface + + BackgroundApi.OnOpenWindow += (s, e) => MainWindow.DispatcherQueue.TryEnqueue(() => + { + MainWindow.Activate(); + }); + + BackgroundApi.OnOpenUpdatesPage += (s, e) => MainWindow.DispatcherQueue.TryEnqueue(() => + { + MainWindow?.NavigationPage?.UpdatesNavButton.ForceClick(); + MainWindow?.Activate(); + }); - if (!Settings.Get("DisableApi")) - _ = BackgroundApi.Start(); + BackgroundApi.OnShowSharedPackage += (s, package) => MainWindow.DispatcherQueue.TryEnqueue(() => + { + MainWindow?.NavigationPage?.DiscoverPage.ShowSharedPackage_ThreadSafe(package.Key, package.Value); + MainWindow?.Activate(); + }); + + BackgroundApi.OnUpgradeAll += (s, e) => MainWindow.DispatcherQueue.TryEnqueue(() => + { + MainWindow?.NavigationPage?.UpdatesPage.UpdateAll(); + }); + + BackgroundApi.OnUpgradeAllForManager += (s, manager) => MainWindow.DispatcherQueue.TryEnqueue(() => + { + MainWindow?.NavigationPage?.UpdatesPage.UpdateAllPackagesForManager(manager); + }); + + BackgroundApi.OnUpgradePackage += (s, package) => MainWindow.DispatcherQueue.TryEnqueue(() => + { + MainWindow?.NavigationPage?.UpdatesPage.UpdatePackageForId(package); + }); + + if (!Settings.Get("DisableApi")) _ = BackgroundApi.Start(); _ = MainWindow.DoEntryTextAnimationAsync(); diff --git a/src/UniGetUI/Interface/MainWindow.xaml.cs b/src/UniGetUI/Interface/MainWindow.xaml.cs index 2dd26e31b..7f393274b 100644 --- a/src/UniGetUI/Interface/MainWindow.xaml.cs +++ b/src/UniGetUI/Interface/MainWindow.xaml.cs @@ -264,7 +264,6 @@ private void LoadTrayMenu() UpdateSystemTrayStatus(); } - public void UpdateSystemTrayStatus() { string modifier = "_empty"; @@ -327,7 +326,6 @@ public void UpdateSystemTrayStatus() TrayIcon.Visibility = Visibility.Visible; } - public void SwitchToInterface() { SetTitleBar(__app_titlebar); diff --git a/src/UniGetUI/Interface/SoftwarePages/NewSoftwareUpdatesPage.cs b/src/UniGetUI/Interface/SoftwarePages/NewSoftwareUpdatesPage.cs index 5ba3364e0..80808abf8 100644 --- a/src/UniGetUI/Interface/SoftwarePages/NewSoftwareUpdatesPage.cs +++ b/src/UniGetUI/Interface/SoftwarePages/NewSoftwareUpdatesPage.cs @@ -525,14 +525,5 @@ public void UpdateAllPackagesForManager(string manager) if (package.Manager.Name == manager) MainApp.Instance.AddOperationToList(new UpdatePackageOperation(package)); } - - public Package? GetPackageForId(string id, string? sourceName = null) - { - foreach (var package in Loader.Packages) - if (package.Id == id && (sourceName == null || package.Source.Name == sourceName)) - return package; - - return null; - } } } diff --git a/src/UniGetUI/UniGetUI.csproj b/src/UniGetUI/UniGetUI.csproj index 0d26d7b35..6be5693a5 100644 --- a/src/UniGetUI/UniGetUI.csproj +++ b/src/UniGetUI/UniGetUI.csproj @@ -79,10 +79,6 @@ - - - NU1701 - @@ -276,6 +272,7 @@ + From 2247f645666b8d4049fbb723dc63a9d0b43718c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Fri, 21 Jun 2024 11:14:06 +0200 Subject: [PATCH 10/21] Simplify creation of PackagesPages, move building method to the constructor --- .../AbstractPackageLoader.cs | 2 +- .../DiscoverablePackagesLoader.cs | 12 ++ src/UniGetUI/Interface/MainView.xaml.cs | 8 +- .../SoftwarePages/AbstractPackagesPage.xaml | 2 +- .../AbstractPackagesPage.xaml.cs | 193 +++++++++--------- ...oftwarePage.cs => DiscoverSoftwarePage.cs} | 71 ++++--- ...ckagesPage.cs => InstalledPackagesPage.cs} | 51 +++-- ...eUpdatesPage.cs => SoftwareUpdatesPage.cs} | 43 ++-- 8 files changed, 201 insertions(+), 181 deletions(-) rename src/UniGetUI/Interface/SoftwarePages/{NewDiscoverSoftwarePage.cs => DiscoverSoftwarePage.cs} (91%) rename src/UniGetUI/Interface/SoftwarePages/{NewInstalledPackagesPage.cs => InstalledPackagesPage.cs} (96%) rename src/UniGetUI/Interface/SoftwarePages/{NewSoftwareUpdatesPage.cs => SoftwareUpdatesPage.cs} (96%) diff --git a/src/UniGetUI.PackageEngine.PackageLoader/AbstractPackageLoader.cs b/src/UniGetUI.PackageEngine.PackageLoader/AbstractPackageLoader.cs index 7e056a624..d69ee4f46 100644 --- a/src/UniGetUI.PackageEngine.PackageLoader/AbstractPackageLoader.cs +++ b/src/UniGetUI.PackageEngine.PackageLoader/AbstractPackageLoader.cs @@ -57,7 +57,7 @@ public AbstractPackageLoader(IEnumerable managers, bool AllowMul /// Will trigger a forceful reload of the packages /// /// - public async Task ReloadPackages() + public virtual async Task ReloadPackages() { IsLoading = true; StartedLoading?.Invoke(this, new EventArgs()); diff --git a/src/UniGetUI.PackageEngine.PackageLoader/DiscoverablePackagesLoader.cs b/src/UniGetUI.PackageEngine.PackageLoader/DiscoverablePackagesLoader.cs index 4b8455a52..8822f02a4 100644 --- a/src/UniGetUI.PackageEngine.PackageLoader/DiscoverablePackagesLoader.cs +++ b/src/UniGetUI.PackageEngine.PackageLoader/DiscoverablePackagesLoader.cs @@ -20,6 +20,18 @@ public DiscoverablePackagesLoader(IEnumerable managers) LOADER_IDENTIFIER = "DISCOVERABLE_PACKAGES"; } + public async Task ReloadPackages(string query) + { + QUERY_TEXT = query; + await ReloadPackages(); + } + + public override async Task ReloadPackages() + { + if (QUERY_TEXT == "") return; + else await base.ReloadPackages(); + } + #pragma warning disable protected override async Task IsPackageValid(Package package) { diff --git a/src/UniGetUI/Interface/MainView.xaml.cs b/src/UniGetUI/Interface/MainView.xaml.cs index b370b17ee..8bf782cfc 100644 --- a/src/UniGetUI/Interface/MainView.xaml.cs +++ b/src/UniGetUI/Interface/MainView.xaml.cs @@ -25,8 +25,8 @@ public sealed partial class MainView : UserControl { public SettingsInterface SettingsPage; public NewDiscoverSoftwarePage DiscoverPage; - public NewSoftwareUpdatesPage UpdatesPage; - public NewInstalledPackagesPage InstalledPage; + public SoftwareUpdatesPage UpdatesPage; + public InstalledPackagesPage InstalledPage; public HelpDialog? HelpPage; public PackageBundlePage BundlesPage; public Page? OldPage; @@ -43,9 +43,9 @@ public MainView() BundleBadge = __bundle_count_badge; OperationStackPanel = __operations_list_stackpanel; DiscoverPage = new NewDiscoverSoftwarePage(); - UpdatesPage = new NewSoftwareUpdatesPage(); + UpdatesPage = new SoftwareUpdatesPage(); UpdatesPage.ExternalCountBadge = UpdatesBadge; - InstalledPage = new NewInstalledPackagesPage(); + InstalledPage = new InstalledPackagesPage(); BundlesPage = new PackageBundlePage(); SettingsPage = new SettingsInterface(); diff --git a/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml b/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml index 58ec31237..2e1ecc41d 100644 --- a/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml +++ b/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml @@ -614,7 +614,7 @@ - $"DisableInstantSearch{PAGE_NAME}Tab"; } + public string SIDEPANEL_WIDTH_SETTING_NAME { get => $"SidepanelWidth{PAGE_NAME}Page"; } + protected string PAGE_NAME { get; private set; } + public bool RoleIsUpdateLike { get => PAGE_ROLE == OperationType.Update; } + protected DateTime LastPackageLoadTime { get; private set; } + protected OperationType PAGE_ROLE { get; private set; } + protected AbstractPackageLoader Loader; public SortableObservableCollection FilteredPackages = new() { SortingSelector = (a) => (a.Name) }; protected List UsedManagers = new(); protected Dictionary> UsedSourcesForManager = new(); protected Dictionary RootNodeForManager = new(); protected Dictionary NodesForSources = new(); - - public int NewVersionLabelWidth { get { return RoleIsUpdateLike ? 125 : 0; } } - public int NewVersionIconWidth { get { return RoleIsUpdateLike ? 24 : 0; } } - private TreeViewNode LocalPackagesNode; - public InfoBadge? ExternalCountBadge; + public int NewVersionLabelWidth { get { return RoleIsUpdateLike ? 125 : 0; } } + public int NewVersionIconWidth { get { return RoleIsUpdateLike ? 24 : 0; } } protected bool Initialized = false; private bool AllSelected = true; - - int lastSavedWidth = 0; - protected string PAGE_NAME = "UNDEFINED"; - public string InstantSearchSettingString { get { return $"DisableInstantSearch{PAGE_NAME}Tab"; } } - public string SidepalWidthSettingString { get { return $"SidepanelWidth{PAGE_NAME}Page"; } } - - public bool RoleIsUpdateLike { get { return PageRole == OperationType.Update; } } protected abstract Task WhenPackagesLoaded(ReloadReason reason); protected abstract void WhenPackageCountUpdated(); protected abstract void WhenShowingContextMenu(Package package); public abstract void GenerateToolBar(); public abstract BetterMenu GenerateContextMenu(); - public abstract void GenerateUIText(); - - protected string NoPackages_BackgroundText = CoreTools.Translate("Hooray! No updates were found."); - protected string NoPackages_SourcesText = CoreTools.Translate("Everything is up to date"); - protected string NoPackages_SubtitleMainText = CoreTools.Translate("Everything is up to date"); - + protected string NoPackages_BackgroundText { get; private set; } + protected string NoPackages_SourcesText { get; private set; } + protected string MainSubtitle_StillLoading { get; private set; } + protected string NoPackages_SubtitleText_Base { get; private set; } protected string NoPackages_SubtitleText { - get - { - return NoPackages_SubtitleMainText + " " + - (SHOW_LAST_CHECKED_TIME ? CoreTools.Translate("(Last checked: {0})", LastPackageLoadTime.ToString()) : ""); - } + get => NoPackages_SubtitleText_Base + + (SHOW_LAST_CHECKED_TIME ? " " + CoreTools.Translate("(Last checked: {0})", LastPackageLoadTime.ToString()) : ""); } - - protected string NoMatches_BackgroundText = CoreTools.Translate("No results were found matching the input criteria"); - protected string NoMatches_SourcesText = CoreTools.Translate("No packages were found"); + protected string NoMatches_BackgroundText { get; private set; } + protected Func FoundPackages_SubtitleText_Base = (a, b) => CoreTools.Translate("{0} packages were found, {1} of which match the specified filters.", a, b); protected string NoMatches_SubtitleText { - get - { - return CoreTools.Translate("{0} packages were found, {1} of which match the specified filters.", - Loader.Packages.Count.ToString(), FilteredPackages.Count()) - + " " + (SHOW_LAST_CHECKED_TIME? CoreTools.Translate("(Last checked: {0})", LastPackageLoadTime.ToString()): ""); - } + get => FoundPackages_SubtitleText_Base(Loader.Packages.Count(), FilteredPackages.Count()) + + (SHOW_LAST_CHECKED_TIME? " " + CoreTools.Translate("(Last checked: {0})", LastPackageLoadTime.ToString()): ""); } - protected string FoundPackages_SubtitleText { get { return NoMatches_SubtitleText; } } - protected string MainTitleText = CoreTools.AutoTranslated("Software Updates"); - protected string MainTitleGlyph = "\uE895"; + protected string FoundPackages_SubtitleText { get => NoMatches_SubtitleText; } + + protected AbstractPackagesPage(PackagesPageData data) + { + InitializeComponent(); + + Loader = data.Loader; - protected string MainSubtitle_StillLoading = CoreTools.Translate("Loading..."); + DISABLE_AUTOMATIC_PACKAGE_LOAD_ON_START = data.DisableAutomaticPackageLoadOnStart; + MEGA_QUERY_BOX_ENABLED = data.MegaQueryBlockEnabled; + SHOW_LAST_CHECKED_TIME = data.ShowLastLoadTime; + PAGE_ROLE = data.PageRole; + Loader = data.Loader; + PAGE_NAME = data.PageName; + MainTitle.Text = data.PageTitle; + HeaderIcon.Glyph = data.Glyph; - public AbstractPackagesPage(AbstractPackageLoader loader) - { - Loader = loader; + NoPackages_BackgroundText = data.NoPackages_BackgroundText; + NoPackages_SourcesText = data.NoPackages_SourcesText; + NoPackages_SubtitleText_Base = data.NoPackages_SubtitleText_Base; + MainSubtitle_StillLoading = data.MainSubtitle_StillLoading; + + NoMatches_BackgroundText = data.NoMatches_BackgroundText; Loader.StartedLoading += Loader_StartedLoading; Loader.FinishedLoading += Loader_FinishedLoading; Loader.PackagesChanged += Loader_PackagesChanged; - InitializeComponent(); + if (Loader.IsLoading) + { + Loader_StartedLoading(this, EventArgs.Empty); + } + else + { + Loader_FinishedLoading(this, EventArgs.Empty); + } + LastPackageLoadTime = DateTime.Now; QueryBothRadio.IsChecked = true; QueryOptionsGroup.SelectedIndex = 2; @@ -139,7 +155,7 @@ public AbstractPackagesPage(AbstractPackageLoader loader) QueryBlock.TextChanged += (s, e) => { if (InstantSearchCheckbox.IsChecked == true) FilterPackages(QueryBlock.Text); }; QueryBlock.KeyUp += (s, e) => { - if (e.Key == Windows.System.VirtualKey.Enter) + if (e.Key == VirtualKey.Enter) { MegaQueryBlockGrid.Visibility = Visibility.Collapsed; FilterPackages(QueryBlock.Text); @@ -159,7 +175,7 @@ public AbstractPackagesPage(AbstractPackageLoader loader) }; MegaQueryBlock.KeyUp += (s, e) => { - if (e.Key == Windows.System.VirtualKey.Enter) + if (e.Key == VirtualKey.Enter) { MegaQueryBlockGrid.Visibility = Visibility.Collapsed; QueryBlock.Text = MegaQueryBlock.Text.Trim(); @@ -174,7 +190,6 @@ public AbstractPackagesPage(AbstractPackageLoader loader) FilterPackages(QueryBlock.Text); }; - LocalPackagesNode = new TreeViewNode { Content = CoreTools.Translate("Local"), IsExpanded = false }; SourcesTreeView.Tapped += (s, e) => @@ -239,11 +254,11 @@ public AbstractPackagesPage(AbstractPackageLoader loader) PackageList.KeyUp += (s, e) => { - bool IS_CONTROL_PRESSED = InputKeyboardSource.GetKeyStateForCurrentThread(Windows.System.VirtualKey.Control).HasFlag(CoreVirtualKeyStates.Down); - bool IS_SHIFT_PRESSED = InputKeyboardSource.GetKeyStateForCurrentThread(Windows.System.VirtualKey.Shift).HasFlag(CoreVirtualKeyStates.Down); - bool IS_ALT_PRESSED = InputKeyboardSource.GetKeyStateForCurrentThread(Windows.System.VirtualKey.Menu).HasFlag(CoreVirtualKeyStates.Down); + bool IS_CONTROL_PRESSED = InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.Control).HasFlag(CoreVirtualKeyStates.Down); + bool IS_SHIFT_PRESSED = InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.Shift).HasFlag(CoreVirtualKeyStates.Down); + bool IS_ALT_PRESSED = InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.Menu).HasFlag(CoreVirtualKeyStates.Down); - if (e.Key == Windows.System.VirtualKey.Enter && PackageList.SelectedItem != null) + if (e.Key == VirtualKey.Enter && PackageList.SelectedItem != null) { if (IS_ALT_PRESSED) ShowInstallationOptionsForPackage(PackageList.SelectedItem as Package); @@ -252,7 +267,7 @@ public AbstractPackagesPage(AbstractPackageLoader loader) else ShowDetailsForPackage(PackageList.SelectedItem as Package); } - else if (e.Key == Windows.System.VirtualKey.Space) + else if (e.Key == VirtualKey.Space) { Package? package = PackageList.SelectedItem as Package; if(package != null) @@ -260,24 +275,8 @@ public AbstractPackagesPage(AbstractPackageLoader loader) } }; - int width = 250; - try - { - width = int.Parse(Settings.GetValue(SidepalWidthSettingString)); - } - catch - { - Settings.SetValue(SidepalWidthSettingString, "250"); - } - BodyGrid.ColumnDefinitions.ElementAt(0).Width = new GridLength(width); - - - GenerateToolBar(); LoadInterface(); _ = LoadPackages(ReloadReason.FirstRun); - - QueryBlock.PlaceholderText = CoreTools.Translate("Search for packages"); - MegaQueryBlock.PlaceholderText = CoreTools.Translate("Search for packages"); } private void Loader_PackagesChanged(object? sender, EventArgs e) @@ -387,7 +386,7 @@ private void InstantSearchValueChanged(object sender, RoutedEventArgs e) { if (!Initialized) return; - Settings.Set(InstantSearchSettingString, InstantSearchCheckbox.IsChecked == false); + Settings.Set(INSTANT_SEARCH_SETTING_NAME, InstantSearchCheckbox.IsChecked == false); } private void SourcesTreeView_SelectionChanged(TreeView sender, TreeViewSelectionChangedEventArgs args) { @@ -504,12 +503,13 @@ public void UpdatePackageCount() { BackgroundText.Text = NoPackages_BackgroundText; SourcesPlaceholderText.Text = NoPackages_SourcesText; + SourcesPlaceholderText.Visibility = Visibility.Visible; MainSubtitle.Text = NoPackages_SubtitleText; } else { BackgroundText.Text = NoMatches_BackgroundText; - SourcesPlaceholderText.Text = NoMatches_SourcesText; + SourcesPlaceholderText.Visibility = Visibility.Collapsed; MainSubtitle.Text = NoMatches_SubtitleText; } BackgroundText.Visibility = Visibility.Visible; @@ -558,13 +558,11 @@ public void SortPackages(string Sorter) if (FilteredPackages.Count > 0) PackageList.ScrollIntoView(FilteredPackages[0]); } - public void LoadInterface() + private void LoadInterface() { if (!Initialized) return; - GenerateUIText(); - if (MEGA_QUERY_BOX_ENABLED) { MegaQueryBlockGrid.Visibility = Visibility.Visible; @@ -573,10 +571,20 @@ public void LoadInterface() } - InstantSearchCheckbox.IsChecked = !Settings.Get(InstantSearchSettingString); + int width = 250; + try + { + width = int.Parse(Settings.GetValue(SIDEPANEL_WIDTH_SETTING_NAME)); + } + catch + { + Settings.SetValue(SIDEPANEL_WIDTH_SETTING_NAME, "250"); + } + BodyGrid.ColumnDefinitions.ElementAt(0).Width = new GridLength(width); + QueryBlock.PlaceholderText = CoreTools.Translate("Search for packages"); + MegaQueryBlock.PlaceholderText = CoreTools.Translate("Search for packages"); + InstantSearchCheckbox.IsChecked = !Settings.Get(INSTANT_SEARCH_SETTING_NAME); - MainTitle.Text = MainTitleText; - HeaderIcon.Glyph = MainTitleGlyph; HeaderIcon.FontWeight = new Windows.UI.Text.FontWeight(700); CheckboxHeader.Content = " "; NameHeader.Content = CoreTools.Translate("Package Name"); @@ -592,6 +600,7 @@ public void LoadInterface() NewVersionHeader.Click += (s, e) => { SortPackages("NewVersionAsFloat"); }; SourceHeader.Click += (s, e) => { SortPackages("SourceAsString"); }; PackageList.ContextFlyout = GenerateContextMenu(); + GenerateToolBar(); } protected void SelectAllSourcesButton_Click(object sender, RoutedEventArgs e) { @@ -607,8 +616,8 @@ protected async void ShowDetailsForPackage(Package? package) if (package == null) return; - Logger.Warn(PageRole.ToString()); - await MainApp.Instance.MainWindow.NavigationPage.ShowPackageDetails(package, PageRole); + Logger.Warn(PAGE_ROLE.ToString()); + await MainApp.Instance.MainWindow.NavigationPage.ShowPackageDetails(package, PAGE_ROLE); } protected void SharePackage(Package? package) { @@ -621,7 +630,7 @@ protected async void ShowInstallationOptionsForPackage(Package? package) if(package == null) return; - if (await MainApp.Instance.MainWindow.NavigationPage.ShowInstallationSettingsForPackageAndContinue(package, PageRole)) + if (await MainApp.Instance.MainWindow.NavigationPage.ShowInstallationSettingsForPackageAndContinue(package, PAGE_ROLE)) PerformMainPackageAction(package); } protected void SelectAllItems() @@ -652,9 +661,9 @@ protected void PerformMainPackageAction(Package? package) { if(package == null) return; - if (PageRole == OperationType.Install) + if (PAGE_ROLE == OperationType.Install) MainApp.Instance.AddOperationToList(new InstallPackageOperation(package)); - else if (PageRole == OperationType.Update) + else if (PAGE_ROLE == OperationType.Update) MainApp.Instance.AddOperationToList(new UpdatePackageOperation(package)); else // if (PageRole == OperationType.Uninstall) MainApp.Instance.AddOperationToList(new UninstallPackageOperation(package)); diff --git a/src/UniGetUI/Interface/SoftwarePages/NewDiscoverSoftwarePage.cs b/src/UniGetUI/Interface/SoftwarePages/DiscoverSoftwarePage.cs similarity index 91% rename from src/UniGetUI/Interface/SoftwarePages/NewDiscoverSoftwarePage.cs rename to src/UniGetUI/Interface/SoftwarePages/DiscoverSoftwarePage.cs index aa8cdd023..bf3344ab9 100644 --- a/src/UniGetUI/Interface/SoftwarePages/NewDiscoverSoftwarePage.cs +++ b/src/UniGetUI/Interface/SoftwarePages/DiscoverSoftwarePage.cs @@ -1,5 +1,6 @@ using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; +using System.Threading.Tasks.Dataflow; using UniGetUI.Core.Logging; using UniGetUI.Core.Tools; using UniGetUI.Interface.Enums; @@ -9,6 +10,8 @@ using UniGetUI.PackageEngine.ManagerClasses.Manager; using UniGetUI.PackageEngine.Operations; using UniGetUI.PackageEngine.PackageClasses; +using UniGetUI.PackageEngine.PackageLoader; +using Windows.System; namespace UniGetUI.Interface.SoftwarePages { @@ -18,8 +21,38 @@ public class NewDiscoverSoftwarePage : AbstractPackagesPage BetterMenuItem? MenuInteractive; BetterMenuItem? MenuSkipHash; public NewDiscoverSoftwarePage() - : base(PEInterface.DiscoveredPackagesLoader) + : base(new PackagesPageData() { + DisableAutomaticPackageLoadOnStart = true, + MegaQueryBlockEnabled = true, + ShowLastLoadTime = false, + PageName = "Discover", + + Loader = PEInterface.DiscoveredPackagesLoader, + PageRole = OperationType.Install, + + NoPackages_BackgroundText = CoreTools.Translate("No results were found matching the input criteria"), + NoPackages_SourcesText = CoreTools.Translate("No packages were found"), + NoPackages_SubtitleText_Base = CoreTools.Translate("No packages were found"), + MainSubtitle_StillLoading = CoreTools.Translate("Loading packages"), + NoMatches_BackgroundText = CoreTools.Translate("No results were found matching the input criteria"), + + PageTitle = CoreTools.AutoTranslated("Discover Packages"), + Glyph = "\uF6FA" + }) + { + InstantSearchCheckbox.IsEnabled = false; + InstantSearchCheckbox.Visibility = Visibility.Collapsed; + + FindButton.Click += Event_SearchPackages; + MegaFindButton.Click += Event_SearchPackages; + + QueryBlock.KeyUp += (s, e) => { if (e.Key == VirtualKey.Enter) Event_SearchPackages(s, e); }; + MegaQueryBlock.KeyUp += (s, e) => { if (e.Key == VirtualKey.Enter) Event_SearchPackages(s, e); }; + + QueryOptionsGroup.SelectedIndex = 1; + QueryOptionsGroup.SelectedIndex = 2; + QueryOptionsGroup.SelectedItem = QueryBothRadio; } public override BetterMenu GenerateContextMenu() @@ -229,40 +262,10 @@ public override async Task LoadPackages() if(QueryBlock.Text.Trim() != "") await LoadPackages(ReloadReason.External); } - public override void GenerateUIText() + private void Event_SearchPackages(object sender, RoutedEventArgs e) { - DISABLE_AUTOMATIC_PACKAGE_LOAD_ON_START = true; - MEGA_QUERY_BOX_ENABLED = true; - PAGE_NAME = "Discover"; - - PageRole = OperationType.Install; - InstantSearchCheckbox.IsEnabled = false; - InstantSearchCheckbox.Visibility = Visibility.Collapsed; - - FindButton.Click += (s, e) => { if(QueryBlock.Text.Trim() != "") _ = LoadPackages(ReloadReason.Manual); }; - QueryBlock.KeyUp += (s, e) => - { - if (QueryBlock.Text.Trim() != "" && e.Key == Windows.System.VirtualKey.Enter) - _ = LoadPackages(ReloadReason.Manual); - }; - - MegaFindButton.Click += (s, e) => { if (QueryBlock.Text.Trim() != "") _ = LoadPackages(ReloadReason.Manual); }; - MegaQueryBlock.KeyUp += (s, e) => { if (QueryBlock.Text.Trim() != "" && e.Key == Windows.System.VirtualKey.Enter) _ = LoadPackages(ReloadReason.Manual); }; - - - NoPackages_BackgroundText = CoreTools.Translate("No results were found matching the input criteria"); - NoPackages_SourcesText = CoreTools.Translate("No packages were found"); - NoPackages_SubtitleMainText = NoPackages_SourcesText; - - NoMatches_BackgroundText = NoPackages_BackgroundText; - NoMatches_SourcesText = NoPackages_SourcesText; - - MainTitleText = CoreTools.AutoTranslated("Discover Packages"); - MainTitleGlyph = "\uF6FA"; - - QueryOptionsGroup.SelectedIndex = 1; - QueryOptionsGroup.SelectedIndex = 2; - QueryOptionsGroup.SelectedItem = QueryBothRadio; + if (QueryBlock.Text.Trim() != "") + _ = (Loader as DiscoverablePackagesLoader)?.ReloadPackages(); } protected override void WhenPackageCountUpdated() diff --git a/src/UniGetUI/Interface/SoftwarePages/NewInstalledPackagesPage.cs b/src/UniGetUI/Interface/SoftwarePages/InstalledPackagesPage.cs similarity index 96% rename from src/UniGetUI/Interface/SoftwarePages/NewInstalledPackagesPage.cs rename to src/UniGetUI/Interface/SoftwarePages/InstalledPackagesPage.cs index 14f7a80d9..7e353877d 100644 --- a/src/UniGetUI/Interface/SoftwarePages/NewInstalledPackagesPage.cs +++ b/src/UniGetUI/Interface/SoftwarePages/InstalledPackagesPage.cs @@ -15,7 +15,7 @@ namespace UniGetUI.Interface.SoftwarePages { - public class NewInstalledPackagesPage : AbstractPackagesPage + public class InstalledPackagesPage : AbstractPackagesPage { bool HasDoneBackup = false; @@ -23,9 +23,31 @@ public class NewInstalledPackagesPage : AbstractPackagesPage BetterMenuItem? MenuInteractive; BetterMenuItem? MenuRemoveData; - public NewInstalledPackagesPage() - : base(PEInterface.InstalledPackagesLoader) + public InstalledPackagesPage() + : base(new PackagesPageData() { + DisableAutomaticPackageLoadOnStart = false, + MegaQueryBlockEnabled = false, + ShowLastLoadTime = false, + PageName = "Installed", + + Loader = PEInterface.InstalledPackagesLoader, + PageRole = OperationType.Uninstall, + + NoPackages_BackgroundText = CoreTools.Translate("No results were found matching the input criteria"), + NoPackages_SourcesText = CoreTools.Translate("No packages were found"), + NoPackages_SubtitleText_Base = CoreTools.Translate("No packages were found"), + MainSubtitle_StillLoading = CoreTools.Translate("Loading packages"), + NoMatches_BackgroundText = CoreTools.Translate("No results were found matching the input criteria"), + + PageTitle = CoreTools.AutoTranslated("Installed Packages"), + Glyph = "\uE977" + }) + { + QuerySimilarResultsRadio.IsEnabled = false; + QueryOptionsGroup.SelectedIndex = 1; + QueryOptionsGroup.SelectedIndex = 2; + QueryOptionsGroup.SelectedItem = QueryBothRadio; } public override BetterMenu GenerateContextMenu() @@ -251,29 +273,6 @@ public override void GenerateToolBar() SelectNone.Click += (s, e) => { ClearItemSelection(); }; } - public override void GenerateUIText() - { - PAGE_NAME = "Installed"; - - - PageRole = OperationType.Uninstall; - - NoPackages_BackgroundText = CoreTools.Translate("No packages were found"); - NoPackages_SourcesText = CoreTools.Translate("No packages were found"); - NoPackages_SubtitleMainText = NoPackages_SourcesText; - - NoMatches_BackgroundText = CoreTools.Translate("No results were found matching the input criteria"); - NoMatches_SourcesText = CoreTools.Translate("No matches were found"); - - MainTitleText = CoreTools.AutoTranslated("Installed Packages"); - MainTitleGlyph = "\uE977"; - - QuerySimilarResultsRadio.IsEnabled = false; - QueryOptionsGroup.SelectedIndex = 1; - QueryOptionsGroup.SelectedIndex = 2; - QueryOptionsGroup.SelectedItem = QueryBothRadio; - } - protected override void WhenPackageCountUpdated() { return; diff --git a/src/UniGetUI/Interface/SoftwarePages/NewSoftwareUpdatesPage.cs b/src/UniGetUI/Interface/SoftwarePages/SoftwareUpdatesPage.cs similarity index 96% rename from src/UniGetUI/Interface/SoftwarePages/NewSoftwareUpdatesPage.cs rename to src/UniGetUI/Interface/SoftwarePages/SoftwareUpdatesPage.cs index 80808abf8..c9fdcf794 100644 --- a/src/UniGetUI/Interface/SoftwarePages/NewSoftwareUpdatesPage.cs +++ b/src/UniGetUI/Interface/SoftwarePages/SoftwareUpdatesPage.cs @@ -15,34 +15,33 @@ namespace UniGetUI.Interface.SoftwarePages { - public class NewSoftwareUpdatesPage : AbstractPackagesPage + public class SoftwareUpdatesPage : AbstractPackagesPage { private BetterMenuItem? MenuAsAdmin; private BetterMenuItem? MenuInteractive; private BetterMenuItem? MenuskipHash; - public NewSoftwareUpdatesPage() - : base(PEInterface.UpgradablePackagesLoader) + public SoftwareUpdatesPage() + : base(new PackagesPageData() { - - } - - public override void GenerateUIText() + DisableAutomaticPackageLoadOnStart = false, + MegaQueryBlockEnabled = false, + ShowLastLoadTime = true, + PageName = "Updates", + + Loader = PEInterface.UpgradablePackagesLoader, + PageRole = OperationType.Update, + + NoPackages_BackgroundText = CoreTools.Translate("Hooray! No updates were found."), + NoPackages_SourcesText = CoreTools.Translate("Everything is up to date"), + NoPackages_SubtitleText_Base = CoreTools.Translate("Everything is up to date"), + MainSubtitle_StillLoading = CoreTools.Translate("Loading packages"), + NoMatches_BackgroundText = CoreTools.Translate("No results were found matching the input criteria"), + + PageTitle = CoreTools.AutoTranslated("Software Updates"), + Glyph = "\uE895" + }) { - PAGE_NAME = "Updates"; - SHOW_LAST_CHECKED_TIME = true; - - PageRole = OperationType.Update; - NoPackages_BackgroundText = CoreTools.Translate("Hooray! No updates were found."); - NoPackages_SourcesText = CoreTools.Translate("Everything is up to date"); - NoPackages_SubtitleMainText = NoPackages_SourcesText; - - NoMatches_BackgroundText = CoreTools.Translate("No results were found matching the input criteria"); - NoMatches_SourcesText = CoreTools.Translate("No packages were found"); - - MainTitleText = CoreTools.AutoTranslated("Software Updates"); - MainTitleGlyph = "\uE895"; - QuerySimilarResultsRadio.IsEnabled = false; QueryOptionsGroup.SelectedIndex = 1; QueryOptionsGroup.SelectedIndex = 2; @@ -165,10 +164,8 @@ protected override void WhenShowingContextMenu(Package package) MenuAsAdmin.IsEnabled = package.Manager.Capabilities.CanRunAsAdmin; MenuInteractive.IsEnabled = package.Manager.Capabilities.CanRunInteractively; MenuskipHash.IsEnabled = package.Manager.Capabilities.CanSkipIntegrityChecks; - } - public override void GenerateToolBar() { AppBarButton UpdateSelected = new(); From e84d124b6b77a949e97281ffa6f3f3c9ba5c7a01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Fri, 21 Jun 2024 11:16:06 +0200 Subject: [PATCH 11/21] Forgot to use overloaded method --- src/UniGetUI/Interface/SoftwarePages/DiscoverSoftwarePage.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/UniGetUI/Interface/SoftwarePages/DiscoverSoftwarePage.cs b/src/UniGetUI/Interface/SoftwarePages/DiscoverSoftwarePage.cs index bf3344ab9..e4b239022 100644 --- a/src/UniGetUI/Interface/SoftwarePages/DiscoverSoftwarePage.cs +++ b/src/UniGetUI/Interface/SoftwarePages/DiscoverSoftwarePage.cs @@ -265,7 +265,7 @@ public override async Task LoadPackages() private void Event_SearchPackages(object sender, RoutedEventArgs e) { if (QueryBlock.Text.Trim() != "") - _ = (Loader as DiscoverablePackagesLoader)?.ReloadPackages(); + _ = (Loader as DiscoverablePackagesLoader)?.ReloadPackages(QueryBlock.Text.Trim()); } protected override void WhenPackageCountUpdated() From b642ce50c53a7fb6ca611052d2ecab06c4c4b2ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Fri, 21 Jun 2024 11:33:19 +0200 Subject: [PATCH 12/21] Allow aborting a package load --- .../AbstractPackageLoader.cs | 28 ++++++++++++++++--- .../AbstractPackagesPage.xaml.cs | 1 + .../SoftwarePages/DiscoverSoftwarePage.cs | 5 ++++ 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/UniGetUI.PackageEngine.PackageLoader/AbstractPackageLoader.cs b/src/UniGetUI.PackageEngine.PackageLoader/AbstractPackageLoader.cs index d69ee4f46..8116ba720 100644 --- a/src/UniGetUI.PackageEngine.PackageLoader/AbstractPackageLoader.cs +++ b/src/UniGetUI.PackageEngine.PackageLoader/AbstractPackageLoader.cs @@ -41,6 +41,7 @@ public abstract class AbstractPackageLoader bool ALLOW_MULTIPLE_PACKAGE_VERSIONS = false; protected string LOADER_IDENTIFIER; + private int LoadOperationIdentifier = 0; protected IEnumerable Managers { get; private set; } public AbstractPackageLoader(IEnumerable managers, bool AllowMultiplePackageVersions = false) @@ -53,12 +54,28 @@ public AbstractPackageLoader(IEnumerable managers, bool AllowMul LOADER_IDENTIFIER = "ABSTRACT"; } + /// + /// Stops the current loading process + /// + public void StopLoading() + { + if (!IsLoading) return; + + LoadOperationIdentifier = -1; + IsLoaded = false; + IsLoading = false; + FinishedLoading?.Invoke(this, EventArgs.Empty); + } + /// /// Will trigger a forceful reload of the packages /// /// public virtual async Task ReloadPackages() { + StopLoading(); + LoadOperationIdentifier = new Random().Next(); + int current_identifier = LoadOperationIdentifier; IsLoading = true; StartedLoading?.Invoke(this, new EventArgs()); @@ -82,7 +99,7 @@ public virtual async Task ReloadPackages() if (task.IsCompleted) { - if (task.IsCompletedSuccessfully) + if (LoadOperationIdentifier == current_identifier && task.IsCompletedSuccessfully) { int InitialCount = Packages.Count; foreach (Package package in task.Result) @@ -101,9 +118,12 @@ public virtual async Task ReloadPackages() } } - IsLoading = false; - FinishedLoading?.Invoke(this, new EventArgs()); - IsLoaded = true; + if (LoadOperationIdentifier == current_identifier) + { + IsLoading = false; + FinishedLoading?.Invoke(this, new EventArgs()); + IsLoaded = true; + } } /// diff --git a/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs b/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs index 4b1fbfa67..0f573e99c 100644 --- a/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs +++ b/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs @@ -47,6 +47,7 @@ protected struct PackagesPageData public string MainSubtitle_StillLoading; public string NoMatches_BackgroundText; } + protected enum ReloadReason { FirstRun, diff --git a/src/UniGetUI/Interface/SoftwarePages/DiscoverSoftwarePage.cs b/src/UniGetUI/Interface/SoftwarePages/DiscoverSoftwarePage.cs index e4b239022..2c3afed75 100644 --- a/src/UniGetUI/Interface/SoftwarePages/DiscoverSoftwarePage.cs +++ b/src/UniGetUI/Interface/SoftwarePages/DiscoverSoftwarePage.cs @@ -265,7 +265,12 @@ public override async Task LoadPackages() private void Event_SearchPackages(object sender, RoutedEventArgs e) { if (QueryBlock.Text.Trim() != "") + { _ = (Loader as DiscoverablePackagesLoader)?.ReloadPackages(QueryBlock.Text.Trim()); + } else + { + Loader.StopLoading(); + } } protected override void WhenPackageCountUpdated() From 7217dea6cab1a1c936db1ad44e8b5b876d693591 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Fri, 21 Jun 2024 11:43:31 +0200 Subject: [PATCH 13/21] New AppSdk version uses more memory --- src/UniGetUI/Interface/SoftwarePages/DiscoverSoftwarePage.cs | 5 +---- src/UniGetUI/UniGetUI.csproj | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/UniGetUI/Interface/SoftwarePages/DiscoverSoftwarePage.cs b/src/UniGetUI/Interface/SoftwarePages/DiscoverSoftwarePage.cs index 2c3afed75..340bea7ab 100644 --- a/src/UniGetUI/Interface/SoftwarePages/DiscoverSoftwarePage.cs +++ b/src/UniGetUI/Interface/SoftwarePages/DiscoverSoftwarePage.cs @@ -265,12 +265,9 @@ public override async Task LoadPackages() private void Event_SearchPackages(object sender, RoutedEventArgs e) { if (QueryBlock.Text.Trim() != "") - { _ = (Loader as DiscoverablePackagesLoader)?.ReloadPackages(QueryBlock.Text.Trim()); - } else - { + else Loader.StopLoading(); - } } protected override void WhenPackageCountUpdated() diff --git a/src/UniGetUI/UniGetUI.csproj b/src/UniGetUI/UniGetUI.csproj index 6be5693a5..11659a2d1 100644 --- a/src/UniGetUI/UniGetUI.csproj +++ b/src/UniGetUI/UniGetUI.csproj @@ -77,7 +77,7 @@ - + From 962b95bab8208256256d2ba99e68d0b4e873fff5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Fri, 21 Jun 2024 11:48:55 +0200 Subject: [PATCH 14/21] Prevent assigning to attributes that shouldn't be touched --- .../PEInterface.cs | 22 +++++++++---------- .../SoftwarePages/DiscoverSoftwarePage.cs | 2 +- .../SoftwarePages/InstalledPackagesPage.cs | 2 +- .../SoftwarePages/SoftwareUpdatesPage.cs | 2 +- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/UniGetUI.PackageEngine.PackageEngine/PEInterface.cs b/src/UniGetUI.PackageEngine.PackageEngine/PEInterface.cs index a404a301f..14f40ce6b 100644 --- a/src/UniGetUI.PackageEngine.PackageEngine/PEInterface.cs +++ b/src/UniGetUI.PackageEngine.PackageEngine/PEInterface.cs @@ -20,19 +20,19 @@ public static class PEInterface { private const int ManagerLoadTimeout = 10000; // 10 seconds timeout for Package Manager initialization - public static WinGet WinGet = new WinGet(); - public static Scoop Scoop = new Scoop(); - public static Chocolatey Chocolatey = new Chocolatey(); - public static Npm Npm = new Npm(); - public static Pip Pip = new Pip(); - public static DotNet DotNet = new DotNet(); - public static PowerShell PowerShell = new PowerShell(); + public static readonly WinGet WinGet = new WinGet(); + public static readonly Scoop Scoop = new Scoop(); + public static readonly Chocolatey Chocolatey = new Chocolatey(); + public static readonly Npm Npm = new Npm(); + public static readonly Pip Pip = new Pip(); + public static readonly DotNet DotNet = new DotNet(); + public static readonly PowerShell PowerShell = new PowerShell(); - public static PackageManager[] Managers = [WinGet, Scoop, Chocolatey, Npm, Pip, DotNet, PowerShell]; + public static readonly PackageManager[] Managers = [WinGet, Scoop, Chocolatey, Npm, Pip, DotNet, PowerShell]; - public static DiscoverablePackagesLoader DiscoveredPackagesLoader = new(Managers); - public static UpgradablePackagesLoader UpgradablePackagesLoader = new(Managers); - public static InstalledPackagesLoader InstalledPackagesLoader = new(Managers); + public static readonly DiscoverablePackagesLoader DiscoveredPackagesLoader = new(Managers); + public static readonly UpgradablePackagesLoader UpgradablePackagesLoader = new(Managers); + public static readonly InstalledPackagesLoader InstalledPackagesLoader = new(Managers); public static async Task Initialize() { diff --git a/src/UniGetUI/Interface/SoftwarePages/DiscoverSoftwarePage.cs b/src/UniGetUI/Interface/SoftwarePages/DiscoverSoftwarePage.cs index 340bea7ab..66cafbd4c 100644 --- a/src/UniGetUI/Interface/SoftwarePages/DiscoverSoftwarePage.cs +++ b/src/UniGetUI/Interface/SoftwarePages/DiscoverSoftwarePage.cs @@ -37,7 +37,7 @@ public NewDiscoverSoftwarePage() MainSubtitle_StillLoading = CoreTools.Translate("Loading packages"), NoMatches_BackgroundText = CoreTools.Translate("No results were found matching the input criteria"), - PageTitle = CoreTools.AutoTranslated("Discover Packages"), + PageTitle = CoreTools.Translate("Discover Packages"), Glyph = "\uF6FA" }) { diff --git a/src/UniGetUI/Interface/SoftwarePages/InstalledPackagesPage.cs b/src/UniGetUI/Interface/SoftwarePages/InstalledPackagesPage.cs index 7e353877d..5719041c8 100644 --- a/src/UniGetUI/Interface/SoftwarePages/InstalledPackagesPage.cs +++ b/src/UniGetUI/Interface/SoftwarePages/InstalledPackagesPage.cs @@ -40,7 +40,7 @@ public InstalledPackagesPage() MainSubtitle_StillLoading = CoreTools.Translate("Loading packages"), NoMatches_BackgroundText = CoreTools.Translate("No results were found matching the input criteria"), - PageTitle = CoreTools.AutoTranslated("Installed Packages"), + PageTitle = CoreTools.Translate("Installed Packages"), Glyph = "\uE977" }) { diff --git a/src/UniGetUI/Interface/SoftwarePages/SoftwareUpdatesPage.cs b/src/UniGetUI/Interface/SoftwarePages/SoftwareUpdatesPage.cs index c9fdcf794..11d67d56a 100644 --- a/src/UniGetUI/Interface/SoftwarePages/SoftwareUpdatesPage.cs +++ b/src/UniGetUI/Interface/SoftwarePages/SoftwareUpdatesPage.cs @@ -38,7 +38,7 @@ public SoftwareUpdatesPage() MainSubtitle_StillLoading = CoreTools.Translate("Loading packages"), NoMatches_BackgroundText = CoreTools.Translate("No results were found matching the input criteria"), - PageTitle = CoreTools.AutoTranslated("Software Updates"), + PageTitle = CoreTools.Translate("Software Updates"), Glyph = "\uE895" }) { From a44ca439468be018c983d805be540dcad105fa49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Fri, 21 Jun 2024 11:59:21 +0200 Subject: [PATCH 15/21] Handle OnNavigatedFrom event on the AbstractPackagesPage --- .../AbstractPackagesPage.xaml.cs | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs b/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs index 0f573e99c..c317b8e4e 100644 --- a/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs +++ b/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs @@ -1,6 +1,7 @@ using Microsoft.UI.Input; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Navigation; using System.Collections.ObjectModel; using System.Runtime.InteropServices.WindowsRuntime; using UniGetUI.Core.Classes; @@ -148,12 +149,13 @@ protected AbstractPackagesPage(PackagesPageData data) QueryOptionsGroup.SelectedIndex = 2; LoadingProgressBar.Visibility = Visibility.Collapsed; Initialized = true; + LocalPackagesNode = new TreeViewNode { Content = CoreTools.Translate("Local"), IsExpanded = false }; + ReloadButton.Click += async (s, e) => { await LoadPackages(); }; FindButton.Click += (s, e) => { MegaQueryBlockGrid.Visibility = Visibility.Collapsed; FilterPackages(QueryBlock.Text); }; - QueryBlock.TextChanged += (s, e) => { if (InstantSearchCheckbox.IsChecked == true) FilterPackages(QueryBlock.Text); }; QueryBlock.KeyUp += (s, e) => { if (e.Key == VirtualKey.Enter) @@ -162,7 +164,6 @@ protected AbstractPackagesPage(PackagesPageData data) FilterPackages(QueryBlock.Text); } }; - QueryBlock.TextChanged += (s, e) => { if (MEGA_QUERY_BOX_ENABLED && QueryBlock.Text.Trim() == "") { @@ -174,7 +175,6 @@ protected AbstractPackagesPage(PackagesPageData data) MegaQueryBlock.Text = ""; } }; - MegaQueryBlock.KeyUp += (s, e) => { if (e.Key == VirtualKey.Enter) { @@ -183,16 +183,12 @@ protected AbstractPackagesPage(PackagesPageData data) FilterPackages(QueryBlock.Text); } }; - MegaFindButton.Click += (s, e) => { MegaQueryBlockGrid.Visibility = Visibility.Collapsed; QueryBlock.Text = MegaQueryBlock.Text.Trim(); FilterPackages(QueryBlock.Text); }; - - LocalPackagesNode = new TreeViewNode { Content = CoreTools.Translate("Local"), IsExpanded = false }; - SourcesTreeView.Tapped += (s, e) => { if (e.OriginalSource != null && (e.OriginalSource as FrameworkElement)?.DataContext != null) @@ -210,7 +206,6 @@ protected AbstractPackagesPage(PackagesPageData data) } } }; - SourcesTreeView.RightTapped += (s, e) => { if (e.OriginalSource != null && (e.OriginalSource as FrameworkElement)?.DataContext != null) @@ -227,12 +222,10 @@ protected AbstractPackagesPage(PackagesPageData data) } } }; - PackageList.DoubleTapped += (s, e) => { ShowDetailsForPackage(PackageList.SelectedItem as Package); }; - PackageList.RightTapped += (s, e) => { if (e.OriginalSource is FrameworkElement element) @@ -252,7 +245,6 @@ protected AbstractPackagesPage(PackagesPageData data) } } }; - PackageList.KeyUp += (s, e) => { bool IS_CONTROL_PRESSED = InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.Control).HasFlag(CoreVirtualKeyStates.Down); @@ -280,6 +272,13 @@ protected AbstractPackagesPage(PackagesPageData data) _ = LoadPackages(ReloadReason.FirstRun); } + protected override void OnNavigatedFrom(NavigationEventArgs e) + { + Loader.StartedLoading -= Loader_StartedLoading; + Loader.FinishedLoading -= Loader_FinishedLoading; + Loader.PackagesChanged -= Loader_PackagesChanged; + } + private void Loader_PackagesChanged(object? sender, EventArgs e) { if (Loader.Packages.Count == 0) From d87038b284e8c47626b3556157f28a309c680d46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Fri, 21 Jun 2024 12:14:43 +0200 Subject: [PATCH 16/21] call base method --- .../Interface/SoftwarePages/AbstractPackagesPage.xaml.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs b/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs index c317b8e4e..a2a487f12 100644 --- a/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs +++ b/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs @@ -277,6 +277,7 @@ protected override void OnNavigatedFrom(NavigationEventArgs e) Loader.StartedLoading -= Loader_StartedLoading; Loader.FinishedLoading -= Loader_FinishedLoading; Loader.PackagesChanged -= Loader_PackagesChanged; + base.OnNavigatedFrom(e); } private void Loader_PackagesChanged(object? sender, EventArgs e) From 3fe8bb1c01f330e5f2e4360b73ec836051a05bfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Sat, 22 Jun 2024 22:13:30 +0200 Subject: [PATCH 17/21] Move ConfirmUninstallation method to MainWindow --- src/UniGetUI/Interface/MainView.xaml.cs | 49 ++++++++++++++++++ .../SoftwarePages/InstalledPackagesPage.cs | 51 ++----------------- 2 files changed, 54 insertions(+), 46 deletions(-) diff --git a/src/UniGetUI/Interface/MainView.xaml.cs b/src/UniGetUI/Interface/MainView.xaml.cs index 8bf782cfc..8ddd9db9e 100644 --- a/src/UniGetUI/Interface/MainView.xaml.cs +++ b/src/UniGetUI/Interface/MainView.xaml.cs @@ -483,6 +483,55 @@ public async Task ShowPackageDetails(Package package, OperationType ActionOperat } + public async Task ConfirmUninstallation(Package package) + { + ContentDialog dialog = new(); + + dialog.XamlRoot = XamlRoot; + dialog.Style = Application.Current.Resources["DefaultContentDialogStyle"] as Style; + dialog.Title = CoreTools.Translate("Are you sure?"); + dialog.PrimaryButtonText = CoreTools.Translate("No"); + dialog.SecondaryButtonText = CoreTools.Translate("Yes"); + dialog.DefaultButton = ContentDialogButton.Primary; + dialog.Content = CoreTools.Translate("Do you really want to uninstall {0}?", package.Name); + + return await MainApp.Instance.MainWindow.ShowDialogAsync(dialog) == ContentDialogResult.Secondary; + } + + public async Task ConfirmUninstallation(Package[] packages) + { + if (packages.Length == 0) return false; + if (packages.Length == 1) + { + return await ConfirmUninstallation(packages[0]); + } + + ContentDialog dialog = new(); + + dialog.XamlRoot = XamlRoot; + dialog.Style = Application.Current.Resources["DefaultContentDialogStyle"] as Style; + dialog.Title = CoreTools.Translate("Are you sure?"); + dialog.PrimaryButtonText = CoreTools.Translate("No"); + dialog.SecondaryButtonText = CoreTools.Translate("Yes"); + dialog.DefaultButton = ContentDialogButton.Primary; + + StackPanel p = new(); + p.Children.Add(new TextBlock { Text = CoreTools.Translate("Do you really want to uninstall the following {0} packages?", packages.Length), Margin = new Thickness(0, 0, 0, 5) }); + + string pkgList = ""; + foreach (Package package in packages) + pkgList += " ● " + package.Name + "\x0a"; + + TextBlock PackageListTextBlock = new() { FontFamily = new Microsoft.UI.Xaml.Media.FontFamily("Consolas"), Text = pkgList }; + p.Children.Add(new ScrollView { Content = PackageListTextBlock, MaxHeight = 200 }); + + dialog.Content = p; + + return await MainApp.Instance.MainWindow.ShowDialogAsync(dialog) == ContentDialogResult.Secondary; + } + + + private void OperationHistoryMenu_Click(object sender, RoutedEventArgs e) { NavigateToPage(new Logger_LogPage(Logger_LogType.OperationHistory)); diff --git a/src/UniGetUI/Interface/SoftwarePages/InstalledPackagesPage.cs b/src/UniGetUI/Interface/SoftwarePages/InstalledPackagesPage.cs index 5719041c8..2fb00dd60 100644 --- a/src/UniGetUI/Interface/SoftwarePages/InstalledPackagesPage.cs +++ b/src/UniGetUI/Interface/SoftwarePages/InstalledPackagesPage.cs @@ -310,56 +310,15 @@ private async void ExportSelection_Click(object sender, RoutedEventArgs e) public async void ConfirmAndUninstall(Package package, InstallationOptions options) { - ContentDialog dialog = new(); - - dialog.XamlRoot = XamlRoot; - dialog.Style = Application.Current.Resources["DefaultContentDialogStyle"] as Style; - dialog.Title = CoreTools.Translate("Are you sure?"); - dialog.PrimaryButtonText = CoreTools.Translate("No"); - dialog.SecondaryButtonText = CoreTools.Translate("Yes"); - dialog.DefaultButton = ContentDialogButton.Primary; - dialog.Content = CoreTools.Translate("Do you really want to uninstall {0}?", package.Name); - - if (await MainApp.Instance.MainWindow.ShowDialogAsync(dialog) == ContentDialogResult.Secondary) + if (await MainApp.Instance.MainWindow.NavigationPage.ConfirmUninstallation(package)) + { MainApp.Instance.AddOperationToList(new UninstallPackageOperation(package, options)); - + } } + public async void ConfirmAndUninstall(Package[] packages, bool? elevated = null, bool? interactive = null, bool? remove_data = null) { - if (packages.Length == 0) return; - if (packages.Length == 1) - { - ConfirmAndUninstall(packages[0], await InstallationOptions.FromPackageAsync( - packages[0], - elevated: elevated, - interactive: interactive, - remove_data: remove_data - )); - return; - } - - ContentDialog dialog = new(); - - dialog.XamlRoot = XamlRoot; - dialog.Style = Application.Current.Resources["DefaultContentDialogStyle"] as Style; - dialog.Title = CoreTools.Translate("Are you sure?"); - dialog.PrimaryButtonText = CoreTools.Translate("No"); - dialog.SecondaryButtonText = CoreTools.Translate("Yes"); - dialog.DefaultButton = ContentDialogButton.Primary; - - StackPanel p = new(); - p.Children.Add(new TextBlock { Text = CoreTools.Translate("Do you really want to uninstall the following {0} packages?", packages.Length), Margin = new Thickness(0, 0, 0, 5) }); - - string pkgList = ""; - foreach (Package package in packages) - pkgList += " ● " + package.Name + "\x0a"; - - TextBlock PackageListTextBlock = new() { FontFamily = new Microsoft.UI.Xaml.Media.FontFamily("Consolas"), Text = pkgList }; - p.Children.Add(new ScrollView { Content = PackageListTextBlock, MaxHeight = 200 }); - - dialog.Content = p; - - if (await MainApp.Instance.MainWindow.ShowDialogAsync(dialog) == ContentDialogResult.Secondary) + if (await MainApp.Instance.MainWindow.NavigationPage.ConfirmUninstallation(packages)) { foreach (Package package in packages) { From 279b481409a2cf9bf3500c2a5fcf63756707d454 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Sat, 22 Jun 2024 22:14:36 +0200 Subject: [PATCH 18/21] Improvements --- src/UniGetUI/Interface/MainWindow.xaml.cs | 11 +++-------- .../Interface/Pages/PackageDetailsPage.xaml.cs | 7 +++++-- .../Interface/SoftwarePages/DiscoverSoftwarePage.cs | 4 ++-- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/UniGetUI/Interface/MainWindow.xaml.cs b/src/UniGetUI/Interface/MainWindow.xaml.cs index 7f393274b..176a62876 100644 --- a/src/UniGetUI/Interface/MainWindow.xaml.cs +++ b/src/UniGetUI/Interface/MainWindow.xaml.cs @@ -13,6 +13,7 @@ using UniGetUI.Core.SettingsEngine; using UniGetUI.Core.Tools; using UniGetUI.Interface.Widgets; +using UniGetUI.PackageEngine; using UniGetUI.PackageEngine.PackageClasses; using Windows.ApplicationModel.DataTransfer; using Windows.Foundation.Collections; @@ -105,16 +106,10 @@ public void HandleNotificationActivation(ToastArguments args, ValueSet input) else if (args.Contains("action") && args["action"] == "openUniGetUIOnUpdatesTab") { NavigationPage.UpdatesNavButton.ForceClick(); - - if (NavigationPage != null && NavigationPage.InstalledPage != null) - _ = NavigationPage.InstalledPage.LoadPackages(); Activate(); } else { - - if (NavigationPage != null && NavigationPage.InstalledPage != null) - _ = NavigationPage.InstalledPage.LoadPackages(); Activate(); } Logger.Debug("Notification activated: " + args.ToString() + " " + input.ToString()); @@ -173,8 +168,8 @@ public async void HandleClosingEvent(AppWindow sender, AppWindowClosingEventArgs } SetForegroundWindow(GetWindowHandle()); - if (NavigationPage != null && NavigationPage.InstalledPage != null) - _ = NavigationPage.InstalledPage.LoadPackages(); + if (!PEInterface.InstalledPackagesLoader.IsLoading) + _ = PEInterface.InstalledPackagesLoader.ReloadPackages(); (this as Window).Activate(); } diff --git a/src/UniGetUI/Interface/Pages/PackageDetailsPage.xaml.cs b/src/UniGetUI/Interface/Pages/PackageDetailsPage.xaml.cs index 7764d7ddf..81222f84a 100644 --- a/src/UniGetUI/Interface/Pages/PackageDetailsPage.xaml.cs +++ b/src/UniGetUI/Interface/Pages/PackageDetailsPage.xaml.cs @@ -279,7 +279,7 @@ public async void LoadScreenshots() } - public void ActionButton_Click(object sender, RoutedEventArgs e) + public async void ActionButton_Click(object sender, RoutedEventArgs e) { Close?.Invoke(this, new EventArgs()); InstallOptionsPage.SaveToDisk(); @@ -288,9 +288,12 @@ public void ActionButton_Click(object sender, RoutedEventArgs e) case OperationType.Install: MainApp.Instance.AddOperationToList(new InstallPackageOperation(Package, InstallOptionsPage.Options)); break; + case OperationType.Uninstall: - MainApp.Instance.MainWindow.NavigationPage.InstalledPage.ConfirmAndUninstall(Package, InstallOptionsPage.Options); + if(await MainApp.Instance.MainWindow.NavigationPage.ConfirmUninstallation(Package)) + MainApp.Instance.AddOperationToList(new UninstallPackageOperation(Package, InstallOptionsPage.Options)); break; + case OperationType.Update: MainApp.Instance.AddOperationToList(new UpdatePackageOperation(Package, InstallOptionsPage.Options)); break; diff --git a/src/UniGetUI/Interface/SoftwarePages/DiscoverSoftwarePage.cs b/src/UniGetUI/Interface/SoftwarePages/DiscoverSoftwarePage.cs index 66cafbd4c..68c5a3fb2 100644 --- a/src/UniGetUI/Interface/SoftwarePages/DiscoverSoftwarePage.cs +++ b/src/UniGetUI/Interface/SoftwarePages/DiscoverSoftwarePage.cs @@ -15,12 +15,12 @@ namespace UniGetUI.Interface.SoftwarePages { - public class NewDiscoverSoftwarePage : AbstractPackagesPage + public class DiscoverSoftwarePage : AbstractPackagesPage { BetterMenuItem? MenuAsAdmin; BetterMenuItem? MenuInteractive; BetterMenuItem? MenuSkipHash; - public NewDiscoverSoftwarePage() + public DiscoverSoftwarePage() : base(new PackagesPageData() { DisableAutomaticPackageLoadOnStart = true, From baf6714c528d32eff4f5a52b74c36d785f104f0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Sat, 22 Jun 2024 22:16:35 +0200 Subject: [PATCH 19/21] Fix type --- src/UniGetUI/Interface/MainView.xaml.cs | 4 ++-- .../Interface/SoftwarePages/AbstractPackagesPage.xaml.cs | 8 -------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/UniGetUI/Interface/MainView.xaml.cs b/src/UniGetUI/Interface/MainView.xaml.cs index 8ddd9db9e..944d24b84 100644 --- a/src/UniGetUI/Interface/MainView.xaml.cs +++ b/src/UniGetUI/Interface/MainView.xaml.cs @@ -24,7 +24,7 @@ namespace UniGetUI.Interface public sealed partial class MainView : UserControl { public SettingsInterface SettingsPage; - public NewDiscoverSoftwarePage DiscoverPage; + public DiscoverSoftwarePage DiscoverPage; public SoftwareUpdatesPage UpdatesPage; public InstalledPackagesPage InstalledPage; public HelpDialog? HelpPage; @@ -42,7 +42,7 @@ public MainView() UpdatesBadge = __updates_count_badge; BundleBadge = __bundle_count_badge; OperationStackPanel = __operations_list_stackpanel; - DiscoverPage = new NewDiscoverSoftwarePage(); + DiscoverPage = new DiscoverSoftwarePage(); UpdatesPage = new SoftwareUpdatesPage(); UpdatesPage.ExternalCountBadge = UpdatesBadge; InstalledPage = new InstalledPackagesPage(); diff --git a/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs b/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs index a2a487f12..61c7f15be 100644 --- a/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs +++ b/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs @@ -272,14 +272,6 @@ protected AbstractPackagesPage(PackagesPageData data) _ = LoadPackages(ReloadReason.FirstRun); } - protected override void OnNavigatedFrom(NavigationEventArgs e) - { - Loader.StartedLoading -= Loader_StartedLoading; - Loader.FinishedLoading -= Loader_FinishedLoading; - Loader.PackagesChanged -= Loader_PackagesChanged; - base.OnNavigatedFrom(e); - } - private void Loader_PackagesChanged(object? sender, EventArgs e) { if (Loader.Packages.Count == 0) From ad3324e0261efe21adfdbdef3ebf3795db703a80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Sat, 22 Jun 2024 23:12:32 +0200 Subject: [PATCH 20/21] Allow UpgradablePackagesLoader to handle the autoupdate check (fix #1780), other improvements to PackageLoaders --- .../PEInterface.cs | 3 ++ .../AbstractPackageLoader.cs | 12 +++--- .../DiscoverablePackagesLoader.cs | 6 +-- .../InstalledPackagesLoader.cs | 3 +- .../UpgradablePackagesLoader.cs | 42 ++++++++++++++++++- .../AbstractPackagesPage.xaml.cs | 28 ++++++++++--- .../SoftwarePages/SoftwareUpdatesPage.cs | 16 +------ 7 files changed, 76 insertions(+), 34 deletions(-) diff --git a/src/UniGetUI.PackageEngine.PackageEngine/PEInterface.cs b/src/UniGetUI.PackageEngine.PackageEngine/PEInterface.cs index 14f40ce6b..824600d8a 100644 --- a/src/UniGetUI.PackageEngine.PackageEngine/PEInterface.cs +++ b/src/UniGetUI.PackageEngine.PackageEngine/PEInterface.cs @@ -54,6 +54,9 @@ public static async Task Initialize() } if (ManagersMetaTask.IsCompletedSuccessfully == false) Logger.Warn("Timeout: Not all package managers have finished initializing."); + + _ = UpgradablePackagesLoader.ReloadPackages(); + _ = InstalledPackagesLoader.ReloadPackages(); } } } diff --git a/src/UniGetUI.PackageEngine.PackageLoader/AbstractPackageLoader.cs b/src/UniGetUI.PackageEngine.PackageLoader/AbstractPackageLoader.cs index 8116ba720..9728fc1c7 100644 --- a/src/UniGetUI.PackageEngine.PackageLoader/AbstractPackageLoader.cs +++ b/src/UniGetUI.PackageEngine.PackageLoader/AbstractPackageLoader.cs @@ -44,14 +44,14 @@ public abstract class AbstractPackageLoader private int LoadOperationIdentifier = 0; protected IEnumerable Managers { get; private set; } - public AbstractPackageLoader(IEnumerable managers, bool AllowMultiplePackageVersions = false) + public AbstractPackageLoader(IEnumerable managers, string identifier, bool AllowMultiplePackageVersions = false) { Managers = managers; Packages = new ObservableCollection(); PackageReference = new Dictionary(); IsLoaded = false; IsLoading = false; - LOADER_IDENTIFIER = "ABSTRACT"; + LOADER_IDENTIFIER = identifier; } /// @@ -59,8 +59,6 @@ public AbstractPackageLoader(IEnumerable managers, bool AllowMul /// public void StopLoading() { - if (!IsLoading) return; - LoadOperationIdentifier = -1; IsLoaded = false; IsLoading = false; @@ -73,7 +71,7 @@ public void StopLoading() /// public virtual async Task ReloadPackages() { - StopLoading(); + ClearPackages(); LoadOperationIdentifier = new Random().Next(); int current_identifier = LoadOperationIdentifier; IsLoading = true; @@ -120,10 +118,10 @@ public virtual async Task ReloadPackages() if (LoadOperationIdentifier == current_identifier) { - IsLoading = false; FinishedLoading?.Invoke(this, new EventArgs()); IsLoaded = true; } + IsLoading = false; } /// @@ -131,9 +129,11 @@ public virtual async Task ReloadPackages() /// public void ClearPackages() { + StopLoading(); Packages.Clear(); PackageReference.Clear(); IsLoaded = false; + IsLoading = false; PackagesChanged?.Invoke(this, new EventArgs()); } diff --git a/src/UniGetUI.PackageEngine.PackageLoader/DiscoverablePackagesLoader.cs b/src/UniGetUI.PackageEngine.PackageLoader/DiscoverablePackagesLoader.cs index 8822f02a4..7b4fbd94b 100644 --- a/src/UniGetUI.PackageEngine.PackageLoader/DiscoverablePackagesLoader.cs +++ b/src/UniGetUI.PackageEngine.PackageLoader/DiscoverablePackagesLoader.cs @@ -15,10 +15,8 @@ public class DiscoverablePackagesLoader : AbstractPackageLoader private string QUERY_TEXT = string.Empty; public DiscoverablePackagesLoader(IEnumerable managers) - : base(managers, AllowMultiplePackageVersions: false) - { - LOADER_IDENTIFIER = "DISCOVERABLE_PACKAGES"; - } + : base(managers, "DISCOVERABLE_PACKAGES", AllowMultiplePackageVersions: false) + { } public async Task ReloadPackages(string query) { diff --git a/src/UniGetUI.PackageEngine.PackageLoader/InstalledPackagesLoader.cs b/src/UniGetUI.PackageEngine.PackageLoader/InstalledPackagesLoader.cs index 10f04f437..af87a8a3e 100644 --- a/src/UniGetUI.PackageEngine.PackageLoader/InstalledPackagesLoader.cs +++ b/src/UniGetUI.PackageEngine.PackageLoader/InstalledPackagesLoader.cs @@ -7,9 +7,8 @@ namespace UniGetUI.PackageEngine.PackageLoader public class InstalledPackagesLoader : AbstractPackageLoader { public InstalledPackagesLoader(IEnumerable managers) - : base(managers, AllowMultiplePackageVersions: true) + : base(managers, "INSTALLED_PACKAGES", AllowMultiplePackageVersions: true) { - LOADER_IDENTIFIER = "INSTALLED_PACKAGES"; } #pragma warning disable diff --git a/src/UniGetUI.PackageEngine.PackageLoader/UpgradablePackagesLoader.cs b/src/UniGetUI.PackageEngine.PackageLoader/UpgradablePackagesLoader.cs index 772e79736..bf9ea41a6 100644 --- a/src/UniGetUI.PackageEngine.PackageLoader/UpgradablePackagesLoader.cs +++ b/src/UniGetUI.PackageEngine.PackageLoader/UpgradablePackagesLoader.cs @@ -2,20 +2,29 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using System.Timers; using System.Threading.Tasks; +using UniGetUI.Core.Classes; +using UniGetUI.Core.Logging; +using UniGetUI.Core.SettingsEngine; using UniGetUI.Interface.Enums; using UniGetUI.PackageEngine.ManagerClasses.Manager; using UniGetUI.PackageEngine.PackageClasses; +using Windows.System; namespace UniGetUI.PackageEngine.PackageLoader { public class UpgradablePackagesLoader : AbstractPackageLoader { + + System.Timers.Timer? UpdatesTimer; + public UpgradablePackagesLoader(IEnumerable managers) - : base(managers, AllowMultiplePackageVersions: false) + : base(managers, "DISCOVERABLE_PACKAGES", AllowMultiplePackageVersions: false) { - LOADER_IDENTIFIER = "DISCOVERABLE_PACKAGES"; + FinishedLoading += (s, e) => StartAutoCheckTimeout(); } + protected override async Task IsPackageValid(Package package) { if (await package.HasUpdatesIgnoredAsync(package.NewVersion)) @@ -38,5 +47,34 @@ protected override async Task WhenAddingPackage(Package package) package.GetInstalledPackage()?.SetTag(PackageTag.IsUpgradable); } #pragma warning restore + + protected void StartAutoCheckTimeout() + { + if (!Settings.Get("DisableAutoCheckforUpdates")) + { + long waitTime = 3600; + try + { + waitTime = long.Parse(Settings.GetValue("UpdatesCheckInterval")); + Logger.Debug($"Starting check for updates wait interval with waitTime={waitTime}"); + } + catch + { + Logger.Debug("Invalid value for UpdatesCheckInterval, using default value of 3600 seconds"); + } + + if (UpdatesTimer != null) + { + UpdatesTimer.Stop(); + UpdatesTimer.Dispose(); + } + + UpdatesTimer = new System.Timers.Timer(waitTime * 1000); + UpdatesTimer.Enabled = false; + UpdatesTimer.AutoReset = false; + UpdatesTimer.Elapsed += (s, e) => _ = ReloadPackages(); + UpdatesTimer.Start(); + } + } } } diff --git a/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs b/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs index 61c7f15be..150f4a933 100644 --- a/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs +++ b/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs @@ -82,7 +82,6 @@ protected enum ReloadReason private bool AllSelected = true; int lastSavedWidth = 0; - protected abstract Task WhenPackagesLoaded(ReloadReason reason); protected abstract void WhenPackageCountUpdated(); protected abstract void WhenShowingContextMenu(Package package); @@ -142,12 +141,12 @@ protected AbstractPackagesPage(PackagesPageData data) else { Loader_FinishedLoading(this, EventArgs.Empty); + FilterPackages(QueryBlock.Text); } LastPackageLoadTime = DateTime.Now; QueryBothRadio.IsChecked = true; QueryOptionsGroup.SelectedIndex = 2; - LoadingProgressBar.Visibility = Visibility.Collapsed; Initialized = true; LocalPackagesNode = new TreeViewNode { Content = CoreTools.Translate("Local"), IsExpanded = false }; @@ -269,11 +268,17 @@ protected AbstractPackagesPage(PackagesPageData data) }; LoadInterface(); - _ = LoadPackages(ReloadReason.FirstRun); } private void Loader_PackagesChanged(object? sender, EventArgs e) { + // Ensure we are in the UI thread + if(Microsoft.UI.Dispatching.DispatcherQueue.GetForCurrentThread() == null) + { + DispatcherQueue.TryEnqueue(() => Loader_PackagesChanged(sender, e)); + return; + } + if (Loader.Packages.Count == 0) { ClearPackageList(); @@ -283,20 +288,33 @@ private void Loader_PackagesChanged(object? sender, EventArgs e) foreach (var package in Loader.Packages) AddPackageToSourcesList(package); } - - UpdatePackageCount(); FilterPackages(QueryBlock.Text); } private void Loader_FinishedLoading(object? sender, EventArgs e) { + // Ensure we are in the UI thread + if (Microsoft.UI.Dispatching.DispatcherQueue.GetForCurrentThread() == null) + { + DispatcherQueue.TryEnqueue(() => Loader_FinishedLoading(sender, e)); + return; + } + LoadingProgressBar.Visibility = Visibility.Collapsed; + LastPackageLoadTime = DateTime.Now; + WhenPackagesLoaded(ReloadReason.External); UpdatePackageCount(); FilterPackages(QueryBlock.Text); } private void Loader_StartedLoading(object? sender, EventArgs e) { + // Ensure we are in the UI thread + if (Microsoft.UI.Dispatching.DispatcherQueue.GetForCurrentThread() == null) + { + DispatcherQueue.TryEnqueue(() => Loader_StartedLoading(sender, e)); + return; + } LoadingProgressBar.Visibility = Visibility.Visible; UpdatePackageCount(); } diff --git a/src/UniGetUI/Interface/SoftwarePages/SoftwareUpdatesPage.cs b/src/UniGetUI/Interface/SoftwarePages/SoftwareUpdatesPage.cs index 11d67d56a..80ceda721 100644 --- a/src/UniGetUI/Interface/SoftwarePages/SoftwareUpdatesPage.cs +++ b/src/UniGetUI/Interface/SoftwarePages/SoftwareUpdatesPage.cs @@ -414,21 +414,7 @@ protected override async Task WhenPackagesLoaded(ReloadReason reason) } } - if (!Settings.Get("DisableAutoCheckforUpdates") && reason != ReloadReason.Manual && reason != ReloadReason.External) - { - long waitTime = 3600; - try - { - waitTime = long.Parse(Settings.GetValue("UpdatesCheckInterval")); - Logger.Debug($"Starting check for updates wait interval with waitTime={waitTime}"); - } - catch - { - Logger.Debug("Invalid value for UpdatesCheckInterval, using default value of 3600 seconds"); - } - await Task.Delay(TimeSpan.FromSeconds(waitTime)); - _ = LoadPackages(ReloadReason.Automated); - } + /**/ } private void MenuInstall_Invoked(object sender, RoutedEventArgs e) From 6ba6c24ea892ec29bf28b0e6aabfb88c23c27e6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Sun, 23 Jun 2024 00:16:26 +0200 Subject: [PATCH 21/21] Improvements --- src/UniGetUI/Interface/MainView.xaml.cs | 24 +++++++++---------- .../Pages/IPageWithKeyboardShortcuts.cs | 13 ++++++++++ 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/UniGetUI/Interface/MainView.xaml.cs b/src/UniGetUI/Interface/MainView.xaml.cs index 944d24b84..63f026cff 100644 --- a/src/UniGetUI/Interface/MainView.xaml.cs +++ b/src/UniGetUI/Interface/MainView.xaml.cs @@ -120,20 +120,17 @@ public MainView() { MainApp.Instance.MainWindow.Close(); } - else if(CurrentPage is IPageWithKeyboardShortcuts) + else if (e.Key == Windows.System.VirtualKey.F5 || (IS_CONTROL_PRESSED && e.Key == Windows.System.VirtualKey.R)) { - if (e.Key == Windows.System.VirtualKey.F5 || (IS_CONTROL_PRESSED && e.Key == Windows.System.VirtualKey.R)) - { - (CurrentPage as IPageWithKeyboardShortcuts)?.ReloadTriggered(); - } - else if (IS_CONTROL_PRESSED && e.Key == Windows.System.VirtualKey.F) - { - (CurrentPage as IPageWithKeyboardShortcuts)?.SearchTriggered(); - } - else if (IS_CONTROL_PRESSED && e.Key == Windows.System.VirtualKey.A) - { - (CurrentPage as IPageWithKeyboardShortcuts)?.SelectAllTriggered(); - } + (CurrentPage as IPageWithKeyboardShortcuts)?.ReloadTriggered(); + } + else if (IS_CONTROL_PRESSED && e.Key == Windows.System.VirtualKey.F) + { + (CurrentPage as IPageWithKeyboardShortcuts)?.SearchTriggered(); + } + else if (IS_CONTROL_PRESSED && e.Key == Windows.System.VirtualKey.A) + { + (CurrentPage as IPageWithKeyboardShortcuts)?.SelectAllTriggered(); } }; } @@ -418,6 +415,7 @@ private void NavigateToPage(Page TargetPage) foreach (Page page in PageButtonReference.Keys) page.Visibility = (page == TargetPage) ? Visibility.Visible : Visibility.Collapsed; + OldPage = CurrentPage; CurrentPage = TargetPage; if (CurrentPage == DiscoverPage) diff --git a/src/UniGetUI/Interface/Pages/IPageWithKeyboardShortcuts.cs b/src/UniGetUI/Interface/Pages/IPageWithKeyboardShortcuts.cs index 3245505e2..3474f34e5 100644 --- a/src/UniGetUI/Interface/Pages/IPageWithKeyboardShortcuts.cs +++ b/src/UniGetUI/Interface/Pages/IPageWithKeyboardShortcuts.cs @@ -7,12 +7,25 @@ namespace UniGetUI.Interface.Pages { + /// + /// Any object that can perform any of the following listed actions should + /// implement this class, to allow proper keyboard bindings on the interface. + /// interface IPageWithKeyboardShortcuts { + /// + /// Handles when a search-like automation was triggered (Ctrl+F, etc.) + /// public void SearchTriggered(); + /// + /// Handles when a reload/refresh-like automation was triggered (F5, Ctrl+R, etc) + /// public void ReloadTriggered(); + /// + /// Handles when a select-like automation was triggered (Ctrl+A, etc.) + /// public void SelectAllTriggered(); } }