From 14333394667ad04f4cb6a2c9ccd1dcd81807a557 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Tue, 8 Apr 2025 19:38:54 +0200 Subject: [PATCH 01/17] Working example --- src/UniGetUI/Controls/PackageWrapper.cs | 4 +- .../SoftwarePages/AbstractPackagesPage.xaml | 146 +++++++++++++++++- .../AbstractPackagesPage.xaml.cs | 9 ++ 3 files changed, 156 insertions(+), 3 deletions(-) diff --git a/src/UniGetUI/Controls/PackageWrapper.cs b/src/UniGetUI/Controls/PackageWrapper.cs index 65ae208abd..0749b51080 100644 --- a/src/UniGetUI/Controls/PackageWrapper.cs +++ b/src/UniGetUI/Controls/PackageWrapper.cs @@ -32,6 +32,7 @@ public bool IsChecked public bool AlternateIdIconVisible; public bool ShowCustomPackageIcon; public bool ShowDefaultPackageIcon = true; + public string VersionComboString; public IconType MainIconId = IconType.Id; public IconType AlternateIconId = IconType.Id; public ImageSource? MainIconSource; @@ -64,6 +65,7 @@ public PackageWrapper(IPackage package) WhenTagHasChanged(); Package.PropertyChanged += Package_PropertyChanged; UpdatePackageIcon(); + VersionComboString = package.IsUpgradable ? $"{package.VersionString} -> {package.NewVersionString}" : package.VersionString; } public void Package_PropertyChanged(object? sender, PropertyChangedEventArgs e) @@ -167,7 +169,7 @@ public void UpdatePackageIcon() MainIconSource = new BitmapImage { UriSource = icon, - DecodePixelWidth = 24, + DecodePixelWidth = 48, DecodePixelType = DecodePixelType.Logical, }; ShowCustomPackageIcon = true; diff --git a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml index 76f81ffb2e..220e427182 100644 --- a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml +++ b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml @@ -806,6 +806,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1322,10 +1464,10 @@ x:FieldModifier="protected" CanBeScrollAnchor="False" CharacterReceived="{x:Bind PackageList_CharacterReceived}" - ItemTemplate="{StaticResource PackageTemplate}" + ItemTemplate="{StaticResource PackageTemplate_Grid}" ItemsSource="{x:Bind FilteredPackages, Mode=OneWay}"> - + diff --git a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs index 7d762926de..62d067cfa3 100644 --- a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs +++ b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs @@ -924,6 +924,9 @@ public void FocusPackageList() { PackageList.Focus(FocusState.Programmatic); } private void PackageItemContainer_RightTapped(object sender, RightTappedRoutedEventArgs e) + => PackageItemContainer_RightTapped(sender, new RoutedEventArgs()); + + private void PackageItemContainer_RightTapped(object sender, RoutedEventArgs e) { if (sender is PackageItemContainer container && container.Package is not null) { @@ -931,6 +934,12 @@ private void PackageItemContainer_RightTapped(object sender, RightTappedRoutedEv container.Focus(FocusState.Keyboard); WhenShowingContextMenu(container.Package); } + else if((((sender as Button)?.Parent as StackPanel)?.Parent as Grid)?.Parent is PackageItemContainer container2 && container2.Package is not null) + { + PackageList.Select(container2.Wrapper.Index); + container2.Focus(FocusState.Keyboard); + WhenShowingContextMenu(container2.Package); + } } private void PackageItemContainer_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e) From 11270e6cf3cf3189fb42579d9dc0804e09389382 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Tue, 8 Apr 2025 20:04:29 +0200 Subject: [PATCH 02/17] Quick layout toggle buttons for testing --- .../SoftwarePages/AbstractPackagesPage.xaml | 6 ++--- .../AbstractPackagesPage.xaml.cs | 24 +++++++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml index 220e427182..73153cafe2 100644 --- a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml +++ b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml @@ -1245,6 +1245,8 @@ HorizontalAlignment="Stretch" Orientation="Vertical" Spacing="0"> + + - - - diff --git a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs index 62d067cfa3..91d2b1d6f2 100644 --- a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs +++ b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs @@ -121,6 +121,7 @@ protected string NoMatches_SubtitleText protected AbstractPackagesPage(PackagesPageData data) { InitializeComponent(); + LoadListLayout(); Loader = data.Loader; @@ -1189,5 +1190,28 @@ private void FilteringPanel_PaneClosing(SplitView sender, SplitViewPaneClosingEv { ToggleFiltersButton.IsChecked = false; } + + private void GridView_Click(object sender, RoutedEventArgs e) + => LoadGridLayout(); + + private void ListView_Click(object sender, RoutedEventArgs e) + => LoadListLayout(); + + private void LoadListLayout() + { + PackageList.ItemTemplate = (DataTemplate)this.Resources["PackageTemplate"]; + PackageList.Layout = new StackLayout() { Spacing = 3 }; + } + + private void LoadGridLayout() + { + PackageList.ItemTemplate = (DataTemplate)this.Resources["PackageTemplate_Grid"]; + PackageList.Layout = new UniformGridLayout() + { + ItemsStretch = UniformGridLayoutItemsStretch.Fill, + MinColumnSpacing = 8, + MinRowSpacing = 8, + }; + } } } From 22204b41da32c30c57e5ebe37f7f6212df89f476 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Wed, 9 Apr 2025 10:36:44 +0200 Subject: [PATCH 03/17] Add view mode toggler --- src/Directory.Build.props | 2 +- .../SoftwarePages/AbstractPackagesPage.xaml | 122 ++++++++++-------- .../AbstractPackagesPage.xaml.cs | 25 +++- src/UniGetUI/UniGetUI.csproj | 1 + 4 files changed, 91 insertions(+), 59 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index d4020c2f92..e6fcb59e62 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -3,7 +3,7 @@ enable net8.0-windows10.0.26100.0 10.0.19041.0 - 10.0.26100.57 + 10.0.26100.56 8.0.407 Martí Climent and the contributors Martí Climent diff --git a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml index 73153cafe2..ea59173683 100644 --- a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml +++ b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml @@ -10,6 +10,7 @@ xmlns:local="using:UniGetUI.Interface" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:pkgClasses="using:UniGetUI.PackageEngine.PackageClasses" + xmlns:ui="using:CommunityToolkit.WinUI" xmlns:widgets="using:UniGetUI.Interface.Widgets" Name="ABSTRACT_PAGE" NavigationCacheMode="Required" @@ -1009,58 +1010,80 @@ FontWeight="Normal" Foreground="{ThemeResource AppBarItemDisabledForegroundThemeBrush}" TextWrapping="Wrap" /> - - - - - - - + HorizontalAlignment="Stretch" + Orientation="Vertical" + Spacing="8"> - + + + + + + + - - - + + + + + + + + + + + + + + + + - - - + ItemsSource="{x:Bind FilteredPackages, Mode=OneWay}" /> diff --git a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs index 91d2b1d6f2..7807e343c2 100644 --- a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs +++ b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs @@ -121,7 +121,12 @@ protected string NoMatches_SubtitleText protected AbstractPackagesPage(PackagesPageData data) { InitializeComponent(); - LoadListLayout(); + + // Selection of grid view mode + int viewMode = Settings.GetDictionaryItem("PackageListViewMode", PAGE_NAME); + if (viewMode < 0 || viewMode >= ViewModeSelector.Items.Count) viewMode = 0; + ViewModeSelector.SelectedIndex = viewMode; + Loader = data.Loader; @@ -293,6 +298,7 @@ protected AbstractPackagesPage(PackagesPageData data) ShowFilteringPane(); } + QueryBlock.PlaceholderText = CoreTools.Translate("Search for packages"); MegaQueryBlock.PlaceholderText = CoreTools.Translate("Search for packages"); InstantSearchCheckbox.IsChecked = !Settings.GetDictionaryItem("DisableInstantSearch", PAGE_NAME); @@ -1191,12 +1197,6 @@ private void FilteringPanel_PaneClosing(SplitView sender, SplitViewPaneClosingEv ToggleFiltersButton.IsChecked = false; } - private void GridView_Click(object sender, RoutedEventArgs e) - => LoadGridLayout(); - - private void ListView_Click(object sender, RoutedEventArgs e) - => LoadListLayout(); - private void LoadListLayout() { PackageList.ItemTemplate = (DataTemplate)this.Resources["PackageTemplate"]; @@ -1213,5 +1213,16 @@ private void LoadGridLayout() MinRowSpacing = 8, }; } + + private void ViewModeSelector_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + Settings.SetDictionaryItem("PackageListViewMode", PAGE_NAME, ViewModeSelector.SelectedIndex); + if (ViewModeSelector.SelectedIndex == 0) + LoadListLayout(); + else if (ViewModeSelector.SelectedIndex == 1) + LoadGridLayout(); + else if (ViewModeSelector.SelectedIndex == 2) + LoadGridLayout(); + } } } diff --git a/src/UniGetUI/UniGetUI.csproj b/src/UniGetUI/UniGetUI.csproj index 85f8007cdf..79a2b77151 100644 --- a/src/UniGetUI/UniGetUI.csproj +++ b/src/UniGetUI/UniGetUI.csproj @@ -69,6 +69,7 @@ + From e1a93872b26bd3614d09dd9ff6d95f85b24c9611 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Wed, 9 Apr 2025 10:44:20 +0200 Subject: [PATCH 04/17] Code was crashing due to incorrect order on constructor --- .../AbstractPackagesPage.xaml.cs | 31 +++++++++---------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs index 7807e343c2..dd330ef85d 100644 --- a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs +++ b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs @@ -120,16 +120,8 @@ protected string NoMatches_SubtitleText protected AbstractPackagesPage(PackagesPageData data) { - InitializeComponent(); - - // Selection of grid view mode - int viewMode = Settings.GetDictionaryItem("PackageListViewMode", PAGE_NAME); - if (viewMode < 0 || viewMode >= ViewModeSelector.Items.Count) viewMode = 0; - ViewModeSelector.SelectedIndex = viewMode; - - - Loader = data.Loader; - + // Load page attributes + PAGE_NAME = data.PageName; DISABLE_AUTOMATIC_PACKAGE_LOAD_ON_START = data.DisableAutomaticPackageLoadOnStart; DISABLE_FILTER_ON_QUERY_CHANGE = data.DisableFilterOnQueryChange; MEGA_QUERY_BOX_ENABLED = data.MegaQueryBlockEnabled; @@ -140,19 +132,24 @@ protected AbstractPackagesPage(PackagesPageData data) NewVersionLabelWidth = RoleIsUpdateLike ? 125 : 0; NewVersionIconWidth = RoleIsUpdateLike ? 24 : 0; - Loader = data.Loader; - - PAGE_NAME = data.PageName; - - MainTitle.Text = data.PageTitle; - HeaderIcon.Glyph = data.Glyph; - 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 = data.Loader; + + // Load UI + InitializeComponent(); + + // Selection of grid view mode + int viewMode = Settings.GetDictionaryItem("PackageListViewMode", PAGE_NAME); + if (viewMode < 0 || viewMode >= ViewModeSelector.Items.Count) viewMode = 0; + ViewModeSelector.SelectedIndex = viewMode; + + MainTitle.Text = data.PageTitle; + HeaderIcon.Glyph = data.Glyph; SelectAllCheckBox.IsChecked = data.PackagesAreCheckedByDefault; QuerySimilarResultsRadio.IsEnabled = !data.DisableSuggestedResultsRadio; From 408113fea41fc6f22e7ec4156287a8f78e4d7744 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Wed, 9 Apr 2025 19:55:51 +0200 Subject: [PATCH 05/17] Layout improvements --- src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml index ea59173683..a1c17a3af4 100644 --- a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml +++ b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml @@ -1017,6 +1017,7 @@ Grid.Column="2" HorizontalAlignment="Stretch" Orientation="Vertical" + Margin="0,0,4,0" Spacing="8"> @@ -1061,7 +1062,7 @@ Grid.Column="3" Width="32" Height="32" - Margin="6,0,4,0" + Margin="6,0,0,0" Padding="0" x:FieldModifier="protected" AutomationProperties.HelpText="Reload packages" @@ -1075,7 +1076,7 @@ Spacing="8"> From 2ec8c447313dbc122f20328053fd8997582d9fe4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Wed, 9 Apr 2025 20:44:51 +0200 Subject: [PATCH 06/17] Implement button context menu on gridview --- .../Controls/ObservablePackageCollection.cs | 5 ++-- src/UniGetUI/Controls/PackageWrapper.cs | 11 ++++++++- .../SoftwarePages/AbstractPackagesPage.xaml | 7 +++--- .../AbstractPackagesPage.xaml.cs | 23 ++++++++++++++++++- 4 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/UniGetUI/Controls/ObservablePackageCollection.cs b/src/UniGetUI/Controls/ObservablePackageCollection.cs index 99e0c5c625..7252e36aa8 100644 --- a/src/UniGetUI/Controls/ObservablePackageCollection.cs +++ b/src/UniGetUI/Controls/ObservablePackageCollection.cs @@ -1,4 +1,5 @@ using UniGetUI.Core.Classes; +using UniGetUI.Interface; using UniGetUI.PackageEngine.Interfaces; namespace UniGetUI.PackageEngine.PackageClasses @@ -26,9 +27,9 @@ public ObservablePackageCollection() /// /// Add a package to the collection /// - public void Add(IPackage p) + public void Add(IPackage p, AbstractPackagesPage page) { - base.Add(new PackageWrapper(p)); + base.Add(new PackageWrapper(p, page)); } /// diff --git a/src/UniGetUI/Controls/PackageWrapper.cs b/src/UniGetUI/Controls/PackageWrapper.cs index 0749b51080..a9bcf06935 100644 --- a/src/UniGetUI/Controls/PackageWrapper.cs +++ b/src/UniGetUI/Controls/PackageWrapper.cs @@ -5,6 +5,7 @@ using Microsoft.UI.Xaml.Media.Imaging; using UniGetUI.Core.Classes; using UniGetUI.Core.Tools; +using UniGetUI.Interface; using UniGetUI.Interface.Enums; using UniGetUI.PackageEngine.Interfaces; @@ -58,16 +59,24 @@ public Uri? PackageIcon public IPackage Package { get; private set; } public PackageWrapper Self { get; private set; } - public PackageWrapper(IPackage package) + private readonly AbstractPackagesPage _page; + + public PackageWrapper(IPackage package, AbstractPackagesPage page) { Package = package; Self = this; + _page = page; WhenTagHasChanged(); Package.PropertyChanged += Package_PropertyChanged; UpdatePackageIcon(); VersionComboString = package.IsUpgradable ? $"{package.VersionString} -> {package.NewVersionString}" : package.VersionString; } + public void RightClick() + { + _page.ShowContextMenu(this); + } + public void Package_PropertyChanged(object? sender, PropertyChangedEventArgs e) { try diff --git a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml index a1c17a3af4..fddb6206b0 100644 --- a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml +++ b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml @@ -912,7 +912,8 @@ Padding="0" Background="Transparent" BorderThickness="0" - Click="PackageItemContainer_RightTapped"> + Click="{x:Bind RightClick}" + Tapped="ContextMenuButton_Tapped"> @@ -1015,9 +1016,9 @@ Grid.Row="0" Grid.RowSpan="3" Grid.Column="2" + Margin="0,0,4,0" HorizontalAlignment="Stretch" Orientation="Vertical" - Margin="0,0,4,0" Spacing="8"> @@ -1482,7 +1483,7 @@ PackageItemContainer_RightTapped(sender, new RoutedEventArgs()); @@ -1247,5 +1261,12 @@ private void ViewModeSelector_SelectionChanged(object sender, SelectionChangedEv else if (ViewModeSelector.SelectedIndex == 2) LoadGridLayout(); } + + FrameworkElement _lastContextMenuButtonTapped = null; + private void ContextMenuButton_Tapped(object sender, TappedRoutedEventArgs e) + { + if (sender is FrameworkElement el) + _lastContextMenuButtonTapped = el; + } } } From 60d7df6c27b395aecd4730a34a8a24be30823e7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Wed, 9 Apr 2025 20:50:16 +0200 Subject: [PATCH 07/17] Move generic styles to App.xaml --- src/UniGetUI/App.xaml | 619 ++++++++++++++++++ .../SoftwarePages/AbstractPackagesPage.xaml | 617 ----------------- 2 files changed, 619 insertions(+), 617 deletions(-) diff --git a/src/UniGetUI/App.xaml b/src/UniGetUI/App.xaml index f6ce147d13..f5a25c0ad0 100644 --- a/src/UniGetUI/App.xaml +++ b/src/UniGetUI/App.xaml @@ -34,6 +34,625 @@ + + + + + + diff --git a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml index fddb6206b0..09be6f99f9 100644 --- a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml +++ b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml @@ -30,623 +30,6 @@ - - - - Date: Wed, 9 Apr 2025 22:24:55 +0200 Subject: [PATCH 08/17] Layout simplification for GridLayout, less RAM usage --- src/UniGetUI/Controls/PackageWrapper.cs | 4 +- .../SoftwarePages/AbstractPackagesPage.xaml | 150 ++++++++---------- .../AbstractPackagesPage.xaml.cs | 10 +- 3 files changed, 65 insertions(+), 99 deletions(-) diff --git a/src/UniGetUI/Controls/PackageWrapper.cs b/src/UniGetUI/Controls/PackageWrapper.cs index a9bcf06935..4bcc59fa7e 100644 --- a/src/UniGetUI/Controls/PackageWrapper.cs +++ b/src/UniGetUI/Controls/PackageWrapper.cs @@ -72,9 +72,9 @@ public PackageWrapper(IPackage package, AbstractPackagesPage page) VersionComboString = package.IsUpgradable ? $"{package.VersionString} -> {package.NewVersionString}" : package.VersionString; } - public void RightClick() + public async void RightClick() { - _page.ShowContextMenu(this); + await _page.ShowContextMenu(this); } public void Package_PropertyChanged(object? sender, PropertyChangedEventArgs e) diff --git a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml index 09be6f99f9..dca06de10c 100644 --- a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml +++ b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml @@ -204,108 +204,83 @@ - - - + - - - + + + - - - - + HorizontalAlignment="Center" + VerticalAlignment="Center" + FontSize="48" + FontWeight="ExtraLight" + Icon="Package" + ToolTipService.ToolTip="{x:Bind ListedNameTooltip, Mode=OneWay}" + Visibility="{x:Bind ShowDefaultPackageIcon, Mode=OneWay}" /> - + - + - + - - - - - + Margin="1,-4,0,0" + HorizontalAlignment="Left" + VerticalAlignment="Top" + IsChecked="{x:Bind IsChecked, Mode=TwoWay}" /> + - diff --git a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs index e42eaac193..b3e00f203d 100644 --- a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs +++ b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs @@ -935,9 +935,6 @@ public async Task ShowContextMenu(PackageWrapper wrapper) } private void PackageItemContainer_RightTapped(object sender, RightTappedRoutedEventArgs e) - => PackageItemContainer_RightTapped(sender, new RoutedEventArgs()); - - private void PackageItemContainer_RightTapped(object sender, RoutedEventArgs e) { if (sender is PackageItemContainer container && container.Package is not null) { @@ -945,12 +942,6 @@ private void PackageItemContainer_RightTapped(object sender, RoutedEventArgs e) container.Focus(FocusState.Keyboard); WhenShowingContextMenu(container.Package); } - else if((((sender as Button)?.Parent as StackPanel)?.Parent as Grid)?.Parent is PackageItemContainer container2 && container2.Package is not null) - { - PackageList.Select(container2.Wrapper.Index); - container2.Focus(FocusState.Keyboard); - WhenShowingContextMenu(container2.Package); - } } private void PackageItemContainer_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e) @@ -1248,6 +1239,7 @@ private void LoadGridLayout() ItemsStretch = UniformGridLayoutItemsStretch.Fill, MinColumnSpacing = 8, MinRowSpacing = 8, + MinItemWidth = 275, }; } From 39849546e25e9f3be10e37190baa4a3ec2e87d87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Wed, 9 Apr 2025 22:34:41 +0200 Subject: [PATCH 09/17] ListLayout simplification, less RAM usage --- .../SoftwarePages/AbstractPackagesPage.xaml | 69 +++++++++++-------- 1 file changed, 41 insertions(+), 28 deletions(-) diff --git a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml index dca06de10c..63982466d8 100644 --- a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml +++ b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml @@ -42,23 +42,18 @@ - - - - - - - - - + + + + + + + + + + + + + + From 87d84376238a1ee4cc7a34193fb886db7bad8f0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Thu, 10 Apr 2025 16:17:45 +0200 Subject: [PATCH 10/17] Better item virtualization --- .../SoftwarePages/AbstractPackagesPage.xaml | 25 ++++++++++++------- .../AbstractPackagesPage.xaml.cs | 3 ++- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml index 63982466d8..c417847cb2 100644 --- a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml +++ b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml @@ -30,7 +30,7 @@ - + - + VerticalAlignment="Stretch"> + + + + + diff --git a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs index b3e00f203d..7358ca339f 100644 --- a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs +++ b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs @@ -1227,7 +1227,7 @@ private void FilteringPanel_PaneClosing(SplitView sender, SplitViewPaneClosingEv private void LoadListLayout() { - PackageList.ItemTemplate = (DataTemplate)this.Resources["PackageTemplate"]; + PackageList.ItemTemplate = (DataTemplate)this.Resources["PackageTemplate_List"]; PackageList.Layout = new StackLayout() { Spacing = 3 }; } @@ -1240,6 +1240,7 @@ private void LoadGridLayout() MinColumnSpacing = 8, MinRowSpacing = 8, MinItemWidth = 275, + MinItemHeight = 56, // Add this - should match your row height plus padding }; } From a3addc16a8421423463b5f2baddef3b554461e11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Thu, 10 Apr 2025 16:30:08 +0200 Subject: [PATCH 11/17] Basic IconsLayout --- .../SoftwarePages/AbstractPackagesPage.xaml | 115 ++++++++++++++++++ .../AbstractPackagesPage.xaml.cs | 12 +- 2 files changed, 126 insertions(+), 1 deletion(-) diff --git a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml index c417847cb2..ebb1f33d58 100644 --- a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml +++ b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml @@ -320,6 +320,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs index 7358ca339f..1ca8e8327e 100644 --- a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs +++ b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs @@ -1230,6 +1230,16 @@ private void LoadListLayout() PackageList.ItemTemplate = (DataTemplate)this.Resources["PackageTemplate_List"]; PackageList.Layout = new StackLayout() { Spacing = 3 }; } + private void LoadIconsLayout() + { + PackageList.ItemTemplate = (DataTemplate)this.Resources["PackageTemplate_Icons"]; + PackageList.Layout = new UniformGridLayout() + { + ItemsStretch = UniformGridLayoutItemsStretch.Fill, + MinColumnSpacing = 8, + MinRowSpacing = 8, + }; + } private void LoadGridLayout() { @@ -1252,7 +1262,7 @@ private void ViewModeSelector_SelectionChanged(object sender, SelectionChangedEv else if (ViewModeSelector.SelectedIndex == 1) LoadGridLayout(); else if (ViewModeSelector.SelectedIndex == 2) - LoadGridLayout(); + LoadIconsLayout(); } FrameworkElement _lastContextMenuButtonTapped = null; From bb1a4711fc7d1cd70366af07c378023c511b686d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Thu, 10 Apr 2025 16:49:49 +0200 Subject: [PATCH 12/17] Final touches to Icons view --- src/UniGetUI/Controls/PackageWrapper.cs | 2 +- .../SoftwarePages/AbstractPackagesPage.xaml | 30 +++++++++++-------- .../AbstractPackagesPage.xaml.cs | 3 +- test_publish_nosign.cmd | 5 ++++ 4 files changed, 25 insertions(+), 15 deletions(-) create mode 100644 test_publish_nosign.cmd diff --git a/src/UniGetUI/Controls/PackageWrapper.cs b/src/UniGetUI/Controls/PackageWrapper.cs index 4bcc59fa7e..e105bf314e 100644 --- a/src/UniGetUI/Controls/PackageWrapper.cs +++ b/src/UniGetUI/Controls/PackageWrapper.cs @@ -178,7 +178,7 @@ public void UpdatePackageIcon() MainIconSource = new BitmapImage { UriSource = icon, - DecodePixelWidth = 48, + DecodePixelWidth = 64, DecodePixelType = DecodePixelType.Logical, }; ShowCustomPackageIcon = true; diff --git a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml index ebb1f33d58..c90da80b3f 100644 --- a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml +++ b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml @@ -336,22 +336,22 @@ Padding="4,4,4,4" HorizontalAlignment="Stretch" Opacity="{x:Bind ListedOpacity, Mode=OneWay}" - RowSpacing="4"> + RowSpacing="0"> - - - - + + + + - + diff --git a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs index 1ca8e8327e..484e3ce4d2 100644 --- a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs +++ b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs @@ -1235,7 +1235,8 @@ private void LoadIconsLayout() PackageList.ItemTemplate = (DataTemplate)this.Resources["PackageTemplate_Icons"]; PackageList.Layout = new UniformGridLayout() { - ItemsStretch = UniformGridLayoutItemsStretch.Fill, + ItemsStretch = UniformGridLayoutItemsStretch.None, + ItemsJustification = UniformGridLayoutItemsJustification.Start, MinColumnSpacing = 8, MinRowSpacing = 8, }; diff --git a/test_publish_nosign.cmd b/test_publish_nosign.cmd new file mode 100644 index 0000000000..d503cc957c --- /dev/null +++ b/test_publish_nosign.cmd @@ -0,0 +1,5 @@ +@echo off +rmdir /q /s src\UniGetUI\bin\x64\Release\net8.0-windows10.0.26100.0\win-x64\publish\ +dotnet publish src/UniGetUI/UniGetUI.csproj /noLogo /property:Configuration=Release /property:Platform=x64 -v m +src\UniGetUI\bin\x64\Release\net8.0-windows10.0.26100.0\win-x64\publish\UniGetUI.exe +pause \ No newline at end of file From a9193235eed607173d064212485a628c017a2155 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Thu, 10 Apr 2025 16:55:33 +0200 Subject: [PATCH 13/17] Update AbstractPackagesPage.xaml --- src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml index c90da80b3f..2ca122541c 100644 --- a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml +++ b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml @@ -570,8 +570,8 @@ SelectionChanged="ViewModeSelector_SelectionChanged" SelectionMode="Single"> - - + + From f43c7d85b784af0f6ee9e08f8a3e0c862841b80f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Thu, 10 Apr 2025 18:35:21 +0200 Subject: [PATCH 14/17] Add sorting selector combobox on AbstractPackagesPage --- src/UniGetUI/App.xaml | 187 +++++++++--------- src/UniGetUI/Controls/MenuForPackage.cs | 24 +++ .../Controls/ObservablePackageCollection.cs | 4 + .../SoftwarePages/AbstractPackagesPage.xaml | 112 +++++++---- .../AbstractPackagesPage.xaml.cs | 91 ++++++++- 5 files changed, 285 insertions(+), 133 deletions(-) diff --git a/src/UniGetUI/App.xaml b/src/UniGetUI/App.xaml index f5a25c0ad0..6214716716 100644 --- a/src/UniGetUI/App.xaml +++ b/src/UniGetUI/App.xaml @@ -22,6 +22,15 @@ + + /Assets/Symbols/Font/fonts/UniGetUI-Symbols.ttf#UniGetUI-Symbols @@ -48,30 +57,30 @@ + x:Name="ContentPresenterGrid" + Margin="{ThemeResource TreeViewItemPresenterMargin}" + Padding="{ThemeResource TreeViewItemPresenterPadding}" + Background="{TemplateBinding Background}" + BorderBrush="{TemplateBinding BorderBrush}" + BorderThickness="{TemplateBinding BorderThickness}" + CornerRadius="{TemplateBinding CornerRadius}"> + x:Name="SelectionIndicator" + Width="3" + Height="16" + HorizontalAlignment="Left" + VerticalAlignment="Center" + Fill="{ThemeResource TreeViewItemSelectionIndicatorForeground}" + Opacity="0" + RadiusX="2" + RadiusY="2" /> + x:Name="MultiSelectGrid" + Margin="{ThemeResource TreeViewItemMultiSelectSelectedItemBorderMargin}" + Padding="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TreeViewItemTemplateSettings.Indentation}" + BorderBrush="Transparent" + BorderThickness="{ThemeResource TreeViewItemBorderThemeThickness}" + CornerRadius="{ThemeResource ControlCornerRadius}"> @@ -80,84 +89,84 @@ + x:Name="MultiSelectCheckBox" + Width="24" + MinWidth="24" + MinHeight="{ThemeResource TreeViewItemMultiSelectCheckBoxMinHeight}" + Margin="10,0,0,0" + VerticalAlignment="Center" + AutomationProperties.AccessibilityView="Raw" + IsTabStop="False" + Visibility="Collapsed" /> - + Visibility="Collapsed"> + + x:Name="ExpandCollapseChevron" + Grid.Column="1" + Width="20" + Padding="0,0,0,0" + Background="Transparent" + Opacity="{TemplateBinding GlyphOpacity}"> + x:Name="CollapsedGlyph" + Width="12" + Height="12" + Padding="2" + VerticalAlignment="Center" + AutomationProperties.AccessibilityView="Raw" + FontFamily="{StaticResource SymbolThemeFontFamily}" + FontSize="{TemplateBinding GlyphSize}" + Foreground="{TemplateBinding GlyphBrush}" + IsHitTestVisible="False" + IsTextScaleFactorEnabled="False" + Text="{TemplateBinding CollapsedGlyph}" + Visibility="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TreeViewItemTemplateSettings.CollapsedGlyphVisibility}" /> + x:Name="ExpandedGlyph" + Width="12" + Height="12" + Padding="2" + VerticalAlignment="Center" + AutomationProperties.AccessibilityView="Raw" + FontFamily="{StaticResource SymbolThemeFontFamily}" + FontSize="{TemplateBinding GlyphSize}" + Foreground="{TemplateBinding GlyphBrush}" + IsHitTestVisible="False" + IsTextScaleFactorEnabled="False" + Text="{TemplateBinding ExpandedGlyph}" + Visibility="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TreeViewItemTemplateSettings.ExpandedGlyphVisibility}" /> + x:Name="ContentPresenter" + Grid.Column="2" + MinHeight="{ThemeResource TreeViewItemContentHeight}" + Margin="{TemplateBinding Padding}" + HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" + VerticalAlignment="{TemplateBinding VerticalContentAlignment}" + Content="{TemplateBinding Content}" + ContentTemplate="{TemplateBinding ContentTemplate}" + ContentTransitions="{TemplateBinding ContentTransitions}" /> diff --git a/src/UniGetUI/Controls/MenuForPackage.cs b/src/UniGetUI/Controls/MenuForPackage.cs index 653bad5db1..71dd72bdaf 100644 --- a/src/UniGetUI/Controls/MenuForPackage.cs +++ b/src/UniGetUI/Controls/MenuForPackage.cs @@ -38,4 +38,28 @@ public BetterMenuItem() Style = menuStyle; } } + + public partial class BetterToggleMenuItem : ToggleMenuFlyoutItem + { + private readonly Style menuStyle = (Style)Application.Current.Resources["BetterToggleMenuItem"]; + + public IconType IconName + { + set + { + var icon = new LocalIcon(value) { FontSize = 24 }; + Icon = icon; + } + } + + public new string Text + { + set => base.Text = CoreTools.Translate(value); + } + + public BetterToggleMenuItem() + { + Style = menuStyle; + } + } } diff --git a/src/UniGetUI/Controls/ObservablePackageCollection.cs b/src/UniGetUI/Controls/ObservablePackageCollection.cs index 7252e36aa8..41d7170571 100644 --- a/src/UniGetUI/Controls/ObservablePackageCollection.cs +++ b/src/UniGetUI/Controls/ObservablePackageCollection.cs @@ -18,9 +18,11 @@ public enum Sorter NewVersion, Source, } + public Sorter CurrentSorter { get; private set; } public ObservablePackageCollection() { + CurrentSorter = Sorter.Name; SortingSelector = x => x.Package.Name; } @@ -36,8 +38,10 @@ public void Add(IPackage p, AbstractPackagesPage page) /// Sets the property with which to filter the package and sorts the collection /// /// The field with which to sort the collection + /// public void SetSorter(Sorter field) { + CurrentSorter = field; switch (field) { case Sorter.Checked: diff --git a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml index 2ca122541c..6c3e771aa2 100644 --- a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml +++ b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml @@ -14,6 +14,7 @@ xmlns:widgets="using:UniGetUI.Interface.Widgets" Name="ABSTRACT_PAGE" NavigationCacheMode="Required" + SizeChanged="ABSTRACT_PAGE_SizeChanged" mc:Ignorable="d"> @@ -460,50 +461,46 @@ - + - - - + - - + VerticalAlignment="Center" + Orientation="Vertical" + Spacing="0"> + + + - @@ -521,7 +517,7 @@ + + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -936,6 +959,7 @@ Grid.Column="3" Grid.ColumnSpan="1" HorizontalAlignment="Stretch" + VerticalAlignment="Stretch" BorderThickness="0" CornerRadius="0" /> - @@ -372,26 +373,26 @@ ToolTipService.ToolTip="{x:Bind ListedNameTooltip, Mode=OneWay}" Visibility="{x:Bind ShowCustomPackageIcon, Mode=OneWay}" /> - - @@ -412,7 +413,7 @@ BorderThickness="0" Click="{x:Bind RightClick}" Tapped="ContextMenuButton_Tapped"> - + - + diff --git a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs index 385c4c1b5e..b69bea9d85 100644 --- a/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs +++ b/src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs @@ -1269,68 +1269,10 @@ private void FilteringPanel_PaneClosing(SplitView sender, SplitViewPaneClosingEv { ToggleFiltersButton.IsChecked = false; } - - /*private void LoadListLayout() - { - PackageList.ItemTemplate = (DataTemplate)this.Resources["PackageTemplate_List"]; - PackageList.Layout = new StackLayout() { Spacing = 3 }; - } - private void LoadIconsLayout() - { - PackageList.ItemTemplate = (DataTemplate)this.Resources["PackageTemplate_Icons"]; - PackageList.Layout = new UniformGridLayout() - { - ItemsStretch = UniformGridLayoutItemsStretch.None, - ItemsJustification = UniformGridLayoutItemsJustification.Start, - MinColumnSpacing = 8, - MinRowSpacing = 8, - }; - } - - private void LoadGridLayout() - { - PackageList.ItemTemplate = (DataTemplate)this.Resources["PackageTemplate_Grid"]; - PackageList.Layout = new UniformGridLayout() - { - ItemsStretch = UniformGridLayoutItemsStretch.Fill, - MinColumnSpacing = 8, - MinRowSpacing = 8, - MinItemWidth = 275, - MinItemHeight = 56, // Add this - should match your row height plus padding - }; - } - private void ViewModeSelector_SelectionChanged(object sender, SelectionChangedEventArgs e) { Settings.SetDictionaryItem("PackageListViewMode", PAGE_NAME, ViewModeSelector.SelectedIndex); - if (ViewModeSelector.SelectedIndex == 0) - LoadListLayout(); - else if (ViewModeSelector.SelectedIndex == 1) - LoadGridLayout(); - else if (ViewModeSelector.SelectedIndex == 2) - LoadIconsLayout(); - - if(ViewModeSelector.SelectedIndex == 0) - { - NameHeader.Content = CoreTools.Translate("Package Name"); - IdHeader.Content = CoreTools.Translate("Package ID"); - VersionHeader.Content = CoreTools.Translate("Version"); - NewVersionHeader.Content = CoreTools.Translate("New version"); - SourceHeader.Content = CoreTools.Translate("Source"); - foreach (var item in new Button[] { NameHeader, IdHeader, VersionHeader, NewVersionHeader, SourceHeader }) - { - item.IsEnabled = true; - } - } - else - { - foreach (var item in new Button[] { NameHeader, IdHeader, VersionHeader, NewVersionHeader, SourceHeader }) - { - item.Content = ""; - item.IsEnabled = false; - } - } - }*/ + } FrameworkElement _lastContextMenuButtonTapped = null!; private void ContextMenuButton_Tapped(object sender, TappedRoutedEventArgs e) From 49043b6d5977072fad56f2bb28a7fd63fd4d4c56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Fri, 11 Apr 2025 19:05:36 +0200 Subject: [PATCH 17/17] privatize methods --- .../DiscoverablePackagesLoader.cs | 42 ++++++++ src/UniGetUI/App.xaml.cs | 15 +-- src/UniGetUI/AppOperationHelper.cs | 34 +++++++ src/UniGetUI/MainWindow.xaml.cs | 9 +- .../DialogPages/DialogHelper_Packages.cs | 56 +++++++++++ src/UniGetUI/Pages/MainView.xaml.cs | 14 ++- .../SettingsPages/GeneralPages/Backup.xaml.cs | 3 +- .../SoftwarePages/DiscoverSoftwarePage.cs | 97 ------------------- .../SoftwarePages/InstalledPackagesPage.cs | 6 +- .../SoftwarePages/SoftwareUpdatesPage.cs | 37 ++----- 10 files changed, 168 insertions(+), 145 deletions(-) diff --git a/src/UniGetUI.PackageEngine.PackageLoader/DiscoverablePackagesLoader.cs b/src/UniGetUI.PackageEngine.PackageLoader/DiscoverablePackagesLoader.cs index 0e61004ef3..50f011c72f 100644 --- a/src/UniGetUI.PackageEngine.PackageLoader/DiscoverablePackagesLoader.cs +++ b/src/UniGetUI.PackageEngine.PackageLoader/DiscoverablePackagesLoader.cs @@ -1,3 +1,4 @@ +using UniGetUI.Core.Logging; using UniGetUI.Core.Tools; using UniGetUI.Interface.Enums; using UniGetUI.PackageEngine.Interfaces; @@ -66,5 +67,46 @@ protected override Task WhenAddingPackage(IPackage package) } return Task.CompletedTask; } + + public (IPackage?, string?) GetPackageFromIdAndManager(string id, string managerName, string sourceName) + { + IPackageManager? manager = null; + + foreach (var candidate in Managers) + { + if (candidate.Name == managerName || candidate.DisplayName == managerName) + { + manager = candidate; + break; + } + } + + if (manager is null) + return (null, CoreTools.Translate("The package manager \"{0}\" was not found", managerName)); + + if (!manager.IsEnabled()) + return (null, CoreTools.Translate("The package manager \"{0}\" is disabled", manager.DisplayName)); + + if (!manager.Status.Found) + return (null, CoreTools.Translate("There is an error with the configuration of the package manager \"{0}\"", manager.DisplayName)); + + var results = manager.FindPackages(id); + var candidates = results.Where(p => p.Id == id).ToArray(); + + if (candidates.Length == 0) + return (null, CoreTools.Translate("The package \"{0}\" was not found on the package manager \"{1}\"", id, manager.DisplayName)); + + IPackage package = candidates[0]; + + // Get package from best source + if (candidates.Length >= 1 && manager.Capabilities.SupportsCustomSources) + foreach (var candidate in candidates) + { + if (candidate.Source.Name == sourceName) + package = candidate; + } + + return (package, null); + } } } diff --git a/src/UniGetUI/App.xaml.cs b/src/UniGetUI/App.xaml.cs index aa641b1b26..f16529aed2 100644 --- a/src/UniGetUI/App.xaml.cs +++ b/src/UniGetUI/App.xaml.cs @@ -18,6 +18,8 @@ using UniGetUI.Interface.Telemetry; using UniGetUI.PackageEngine.Interfaces; using LaunchActivatedEventArgs = Microsoft.UI.Xaml.LaunchActivatedEventArgs; +using UniGetUI.Pages.DialogPages; +using UniGetUI.Interface.Enums; namespace UniGetUI { @@ -227,23 +229,22 @@ private async Task LoadComponentsAsync() BackgroundApi.OnShowSharedPackage += (_, package) => MainWindow.DispatcherQueue.TryEnqueue(() => { - MainWindow?.NavigationPage?.DiscoverPage.ShowSharedPackage_ThreadSafe(package.Key, package.Value); - MainWindow?.Activate(); + DialogHelper.ShowSharedPackage_ThreadSafe(package.Key, package.Value); }); BackgroundApi.OnUpgradeAll += (_, _) => MainWindow.DispatcherQueue.TryEnqueue(() => { - MainWindow?.NavigationPage?.UpdatesPage.UpdateAll(); + Operations.UpdateAll(); }); - BackgroundApi.OnUpgradeAllForManager += (_, manager) => MainWindow.DispatcherQueue.TryEnqueue(() => + BackgroundApi.OnUpgradeAllForManager += (_, managerName) => MainWindow.DispatcherQueue.TryEnqueue(async () => { - MainWindow?.NavigationPage?.UpdatesPage.UpdateAllPackagesForManager(manager); + Operations.UpdateAllForManager(managerName); }); - BackgroundApi.OnUpgradePackage += (_, package) => MainWindow.DispatcherQueue.TryEnqueue(() => + BackgroundApi.OnUpgradePackage += (_, packageId) => MainWindow.DispatcherQueue.TryEnqueue(() => { - MainWindow?.NavigationPage?.UpdatesPage.UpdatePackageForId(package); + Operations.UpdateForId(packageId); }); _ = BackgroundApi.Start(); diff --git a/src/UniGetUI/AppOperationHelper.cs b/src/UniGetUI/AppOperationHelper.cs index 83643ea1dd..9b08b250fc 100644 --- a/src/UniGetUI/AppOperationHelper.cs +++ b/src/UniGetUI/AppOperationHelper.cs @@ -15,6 +15,8 @@ using UniGetUI.PackageEngine.PackageClasses; using UniGetUI.PackageOperations; using UniGetUI.Pages.DialogPages; +using UniGetUI.Interface.Enums; +using UniGetUI.PackageEngine; namespace UniGetUI; @@ -163,6 +165,38 @@ public static void Update(IReadOnlyList packages, bool? elevated = nul } } + public static async void UpdateAll() + { + foreach (IPackage package in PEInterface.UpgradablePackagesLoader.Packages) + if (package.Tag is not PackageTag.BeingProcessed and not PackageTag.OnQueue) + await Update(package); + } + + public static async void UpdateAllForManager(string managerName) + { + foreach (IPackage package in PEInterface.UpgradablePackagesLoader.Packages) + { + if (package.Tag is not PackageTag.OnQueue and not PackageTag.BeingProcessed + && package.Manager.Name == managerName || package.Manager.DisplayName == managerName) + await Update(package); + } + } + + public static async void UpdateForId(string packageId) + { + foreach (IPackage package in PEInterface.UpgradablePackagesLoader.Packages) + { + if (package.Id == packageId) + { + await Update(package); + Logger.Info($"[WIDGETS] Updating package with id {packageId}"); + return; + } + } + + Logger.Warn($"[WIDGETS] No package with id={packageId} was found"); + } + /* * PACKAGE UNINSTALL */ diff --git a/src/UniGetUI/MainWindow.xaml.cs b/src/UniGetUI/MainWindow.xaml.cs index 143b04714a..b44429727c 100644 --- a/src/UniGetUI/MainWindow.xaml.cs +++ b/src/UniGetUI/MainWindow.xaml.cs @@ -265,7 +265,7 @@ public void HandleNotificationActivation(AppNotificationActivatedEventArgs args) if (action == NotificationArguments.UpdateAllPackages) { - NavigationPage.UpdatesPage.UpdateAll(); + MainApp.Operations.UpdateAll(); } else if (action == NotificationArguments.ShowOnUpdatesTab) { @@ -360,11 +360,11 @@ private void HandleDeepLink(string link) if (Id != "" && CombinedManagerName != "" && ManagerName == "" && SourceName == "") { Logger.Warn($"URI {link} follows old scheme"); - NavigationPage.DiscoverPage.ShowSharedPackage_ThreadSafe(Id, CombinedManagerName); + DialogHelper.ShowSharedPackage_ThreadSafe(Id, CombinedManagerName); } else if (Id != "" && ManagerName != "" && SourceName != "") { - NavigationPage.DiscoverPage.ShowSharedPackage_ThreadSafe(Id, ManagerName, SourceName); + DialogHelper.ShowSharedPackage_ThreadSafe(Id, ManagerName, SourceName); } else { @@ -437,8 +437,7 @@ public void ProcessCommandLineParameters() { // Handle potential JSON files Logger.ImportantInfo("Begin attempt to open the package bundle " + param); - NavigationPage.NavigateTo(PageType.Bundles); - _ = NavigationPage.BundlesPage.OpenFromFile(param); + NavigationPage.LoadBundleFile(param); } else if (param.EndsWith("UniGetUI.exe") || param.EndsWith("UniGetUI.dll")) { diff --git a/src/UniGetUI/Pages/DialogPages/DialogHelper_Packages.cs b/src/UniGetUI/Pages/DialogPages/DialogHelper_Packages.cs index 280cf91cbb..5dc4b8034e 100644 --- a/src/UniGetUI/Pages/DialogPages/DialogHelper_Packages.cs +++ b/src/UniGetUI/Pages/DialogPages/DialogHelper_Packages.cs @@ -1,13 +1,17 @@ +using System.Diagnostics.Tracing; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Media; +using UniGetUI.Core.Logging; using UniGetUI.Core.Tools; using UniGetUI.Interface.Dialogs; using UniGetUI.Interface.Telemetry; +using UniGetUI.PackageEngine; using UniGetUI.PackageEngine.Enums; using UniGetUI.PackageEngine.Interfaces; using UniGetUI.PackageEngine.PackageClasses; using UniGetUI.PackageEngine.Serializable; +using Windows.ApplicationModel; namespace UniGetUI.Pages.DialogPages; @@ -139,4 +143,56 @@ public static async Task ConfirmUninstallation(IReadOnlyList pac return await Window.ShowDialogAsync(dialog) is ContentDialogResult.Primary; } + + public static void ShowSharedPackage_ThreadSafe(string id, string combinedSourceName) + { + var contents = combinedSourceName.Split(':'); + string managerName = contents[0]; + string sourceName = ""; + if (contents.Length > 1) sourceName = contents[1]; + GetPackageFromIdAndManager(id, managerName, sourceName, "LEGACY_COMBINEDSOURCE"); + } + + public static void ShowSharedPackage_ThreadSafe(string id, string managerName, string sourceName) + { + MainApp.Instance.MainWindow.DispatcherQueue.TryEnqueue(() => + { + GetPackageFromIdAndManager(id, managerName, sourceName, "DEFAULT"); + }); + } + + private static async void GetPackageFromIdAndManager(string id, string managerName, string sourceName, string eventSource) + { + try + { + Window.Activate(); + ShowLoadingDialog(CoreTools.Translate("Please wait...")); + + var findResult = await Task.Run(() => PEInterface.DiscoveredPackagesLoader.GetPackageFromIdAndManager(id, managerName, sourceName)); + + HideLoadingDialog(); + + if (findResult.Item1 is null) throw new KeyNotFoundException(findResult.Item2 ?? "Unknown error"); + + TelemetryHandler.SharedPackage(findResult.Item1, eventSource); + ShowPackageDetails(findResult.Item1, OperationType.Install, TEL_InstallReferral.FROM_WEB_SHARE); + + } + catch (Exception ex) + { + Logger.Error($"An error occurred while attempting to show the package with id {id}"); + var warningDialog = new ContentDialog + { + Title = CoreTools.Translate("Package not found"), + Content = CoreTools.Translate("An error occurred when attempting to show the package with Id {0}", id) + ":\n" + ex.Message, + CloseButtonText = CoreTools.Translate("Ok"), + DefaultButton = ContentDialogButton.Close, + XamlRoot = MainApp.Instance.MainWindow.Content.XamlRoot // Ensure the dialog is shown in the correct context + }; + + HideLoadingDialog(); + await Window.ShowDialogAsync(warningDialog); + + } + } } diff --git a/src/UniGetUI/Pages/MainView.xaml.cs b/src/UniGetUI/Pages/MainView.xaml.cs index 56e592f5c1..72efe2776a 100644 --- a/src/UniGetUI/Pages/MainView.xaml.cs +++ b/src/UniGetUI/Pages/MainView.xaml.cs @@ -42,10 +42,10 @@ public enum PageType public sealed partial class MainView : UserControl { - public DiscoverSoftwarePage DiscoverPage; - public SoftwareUpdatesPage UpdatesPage; - public InstalledPackagesPage InstalledPage; - public PackageBundlesPage BundlesPage; + private DiscoverSoftwarePage DiscoverPage; + private SoftwareUpdatesPage UpdatesPage; + private InstalledPackagesPage InstalledPage; + private PackageBundlesPage BundlesPage; private SettingsBasePage? SettingsPage; private SettingsBasePage? ManagersPage; private UniGetUILogPage? UniGetUILogPage; @@ -431,5 +431,11 @@ private void MoreNavBtn_Tapped(object sender, Microsoft.UI.Xaml.Input.TappedRout (VersionMenuItem as MenuFlyoutItem).Text = CoreTools.Translate("WingetUI Version {0}", CoreData.VersionName); MoreNavButtonMenu.ShowAt(sender as FrameworkElement); } + + internal void LoadBundleFile(string param) + { + NavigateTo(PageType.Bundles); + BundlesPage?.OpenFromFile(param); + } } } diff --git a/src/UniGetUI/Pages/SettingsPages/GeneralPages/Backup.xaml.cs b/src/UniGetUI/Pages/SettingsPages/GeneralPages/Backup.xaml.cs index dbf726d1d3..81e0c5f4b4 100644 --- a/src/UniGetUI/Pages/SettingsPages/GeneralPages/Backup.xaml.cs +++ b/src/UniGetUI/Pages/SettingsPages/GeneralPages/Backup.xaml.cs @@ -5,6 +5,7 @@ using UniGetUI.Core.Data; using System.Diagnostics; using UniGetUI.Pages.DialogPages; +using UniGetUI.Interface.SoftwarePages; // To learn more about WinUI, the WinUI project structure, // and more about our project templates, see: http://aka.ms/winui-project-info. @@ -99,7 +100,7 @@ private void OpenBackupPath_Click(object sender, RoutedEventArgs e) private async void DoBackup_Click(object sender, EventArgs e) { DialogHelper.ShowLoadingDialog(CoreTools.Translate("Performing backup, please wait...")); - await MainApp.Instance.MainWindow.NavigationPage.InstalledPage.BackupPackages(); + await InstalledPackagesPage.BackupPackages(); DialogHelper.HideLoadingDialog(); } } diff --git a/src/UniGetUI/Pages/SoftwarePages/DiscoverSoftwarePage.cs b/src/UniGetUI/Pages/SoftwarePages/DiscoverSoftwarePage.cs index ee34f4b52b..be4b8c51cd 100644 --- a/src/UniGetUI/Pages/SoftwarePages/DiscoverSoftwarePage.cs +++ b/src/UniGetUI/Pages/SoftwarePages/DiscoverSoftwarePage.cs @@ -298,102 +298,5 @@ private void MenuAsAdmin_Invoked(object sender, RoutedEventArgs e) private void MenuInstallSettings_Invoked(object sender, RoutedEventArgs e) => ShowInstallationOptionsForPackage(SelectedItem); - public void ShowSharedPackage_ThreadSafe(string id, string combinedSourceName) - { - var contents = combinedSourceName.Split(':'); - string managerName = contents[0]; - string sourceName = ""; - if (contents.Length > 1) sourceName = contents[1]; - _showSharedPackage(id, managerName, sourceName, "LEGACY_COMBINEDSOURCE"); - } - - public void ShowSharedPackage_ThreadSafe(string id, string managerName, string sourceName) - { - MainApp.Instance.MainWindow.DispatcherQueue.TryEnqueue(() => - { - _showSharedPackage(id, managerName, sourceName, "DEFAULT"); - }); - } - - private async void _showSharedPackage(string id, string manager, string source, string eventSource) - { - IPackage? package = await GetPackageFromIdAndManager(id, manager, source); - if (package is not null) - { - TelemetryHandler.SharedPackage(package, eventSource); - ShowDetailsForPackage(package, TEL_InstallReferral.FROM_WEB_SHARE); - } - } - - private static async Task GetPackageFromIdAndManager(string id, string managerName, string sourceName) - { - try - { - Logger.Info($"Showing shared package with pId={id} and pSource={managerName}: ´{sourceName} ..."); - MainApp.Instance.MainWindow.Activate(); - DialogHelper.ShowLoadingDialog(CoreTools.Translate("Please wait...", id)); - - IPackageManager? manager = null; - - foreach (var candidate in PEInterface.Managers) - { - if (candidate.Name == managerName || candidate.DisplayName == managerName) - { - manager = candidate; - break; - } - } - - if (manager is null) - { - throw new ArgumentException(CoreTools.Translate("The package manager \"{0}\" was not found", managerName)); - } - - if (!manager.IsEnabled()) - throw new ArgumentException(CoreTools.Translate("The package manager \"{0}\" is disabled", manager.DisplayName)); - - if (!manager.Status.Found) - throw new ArgumentException(CoreTools.Translate("There is an error with the configuration of the package manager \"{0}\"", manager.DisplayName)); - - var results = await Task.Run(() => manager.FindPackages(id)); - var candidates = results.Where(p => p.Id == id).ToArray(); - - if (candidates.Length == 0) - { - throw new ArgumentException(CoreTools.Translate("The package \"{0}\" was not found on the package manager \"{1}\"", id, manager.DisplayName)); - } - - IPackage package = candidates[0]; - - // Get package from best source - if (candidates.Length >= 1 && manager.Capabilities.SupportsCustomSources) - foreach (var candidate in candidates) - { - if (candidate.Source.Name == sourceName) - package = candidate; - } - - Logger.ImportantInfo($"Found package {package.Id} on manager {package.Manager.Name}, showing it..."); - DialogHelper.HideLoadingDialog(); - return package; - } - catch (Exception ex) - { - Logger.Error($"An error occurred while attempting to show the package with id {id}"); - Logger.Error(ex); - var warningDialog = new ContentDialog - { - Title = CoreTools.Translate("Package not found"), - Content = CoreTools.Translate("An error occurred when attempting to show the package with Id {0}", id) + ":\n" + ex.Message, - CloseButtonText = CoreTools.Translate("Ok"), - DefaultButton = ContentDialogButton.Close, - XamlRoot = MainApp.Instance.MainWindow.Content.XamlRoot // Ensure the dialog is shown in the correct context - }; - - DialogHelper.HideLoadingDialog(); - await MainApp.Instance.MainWindow.ShowDialogAsync(warningDialog); - return null; - } - } } } diff --git a/src/UniGetUI/Pages/SoftwarePages/InstalledPackagesPage.cs b/src/UniGetUI/Pages/SoftwarePages/InstalledPackagesPage.cs index 54d2c33d32..ead9b05601 100644 --- a/src/UniGetUI/Pages/SoftwarePages/InstalledPackagesPage.cs +++ b/src/UniGetUI/Pages/SoftwarePages/InstalledPackagesPage.cs @@ -17,7 +17,7 @@ namespace UniGetUI.Interface.SoftwarePages { public partial class InstalledPackagesPage : AbstractPackagesPage { - private bool HasDoneBackup; + private static bool HasDoneBackup; private BetterMenuItem? MenuAsAdmin; private BetterMenuItem? MenuInteractive; @@ -361,14 +361,14 @@ private async void ExportSelection_Click(object sender, RoutedEventArgs e) } - public async Task BackupPackages() + public static async Task BackupPackages() { try { Logger.Debug("Starting package backup"); List packagesToExport = []; - foreach (IPackage package in Loader.Packages) + foreach (IPackage package in PEInterface.InstalledPackagesLoader.Packages) { packagesToExport.Add(package); } diff --git a/src/UniGetUI/Pages/SoftwarePages/SoftwareUpdatesPage.cs b/src/UniGetUI/Pages/SoftwarePages/SoftwareUpdatesPage.cs index 20bb2719ad..72b0ff73bb 100644 --- a/src/UniGetUI/Pages/SoftwarePages/SoftwareUpdatesPage.cs +++ b/src/UniGetUI/Pages/SoftwarePages/SoftwareUpdatesPage.cs @@ -325,15 +325,6 @@ protected override void WhenPackageCountUpdated() MainApp.Tooltip.AvailableUpdates = Loader.Count(); } - public void UpdateAll() - { - foreach (IPackage package in Loader.Packages) - { - if (package.Tag is not PackageTag.BeingProcessed and not PackageTag.OnQueue) - _ = MainApp.Operations.Update(package); - } - } - protected override void WhenPackagesLoaded(ReloadReason reason) { List upgradablePackages = []; @@ -374,12 +365,14 @@ protected override void WhenPackagesLoaded(ReloadReason reason) if(EnableAutoUpdate) - UpdateAll(); + { + MainApp.Operations.UpdateAll(); + } if (Settings.AreUpdatesNotificationsDisabled()) return; - AppNotificationManager.Default.RemoveByTagAsync(CoreData.UpdatesAvailableNotificationTag.ToString()); + _ = AppNotificationManager.Default.RemoveByTagAsync(CoreData.UpdatesAvailableNotificationTag.ToString()); AppNotification notification; if (upgradablePackages.Count == 1) @@ -536,29 +529,17 @@ private void MenuSkipVersion_Invoked(object sender, RoutedEventArgs e) PEInterface.UpgradablePackagesLoader.IgnoredPackages[package.Id] = package; } - public void UpdatePackageForId(string id) + + public void UpdateAll() { - foreach (IPackage package in Loader.Packages) - { - if (package.Id == id) - { - _ = MainApp.Operations.Update(package); - Logger.Info($"[WIDGETS] Updating package with id {id}"); - break; - } - } + } - Logger.Warn($"[WIDGETS] No package with id={id} was found"); + public void UpdatePackageForId(string id) + { } public async void UpdateAllPackagesForManager(string manager) { - foreach (IPackage package in Loader.Packages) - { - if (package.Tag is not PackageTag.OnQueue and not PackageTag.BeingProcessed) - if (package.Manager.Name == manager || package.Manager.DisplayName == manager) - await MainApp.Operations.Update(package); - } } } }