Skip to content

Commit 8bac9e3

Browse files
authored
Merge pull request #3551 from marticliment/package-grid
2 parents b1629a6 + 3b1a62f commit 8bac9e3

20 files changed

Lines changed: 1493 additions & 939 deletions

src/Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<ImplicitUsings>enable</ImplicitUsings>
44
<TargetFramework>net8.0-windows10.0.26100.0</TargetFramework>
55
<TargetPlatformMinVersion>10.0.19041.0</TargetPlatformMinVersion>
6-
<WindowsSdkPackageVersion>10.0.26100.57</WindowsSdkPackageVersion>
6+
<WindowsSdkPackageVersion>10.0.26100.56</WindowsSdkPackageVersion>
77
<SdkVersion>8.0.407</SdkVersion>
88
<Authors>Martí Climent and the contributors</Authors>
99
<PublisherName>Martí Climent</PublisherName>

src/UniGetUI.PackageEngine.PackageLoader/DiscoverablePackagesLoader.cs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using UniGetUI.Core.Logging;
12
using UniGetUI.Core.Tools;
23
using UniGetUI.Interface.Enums;
34
using UniGetUI.PackageEngine.Interfaces;
@@ -66,5 +67,46 @@ protected override Task WhenAddingPackage(IPackage package)
6667
}
6768
return Task.CompletedTask;
6869
}
70+
71+
public (IPackage?, string?) GetPackageFromIdAndManager(string id, string managerName, string sourceName)
72+
{
73+
IPackageManager? manager = null;
74+
75+
foreach (var candidate in Managers)
76+
{
77+
if (candidate.Name == managerName || candidate.DisplayName == managerName)
78+
{
79+
manager = candidate;
80+
break;
81+
}
82+
}
83+
84+
if (manager is null)
85+
return (null, CoreTools.Translate("The package manager \"{0}\" was not found", managerName));
86+
87+
if (!manager.IsEnabled())
88+
return (null, CoreTools.Translate("The package manager \"{0}\" is disabled", manager.DisplayName));
89+
90+
if (!manager.Status.Found)
91+
return (null, CoreTools.Translate("There is an error with the configuration of the package manager \"{0}\"", manager.DisplayName));
92+
93+
var results = manager.FindPackages(id);
94+
var candidates = results.Where(p => p.Id == id).ToArray();
95+
96+
if (candidates.Length == 0)
97+
return (null, CoreTools.Translate("The package \"{0}\" was not found on the package manager \"{1}\"", id, manager.DisplayName));
98+
99+
IPackage package = candidates[0];
100+
101+
// Get package from best source
102+
if (candidates.Length >= 1 && manager.Capabilities.SupportsCustomSources)
103+
foreach (var candidate in candidates)
104+
{
105+
if (candidate.Source.Name == sourceName)
106+
package = candidate;
107+
}
108+
109+
return (package, null);
110+
}
69111
}
70112
}

src/UniGetUI/App.xaml

Lines changed: 628 additions & 0 deletions
Large diffs are not rendered by default.

src/UniGetUI/App.xaml.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
using UniGetUI.Interface.Telemetry;
1919
using UniGetUI.PackageEngine.Interfaces;
2020
using LaunchActivatedEventArgs = Microsoft.UI.Xaml.LaunchActivatedEventArgs;
21+
using UniGetUI.Pages.DialogPages;
22+
using UniGetUI.Interface.Enums;
2123

