From a365b18b1e1f25fd0209aa8f57fbab8182ca00cb Mon Sep 17 00:00:00 2001 From: GabrielDuf Date: Fri, 19 Jun 2026 09:06:26 -0400 Subject: [PATCH 01/10] Match Avalonia text styling to WinUI (size, weight, font) --- .../Assets/Styles/Styles.Common.axaml | 4 ++ .../Controls/Settings/CheckboxButtonCard.cs | 2 +- .../Views/Controls/Settings/CheckboxCard.cs | 1 + .../Controls/Settings/SecureCheckboxCard.cs | 1 + .../Views/Controls/Settings/SettingsCard.cs | 3 +- .../Views/DialogPages/CrashReportWindow.axaml | 2 +- .../DialogPages/InstallOptionsControl.axaml | 41 ++++++++++++------- .../ManageDesktopShortcutsWindow.axaml | 1 + .../DialogPages/PackageDetailsWindow.axaml | 6 +-- src/UniGetUI.Avalonia/Views/MainWindow.axaml | 6 +-- .../Views/Pages/AboutPages/AboutPage.axaml | 8 ++++ .../Views/Pages/AboutPages/Contributors.axaml | 4 ++ .../Pages/AboutPages/ThirdPartyLicenses.axaml | 7 ++++ .../Views/Pages/AboutPages/Translators.axaml | 6 +++ .../Views/Pages/LogPages/BaseLogPage.axaml | 1 + .../Pages/SettingsPages/Administrator.axaml | 6 +++ .../Views/Pages/SettingsPages/Backup.axaml | 6 ++- .../Views/Pages/SettingsPages/General.axaml | 6 +++ .../SettingsPages/InstallOptionsPanel.axaml | 19 +++++++-- .../Pages/SettingsPages/Interface_P.axaml | 3 ++ .../Views/Pages/SettingsPages/Internet.axaml | 2 + .../Pages/SettingsPages/Notifications.axaml | 3 ++ .../Pages/SettingsPages/Operations.axaml | 3 ++ .../SettingsPages/PackageManagerPage.axaml | 10 +++-- .../SettingsPages/PackageManagerPage.axaml.cs | 2 +- .../SettingsPages/SettingsBasePage.axaml | 5 ++- .../SettingsPages/SourceManagerCard.axaml | 10 +++-- .../Views/Pages/SettingsPages/Updates.axaml | 4 ++ src/UniGetUI.Avalonia/Views/SidebarView.axaml | 16 ++++---- .../SoftwarePages/AbstractPackagesPage.axaml | 18 ++++---- 30 files changed, 151 insertions(+), 55 deletions(-) diff --git a/src/UniGetUI.Avalonia/Assets/Styles/Styles.Common.axaml b/src/UniGetUI.Avalonia/Assets/Styles/Styles.Common.axaml index 77f4a4c96c..c9867875cb 100644 --- a/src/UniGetUI.Avalonia/Assets/Styles/Styles.Common.axaml +++ b/src/UniGetUI.Avalonia/Assets/Styles/Styles.Common.axaml @@ -147,6 +147,10 @@ + + diff --git a/src/UniGetUI.Avalonia/Views/Controls/Settings/CheckboxButtonCard.cs b/src/UniGetUI.Avalonia/Views/Controls/Settings/CheckboxButtonCard.cs index c54a661a58..e10f4388ec 100644 --- a/src/UniGetUI.Avalonia/Views/Controls/Settings/CheckboxButtonCard.cs +++ b/src/UniGetUI.Avalonia/Views/Controls/Settings/CheckboxButtonCard.cs @@ -92,7 +92,7 @@ public CheckboxButtonCard() Margin = new Thickness(2, 0, 0, 0), VerticalAlignment = VerticalAlignment.Center, TextWrapping = TextWrapping.Wrap, - FontWeight = FontWeight.Medium, + FontSize = 14, }; IS_INVERTED = false; AutomationProperties.SetAccessibilityView(Button, AccessibilityView.Control); diff --git a/src/UniGetUI.Avalonia/Views/Controls/Settings/CheckboxCard.cs b/src/UniGetUI.Avalonia/Views/Controls/Settings/CheckboxCard.cs index cebe2c0ebd..b1062156e2 100644 --- a/src/UniGetUI.Avalonia/Views/Controls/Settings/CheckboxCard.cs +++ b/src/UniGetUI.Avalonia/Views/Controls/Settings/CheckboxCard.cs @@ -100,6 +100,7 @@ public CheckboxCard() { VerticalAlignment = VerticalAlignment.Center, TextWrapping = TextWrapping.Wrap, + FontSize = 14, }; _warningBlock = new TextBlock { diff --git a/src/UniGetUI.Avalonia/Views/Controls/Settings/SecureCheckboxCard.cs b/src/UniGetUI.Avalonia/Views/Controls/Settings/SecureCheckboxCard.cs index a0aa8e79de..8bfda69714 100644 --- a/src/UniGetUI.Avalonia/Views/Controls/Settings/SecureCheckboxCard.cs +++ b/src/UniGetUI.Avalonia/Views/Controls/Settings/SecureCheckboxCard.cs @@ -105,6 +105,7 @@ public SecureCheckboxCard() { VerticalAlignment = VerticalAlignment.Center, TextWrapping = TextWrapping.Wrap, + FontSize = 14, }; _warningBlock = new TextBlock { diff --git a/src/UniGetUI.Avalonia/Views/Controls/Settings/SettingsCard.cs b/src/UniGetUI.Avalonia/Views/Controls/Settings/SettingsCard.cs index 4f1f7e48f4..a04d49e546 100644 --- a/src/UniGetUI.Avalonia/Views/Controls/Settings/SettingsCard.cs +++ b/src/UniGetUI.Avalonia/Views/Controls/Settings/SettingsCard.cs @@ -56,7 +56,7 @@ public class SettingsCard : UserControl { _rightContent = value; _contentPresenter.Content = value is string s - ? new TextBlock { Text = s, VerticalAlignment = VerticalAlignment.Center } + ? new TextBlock { Text = s, FontSize = 14, VerticalAlignment = VerticalAlignment.Center } : value; } } @@ -231,6 +231,7 @@ protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs chang ? new TextBlock { Text = s, + FontSize = 14, TextWrapping = TextWrapping.Wrap, VerticalAlignment = VerticalAlignment.Center, } diff --git a/src/UniGetUI.Avalonia/Views/DialogPages/CrashReportWindow.axaml b/src/UniGetUI.Avalonia/Views/DialogPages/CrashReportWindow.axaml index 6d5a5106c2..7993b0f2b9 100644 --- a/src/UniGetUI.Avalonia/Views/DialogPages/CrashReportWindow.axaml +++ b/src/UniGetUI.Avalonia/Views/DialogPages/CrashReportWindow.axaml @@ -16,7 +16,7 @@ + FontSize="14" Opacity="0.7"/> @@ -193,7 +194,8 @@ + 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 +240,8 @@ + FontFamily="Consolas,Cascadia Mono,Menlo,monospace" + FontSize="14"/> @@ -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 @@ @@ -181,7 +181,7 @@ ToolTip.Tip="{t:Translate Package Managers}"> - @@ -197,7 +197,7 @@ - diff --git a/src/UniGetUI.Avalonia/Views/SoftwarePages/AbstractPackagesPage.axaml b/src/UniGetUI.Avalonia/Views/SoftwarePages/AbstractPackagesPage.axaml index a3b591a88d..30337eb523 100644 --- a/src/UniGetUI.Avalonia/Views/SoftwarePages/AbstractPackagesPage.axaml +++ b/src/UniGetUI.Avalonia/Views/SoftwarePages/AbstractPackagesPage.axaml @@ -97,8 +97,9 @@ - + @@ -341,7 +342,7 @@ - + @@ -373,7 +374,7 @@ - + @@ -632,7 +633,7 @@ - + - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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(); From a6268d6641c4e5391a94cefb51f0288083bd29b8 Mon Sep 17 00:00:00 2001 From: GabrielDuf Date: Fri, 19 Jun 2026 16:31:27 -0400 Subject: [PATCH 07/10] Match Avalonia install-options dialog to WinUI --- .../DialogPages/InstallOptionsViewModel.cs | 88 ++++++++- .../DialogPages/InstallOptionsControl.axaml | 182 +++++++++++++++--- .../DialogPages/InstallOptionsWindow.axaml | 33 +++- .../DialogPages/InstallOptionsWindow.axaml.cs | 17 +- 4 files changed, 281 insertions(+), 39 deletions(-) diff --git a/src/UniGetUI.Avalonia/ViewModels/DialogPages/InstallOptionsViewModel.cs b/src/UniGetUI.Avalonia/ViewModels/DialogPages/InstallOptionsViewModel.cs index 82d4ab383d..d30807f171 100644 --- a/src/UniGetUI.Avalonia/ViewModels/DialogPages/InstallOptionsViewModel.cs +++ b/src/UniGetUI.Avalonia/ViewModels/DialogPages/InstallOptionsViewModel.cs @@ -8,11 +8,13 @@ using UniGetUI.Core.Language; using UniGetUI.Core.Logging; using UniGetUI.Core.SettingsEngine; +using UniGetUI.Core.SettingsEngine.SecureSettings; using UniGetUI.Core.Tools; using UniGetUI.PackageEngine.Enums; using UniGetUI.PackageEngine.Interfaces; using UniGetUI.PackageEngine.PackageClasses; using UniGetUI.PackageEngine.Serializable; +using UniGetUI.Avalonia.Views; namespace UniGetUI.Avalonia.ViewModels; @@ -28,8 +30,11 @@ public partial class InstallOptionsViewModel : ObservableObject // ── Translated static labels ─────────────────────────────────────────────── public string DialogTitle { get; } + public string PlaceholderText { get; } + public string UnlockLabel { get; } = CoreTools.Translate("Change this and unlock"); public string ProfileLabel { get; } = CoreTools.Translate("Operation profile:"); public string FollowGlobalLabel { get; } = CoreTools.Translate("Follow the default options when installing, upgrading or uninstalling this package"); + public string ChangeDefaultOptionsLabel { get; } = CoreTools.Translate("Change default options"); public string GeneralInfoLabel { get; } = CoreTools.Translate("The following settings will be applied each time this package is installed, updated or removed."); public string VersionLabel { get; } = CoreTools.Translate("Version to install:"); public string ArchLabel { get; } = CoreTools.Translate("Architecture to install:"); @@ -51,11 +56,17 @@ public partial class InstallOptionsViewModel : ObservableObject public string AbortUninstallLabel { get; } = CoreTools.Translate("Abort uninstall if pre-uninstall command fails"); public string CommandPreviewLabel { get; } = CoreTools.Translate("Command-line to run:"); public string SaveLabel { get; } = CoreTools.Translate("Save and close"); - public string TabGeneralLabel { get; } = CoreTools.Translate("General"); - public string TabLocationLabel { get; } = CoreTools.Translate("Architecture & Location"); - public string TabCLILabel { get; } = CoreTools.Translate("Command-line"); - public string TabCloseAppsLabel { get; } = CoreTools.Translate("Close apps"); - public string TabPrePostLabel { get; } = CoreTools.Translate("Pre/Post install"); + // Tab headers — icon + two text lines, mirroring the WinUI BetterTabViewItem tabs. + public string TabGeneralLine1 { get; } = CoreTools.Translate("General"); + public string TabGeneralLine2 { get; } = CoreTools.Translate("Version"); + public string TabLocationLine1 { get; } = CoreTools.Translate("Architecture"); + public string TabLocationLine2 { get; } = CoreTools.Translate("Location and Scope"); + public string TabCLILine1 { get; } = CoreTools.Translate("Command-line"); + public string TabCLILine2 { get; } = CoreTools.Translate("Arguments"); + public string TabCloseAppsLine1 { get; } = CoreTools.Translate("Close apps"); + public string TabCloseAppsLine2 { get; } = CoreTools.Translate("before installing"); + public string TabPrePostLine1 { get; } = CoreTools.Translate("Pre-install"); + public string TabPrePostLine2 { get; } = CoreTools.Translate("Post-install"); // Close-apps tab labels public string KillProcessesDescriptionLabel { get; } = CoreTools.Translate( @@ -72,6 +83,17 @@ public partial class InstallOptionsViewModel : ObservableObject public string UninstallPrevCheckBox_Content { get; } = CoreTools.Translate("Uninstall previous versions when updated"); public string SkipMinorCheckBox_Content { get; } = CoreTools.Translate("Skip minor updates for this package"); public string AutoUpdateCheckBox_Content { get; } = CoreTools.Translate("Automatically update this package"); + public string IgnoreUpdatesCheckBox_Content { get; } = CoreTools.Translate("Ignore future updates for this package"); + + // ── Security-gated sections (CLI args & pre/post commands), mirrors WinUI ── + public bool CliEnabled { get; } + public bool CliDisabledWarningVisible => !CliEnabled; + public bool PrePostEnabled { get; } + public bool PrePostDisabledWarningVisible => !PrePostEnabled; + public string CliDisabledLabel { get; } = CoreTools.Translate("For security reasons, custom command-line arguments are disabled by default. Go to UniGetUI security settings to change this."); + public string PrePostDisabledLabel { get; } = CoreTools.Translate("For security reasons, pre-operation and post-operation scripts are disabled by default. Go to UniGetUI security settings to change this."); + public string PrePostExplainerLabel { get; } = CoreTools.Translate("You can define the commands that will be run before or after this package is installed, updated or uninstalled. They will be run on a command prompt, so CMD scripts will work here."); + public string GoToSecurityLabel { get; } = CoreTools.Translate("Go to UniGetUI security settings"); // ── Capability flags (for IsEnabled bindings) ───────────────────────────── public bool CanRunAsAdmin { get; } @@ -122,6 +144,7 @@ partial void OnSelectedProfileChanged(string? value) [ObservableProperty] private bool _skipMinorChecked; [ObservableProperty] private bool _autoUpdateChecked; + [ObservableProperty] private bool _ignoreUpdatesChecked; partial void OnAdminCheckedChanged(bool value) => Refresh(); partial void OnInteractiveCheckedChanged(bool value) => Refresh(); @@ -192,6 +215,9 @@ public InstallOptionsViewModel(IPackage package, OperationType operation, Instal var caps = package.Manager.Capabilities; DialogTitle = CoreTools.Translate("{0} installation options", package.Name); + PlaceholderText = CoreTools.Translate( + "{0} Install options are currently locked because {0} follows the default install options.", + package.Name); // Capability flags CanRunAsAdmin = OperatingSystem.IsWindows() && caps.CanRunAsAdmin; @@ -201,6 +227,10 @@ public InstallOptionsViewModel(IPackage package, OperationType operation, Instal HasCustomScopes = caps.SupportsCustomScopes; HasCustomLocations = caps.SupportsCustomLocations; + // Security-gated sections (disabled by default; toggled in security settings) + CliEnabled = SecureSettings.Get(SecureSettings.K.AllowCLIArguments); + PrePostEnabled = SecureSettings.Get(SecureSettings.K.AllowPrePostOpCommand); + // Profile string installLabel = CoreTools.Translate("Install"); string updateLabel = CoreTools.Translate("Update"); @@ -300,7 +330,13 @@ public InstallOptionsViewModel(IPackage package, OperationType operation, Instal if (caps.SupportsCustomVersions) _ = LoadVersionsAsync(options.Version); + _ = LoadIgnoredUpdatesAsync(); + _uiLoaded = true; + // Apply the operation-dependent enable gates for the initial operation, matching + // WinUI's EnableDisableControls (which runs on load): e.g. Skip-hash/Architecture are + // disabled for Uninstall, Version is enabled only for Install. + ApplyProfileEnableState(); _ = RefreshCommandPreviewAsync(); } @@ -327,6 +363,47 @@ private void Proceed() [RelayCommand] private void ResetLocation() => LocationText = ""; + /// Unlocks the options by turning off "follow default options" (matches WinUI). + [RelayCommand] + private void Unlock() => FollowGlobal = false; + + /// Closes the dialog and opens the manager's default-options settings (matches WinUI). + [RelayCommand] + private void ChangeDefaultOptions() + { + CloseRequested?.Invoke(this, EventArgs.Empty); + if (MainWindow.Instance?.DataContext is MainWindowViewModel vm) + vm.OpenManagerSettings(_package.Manager); + } + + /// Closes the dialog and opens the security settings page (matches WinUI). + [RelayCommand] + private void GoToSecuritySettings() + { + CloseRequested?.Invoke(this, EventArgs.Empty); + if (MainWindow.Instance?.DataContext is MainWindowViewModel vm) + vm.OpenSettingsPage(typeof(Views.Pages.SettingsPages.Administrator)); + } + + // ── Ignore-future-updates state (package-level, like WinUI) ──────────────── + private async Task LoadIgnoredUpdatesAsync() + { + try { IgnoreUpdatesChecked = await _package.HasUpdatesIgnoredAsync(); } + catch (Exception ex) { Logger.Warn($"[InstallOptionsViewModel] Failed to read ignored-updates state: {ex.Message}"); } + } + + private async Task ApplyIgnoredUpdatesAsync() + { + try + { + if (IgnoreUpdatesChecked) + await _package.AddToIgnoredUpdatesAsync("*"); + else if (await _package.GetIgnoredUpdatesVersionAsync() == "*") + await _package.RemoveFromIgnoredUpdatesAsync(); + } + catch (Exception ex) { Logger.Warn($"[InstallOptionsViewModel] Failed to apply ignored-updates state: {ex.Message}"); } + } + // ── Enable/disable based on selected operation profile ──────────────────── private void ApplyProfileEnableState() { @@ -470,6 +547,7 @@ private void ApplyToOptions() _options.AbortOnPreUninstallFail = s.AbortOnPreUninstallFail; _options.KillBeforeOperation = KillProcessEntries.Select(e => e.Name).ToList(); Settings.Set(Settings.K.KillProcessesThatRefuseToDie, ForceKillChecked); + _ = ApplyIgnoredUpdatesAsync(); } private static string ScopeToString(string? selected) diff --git a/src/UniGetUI.Avalonia/Views/DialogPages/InstallOptionsControl.axaml b/src/UniGetUI.Avalonia/Views/DialogPages/InstallOptionsControl.axaml index a9421d7ee6..f6a7cf5bbe 100644 --- a/src/UniGetUI.Avalonia/Views/DialogPages/InstallOptionsControl.axaml +++ b/src/UniGetUI.Avalonia/Views/DialogPages/InstallOptionsControl.axaml @@ -3,9 +3,26 @@ xmlns:automation="clr-namespace:Avalonia.Automation;assembly=Avalonia.Controls" xmlns:vm="using:UniGetUI.Avalonia.ViewModels" xmlns:vmd="using:UniGetUI.Avalonia.ViewModels" + xmlns:controls="using:UniGetUI.Avalonia.Views.Controls" x:Class="UniGetUI.Avalonia.Views.DialogPages.InstallOptionsControl" x:DataType="vm:InstallOptionsViewModel"> + + + + + + + + @@ -37,12 +54,19 @@ - + - + - - + + + + + + + + - + + + + + + + + + + - - + - + + + + + + + + + + @@ -183,11 +235,34 @@ - + + + + + + + + + + - + + + + + + + @@ -215,12 +290,23 @@ FontFamily="Consolas,Cascadia Mono,Menlo,monospace" FontSize="14"/> - + + - + + + + + + + + + + @@ -264,14 +350,36 @@ - + + + + + + + + + + + + + + + + RowDefinitions="Auto,56,Auto" + ColumnSpacing="8" RowSpacing="4" + IsEnabled="{Binding PrePostEnabled}"> @@ -298,8 +406,9 @@ + RowDefinitions="Auto,56,Auto" + ColumnSpacing="8" RowSpacing="4" + IsEnabled="{Binding PrePostEnabled}"> @@ -326,8 +435,9 @@ + RowDefinitions="Auto,56,Auto" + ColumnSpacing="8" RowSpacing="4" + IsEnabled="{Binding PrePostEnabled}"> @@ -353,7 +463,27 @@ - + + + + + + + + + +