Skip to content

More efficient package filtering and fetching on packages page #3597

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Apr 26, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 12 additions & 13 deletions src/UniGetUI.Core.Classes/SortableObservableCollection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,22 +14,21 @@ public class SortableObservableCollection<T> : ObservableCollection<T> where T :

protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
if (!BlockSorting)
{
base.OnCollectionChanged(e);
if (SortingSelector is null
|| e.Action == NotifyCollectionChangedAction.Remove
|| e.Action == NotifyCollectionChangedAction.Reset)
{
return;
}

Sort();
}
if (BlockSorting)
return;

base.OnCollectionChanged(e);
if (SortingSelector is null || e.Action is NotifyCollectionChangedAction.Remove or NotifyCollectionChangedAction.Reset)
return;

Sort();
}

public void Sort()
{
if (BlockSorting)
return;

BlockSorting = true;

if (SortingSelector is null)
Expand All @@ -45,7 +44,7 @@ public void Sort()

for (int i = 0; i < Count; i++)
{
this[i].Index = i;
this.ElementAt(i).Index = i;
}

BlockSorting = false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
"es": "Spanish - Castellano",
"fa": "Persian - فارسی‎",
"fi": "Finnish - Suomi",
"fil": "Filipino - Filipino",
"fr": "French - Français",
"gu": "Gujarati - ગુજરાતી",
"hi": "Hindi - हिंदी",
Expand Down
1 change: 1 addition & 0 deletions src/UniGetUI.Core.Tools/Tools.cs
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,7 @@ public static string RandomString(int length)

public static void ReportFatalException(Exception e)
{
Debugger.Break();
string LangName = "Unknown";
try
{
Expand Down
30 changes: 22 additions & 8 deletions src/UniGetUI.PackageEngine.PackageLoader/AbstractPackageLoader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,20 @@

namespace UniGetUI.PackageEngine.PackageLoader
{
public class PackagesChangedEvent
{
public PackagesChangedEvent(bool proceduralChange, IReadOnlyList<IPackage> addedPackages, IReadOnlyList<IPackage> removedPackages)
{
ProceduralChange = proceduralChange;
AddedPackages = addedPackages;
RemovedPackages = removedPackages;
}

public readonly bool ProceduralChange;
public readonly IReadOnlyList<IPackage> AddedPackages;
public readonly IReadOnlyList<IPackage> RemovedPackages;
}

public abstract class AbstractPackageLoader
{
/// <summary>
Expand Down Expand Up @@ -34,7 +48,7 @@ public List<IPackage> Packages
/// <summary>
/// Fires when a block of packages (one package or more) is added or removed to the loader
/// </summary>
public event EventHandler<EventArgs>? PackagesChanged;
public event EventHandler<PackagesChangedEvent>? PackagesChanged;

/// <summary>
/// Fires when the loader finishes fetching packages
Expand Down Expand Up @@ -85,9 +99,9 @@ public void StopLoading(bool emitFinishSignal = true)
if (emitFinishSignal) InvokeFinishedLoadingEvent();
}

protected void InvokePackagesChangedEvent()
protected void InvokePackagesChangedEvent(bool proceduralChange, IReadOnlyList<IPackage> toAdd, IReadOnlyList<IPackage> toRemove)
{
PackagesChanged?.Invoke(this, EventArgs.Empty);
PackagesChanged?.Invoke(this, new(proceduralChange, toAdd, toRemove));
}

protected void InvokeStartedLoadingEvent()
Expand All @@ -107,7 +121,7 @@ public virtual async Task ReloadPackages()
{
if (DISABLE_RELOAD)
{
InvokePackagesChangedEvent();
InvokePackagesChangedEvent(false, [], []);
return;
}

Expand Down Expand Up @@ -156,7 +170,7 @@ public virtual async Task ReloadPackages()
AddPackage(package);
await WhenAddingPackage(package);
}
InvokePackagesChangedEvent();
InvokePackagesChangedEvent(true, task.Result.ToArray(), []);
}
tasks.Remove(task);
}
Expand All @@ -180,7 +194,7 @@ public void ClearPackages(bool emitFinishSignal = true)
PackageReference.Clear();
IsLoaded = false;
IsLoading = false;
InvokePackagesChangedEvent();
InvokePackagesChangedEvent(false, [], []);
}

/// <summary>
Expand Down Expand Up @@ -245,7 +259,7 @@ public void AddForeign(IPackage? package)
}

AddPackage(package);
InvokePackagesChangedEvent();
InvokePackagesChangedEvent(true, [package], []);
}