2224
namespace UniGetUI
2325
{
@@ -227,23 +229,22 @@ private async Task LoadComponentsAsync()
227229

228230
BackgroundApi.OnShowSharedPackage += (_, package) => MainWindow.DispatcherQueue.TryEnqueue(() =>
229231
{
230-
MainWindow?.NavigationPage?.DiscoverPage.ShowSharedPackage_ThreadSafe(package.Key, package.Value);
231-
MainWindow?.Activate();
232+
DialogHelper.ShowSharedPackage_ThreadSafe(package.Key, package.Value);
232233
});
233234

234235
BackgroundApi.OnUpgradeAll += (_, _) => MainWindow.DispatcherQueue.TryEnqueue(() =>
235236
{
236-
MainWindow?.NavigationPage?.UpdatesPage.UpdateAll();
237+
Operations.UpdateAll();
237238
});
238239

239-
BackgroundApi.OnUpgradeAllForManager += (_, manager) => MainWindow.DispatcherQueue.TryEnqueue(() =>
240+
BackgroundApi.OnUpgradeAllForManager += (_, managerName) => MainWindow.DispatcherQueue.TryEnqueue(async () =>
240241
{
241-
MainWindow?.NavigationPage?.UpdatesPage.UpdateAllPackagesForManager(manager);
242+
Operations.UpdateAllForManager(managerName);
242243
});
243244

244-
BackgroundApi.OnUpgradePackage += (_, package) => MainWindow.DispatcherQueue.TryEnqueue(() =>
245+
BackgroundApi.OnUpgradePackage += (_, packageId) => MainWindow.DispatcherQueue.TryEnqueue(() =>
245246
{
246-
MainWindow?.NavigationPage?.UpdatesPage.UpdatePackageForId(package);
247+
Operations.UpdateForId(packageId);
247248
});
248249

249250
_ = BackgroundApi.Start();

src/UniGetUI/AppOperationHelper.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
using UniGetUI.PackageEngine.PackageClasses;
1616
using UniGetUI.PackageOperations;
1717
using UniGetUI.Pages.DialogPages;
18+
using UniGetUI.Interface.Enums;
19+
using UniGetUI.PackageEngine;
1820

1921
namespace UniGetUI;
2022

@@ -163,6 +165,38 @@ public static void Update(IReadOnlyList<IPackage> packages, bool? elevated = nul
163165
}
164166
}
165167

168+
public static async void UpdateAll()
169+
{
170+
foreach (IPackage package in PEInterface.UpgradablePackagesLoader.Packages)
171+
if (package.Tag is not PackageTag.BeingProcessed and not PackageTag.OnQueue)
172+
await Update(package);
173+
}
174+
175+
public static async void UpdateAllForManager(string managerName)
176+
{
177+
foreach (IPackage package in PEInterface.UpgradablePackagesLoader.Packages)
178+
{
179+
if (package.Tag is not PackageTag.OnQueue and not PackageTag.BeingProcessed
180+
&& package.Manager.Name == managerName || package.Manager.DisplayName == managerName)
181+
await Update(package);
182+
}
183+
}
184+
185+
public static async void UpdateForId(string packageId)
186+
{
187+
foreach (IPackage package in PEInterface.UpgradablePackagesLoader.Packages)
188+
{
189+
if (package.Id == packageId)
190+
{
191+
await Update(package);
192+
Logger.Info($"[WIDGETS] Updating package with id {packageId}");
193+
return;
194+
}
195+
}
196+
197+
Logger.Warn($"[WIDGETS] No package with id={packageId} was found");
198+
}
199+
166200
/*
167201
* PACKAGE UNINSTALL
168202
*/

src/UniGetUI/Controls/LocalIcon.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Diagnostics;
12
using Microsoft.UI.Xaml;
23
using Microsoft.UI.Xaml.Controls;
34
using Microsoft.UI.Xaml.Media;
@@ -25,6 +26,38 @@ public LocalIcon(IconType icon) : this()
2526
}
2627
}
2728

29+
public static class IconBuilder
30+
{
31+
private static FontFamily customFont = null!;
32+
private static FontFamily symbolFont = null!;
33+
34+
public static IconType SetIcon(this TextBlock block, IconType icon)
35+
{
36+
customFont ??= (FontFamily)Application.Current.Resources["SymbolFont"];
37+
block.Text = $"{(char)icon}";
38+
block.FontFamily = customFont;
39+
return icon;
40+
}
41+
42+
public static IconType GetIcon(this TextBlock block)
43+
{
44+
return IconType.Help;
45+
}
46+
47+
public static string SetGlyph(this TextBlock block, string glyph)
48+
{
49+
symbolFont ??= new FontFamily("Segoe Fluent Icons");
50+
block.Text = glyph;
51+
block.FontFamily = symbolFont;
52+
return glyph;
53+
}
54+
55+
public static string GetGlyph(this TextBlock block)
56+
{
57+
return block.Text;
58+
}
59+
}
60+
2861
public partial class LocalIconSource : FontIconSource
2962
{
3063
public static FontFamily font = (FontFamily)Application.Current.Resources["SymbolFont"];

src/UniGetUI/Controls/MenuForPackage.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,28 @@ public BetterMenuItem()
3838
Style = menuStyle;
3939
}
4040
}
41+
42+
public partial class BetterToggleMenuItem : ToggleMenuFlyoutItem
43+
{
44+
private readonly Style menuStyle = (Style)Application.Current.Resources["BetterToggleMenuItem"];
45+
46+
public IconType IconName
47+
{
48+
set
49+
{
50+
var icon = new LocalIcon(value) { FontSize = 24 };
51+
Icon = icon;
52+
}
53+
}
54+
55+
public new string Text
56+
{
57+
set => base.Text = CoreTools.Translate(value);
58+
}
59+
60+
public BetterToggleMenuItem()
61+
{
62+
Style = menuStyle;
63+
}
64+
}
4165
}

src/UniGetUI/Controls/ObservablePackageCollection.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using UniGetUI.Core.Classes;
2+
using UniGetUI.Interface;
23
using UniGetUI.PackageEngine.Interfaces;
34

45
namespace UniGetUI.PackageEngine.PackageClasses
@@ -17,26 +18,30 @@ public enum Sorter
1718
NewVersion,
1819
Source,
1920
}
21+
public Sorter CurrentSorter { get; private set; }
2022

