Skip to content

Commit b1d248c

Browse files
Fix: Fixed issue where the extract button was sometimes not displayed in the toolbar (#16984)
1 parent 09a3a43 commit b1d248c

File tree

5 files changed

+60
-20
lines changed

5 files changed

+60
-20
lines changed

src/Files.App/Actions/Content/Archives/Decompress/BaseDecompressArchiveAction.cs

+7-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public virtual HotKey HotKey
2525

2626
public override bool IsExecutable =>
2727
(IsContextPageTypeAdaptedToCommand() &&
28-
StorageArchiveService.CanDecompress(context.SelectedItems) ||
28+
CanDecompressSelectedItems() ||
2929
CanDecompressInsideArchive()) &&
3030
UIHelpers.CanShowDialog;
3131

@@ -125,11 +125,17 @@ protected virtual bool CanDecompressInsideArchive()
125125
return false;
126126
}
127127

128+
protected virtual bool CanDecompressSelectedItems()
129+
{
130+
return StorageArchiveService.CanDecompress(context.SelectedItems);
131+
}
132+
128133
protected virtual void Context_PropertyChanged(object? sender, PropertyChangedEventArgs e)
129134
{
130135
switch (e.PropertyName)
131136
{
132137
case nameof(IContentPageContext.SelectedItems):
138+
case nameof(IContentPageContext.Folder):
133139
OnPropertyChanged(nameof(IsExecutable));
134140
break;
135141
}

src/Files.App/Actions/Content/Archives/Decompress/DecompressArchive.cs

+22-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,12 @@ public override async Task ExecuteAsync(object? parameter = null)
3131
if (context.ShellPage is null)
3232
return;
3333

34-
BaseStorageFile archive = await StorageHelpers.ToStorageItem<BaseStorageFile>(context.SelectedItem?.ItemPath ?? string.Empty);
34+
var archivePath = GetArchivePath();
35+
36+
if (string.IsNullOrEmpty(archivePath))
37+
return;
38+
39+
BaseStorageFile archive = await StorageHelpers.ToStorageItem<BaseStorageFile>(archivePath);
3540

3641
if (archive?.Path is null)
3742
return;
@@ -86,5 +91,21 @@ protected override bool CanDecompressInsideArchive()
8691
context.Folder is not null &&
8792
FileExtensionHelpers.IsZipFile(Path.GetExtension(context.Folder.ItemPath));
8893
}
94+
95+
protected override bool CanDecompressSelectedItems()
96+
{
97+
return context.SelectedItems.Count == 1 && base.CanDecompressSelectedItems();
98+
}
99+
100+
private string? GetArchivePath()
101+
{
102+
if (!string.IsNullOrEmpty(context.SelectedItem?.ItemPath))
103+
return context.SelectedItem?.ItemPath;
104+
105+
if (context.PageType == ContentPageTypes.ZipFolder && !context.HasSelection)
106+
return context.Folder?.ItemPath;
107+
108+
return null;
109+
}
89110
}
90111
}

src/Files.App/Actions/Content/Archives/Decompress/DecompressArchiveToChildFolderAction.cs

