diff --git a/src/Languages/lang_en.json b/src/Languages/lang_en.json index 3cfc3babf2..35823ddbfa 100644 --- a/src/Languages/lang_en.json +++ b/src/Languages/lang_en.json @@ -80,6 +80,7 @@ "Do you really want to uninstall the following {0} packages?": "Do you really want to uninstall the following {0} packages?", "No": "No", "Yes": "Yes", + "Partial": "Partial", "View on UniGetUI": "View on UniGetUI", "Update": "Update", "Open UniGetUI": "Open UniGetUI", @@ -524,6 +525,7 @@ "e.g. 10": "e.g. 10", "Custom minimum age (days)": "Custom minimum age (days)", "{pm} does not provide release dates for its packages, so this setting will have no effect": "{pm} does not provide release dates for its packages, so this setting will have no effect", + "{pm} only provides release dates for some of its packages, so this setting will only apply to those packages": "{pm} only provides release dates for some of its packages, so this setting will only apply to those packages", "Override the global minimum update age for this package manager": "Override the global minimum update age for this package manager", "View {0} logs": "View {0} logs", "If Python cannot be found or is not listing packages but is installed on the system, ": "If Python cannot be found or is not listing packages but is installed on the system, ", diff --git a/src/UniGetUI.Avalonia/ViewModels/Pages/SettingsPages/UpdatesViewModel.cs b/src/UniGetUI.Avalonia/ViewModels/Pages/SettingsPages/UpdatesViewModel.cs index 9eca37b3bf..78be881a7b 100644 --- a/src/UniGetUI.Avalonia/ViewModels/Pages/SettingsPages/UpdatesViewModel.cs +++ b/src/UniGetUI.Avalonia/ViewModels/Pages/SettingsPages/UpdatesViewModel.cs @@ -6,6 +6,7 @@ using UniGetUI.Avalonia.Views.Pages.SettingsPages; using UniGetUI.Core.Tools; using UniGetUI.PackageEngine; +using UniGetUI.PackageEngine.ManagerClasses.Manager; using CoreSettings = UniGetUI.Core.SettingsEngine.Settings; using CornerRadius = Avalonia.CornerRadius; using Thickness = Avalonia.Thickness; @@ -20,10 +21,6 @@ public partial class UpdatesViewModel : ViewModelBase [ObservableProperty] private bool _isAutoCheckEnabled; [ObservableProperty] private bool _isCustomAgeSelected; - private static readonly HashSet _managersWithoutUpdateDate = - new(StringComparer.OrdinalIgnoreCase) - { "Homebrew", "Scoop", "vcpkg" }; - /// Items for the minimum update age ComboboxCard, in display/value pairs. public IReadOnlyList<(string Name, string Value)> MinimumAgeItems { get; } = [ @@ -60,9 +57,6 @@ public UpdatesViewModel() public Control BuildReleaseDateCompatTable() { - string yesStr = CoreTools.Translate("Yes"); - string noStr = CoreTools.Translate("No"); - var managers = PEInterface.Managers.ToList(); var table = new Grid @@ -89,8 +83,13 @@ public Control BuildReleaseDateCompatTable() var name = new TextBlock { Text = manager.DisplayName, VerticalAlignment = VerticalAlignment.Center }; Grid.SetRow(name, row); Grid.SetColumn(name, 0); - bool supported = !_managersWithoutUpdateDate.Contains(manager.Name); - var badge = _statusBadge(supported ? yesStr : noStr, supported ? Colors.Green : Colors.Red); + (string label, Color color) = manager.Capabilities.KnowsPackageReleaseDate switch + { + PackageReleaseDateSupport.Yes => (CoreTools.Translate("Yes"), Colors.Green), + PackageReleaseDateSupport.Partial => (CoreTools.Translate("Partial"), Color.FromRgb(224, 168, 0)), + _ => (CoreTools.Translate("No"), Colors.Red), + }; + var badge = _statusBadge(label, color); Grid.SetRow(badge, row); Grid.SetColumn(badge, 1); table.Children.Add(name); diff --git a/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/PackageManagerPage.axaml.cs b/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/PackageManagerPage.axaml.cs index 8840c5b266..04747ae25d 100644 --- a/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/PackageManagerPage.axaml.cs +++ b/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/PackageManagerPage.axaml.cs @@ -12,6 +12,7 @@ using UniGetUI.Core.Tools; using UniGetUI.Interface.Enums; using UniGetUI.PackageEngine.Interfaces; +using UniGetUI.PackageEngine.ManagerClasses.Manager; using UniGetUI.PackageEngine.Managers.VcpkgManager; using CoreSettings = UniGetUI.Core.SettingsEngine.Settings; using CornerRadius = global::Avalonia.CornerRadius; @@ -21,9 +22,6 @@ namespace UniGetUI.Avalonia.Views.Pages.SettingsPages; public sealed partial class PackageManagerPage : UserControl, ISettingsPage { - private static readonly HashSet _managersWithoutUpdateDate = - new(StringComparer.OrdinalIgnoreCase) - { "Homebrew", "Scoop", "vcpkg" }; private PackageManagerViewModel ViewModel => (PackageManagerViewModel)DataContext!; public bool CanGoBack => true; @@ -260,17 +258,28 @@ private void BuildPage() }; bool initiallyCustom = savedAge == "custom"; - bool ageSupported = !_managersWithoutUpdateDate.Contains(manager.Name); - object ageDescription = !ageSupported - ? new TextBlock + var releaseDateSupport = manager.Capabilities.KnowsPackageReleaseDate; + bool ageSupported = releaseDateSupport != PackageReleaseDateSupport.No; + object ageDescription = releaseDateSupport switch + { + PackageReleaseDateSupport.No => new TextBlock { Text = CoreTools.Translate("{pm} does not provide release dates for its packages, so this setting will have no effect") .Replace("{pm}", manager.DisplayName), Foreground = new SolidColorBrush(Color.Parse("#e05252")), TextWrapping = TextWrapping.Wrap, FontSize = 12, - } - : CoreTools.Translate("Override the global minimum update age for this package manager"); + }, + PackageReleaseDateSupport.Partial => new TextBlock + { + Text = CoreTools.Translate("{pm} only provides release dates for some of its packages, so this setting will only apply to those packages") + .Replace("{pm}", manager.DisplayName), + Foreground = new SolidColorBrush(Color.FromRgb(224, 168, 0)), + TextWrapping = TextWrapping.Wrap, + FontSize = 12, + }, + _ => CoreTools.Translate("Override the global minimum update age for this package manager"), + }; ageCombo.IsEnabled = ageSupported; customAgeInput.IsEnabled = ageSupported; diff --git a/src/UniGetUI.PackageEngine.Enums/ManagerCapabilities.cs b/src/UniGetUI.PackageEngine.Enums/ManagerCapabilities.cs index c68f1b2bc7..27db407b54 100644 --- a/src/UniGetUI.PackageEngine.Enums/ManagerCapabilities.cs +++ b/src/UniGetUI.PackageEngine.Enums/ManagerCapabilities.cs @@ -7,6 +7,13 @@ public enum ProxySupport Yes, } + public enum PackageReleaseDateSupport + { + No, + Partial, + Yes, + } + public struct SourceCapabilities { public bool KnowsUpdateDate { get; set; } = false; @@ -37,6 +44,7 @@ public struct ManagerCapabilities public bool SupportsCustomPackageScreenshots = false; public ProxySupport SupportsProxy = ProxySupport.No; public bool SupportsProxyAuth = false; + public PackageReleaseDateSupport KnowsPackageReleaseDate = PackageReleaseDateSupport.No; public SourceCapabilities Sources { get; set; } public ManagerCapabilities() diff --git a/src/UniGetUI.PackageEngine.Managers.Apt/Apt.cs b/src/UniGetUI.PackageEngine.Managers.Apt/Apt.cs index 1a7e2f87ea..e4f756c87b 100644 --- a/src/UniGetUI.PackageEngine.Managers.Apt/Apt.cs +++ b/src/UniGetUI.PackageEngine.Managers.Apt/Apt.cs @@ -26,6 +26,7 @@ public Apt() SupportsCustomSources = false, SupportsProxy = ProxySupport.No, SupportsProxyAuth = false, + KnowsPackageReleaseDate = PackageReleaseDateSupport.Yes, }; Properties = new ManagerProperties diff --git a/src/UniGetUI.PackageEngine.Managers.Bun/Bun.cs b/src/UniGetUI.PackageEngine.Managers.Bun/Bun.cs index 8e5f90f7ac..491372278c 100644 --- a/src/UniGetUI.PackageEngine.Managers.Bun/Bun.cs +++ b/src/UniGetUI.PackageEngine.Managers.Bun/Bun.cs @@ -29,7 +29,8 @@ public Bun() CanListDependencies = true, SupportsPreRelease = true, SupportsProxy = ProxySupport.No, - SupportsProxyAuth = false + SupportsProxyAuth = false, + KnowsPackageReleaseDate = PackageReleaseDateSupport.Yes, }; Properties = new ManagerProperties diff --git a/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs b/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs index 71d1e7b26b..ce0f84b59e 100644 --- a/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs +++ b/src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs @@ -67,6 +67,7 @@ public Cargo() CanDownloadInstaller = true, SupportsProxy = ProxySupport.Partially, SupportsProxyAuth = true, + KnowsPackageReleaseDate = PackageReleaseDateSupport.Yes, }; var cratesIo = new ManagerSource(this, "crates.io", new Uri("https://index.crates.io/")); diff --git a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs index 3ac963c1b4..243a6343fa 100644 --- a/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs +++ b/src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs @@ -93,6 +93,7 @@ public Chocolatey() }, SupportsProxy = ProxySupport.Yes, SupportsProxyAuth = true, + KnowsPackageReleaseDate = PackageReleaseDateSupport.Yes, }; Properties = new ManagerProperties diff --git a/src/UniGetUI.PackageEngine.Managers.Dnf/Dnf.cs b/src/UniGetUI.PackageEngine.Managers.Dnf/Dnf.cs index 0cca78226a..2f53f6a7b9 100644 --- a/src/UniGetUI.PackageEngine.Managers.Dnf/Dnf.cs +++ b/src/UniGetUI.PackageEngine.Managers.Dnf/Dnf.cs @@ -29,6 +29,7 @@ public Dnf() SupportsCustomSources = false, SupportsProxy = ProxySupport.No, SupportsProxyAuth = false, + KnowsPackageReleaseDate = PackageReleaseDateSupport.Yes, }; Properties = new ManagerProperties diff --git a/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs b/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs index b3a307e194..51c8b9eb66 100644 --- a/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs +++ b/src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs @@ -43,6 +43,7 @@ public DotNet() SupportsCustomVersions = true, SupportsProxy = ProxySupport.Partially, SupportsProxyAuth = true, + KnowsPackageReleaseDate = PackageReleaseDateSupport.Yes, }; Properties = new ManagerProperties diff --git a/src/UniGetUI.PackageEngine.Managers.Flatpak/Flatpak.cs b/src/UniGetUI.PackageEngine.Managers.Flatpak/Flatpak.cs index 16b794373c..59706c6be9 100644 --- a/src/UniGetUI.PackageEngine.Managers.Flatpak/Flatpak.cs +++ b/src/UniGetUI.PackageEngine.Managers.Flatpak/Flatpak.cs @@ -35,6 +35,7 @@ public Flatpak() }, SupportsProxy = ProxySupport.No, SupportsProxyAuth = false, + KnowsPackageReleaseDate = PackageReleaseDateSupport.Yes, }; Properties = new ManagerProperties diff --git a/src/UniGetUI.PackageEngine.Managers.Homebrew/Homebrew.cs b/src/UniGetUI.PackageEngine.Managers.Homebrew/Homebrew.cs index d762679800..d74978debd 100644 --- a/src/UniGetUI.PackageEngine.Managers.Homebrew/Homebrew.cs +++ b/src/UniGetUI.PackageEngine.Managers.Homebrew/Homebrew.cs @@ -53,6 +53,7 @@ public Homebrew() }, SupportsProxy = ProxySupport.No, SupportsProxyAuth = false, + KnowsPackageReleaseDate = PackageReleaseDateSupport.No, }; Properties = new ManagerProperties diff --git a/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs b/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs index d7e6b43db8..b11980316f 100644 --- a/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs +++ b/src/UniGetUI.PackageEngine.Managers.Npm/Npm.cs @@ -29,6 +29,7 @@ public Npm() SupportsPreRelease = true, SupportsProxy = ProxySupport.No, SupportsProxyAuth = false, + KnowsPackageReleaseDate = PackageReleaseDateSupport.Yes, }; Properties = new ManagerProperties diff --git a/src/UniGetUI.PackageEngine.Managers.Pacman/Pacman.cs b/src/UniGetUI.PackageEngine.Managers.Pacman/Pacman.cs index 27401a9a1b..b582ffff0b 100644 --- a/src/UniGetUI.PackageEngine.Managers.Pacman/Pacman.cs +++ b/src/UniGetUI.PackageEngine.Managers.Pacman/Pacman.cs @@ -25,6 +25,7 @@ public Pacman() SupportsCustomSources = false, SupportsProxy = ProxySupport.No, SupportsProxyAuth = false, + KnowsPackageReleaseDate = PackageReleaseDateSupport.Yes, }; Properties = new ManagerProperties diff --git a/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs b/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs index 680a9191d4..69a2b947d0 100644 --- a/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs +++ b/src/UniGetUI.PackageEngine.Managers.Pip/Pip.cs @@ -63,6 +63,7 @@ public Pip() CanListDependencies = true, SupportsProxy = ProxySupport.Yes, SupportsProxyAuth = true, + KnowsPackageReleaseDate = PackageReleaseDateSupport.Yes, }; Properties = new ManagerProperties diff --git a/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs b/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs index 31fc95f9b9..14632242cf 100644 --- a/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs +++ b/src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs @@ -36,6 +36,7 @@ public PowerShell() }, SupportsProxy = ProxySupport.Partially, SupportsProxyAuth = true, + KnowsPackageReleaseDate = PackageReleaseDateSupport.Yes, }; Properties = new ManagerProperties diff --git a/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs b/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs index b24a792244..0f2efe0504 100644 --- a/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs +++ b/src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs @@ -37,6 +37,7 @@ public PowerShell7() }, SupportsProxy = ProxySupport.Partially, SupportsProxyAuth = true, + KnowsPackageReleaseDate = PackageReleaseDateSupport.Yes, }; Properties = new ManagerProperties diff --git a/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs b/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs index 0b29ab9cd8..d42384455d 100644 --- a/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs +++ b/src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs @@ -80,6 +80,7 @@ public Scoop() }, SupportsProxy = ProxySupport.No, SupportsProxyAuth = false, + KnowsPackageReleaseDate = PackageReleaseDateSupport.No, }; Properties = new ManagerProperties diff --git a/src/UniGetUI.PackageEngine.Managers.Snap/Snap.cs b/src/UniGetUI.PackageEngine.Managers.Snap/Snap.cs index 4ec1baad68..d8b5b15c1a 100644 --- a/src/UniGetUI.PackageEngine.Managers.Snap/Snap.cs +++ b/src/UniGetUI.PackageEngine.Managers.Snap/Snap.cs @@ -32,6 +32,7 @@ public Snap() SupportsCustomSources = false, SupportsProxy = ProxySupport.No, SupportsProxyAuth = false, + KnowsPackageReleaseDate = PackageReleaseDateSupport.Yes, }; var snapcraftSource = new ManagerSource(this, "snapcraft", new Uri("https://snapcraft.io")); diff --git a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs index 245bffd433..7a051aba50 100644 --- a/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs +++ b/src/UniGetUI.PackageEngine.Managers.Vcpkg/Vcpkg.cs @@ -45,6 +45,7 @@ public Vcpkg() CanListDependencies = true, SupportsProxy = ProxySupport.No, SupportsProxyAuth = false, + KnowsPackageReleaseDate = PackageReleaseDateSupport.No, }; string DefaultTriplet = GetDefaultTriplet(); diff --git a/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/PingetPackageDetailsProvider.cs b/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/PingetPackageDetailsProvider.cs index 4e225c6398..44205ba2b7 100644 --- a/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/PingetPackageDetailsProvider.cs +++ b/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/PingetPackageDetailsProvider.cs @@ -247,11 +247,14 @@ private static void ApplyManifestJson(IPackageDetails details, string output) .ToArray()!; } + // ReleaseDate is set at the manifest root by default, with an optional per-installer override + SetIfPresent(value => details.UpdateDate = value, + (hasInstaller ? GetString(installer, "ReleaseDate") : null) ?? GetString(manifest, "ReleaseDate")); + if (hasInstaller) { SetIfPresent(value => details.InstallerHash = value, GetString(installer, "InstallerSha256")); SetIfPresent(value => details.InstallerType = value, GetString(installer, "InstallerType")); - SetIfPresent(value => details.UpdateDate = value, GetString(installer, "ReleaseDate")); if (TryCreateUri(GetString(installer, "InstallerUrl"), out Uri? installerUri)) { diff --git a/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs b/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs index 71980979e6..6b696a3c3f 100644 --- a/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs +++ b/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs @@ -89,6 +89,7 @@ public WinGet() }, SupportsProxy = ProxySupport.Partially, SupportsProxyAuth = false, + KnowsPackageReleaseDate = PackageReleaseDateSupport.Partial, }; Properties = new ManagerProperties diff --git a/src/UniGetUI/Pages/SettingsPages/GeneralPages/Updates.xaml.cs b/src/UniGetUI/Pages/SettingsPages/GeneralPages/Updates.xaml.cs index e03fb5aa21..43d1edf7a8 100644 --- a/src/UniGetUI/Pages/SettingsPages/GeneralPages/Updates.xaml.cs +++ b/src/UniGetUI/Pages/SettingsPages/GeneralPages/Updates.xaml.cs @@ -5,6 +5,7 @@ using UniGetUI.Core.SettingsEngine; using UniGetUI.Core.Tools; using UniGetUI.PackageEngine; +using UniGetUI.PackageEngine.ManagerClasses.Manager; using Windows.UI; using Windows.UI.Text; @@ -18,9 +19,6 @@ namespace UniGetUI.Pages.SettingsPages.GeneralPages /// public sealed partial class Updates : Page, ISettingsPage { - private static readonly HashSet _managersWithoutUpdateDate = - new(StringComparer.OrdinalIgnoreCase) { "Homebrew", "Scoop", "vcpkg", "WinGet" }; - public Updates() { this.InitializeComponent(); @@ -97,9 +95,6 @@ private void RefreshMinimumAgeLayout() private static UIElement BuildReleaseDateCompatTable() { - string yesStr = CoreTools.Translate("Yes"); - string noStr = CoreTools.Translate("No"); - var managers = PEInterface.Managers.ToList(); var table = new Grid { ColumnSpacing = 24, RowSpacing = 8 }; @@ -130,8 +125,7 @@ private static UIElement BuildReleaseDateCompatTable() int row = i + 1; var name = new TextBlock { Text = manager.DisplayName, VerticalAlignment = VerticalAlignment.Center }; Grid.SetRow(name, row); Grid.SetColumn(name, 0); - bool supported = !_managersWithoutUpdateDate.Contains(manager.Name); - var badge = MakeStatusBadge(supported ? yesStr : noStr, supported); + var badge = MakeStatusBadge(manager.Capabilities.KnowsPackageReleaseDate); Grid.SetRow(badge, row); Grid.SetColumn(badge, 1); table.Children.Add(name); table.Children.Add(badge); @@ -156,14 +150,14 @@ private static UIElement BuildReleaseDateCompatTable() return card; } - private static Border MakeStatusBadge(string text, bool isSupported) + private static Border MakeStatusBadge(PackageReleaseDateSupport support) { - var bgColor = isSupported - ? Color.FromArgb(60, 0, 180, 0) - : Color.FromArgb(60, 224, 82, 82); - var borderColor = isSupported - ? Color.FromArgb(120, 0, 180, 0) - : Color.FromArgb(120, 224, 82, 82); + (string text, Color baseColor) = support switch + { + PackageReleaseDateSupport.Yes => (CoreTools.Translate("Yes"), Color.FromArgb(255, 0, 180, 0)), + PackageReleaseDateSupport.Partial => (CoreTools.Translate("Partial"), Color.FromArgb(255, 224, 168, 0)), + _ => (CoreTools.Translate("No"), Color.FromArgb(255, 224, 82, 82)), + }; return new Border { @@ -171,8 +165,8 @@ private static Border MakeStatusBadge(string text, bool isSupported) Padding = new Thickness(4, 2, 4, 2), BorderThickness = new Thickness(1), HorizontalAlignment = HorizontalAlignment.Stretch, - Background = new SolidColorBrush(bgColor), - BorderBrush = new SolidColorBrush(borderColor), + Background = new SolidColorBrush(Color.FromArgb(60, baseColor.R, baseColor.G, baseColor.B)), + BorderBrush = new SolidColorBrush(Color.FromArgb(120, baseColor.R, baseColor.G, baseColor.B)), Child = new TextBlock { Text = text, TextAlignment = TextAlignment.Center }, }; } diff --git a/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs b/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs index eddb4a0a59..b951159157 100644 --- a/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs +++ b/src/UniGetUI/Pages/SettingsPages/ManagersPages/PackageManager.xaml.cs @@ -11,6 +11,7 @@ using UniGetUI.Interface.Widgets; using UniGetUI.PackageEngine; using UniGetUI.PackageEngine.Interfaces; +using UniGetUI.PackageEngine.ManagerClasses.Manager; using UniGetUI.PackageEngine.Managers.BunManager; using UniGetUI.PackageEngine.Managers.CargoManager; using UniGetUI.PackageEngine.Managers.ChocolateyManager; @@ -35,9 +36,6 @@ namespace UniGetUI.Pages.SettingsPages.GeneralPages /// public sealed partial class PackageManagerPage : Page, ISettingsPage { - private static readonly HashSet _managersWithoutUpdateDate = - new(StringComparer.OrdinalIgnoreCase) { "Homebrew", "Scoop", "vcpkg", "WinGet" }; - IPackageManager? Manager; public event EventHandler? RestartRequired; public event EventHandler? NavigationRequested @@ -493,10 +491,12 @@ protected override void OnNavigatedTo(NavigationEventArgs e) }; bool initiallyCustomAge = savedAgeVal == "custom"; - bool ageSupported = !_managersWithoutUpdateDate.Contains(Manager.Name); + var releaseDateSupport = Manager.Capabilities.KnowsPackageReleaseDate; + bool ageSupported = releaseDateSupport != PackageReleaseDateSupport.No; - object ageCardDescription = !ageSupported - ? new TextBlock + object ageCardDescription = releaseDateSupport switch + { + PackageReleaseDateSupport.No => new TextBlock { Text = CoreTools.Translate( "{pm} does not provide release dates for its packages, so this setting will have no effect") @@ -505,8 +505,19 @@ protected override void OnNavigatedTo(NavigationEventArgs e) Windows.UI.Color.FromArgb(255, 224, 82, 82)), TextWrapping = TextWrapping.Wrap, FontSize = 12, - } - : (object)CoreTools.Translate("Override the global minimum update age for this package manager"); + }, + PackageReleaseDateSupport.Partial => new TextBlock + { + Text = CoreTools.Translate( + "{pm} only provides release dates for some of its packages, so this setting will only apply to those packages") + .Replace("{pm}", Manager.DisplayName), + Foreground = new Microsoft.UI.Xaml.Media.SolidColorBrush( + Windows.UI.Color.FromArgb(255, 224, 168, 0)), + TextWrapping = TextWrapping.Wrap, + FontSize = 12, + }, + _ => (object)CoreTools.Translate("Override the global minimum update age for this package manager"), + }; ageCombo.IsEnabled = ageSupported; customAgeInput.IsEnabled = ageSupported;