/// <summary>
Expand All @@ -264,7 +278,7 @@ public void Remove(IPackage? package)
}

PackageReference.Remove(HashPackage(package), out IPackage? _);
InvokePackagesChangedEvent();
InvokePackagesChangedEvent(true, [], [package]);
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ public async Task ReloadPackagesSilently()
await WhenAddingPackage(package);
}
}
InvokePackagesChangedEvent();
InvokePackagesChangedEvent(true, task.Result.ToArray(), []);
}
tasks.Remove(task);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ public async Task AddPackagesAsync(IReadOnlyList<IPackage> foreign_packages)
}
if (package is not null && !Contains(package)) AddPackage(package);
}
InvokePackagesChangedEvent();
InvokePackagesChangedEvent(true, foreign_packages, []);
}

public void RemoveRange(IReadOnlyList<IPackage> packages)
Expand All @@ -83,7 +83,7 @@ public void RemoveRange(IReadOnlyList<IPackage> packages)
if (!Contains(package)) continue;
PackageReference.Remove(HashPackage(package), out IPackage? _);
}
InvokePackagesChangedEvent();
InvokePackagesChangedEvent(true, [], packages);
}
}
}
8 changes: 8 additions & 0 deletions src/UniGetUI/CLIHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ public static class CLIHandler
public const string HELP = "--help";
public const string DAEMON = "--daemon";
public const string MIGRATE_WINGETUI_TO_UNIGETUI = "--migrate-wingetui-to-unigetui";
public const string UNINSTALL_WINGETUI = "--uninstall-wingetui";
public const string UNINSTALL_UNIGETUI = "--uninstall-unigetui";

public const string IMPORT_SETTINGS = "--import-settings";
public const string EXPORT_SETTINGS = "--export-settings";
Expand Down Expand Up @@ -221,4 +223,10 @@ public static int WingetUIToUniGetUIMigrator()
return ex.HResult;
}
}

public static int UninstallUniGetUI()
{
// There is currently no uninstall logic. However, this needs to be maintained, or otherwhise UniGetUI will launch on uninstall
return 0;
}
}
23 changes: 15 additions & 8 deletions src/UniGetUI/Controls/ObservablePackageCollection.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using UniGetUI.Core.Classes;
using UniGetUI.Interface;
using UniGetUI.PackageEngine.Interfaces;

namespace UniGetUI.PackageEngine.PackageClasses
Expand All @@ -26,14 +25,22 @@ public ObservablePackageCollection()
SortingSelector = x => x.Package.Name;
}

/// <summary>
/// Add a package to the collection
/// </summary>
public void Add(IPackage p, AbstractPackagesPage page)
public void FromRange(IReadOnlyList<PackageWrapper> packages)
{
base.Add(new PackageWrapper(p, page));
BlockSorting = true;

// Clear the list
Clear();

// Add all packages
foreach (var w in packages)
Add(w);

BlockSorting = false;
Sort();
}


/// <summary>
/// Sets the property with which to filter the package and sorts the collection
/// </summary>
Expand Down Expand Up @@ -120,7 +127,7 @@ public void SelectAll()
{
foreach (PackageWrapper wrapper in this)
{
wrapper.Package.IsChecked = true;
wrapper.IsChecked = true;
}
}

Expand All @@ -131,7 +138,7 @@ public void ClearSelection()
{
foreach (PackageWrapper wrapper in this)
{
wrapper.Package.IsChecked = false;
wrapper.IsChecked = false;
}
}
}
Expand Down
6 changes: 5 additions & 1 deletion src/UniGetUI/Controls/PackageWrapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,11 @@ public static void ResetIconCache()
public bool IsChecked
{
get => Package.IsChecked;
set => Package.IsChecked = value;
set
{
Package.IsChecked = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsChecked)));
}
}

public bool IconWasLoaded;
Expand Down
5 changes: 5 additions & 0 deletions src/UniGetUI/EntryPoint.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,11 @@ private static void Main(string[] args)
int ret = CLIHandler.WingetUIToUniGetUIMigrator();
Environment.Exit(ret);
}
else if (args.Contains(CLIHandler.UNINSTALL_UNIGETUI) || args.Contains(CLIHandler.UNINSTALL_WINGETUI))
{
int ret = CLIHandler.UninstallUniGetUI();
Environment.Exit(ret);
}
else if (args.Contains(CLIHandler.IMPORT_SETTINGS))
{
int ret = CLIHandler.ImportSettings();
Expand Down
Loading
Loading