diff --git a/src/Files.App/Actions/Content/Archives/Decompress/BaseDecompressArchiveAction.cs b/src/Files.App/Actions/Content/Archives/Decompress/BaseDecompressArchiveAction.cs index 449defe83efd..10790c475c0f 100644 --- a/src/Files.App/Actions/Content/Archives/Decompress/BaseDecompressArchiveAction.cs +++ b/src/Files.App/Actions/Content/Archives/Decompress/BaseDecompressArchiveAction.cs @@ -25,7 +25,7 @@ public virtual HotKey HotKey public override bool IsExecutable => (IsContextPageTypeAdaptedToCommand() && - StorageArchiveService.CanDecompress(context.SelectedItems) || + CanDecompressSelectedItems() || CanDecompressInsideArchive()) && UIHelpers.CanShowDialog; @@ -125,11 +125,17 @@ protected virtual bool CanDecompressInsideArchive() return false; } + protected virtual bool CanDecompressSelectedItems() + { + return StorageArchiveService.CanDecompress(context.SelectedItems); + } + protected virtual void Context_PropertyChanged(object? sender, PropertyChangedEventArgs e) { switch (e.PropertyName) { case nameof(IContentPageContext.SelectedItems): + case nameof(IContentPageContext.Folder): OnPropertyChanged(nameof(IsExecutable)); break; } diff --git a/src/Files.App/Actions/Content/Archives/Decompress/DecompressArchive.cs b/src/Files.App/Actions/Content/Archives/Decompress/DecompressArchive.cs index 07aaf09dcce4..a01eaa3ee536 100644 --- a/src/Files.App/Actions/Content/Archives/Decompress/DecompressArchive.cs +++ b/src/Files.App/Actions/Content/Archives/Decompress/DecompressArchive.cs @@ -31,7 +31,12 @@ public override async Task ExecuteAsync(object? parameter = null) if (context.ShellPage is null) return; - BaseStorageFile archive = await StorageHelpers.ToStorageItem(context.SelectedItem?.ItemPath ?? string.Empty); + var archivePath = GetArchivePath(); + + if (string.IsNullOrEmpty(archivePath)) + return; + + BaseStorageFile archive = await StorageHelpers.ToStorageItem(archivePath); if (archive?.Path is null) return; @@ -86,5 +91,21 @@ protected override bool CanDecompressInsideArchive() context.Folder is not null && FileExtensionHelpers.IsZipFile(Path.GetExtension(context.Folder.ItemPath)); } + + protected override bool CanDecompressSelectedItems() + { + return context.SelectedItems.Count == 1 && base.CanDecompressSelectedItems(); + } + + private string? GetArchivePath() + { + if (!string.IsNullOrEmpty(context.SelectedItem?.ItemPath)) + return context.SelectedItem?.ItemPath; + + if (context.PageType == ContentPageTypes.ZipFolder && !context.HasSelection) + return context.Folder?.ItemPath; + + return null; + } } } diff --git a/src/Files.App/Actions/Content/Archives/Decompress/DecompressArchiveToChildFolderAction.cs b/src/Files.App/Actions/Content/Archives/Decompress/DecompressArchiveToChildFolderAction.cs index 91dd6b41390a..fbbc67063f79 100644 --- a/src/Files.App/Actions/Content/Archives/Decompress/DecompressArchiveToChildFolderAction.cs +++ b/src/Files.App/Actions/Content/Archives/Decompress/DecompressArchiveToChildFolderAction.cs @@ -71,6 +71,7 @@ protected override void Context_PropertyChanged(object? sender, PropertyChangedE switch (e.PropertyName) { case nameof(IContentPageContext.SelectedItems): + case nameof(IContentPageContext.Folder): { if (IsContextPageTypeAdaptedToCommand()) { diff --git a/src/Files.App/UserControls/Toolbar.xaml b/src/Files.App/UserControls/Toolbar.xaml index c87db143ba69..b6af427cb3f1 100644 --- a/src/Files.App/UserControls/Toolbar.xaml +++ b/src/Files.App/UserControls/Toolbar.xaml @@ -36,6 +36,7 @@ x:Key="NegatedBoolToVisibilityConverter" FalseValue="Visible" TrueValue="Collapsed" /> + True False @@ -302,29 +303,25 @@ + Visibility="{x:Bind Commands.DecompressArchive.IsExecutable, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}" /> + Visibility="{x:Bind Commands.DecompressArchiveHereSmart.IsExecutable, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}" /> + Visibility="{x:Bind Commands.DecompressArchiveHere.IsExecutable, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}" /> + Visibility="{x:Bind Commands.DecompressArchiveToChildFolder.IsExecutable, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}" /> diff --git a/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs b/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs index 0ad60b0d20a1..ebfd5e274f99 100644 --- a/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs +++ b/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs @@ -75,14 +75,9 @@ public sealed partial class NavigationToolbarViewModel : ObservableObject, IAddr public SearchBoxViewModel SearchBoxViewModel => (SearchBoxViewModel)SearchBox; - public string ExtractToText => IsSelectionArchivesOnly ? SelectedItems.Count > 1 ? string.Format(Strings.ExtractToChildFolder.GetLocalizedResource(), $"*{Path.DirectorySeparatorChar}") : string.Format(Strings.ExtractToChildFolder.GetLocalizedResource() + "\\", Path.GetFileNameWithoutExtension(_SelectedItems.First().Name)) : Strings.ExtractToChildFolder.GetLocalizedResource(); - public bool HasAdditionalAction => InstanceViewModel.IsPageTypeRecycleBin || IsPowerShellScript || CanExtract || IsImage || IsFont || IsInfFile; public bool CanCopy => SelectedItems is not null && SelectedItems.Any(); - public bool CanExtract => IsArchiveOpened ? (SelectedItems is null || !SelectedItems.Any()) : IsSelectionArchivesOnly; - public bool IsArchiveOpened => InstanceViewModel.IsPageTypeZipFolder; - public bool IsSelectionArchivesOnly => SelectedItems is not null && SelectedItems.Any() && SelectedItems.All(x => FileExtensionHelpers.IsZipFile(x.FileExtension)) && !InstanceViewModel.IsPageTypeRecycleBin; - public bool IsMultipleArchivesSelected => IsSelectionArchivesOnly && SelectedItems.Count > 1; + public bool CanExtract => Commands.DecompressArchive.CanExecute(null) || Commands.DecompressArchiveHere.CanExecute(null) || Commands.DecompressArchiveHereSmart.CanExecute(null) || Commands.DecompressArchiveToChildFolder.CanExecute(null); public bool IsPowerShellScript => SelectedItems is not null && SelectedItems.Count == 1 && FileExtensionHelpers.IsPowerShellFile(SelectedItems.First().FileExtension) && !InstanceViewModel.IsPageTypeRecycleBin; public bool IsImage => SelectedItems is not null && SelectedItems.Any() && SelectedItems.All(x => FileExtensionHelpers.IsImageFile(x.FileExtension)) && !InstanceViewModel.IsPageTypeRecycleBin; public bool IsMultipleImageSelected => SelectedItems is not null && SelectedItems.Count > 1 && SelectedItems.All(x => FileExtensionHelpers.IsImageFile(x.FileExtension)) && !InstanceViewModel.IsPageTypeRecycleBin; @@ -249,10 +244,6 @@ public List? SelectedItems { OnPropertyChanged(nameof(CanCopy)); OnPropertyChanged(nameof(CanExtract)); - OnPropertyChanged(nameof(ExtractToText)); - OnPropertyChanged(nameof(IsArchiveOpened)); - OnPropertyChanged(nameof(IsSelectionArchivesOnly)); - OnPropertyChanged(nameof(IsMultipleArchivesSelected)); OnPropertyChanged(nameof(IsInfFile)); OnPropertyChanged(nameof(IsPowerShellScript)); OnPropertyChanged(nameof(IsImage)); @@ -281,6 +272,30 @@ public NavigationToolbarViewModel() UserSettingsService.OnSettingChangedEvent += UserSettingsService_OnSettingChangedEvent; UpdateService.PropertyChanged += UpdateService_OnPropertyChanged; + Commands.DecompressArchive.PropertyChanged += (s, e) => + { + if (e.PropertyName is nameof(Commands.DecompressArchive.IsExecutable)) + OnPropertyChanged(nameof(CanExtract)); + }; + + Commands.DecompressArchiveHere.PropertyChanged += (s, e) => + { + if (e.PropertyName is nameof(Commands.DecompressArchiveHere.IsExecutable)) + OnPropertyChanged(nameof(CanExtract)); + }; + + Commands.DecompressArchiveHereSmart.PropertyChanged += (s, e) => + { + if (e.PropertyName is nameof(Commands.DecompressArchiveHereSmart.IsExecutable)) + OnPropertyChanged(nameof(CanExtract)); + }; + + Commands.DecompressArchiveHereSmart.PropertyChanged += (s, e) => + { + if (e.PropertyName is nameof(Commands.DecompressArchiveToChildFolder.IsExecutable)) + OnPropertyChanged(nameof(CanExtract)); + }; + AppearanceSettingsService.PropertyChanged += (s, e) => { switch (e.PropertyName)