diff --git a/src/UniGetUI.Avalonia/Assets/Styles/Styles.Common.axaml b/src/UniGetUI.Avalonia/Assets/Styles/Styles.Common.axaml index 77f4a4c96c..9a4cfd00a7 100644 --- a/src/UniGetUI.Avalonia/Assets/Styles/Styles.Common.axaml +++ b/src/UniGetUI.Avalonia/Assets/Styles/Styles.Common.axaml @@ -13,6 +13,9 @@ + + + @@ -35,6 +38,14 @@ + + + + + + + + @@ -78,6 +89,9 @@ + + + @@ -99,6 +113,14 @@ + + + + + + + + @@ -147,6 +169,10 @@ + + @@ -157,6 +183,96 @@ + + + + + + + + + + + + + + + + + + + + @@ -19,14 +36,14 @@ + FontSize="14" Opacity="0.7"/> - + - + - - + + + + + + + + - + + + + + + + + + + - - + - + + + + + + + + + + @@ -174,7 +226,8 @@ @@ -182,18 +235,42 @@ - + + + + + + + + + + - + + + + + + + + FontFamily="Consolas,Cascadia Mono,Menlo,monospace" + FontSize="14"/> + FontFamily="Consolas,Cascadia Mono,Menlo,monospace" + FontSize="14"/> + FontFamily="Consolas,Cascadia Mono,Menlo,monospace" + FontSize="14"/> - + + - + + + + + + + + + + @@ -236,7 +326,8 @@ + FontFamily="Consolas,Cascadia Mono,Menlo,monospace" + FontSize="14"/> - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/UniGetUI.Avalonia/Views/DialogPages/ManageIgnoredUpdatesWindow.axaml.cs b/src/UniGetUI.Avalonia/Views/DialogPages/ManageIgnoredUpdatesWindow.axaml.cs index 3897c61742..ec23a3c172 100644 --- a/src/UniGetUI.Avalonia/Views/DialogPages/ManageIgnoredUpdatesWindow.axaml.cs +++ b/src/UniGetUI.Avalonia/Views/DialogPages/ManageIgnoredUpdatesWindow.axaml.cs @@ -12,7 +12,14 @@ public ManageIgnoredUpdatesWindow() var vm = new ManageIgnoredUpdatesViewModel(); DataContext = vm; InitializeComponent(); - UniGetUI.Avalonia.Infrastructure.MicaWindowHelper.Apply(this); + + // Drop the OS title-bar strip (its background clashed with the dialog) but keep + // the system min/max/close buttons floating over the extended client area. Default + // WindowDecorations (Full) keeps the system buttons; extending the client area + // merges the title-bar region into the content. + ExtendClientAreaToDecorationsHint = true; + ExtendClientAreaTitleBarHeightHint = -1; + vm.CloseRequested += (_, _) => Close(); } @@ -21,7 +28,7 @@ protected override void OnOpened(EventArgs e) base.OnOpened(e); Dispatcher.UIThread.Post(() => { - if (IgnoredUpdatesGrid.IsVisible) + if (((ManageIgnoredUpdatesViewModel)DataContext!).HasEntries) IgnoredUpdatesGrid.Focus(); else ResetButton.Focus(); diff --git a/src/UniGetUI.Avalonia/Views/DialogPages/PackageDetailsWindow.axaml b/src/UniGetUI.Avalonia/Views/DialogPages/PackageDetailsWindow.axaml index de84f78426..391f000f2c 100644 --- a/src/UniGetUI.Avalonia/Views/DialogPages/PackageDetailsWindow.axaml +++ b/src/UniGetUI.Avalonia/Views/DialogPages/PackageDetailsWindow.axaml @@ -142,9 +142,9 @@ VerticalAlignment="Center" Spacing="4"> @@ -223,7 +223,7 @@ VerticalAlignment="Center"/> @@ -82,6 +88,7 @@ HorizontalAlignment="Center" automation:AutomationProperties.Name="{t:Translate Report an issue or submit a feature request}"> @@ -93,6 +100,7 @@ HorizontalAlignment="Center" automation:AutomationProperties.Name="{t:Translate UniGetUI Repository}"> diff --git a/src/UniGetUI.Avalonia/Views/Pages/AboutPages/Contributors.axaml b/src/UniGetUI.Avalonia/Views/Pages/AboutPages/Contributors.axaml index a414289923..c9e5a72217 100644 --- a/src/UniGetUI.Avalonia/Views/Pages/AboutPages/Contributors.axaml +++ b/src/UniGetUI.Avalonia/Views/Pages/AboutPages/Contributors.axaml @@ -13,10 +13,12 @@ @@ -41,6 +43,7 @@ diff --git a/src/UniGetUI.Avalonia/Views/Pages/AboutPages/ThirdPartyLicenses.axaml b/src/UniGetUI.Avalonia/Views/Pages/AboutPages/ThirdPartyLicenses.axaml index f7613aa8d7..c522a6ca8a 100644 --- a/src/UniGetUI.Avalonia/Views/Pages/AboutPages/ThirdPartyLicenses.axaml +++ b/src/UniGetUI.Avalonia/Views/Pages/AboutPages/ThirdPartyLicenses.axaml @@ -13,18 +13,22 @@ @@ -35,6 +39,7 @@ Margin="0,2"> @@ -57,6 +63,7 @@ HorizontalAlignment="Right" automation:AutomationProperties.Name="{Binding HomepageText}"> diff --git a/src/UniGetUI.Avalonia/Views/Pages/AboutPages/Translators.axaml b/src/UniGetUI.Avalonia/Views/Pages/AboutPages/Translators.axaml index 380492408c..76e05dcbaf 100644 --- a/src/UniGetUI.Avalonia/Views/Pages/AboutPages/Translators.axaml +++ b/src/UniGetUI.Avalonia/Views/Pages/AboutPages/Translators.axaml @@ -13,10 +13,12 @@ @@ -40,6 +43,7 @@ @@ -56,6 +60,7 @@ diff --git a/src/UniGetUI.Avalonia/Views/Pages/LogPages/BaseLogPage.axaml b/src/UniGetUI.Avalonia/Views/Pages/LogPages/BaseLogPage.axaml index dd056d2ce6..332aaa785d 100644 --- a/src/UniGetUI.Avalonia/Views/Pages/LogPages/BaseLogPage.axaml +++ b/src/UniGetUI.Avalonia/Views/Pages/LogPages/BaseLogPage.axaml @@ -36,6 +36,7 @@ VerticalAlignment="Center"> @@ -52,6 +54,7 @@ @@ -79,6 +82,7 @@ @@ -97,6 +101,7 @@ CornerRadius="0,0,8,8"/> @@ -108,6 +113,7 @@ CornerRadius="8"/> diff --git a/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/Backup.axaml b/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/Backup.axaml index 6428470f8a..a55bd83500 100644 --- a/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/Backup.axaml +++ b/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/Backup.axaml @@ -14,6 +14,7 @@ @@ -23,7 +24,7 @@ - + @@ -60,6 +61,7 @@ @@ -165,6 +168,7 @@ CommandParameter="{Binding $self}"/> diff --git a/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/General.axaml b/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/General.axaml index d34aedcaa8..403a2dbd43 100644 --- a/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/General.axaml +++ b/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/General.axaml @@ -14,6 +14,7 @@ @@ -22,6 +23,7 @@ CornerRadius="8"/> @@ -43,6 +45,7 @@ BorderThickness="1,0,1,1"/> @@ -54,6 +57,7 @@ CommandParameter="{Binding $self}"/> @@ -65,6 +69,7 @@ StateChangedCommand="{Binding ToggleRedactUsernameCommand}"/> @@ -89,6 +94,7 @@ CommandParameter="{Binding $self}"/> diff --git a/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/InstallOptionsPanel.axaml b/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/InstallOptionsPanel.axaml index f3e94db8cc..79e0654a73 100644 --- a/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/InstallOptionsPanel.axaml +++ b/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/InstallOptionsPanel.axaml @@ -21,6 +21,7 @@ @@ -92,11 +93,11 @@ - + - + diff --git a/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/PackageManagerPage.axaml.cs b/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/PackageManagerPage.axaml.cs index 5f0c54e948..0ddb4b046d 100644 --- a/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/PackageManagerPage.axaml.cs +++ b/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/PackageManagerPage.axaml.cs @@ -206,7 +206,7 @@ private void BuildPage() }; var pathLabel = new TextBlock { - FontFamily = new FontFamily("Courier New"), + FontFamily = new FontFamily("Consolas,Cascadia Mono,Menlo,monospace"), FontSize = 14, TextWrapping = TextWrapping.Wrap, }; diff --git a/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/SettingsBasePage.axaml b/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/SettingsBasePage.axaml index 61ab64b61b..134147d743 100644 --- a/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/SettingsBasePage.axaml +++ b/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/SettingsBasePage.axaml @@ -29,8 +29,8 @@ Path="avares://UniGetUI.Avalonia/Assets/Symbols/backward.svg"/> @@ -47,6 +47,7 @@ + + + + + + + + + + - + + + + + + + - + + + + + diff --git a/src/UniGetUI.Avalonia/Views/SidebarView.axaml.cs b/src/UniGetUI.Avalonia/Views/SidebarView.axaml.cs index 286ef2f129..5bdf240b8e 100644 --- a/src/UniGetUI.Avalonia/Views/SidebarView.axaml.cs +++ b/src/UniGetUI.Avalonia/Views/SidebarView.axaml.cs @@ -1,6 +1,11 @@ using Avalonia; +using Avalonia.Animation; +using Avalonia.Animation.Easings; using Avalonia.Controls; +using Avalonia.Controls.Primitives; using Avalonia.Input; +using Avalonia.Media; +using Avalonia.Styling; using UniGetUI.Avalonia.ViewModels; namespace UniGetUI.Avalonia.Views; @@ -32,15 +37,20 @@ protected override void OnDataContextChanged(EventArgs e) { base.OnDataContextChanged(e); if (DataContext is SidebarViewModel vm) + { vm.PropertyChanged += (_, args) => { if (args.PropertyName == nameof(SidebarViewModel.SelectedPageType)) SyncListBoxSelection(vm.SelectedPageType); }; + // The startup page may already be set before this view subscribes, so apply it now. + SyncListBoxSelection(vm.SelectedPageType); + } } private void SyncListBoxSelection(PageType page) { + // Selection lives in two ListBoxes (main + footer); only one may hold a selection at a time. _lastNavItemSelectionWasAuto = true; NavListBox.SelectedItem = page switch { @@ -50,20 +60,57 @@ private void SyncListBoxSelection(PageType page) PageType.Bundles => BundlesNavBtn, _ => null, }; + FooterNavListBox.SelectedItem = page switch + { + PageType.Settings => SettingsNavBtn, + PageType.Managers => ManagersNavBtn, + _ => null, + }; _lastNavItemSelectionWasAuto = false; } private void NavListBox_SelectionChanged(object? sender, SelectionChangedEventArgs e) + => HandleNavSelectionChanged(NavListBox.SelectedItem); + + private void FooterNavListBox_SelectionChanged(object? sender, SelectionChangedEventArgs e) + => HandleNavSelectionChanged(FooterNavListBox.SelectedItem); + + private void HandleNavSelectionChanged(object? selectedItem) { if (_lastNavItemSelectionWasAuto) return; - if (NavListBox.SelectedItem is ListBoxItem item && item.Tag is string tag - && Enum.TryParse(tag, out var pageType)) + if (selectedItem is not ListBoxItem item || item.Tag is not string tag) return; + + if (tag == "More") + { + // Not a page: re-sync selection so "More" doesn't stay highlighted, then open its menu. + SyncListBoxSelection(ViewModel?.SelectedPageType ?? PageType.Null); + FlyoutBase.ShowAttachedFlyout(item); + return; + } + + if (Enum.TryParse(tag, out var pageType)) ViewModel?.RequestNavigation(pageType.ToString()); } + // One full gear rotation on click, mirroring the spin of WinUI's AnimatedSettingsVisualSource. + // The TransformAnimator manages the icon's RenderTransform, so the animation runs on the Visual itself. + private readonly Animation _settingsIconSpin = new() + { + Duration = TimeSpan.FromSeconds(0.5), + Easing = new CubicEaseOut(), + Children = + { + new KeyFrame { Cue = new Cue(0d), Setters = { new Setter(RotateTransform.AngleProperty, 0d) } }, + new KeyFrame { Cue = new Cue(1d), Setters = { new Setter(RotateTransform.AngleProperty, 360d) } }, + }, + }; + + private void SettingsNavBtn_Tapped(object? sender, TappedEventArgs e) + => _ = _settingsIconSpin.RunAsync(SettingsIcon); + public void FocusSelectedItem() { - if (NavListBox.SelectedItem is InputElement item) + if ((NavListBox.SelectedItem ?? FooterNavListBox.SelectedItem) is InputElement item) item.Focus(); else NavListBox.Focus(); diff --git a/src/UniGetUI.Avalonia/Views/SoftwarePages/AbstractPackagesPage.axaml b/src/UniGetUI.Avalonia/Views/SoftwarePages/AbstractPackagesPage.axaml index a3b591a88d..0298392b89 100644 --- a/src/UniGetUI.Avalonia/Views/SoftwarePages/AbstractPackagesPage.axaml +++ b/src/UniGetUI.Avalonia/Views/SoftwarePages/AbstractPackagesPage.axaml @@ -21,8 +21,25 @@ + + + + +