2123
public ObservablePackageCollection()
2224
{
25+
CurrentSorter = Sorter.Name;
2326
SortingSelector = x => x.Package.Name;
2427
}
2528

2629
/// <summary>
2730
/// Add a package to the collection
2831
/// </summary>
29-
public void Add(IPackage p)
32+
public void Add(IPackage p, AbstractPackagesPage page)
3033
{
31-
base.Add(new PackageWrapper(p));
34+
base.Add(new PackageWrapper(p, page));
3235
}
3336

3437
/// <summary>
3538
/// Sets the property with which to filter the package and sorts the collection
3639
/// </summary>
3740
/// <param name="field">The field with which to sort the collection</param>
41+
///
3842
public void SetSorter(Sorter field)
3943
{
44+
CurrentSorter = field;
4045
switch (field)
4146
{
4247
case Sorter.Checked:

src/UniGetUI/Controls/PackageWrapper.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using Microsoft.UI.Xaml.Media.Imaging;
66
using UniGetUI.Core.Classes;
77
using UniGetUI.Core.Tools;
8+
using UniGetUI.Interface;
89
using UniGetUI.Interface.Enums;
910
using UniGetUI.PackageEngine.Interfaces;
1011

@@ -32,6 +33,7 @@ public bool IsChecked
3233
public bool AlternateIdIconVisible;
3334
public bool ShowCustomPackageIcon;
3435
public bool ShowDefaultPackageIcon = true;
36+
public string VersionComboString;
3537
public IconType MainIconId = IconType.Id;
3638
public IconType AlternateIconId = IconType.Id;
3739
public ImageSource? MainIconSource;
@@ -57,13 +59,22 @@ public Uri? PackageIcon
5759
public IPackage Package { get; private set; }
5860
public PackageWrapper Self { get; private set; }
5961

60-
public PackageWrapper(IPackage package)
62+
private readonly AbstractPackagesPage _page;
63+
64+
public PackageWrapper(IPackage package, AbstractPackagesPage page)
6165
{
6266
Package = package;
6367
Self = this;
68+
_page = page;
6469
WhenTagHasChanged();
6570
Package.PropertyChanged += Package_PropertyChanged;
6671
UpdatePackageIcon();
72+
VersionComboString = package.IsUpgradable ? $"{package.VersionString} -> {package.NewVersionString}" : package.VersionString;
73+
}
74+
75+
public async void RightClick()
76+
{
77+
await _page.ShowContextMenu(this);
6778
}
6879

6980
public void Package_PropertyChanged(object? sender, PropertyChangedEventArgs e)
@@ -167,7 +178,7 @@ public void UpdatePackageIcon()
167178
MainIconSource = new BitmapImage
168179
{
169180
UriSource = icon,
170-
DecodePixelWidth = 24,
181+
DecodePixelWidth = 64,
171182
DecodePixelType = DecodePixelType.Logical,
172183
};
173184
ShowCustomPackageIcon = true;

src/UniGetUI/MainWindow.xaml.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ public void HandleNotificationActivation(AppNotificationActivatedEventArgs args)
265265

266266
if (action == NotificationArguments.UpdateAllPackages)
267267
{
268-
NavigationPage.UpdatesPage.UpdateAll();
268+
MainApp.Operations.UpdateAll();
269269
}
270270
else if (action == NotificationArguments.ShowOnUpdatesTab)
271271
{
@@ -360,11 +360,11 @@ private void HandleDeepLink(string link)
360360
if (Id != "" && CombinedManagerName != "" && ManagerName == "" && SourceName == "")
361361
{
362362
Logger.Warn($"URI {link} follows old scheme");
363-
NavigationPage.DiscoverPage.ShowSharedPackage_ThreadSafe(Id, CombinedManagerName);
363+
DialogHelper.ShowSharedPackage_ThreadSafe(Id, CombinedManagerName);
364364
}
365365
else if (Id != "" && ManagerName != "" && SourceName != "")
366366
{
367-
NavigationPage.DiscoverPage.ShowSharedPackage_ThreadSafe(Id, ManagerName, SourceName);
367+
DialogHelper.ShowSharedPackage_ThreadSafe(Id, ManagerName, SourceName);
368368
}
369369
else
370370
{
@@ -437,8 +437,7 @@ public void ProcessCommandLineParameters()
437437
{
438438
// Handle potential JSON files
439439
Logger.ImportantInfo("Begin attempt to open the package bundle " + param);
440-
NavigationPage.NavigateTo(PageType.Bundles);
441-
_ = NavigationPage.BundlesPage.OpenFromFile(param);
440+
NavigationPage.LoadBundleFile(param);
442441
}
443442
else if (param.EndsWith("UniGetUI.exe") || param.EndsWith("UniGetUI.dll"))
444443
{

0 commit comments

Comments
 (0)