Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public virtual HotKey HotKey

public override bool IsExecutable =>
(IsContextPageTypeAdaptedToCommand() &&
StorageArchiveService.CanDecompress(context.SelectedItems) ||
CanDecompressSelectedItems() ||
CanDecompressInsideArchive()) &&
UIHelpers.CanShowDialog;

Expand Down Expand Up @@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,12 @@ public override async Task ExecuteAsync(object? parameter = null)
if (context.ShellPage is null)
return;

BaseStorageFile archive = await StorageHelpers.ToStorageItem<BaseStorageFile>(context.SelectedItem?.ItemPath ?? string.Empty);
var archivePath = GetArchivePath();

if (string.IsNullOrEmpty(archivePath))
return;

BaseStorageFile archive = await StorageHelpers.ToStorageItem<BaseStorageFile>(archivePath);

if (archive?.Path is null)
return;
Expand Down Expand Up @@ -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;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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())
{
Expand Down
13 changes: 5 additions & 8 deletions src/Files.App/UserControls/Toolbar.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
x:Key="NegatedBoolToVisibilityConverter"
FalseValue="Visible"
TrueValue="Collapsed" />
<wctconverters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" />

<x:Boolean x:Key="True">True</x:Boolean>
<x:Boolean x:Key="False">False</x:Boolean>
Expand Down Expand Up @@ -302,29 +303,25 @@
<MenuFlyoutItem
x:Name="ExtractSingle"
Command="{x:Bind Commands.DecompressArchive, Mode=OneWay}"
IsEnabled="{x:Bind ViewModel.CanExtract, Mode=OneWay, FallbackValue=False}"
KeyboardAcceleratorTextOverride="{x:Bind Commands.DecompressArchive.HotKeyText, Mode=OneWay}"
Text="{x:Bind Commands.DecompressArchive.Label}"
Visibility="{x:Bind ViewModel.IsMultipleArchivesSelected, Mode=OneWay, Converter={StaticResource NegatedBoolToVisibilityConverter}}" />
Visibility="{x:Bind Commands.DecompressArchive.IsExecutable, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}" />
<MenuFlyoutItem
x:Name="ExtractHereSmart"
Command="{x:Bind Commands.DecompressArchiveHereSmart, Mode=OneWay}"
IsEnabled="{x:Bind ViewModel.IsSelectionArchivesOnly, Mode=OneWay, FallbackValue=False}"
KeyboardAcceleratorTextOverride="{x:Bind Commands.DecompressArchiveHereSmart.HotKeyText, Mode=OneWay}"
Text="{x:Bind Commands.DecompressArchiveHereSmart.Label}"
Visibility="{x:Bind ViewModel.IsArchiveOpened, Mode=OneWay, Converter={StaticResource NegatedBoolToVisibilityConverter}}" />
Visibility="{x:Bind Commands.DecompressArchiveHereSmart.IsExecutable, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}" />
<MenuFlyoutItem
x:Name="ExtractHere"
Command="{x:Bind Commands.DecompressArchiveHere, Mode=OneWay}"
IsEnabled="{x:Bind ViewModel.IsSelectionArchivesOnly, Mode=OneWay, FallbackValue=False}"
Text="{x:Bind Commands.DecompressArchiveHere.Label}"
Visibility="{x:Bind ViewModel.IsArchiveOpened, Mode=OneWay, Converter={StaticResource NegatedBoolToVisibilityConverter}}" />
Visibility="{x:Bind Commands.DecompressArchiveHere.IsExecutable, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}" />
<MenuFlyoutItem
x:Name="ExtractTo"
Command="{x:Bind Commands.DecompressArchiveToChildFolder, Mode=OneWay}"
IsEnabled="{x:Bind ViewModel.IsSelectionArchivesOnly, Mode=OneWay, FallbackValue=False}"
Text="{x:Bind Commands.DecompressArchiveToChildFolder.Label, Mode=OneWay}"
Visibility="{x:Bind ViewModel.IsArchiveOpened, Mode=OneWay, Converter={StaticResource NegatedBoolToVisibilityConverter}}" />
Visibility="{x:Bind Commands.DecompressArchiveToChildFolder.IsExecutable, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}" />
</MenuFlyout>
</AppBarButton.Flyout>

Expand Down
35 changes: 25 additions & 10 deletions src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -249,10 +244,6 @@ public List<ListedItem>? 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));
Expand Down Expand Up @@ -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)
Expand Down
Loading