Skip to content

Commit dc88aec

Browse files
fixed bug where the extract button was not displayed in the toolbar
1 parent 28a14e6 commit dc88aec

File tree

4 files changed

+59
-20
lines changed

4 files changed

+59
-20
lines changed

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

Lines changed: 7 additions & 1 deletion
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

Lines changed: 22 additions & 1 deletion
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/UserControls/Toolbar.xaml

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
x:Key="NegatedBoolToVisibilityConverter"
3737
FalseValue="Visible"
3838
TrueValue="Collapsed" />
39+
<wctconverters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" />
3940

4041
<x:Boolean x:Key="True">True</x:Boolean>
4142
<x:Boolean x:Key="False">False</x:Boolean>
@@ -302,29 +303,25 @@
302303
<MenuFlyoutItem
303304
x:Name="ExtractSingle"
304305
Command="{x:Bind Commands.DecompressArchive, Mode=OneWay}"
305-
IsEnabled="{x:Bind ViewModel.CanExtract, Mode=OneWay, FallbackValue=False}"
306306
KeyboardAcceleratorTextOverride="{x:Bind Commands.DecompressArchive.HotKeyText, Mode=OneWay}"
307307
Text="{x:Bind Commands.DecompressArchive.Label}"
308-
Visibility="{x:Bind ViewModel.IsMultipleArchivesSelected, Mode=OneWay, Converter={StaticResource NegatedBoolToVisibilityConverter}}" />
308+
Visibility="{x:Bind Commands.DecompressArchive.IsExecutable, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}" />
309309
<MenuFlyoutItem
310310
x:Name="ExtractHereSmart"
311311
Command="{x:Bind Commands.DecompressArchiveHereSmart, Mode=OneWay}"
312-
IsEnabled="{x:Bind ViewModel.IsSelectionArchivesOnly, Mode=OneWay, FallbackValue=False}"
313312
KeyboardAcceleratorTextOverride="{x:Bind Commands.DecompressArchiveHereSmart.HotKeyText, Mode=OneWay}"
314313
Text="{x:Bind Commands.DecompressArchiveHereSmart.Label}"
315-
Visibility="{x:Bind ViewModel.IsArchiveOpened, Mode=OneWay, Converter={StaticResource NegatedBoolToVisibilityConverter}}" />
314+
Visibility="{x:Bind Commands.DecompressArchiveHereSmart.IsExecutable, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}" />
316315
<MenuFlyoutItem
317316
x:Name="ExtractHere"
318317
Command="{x:Bind Commands.DecompressArchiveHere, Mode=OneWay}"
319-
IsEnabled="{x:Bind ViewModel.IsSelectionArchivesOnly, Mode=OneWay, FallbackValue=False}"
320318
Text="{x:Bind Commands.DecompressArchiveHere.Label}"
321-
Visibility="{x:Bind ViewModel.IsArchiveOpened, Mode=OneWay, Converter={StaticResource NegatedBoolToVisibilityConverter}}" />
319+
Visibility="{x:Bind Commands.DecompressArchiveHere.IsExecutable, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}" />
322320
<MenuFlyoutItem
323321
x:Name="ExtractTo"
324322
Command="{x:Bind Commands.DecompressArchiveToChildFolder, Mode=OneWay}"
325-
IsEnabled="{x:Bind ViewModel.IsSelectionArchivesOnly, Mode=OneWay, FallbackValue=False}"
326323
Text="{x:Bind Commands.DecompressArchiveToChildFolder.Label, Mode=OneWay}"
327-
Visibility="{x:Bind ViewModel.IsArchiveOpened, Mode=OneWay, Converter={StaticResource NegatedBoolToVisibilityConverter}}" />
324+
Visibility="{x:Bind Commands.DecompressArchiveToChildFolder.IsExecutable, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}" />
328325
</MenuFlyout>
329326
</AppBarButton.Flyout>
330327

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

Lines changed: 25 additions & 10 deletions
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)