+1
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ protected override void Context_PropertyChanged(object? sender, PropertyChangedE
7171
switch (e.PropertyName)
7272
{
7373
case nameof(IContentPageContext.SelectedItems):
74+
case nameof(IContentPageContext.Folder):
7475
{
7576
if (IsContextPageTypeAdaptedToCommand())
7677
{

src/Files.App/UserControls/Toolbar.xaml

+5-8
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
x:Key="NegatedBoolToVisibilityConverter"
3636
FalseValue="Visible"
3737
TrueValue="Collapsed" />
38+
<wctconverters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" />
3839

3940
<x:Boolean x:Key="True">True</x:Boolean>
4041
<x:Boolean x:Key="False">False</x:Boolean>
@@ -301,29 +302,25 @@
301302
<MenuFlyoutItem
302303
x:Name="ExtractSingle"
303304
Command="{x:Bind Commands.DecompressArchive, Mode=OneWay}"
304-
IsEnabled="{x:Bind ViewModel.CanExtract, Mode=OneWay, FallbackValue=False}"
305305
KeyboardAcceleratorTextOverride="{x:Bind Commands.DecompressArchive.HotKeyText, Mode=OneWay}"
306306
Text="{x:Bind Commands.DecompressArchive.Label}"
307-
Visibility="{x:Bind ViewModel.IsMultipleArchivesSelected, Mode=OneWay, Converter={StaticResource NegatedBoolToVisibilityConverter}}" />
307+
Visibility="{x:Bind Commands.DecompressArchive.IsExecutable, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}" />
308308
<MenuFlyoutItem
309309
x:Name="ExtractHereSmart"
310310
Command="{x:Bind Commands.DecompressArchiveHereSmart, Mode=OneWay}"
311-
IsEnabled="{x:Bind ViewModel.IsSelectionArchivesOnly, Mode=OneWay, FallbackValue=False}"
312311
KeyboardAcceleratorTextOverride="{x:Bind Commands.DecompressArchiveHereSmart.HotKeyText, Mode=OneWay}"
313312
Text="{x:Bind Commands.DecompressArchiveHereSmart.Label}"
314-
Visibility="{x:Bind ViewModel.IsArchiveOpened, Mode=OneWay, Converter={StaticResource NegatedBoolToVisibilityConverter}}" />
313+
Visibility="{x:Bind Commands.DecompressArchiveHereSmart.IsExecutable, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}" />
315314
<MenuFlyoutItem
316315
x:Name="ExtractHere"
317316
Command="{x:Bind Commands.DecompressArchiveHere, Mode=OneWay}"
318-
IsEnabled="{x:Bind ViewModel.IsSelectionArchivesOnly, Mode=OneWay, FallbackValue=False}"
319317
Text="{x:Bind Commands.DecompressArchiveHere.Label}"
320-
Visibility="{x:Bind ViewModel.IsArchiveOpened, Mode=OneWay, Converter={StaticResource NegatedBoolToVisibilityConverter}}" />
318+
Visibility="{x:Bind Commands.DecompressArchiveHere.IsExecutable, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}" />
321319
<MenuFlyoutItem
322320
x:Name="ExtractTo"
323321
Command="{x:Bind Commands.DecompressArchiveToChildFolder, Mode=OneWay}"
324-
IsEnabled="{x:Bind ViewModel.IsSelectionArchivesOnly, Mode=OneWay, FallbackValue=False}"
325322
Text="{x:Bind Commands.DecompressArchiveToChildFolder.Label, Mode=OneWay}"
326-
Visibility="{x:Bind ViewModel.IsArchiveOpened, Mode=OneWay, Converter={StaticResource NegatedBoolToVisibilityConverter}}" />
323+
Visibility="{x:Bind Commands.DecompressArchiveToChildFolder.IsExecutable, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}" />
327324
</MenuFlyout>
328325
</AppBarButton.Flyout>
329326

src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs

+25-10
Original file line numberDiff line numberDiff line change
@@ -75,14 +75,9 @@ public sealed partial class NavigationToolbarViewModel : ObservableObject, IAddr
7575

7676
public SearchBoxViewModel SearchBoxViewModel => (SearchBoxViewModel)SearchBox;
7777

78-
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();
79-
8078
public bool HasAdditionalAction => InstanceViewModel.IsPageTypeRecycleBin || IsPowerShellScript || CanExtract || IsImage || IsFont || IsInfFile;
8179
public bool CanCopy => SelectedItems is not null && SelectedItems.Any();
82-
public bool CanExtract => IsArchiveOpened ? (SelectedItems is null || !SelectedItems.Any()) : IsSelectionArchivesOnly;
83-
public bool IsArchiveOpened => InstanceViewModel.IsPageTypeZipFolder;
84-
public bool IsSelectionArchivesOnly => SelectedItems is not null && SelectedItems.Any() && SelectedItems.All(x => FileExtensionHelpers.IsZipFile(x.FileExtension)) && !InstanceViewModel.IsPageTypeRecycleBin;
85-
public bool IsMultipleArchivesSelected => IsSelectionArchivesOnly && SelectedItems.Count > 1;
80+
public bool CanExtract => Commands.DecompressArchive.CanExecute(null) || Commands.DecompressArchiveHere.CanExecute(null) || Commands.DecompressArchiveHereSmart.CanExecute(null) || Commands.DecompressArchiveToChildFolder.CanExecute(null);
8681
public bool IsPowerShellScript => SelectedItems is not null && SelectedItems.Count == 1 && FileExtensionHelpers.IsPowerShellFile(SelectedItems.First().FileExtension) && !InstanceViewModel.IsPageTypeRecycleBin;
8782
public bool IsImage => SelectedItems is not null && SelectedItems.Any() && SelectedItems.All(x => FileExtensionHelpers.IsImageFile(x.FileExtension)) && !InstanceViewModel.IsPageTypeRecycleBin;
8883
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<ListedItem>? SelectedItems
249244
{
250245
OnPropertyChanged(nameof(CanCopy));
251246
OnPropertyChanged(nameof(CanExtract));
252-
OnPropertyChanged(nameof(ExtractToText));
253-
OnPropertyChanged(nameof(IsArchiveOpened));
254-
OnPropertyChanged(nameof(IsSelectionArchivesOnly));
255-
OnPropertyChanged(nameof(IsMultipleArchivesSelected));
256247
OnPropertyChanged(nameof(IsInfFile));
257248
OnPropertyChanged(nameof(IsPowerShellScript));
258249
OnPropertyChanged(nameof(IsImage));
@@ -281,6 +272,30 @@ public NavigationToolbarViewModel()
281272
UserSettingsService.OnSettingChangedEvent += UserSettingsService_OnSettingChangedEvent;
282273
UpdateService.PropertyChanged += UpdateService_OnPropertyChanged;
283274

275+
Commands.DecompressArchive.PropertyChanged += (s, e) =>
276+
{
277+
if (e.PropertyName is nameof(Commands.DecompressArchive.IsExecutable))
278+
OnPropertyChanged(nameof(CanExtract));
279+
};
280+
281+
Commands.DecompressArchiveHere.PropertyChanged += (s, e) =>
282+
{
283+
if (e.PropertyName is nameof(Commands.DecompressArchiveHere.IsExecutable))
284+
OnPropertyChanged(nameof(CanExtract));
285+
};
286+
287+
Commands.DecompressArchiveHereSmart.PropertyChanged += (s, e) =>
288+
{
289+
if (e.PropertyName is nameof(Commands.DecompressArchiveHereSmart.IsExecutable))
290+
OnPropertyChanged(nameof(CanExtract));
291+
};
292+
293+
Commands.DecompressArchiveHereSmart.PropertyChanged += (s, e) =>
294+
{
295+
if (e.PropertyName is nameof(Commands.DecompressArchiveToChildFolder.IsExecutable))
296+
OnPropertyChanged(nameof(CanExtract));
297+
};
298+
284299
AppearanceSettingsService.PropertyChanged += (s, e) =>
285300
{
286301
switch (e.PropertyName)

0 commit comments

Comments
 (0)