Skip to content

Commit 9d9b0d5

Browse files
authored
Fix: Fixed an issue where changing file permission for multiple files simultaneously would crash the app (#10886)
1 parent cfabfc9 commit 9d9b0d5

10 files changed

+88
-73
lines changed

src/Files.App/ViewModels/Properties/PropertiesTab.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ protected override void OnNavigatedFrom(NavigationEventArgs e)
7474
/// Tries to save changed properties to file.
7575
/// </summary>
7676
/// <returns>Returns true if properties have been saved successfully.</returns>
77-
public abstract Task<bool> SaveChangesAsync(ListedItem item);
77+
public abstract Task<bool> SaveChangesAsync();
7878

7979
public abstract void Dispose();
8080
}

src/Files.App/Views/Pages/Properties.xaml

Lines changed: 39 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@
2929

3030
<Border
3131
x:Name="TitlebarArea"
32-
HorizontalAlignment="Stretch"
3332
Grid.Row="0"
33+
HorizontalAlignment="Stretch"
3434
Background="Transparent">
3535
<NavigationView
3636
x:Name="NavigationView"
@@ -57,73 +57,74 @@
5757
<!-- Tabs -->
5858
<NavigationView.MenuItems>
5959
<NavigationViewItem
60-
x:Name="TabGeneral"
61-
AccessKey="G"
62-
Content="{helpers:ResourceString Name=General}"
63-
CornerRadius="0"
64-
Tag="General">
60+
x:Name="TabGeneral"
61+
AccessKey="G"
62+
Content="{helpers:ResourceString Name=General}"
63+
CornerRadius="0"
64+
Tag="General">
6565
<NavigationViewItem.Icon>
6666
<FontIcon Glyph="&#xE7C3;" />
6767
</NavigationViewItem.Icon>
6868
</NavigationViewItem>
6969
<NavigationViewItem
70-
x:Name="TabSecurity"
71-
Content="{helpers:ResourceString Name=Security}"
72-
CornerRadius="0"
73-
Tag="Security">
70+
x:Name="TabSecurity"
71+
Content="{helpers:ResourceString Name=Security}"
72+
CornerRadius="0"
73+
Tag="Security"
74+
Visibility="Collapsed">
7475
<NavigationViewItem.Icon>
7576
<FontIcon Glyph="&#xE730;" />
7677
</NavigationViewItem.Icon>
7778
</NavigationViewItem>
7879
<NavigationViewItem
79-
x:Name="TabShorcut"
80-
AccessKey="S"
81-
Content="{helpers:ResourceString Name=Shortcut}"
82-
CornerRadius="0"
83-
Tag="Shortcut"
84-
Visibility="Collapsed">
80+
x:Name="TabShorcut"
81+
AccessKey="S"
82+
Content="{helpers:ResourceString Name=Shortcut}"
83+
CornerRadius="0"
84+
Tag="Shortcut"
85+
Visibility="Collapsed">
8586
<NavigationViewItem.Icon>
8687
<FontIcon FontFamily="{StaticResource CustomGlyph}" Glyph="&#xF10A;" />
8788
</NavigationViewItem.Icon>
8889
</NavigationViewItem>
8990
<NavigationViewItem
90-
x:Name="TabLibrary"
91-
AccessKey="L"
92-
Content="{helpers:ResourceString Name=Library}"
93-
CornerRadius="0"
94-
Tag="Library"
95-
Visibility="Collapsed">
91+
x:Name="TabLibrary"
92+
AccessKey="L"
93+
Content="{helpers:ResourceString Name=Library}"
94+
CornerRadius="0"
95+
Tag="Library"
96+
Visibility="Collapsed">
9697
<NavigationViewItem.Icon>
9798
<FontIcon Glyph="&#xE1D3;" />
9899
</NavigationViewItem.Icon>
99100
</NavigationViewItem>
100101
<NavigationViewItem
101-
x:Name="TabDetails"
102-
AccessKey="D"
103-
Content="{helpers:ResourceString Name=Details}"
104-
CornerRadius="0"
105-
Tag="Details"
106-
Visibility="Collapsed">
102+
x:Name="TabDetails"
103+
AccessKey="D"
104+
Content="{helpers:ResourceString Name=Details}"
105+
CornerRadius="0"
106+
Tag="Details"
107+
Visibility="Collapsed">
107108
<NavigationViewItem.Icon>
108109
<FontIcon Glyph="&#xE946;" />
109110
</NavigationViewItem.Icon>
110111
</NavigationViewItem>
111112
<NavigationViewItem
112-
x:Name="TabCustomization"
113-
Content="{helpers:ResourceString Name=Customization}"
114-
CornerRadius="0"
115-
Tag="Customization"
116-
Visibility="Collapsed">
113+
x:Name="TabCustomization"
114+
Content="{helpers:ResourceString Name=Customization}"
115+
CornerRadius="0"
116+
Tag="Customization"
117+
Visibility="Collapsed">
117118
<NavigationViewItem.Icon>
118119
<FontIcon Glyph="&#xE771;" />
119120
</NavigationViewItem.Icon>
120121
</NavigationViewItem>
121122
<NavigationViewItem
122-
x:Name="TabCompatibility"
123-
Content="{helpers:ResourceString Name=Compatibility}"
124-
CornerRadius="0"
125-
Tag="Compatibility"
126-
Visibility="Collapsed">
123+
x:Name="TabCompatibility"
124+
Content="{helpers:ResourceString Name=Compatibility}"
125+
CornerRadius="0"
126+
Tag="Compatibility"
127+
Visibility="Collapsed">
127128
<NavigationViewItem.Icon>
128129
<FontIcon Glyph="&#xECAA;" />
129130
</NavigationViewItem.Icon>

src/Files.App/Views/Pages/Properties.xaml.cs

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ public sealed partial class Properties : Page
3030
private object navParameterItem;
3131
private IShellPage AppInstance;
3232

33-
private ListedItem listedItem;
34-
3533
public SettingsViewModel AppSettings => App.AppSettings;
3634

3735
public AppWindow appWindow;
@@ -58,18 +56,26 @@ protected override void OnNavigatedTo(NavigationEventArgs e)
5856
var args = e.Parameter as PropertiesPageNavigationArguments;
5957
AppInstance = args.AppInstanceArgument;
6058
navParameterItem = args.Item;
61-
listedItem = args.Item as ListedItem;
62-
TabShorcut.Visibility = listedItem is not null && listedItem.IsShortcut ? Visibility.Visible : Visibility.Collapsed;
63-
TabLibrary.Visibility = listedItem is not null && listedItem.IsLibrary ? Visibility.Visible : Visibility.Collapsed;
64-
TabDetails.Visibility = listedItem is not null && listedItem.FileExtension is not null && !listedItem.IsShortcut && !listedItem.IsLibrary ? Visibility.Visible : Visibility.Collapsed;
65-
TabSecurity.Visibility = args.Item is DriveItem ||
66-
(listedItem is not null && !listedItem.IsLibrary && !listedItem.IsRecycleBinItem) ? Visibility.Visible : Visibility.Collapsed;
67-
TabCustomization.Visibility = listedItem is not null && !listedItem.IsLibrary && (
68-
(listedItem.PrimaryItemAttribute == Windows.Storage.StorageItemTypes.Folder && !listedItem.IsArchive) ||
69-
(listedItem.IsShortcut && !listedItem.IsLinkItem)) ? Visibility.Visible : Visibility.Collapsed;
70-
TabCompatibility.Visibility = listedItem is not null && (
71-
FileExtensionHelpers.IsExecutableFile(listedItem is ShortcutItem sht ? sht.TargetPath : listedItem.FileExtension, true)
72-
) ? Visibility.Visible : Visibility.Collapsed;
59+
if (args.Item is ListedItem listedItem)
60+
{
61+
var isShortcut = listedItem.IsShortcut;
62+
var isLibrary = listedItem.IsLibrary;
63+
var fileExt = listedItem.FileExtension;
64+
TabShorcut.Visibility = isShortcut ? Visibility.Visible : Visibility.Collapsed;
65+
TabLibrary.Visibility = isLibrary ? Visibility.Visible : Visibility.Collapsed;
66+
TabDetails.Visibility = fileExt is not null && !isShortcut && !isLibrary ? Visibility.Visible : Visibility.Collapsed;
67+
TabCustomization.Visibility = !isLibrary && (
68+
(listedItem.PrimaryItemAttribute == Windows.Storage.StorageItemTypes.Folder && !listedItem.IsArchive) ||
69+
(isShortcut && !listedItem.IsLinkItem)) ? Visibility.Visible : Visibility.Collapsed;
70+
TabCompatibility.Visibility = (
71+
FileExtensionHelpers.IsExecutableFile(listedItem is ShortcutItem sht ? sht.TargetPath : fileExt, true)
72+
) ? Visibility.Visible : Visibility.Collapsed;
73+
TabSecurity.Visibility = !isLibrary && !listedItem.IsRecycleBinItem ? Visibility.Visible : Visibility.Collapsed;
74+
}
75+
else if (args.Item is DriveItem)
76+
{
77+
TabSecurity.Visibility = Visibility.Visible;
78+
}
7379
base.OnNavigatedTo(e);
7480
}
7581

@@ -194,11 +200,11 @@ private async void OKButton_Click(object sender, RoutedEventArgs e)
194200
{
195201
if (contentFrame.Content is PropertiesGeneral propertiesGeneral)
196202
{
197-
await propertiesGeneral.SaveChangesAsync(listedItem);
203+
await propertiesGeneral.SaveChangesAsync();
198204
}
199205
else
200206
{
201-
if (!await (contentFrame.Content as PropertiesTab).SaveChangesAsync(listedItem))
207+
if (!await (contentFrame.Content as PropertiesTab).SaveChangesAsync())
202208
return;
203209
}
204210

src/Files.App/Views/Pages/PropertiesCompatibility.xaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ protected override void Properties_Loaded(object sender, RoutedEventArgs e)
3737
}
3838
}
3939

40-
public override Task<bool> SaveChangesAsync(ListedItem item)
40+
public override Task<bool> SaveChangesAsync()
4141
{
4242
if (CompatibilityProperties is not null)
4343
return Task.FromResult(CompatibilityProperties.SetCompatibilityOptions());

src/Files.App/Views/Pages/PropertiesCustomization.xaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ private void CustomIconsSelectorFrame_Loaded(object sender, RoutedEventArgs e)
2929
}, new SuppressNavigationTransitionInfo());
3030
}
3131

32-
public override Task<bool> SaveChangesAsync(ListedItem item)
32+
public override Task<bool> SaveChangesAsync()
3333
{
3434
return Task.FromResult(true);
3535
}

src/Files.App/Views/Pages/PropertiesDetails.xaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ private static ContentDialog SetContentDialogRoot(ContentDialog contentDialog)
4040
return contentDialog;
4141
}
4242

43-
public override async Task<bool> SaveChangesAsync(ListedItem item)
43+
public override async Task<bool> SaveChangesAsync()
4444
{
4545
while (true)
4646
{

src/Files.App/Views/Pages/PropertiesGeneral.xaml.cs

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,26 +22,34 @@ public sealed partial class PropertiesGeneral : PropertiesTab
2222

2323
public PropertiesGeneral() => InitializeComponent();
2424

25-
public override async Task<bool> SaveChangesAsync(ListedItem item)
25+
public override async Task<bool> SaveChangesAsync()
2626
{
27-
ViewModel.ItemName = ItemFileName.Text; // Make sure Name is updated
28-
29-
string newName = ViewModel.ItemName;
30-
string oldName = ViewModel.OriginalItemName;
31-
bool hasNewName = !string.IsNullOrWhiteSpace(newName) && newName != oldName;
32-
3327
return BaseProperties switch
3428
{
3529
DriveProperties properties => SaveDrive(properties.Drive),
3630
LibraryProperties properties => await SaveLibraryAsync(properties.Library),
3731
CombinedProperties properties => await SaveCombinedAsync(properties.List),
38-
_ => await SaveBaseAsync(),
32+
FileProperties properties => await SaveBaseAsync(properties.Item),
33+
FolderProperties properties => await SaveBaseAsync(properties.Item),
3934
};
4035

36+
bool GetNewName(out string newName)
37+
{
38+
if (ItemFileName is not null)
39+
{
40+
ViewModel.ItemName = ItemFileName.Text; // Make sure Name is updated
41+
newName = ViewModel.ItemName;
42+
string oldName = ViewModel.OriginalItemName;
43+
return !string.IsNullOrWhiteSpace(newName) && newName != oldName;
44+
}
45+
newName = "";
46+
return false;
47+
}
48+
4149
bool SaveDrive(DriveItem drive)
4250
{
4351
var fsVM = AppInstance.FilesystemViewModel;
44-
if (!hasNewName || fsVM is null)
52+
if (!GetNewName(out var newName) || fsVM is null)
4553
return false;
4654

4755
newName = letterRegex.Replace(newName, string.Empty); // Remove "(C:)" from the new label
@@ -58,7 +66,7 @@ bool SaveDrive(DriveItem drive)
5866
async Task<bool> SaveLibraryAsync(LibraryItem library)
5967
{
6068
var fsVM = AppInstance.FilesystemViewModel;
61-
if (!hasNewName || fsVM is null || !App.LibraryManager.CanCreateLibrary(newName).result)
69+
if (!GetNewName(out var newName) || fsVM is null || !App.LibraryManager.CanCreateLibrary(newName).result)
6270
return false;
6371

6472
newName = $"{newName}{ShellLibraryItem.EXTENSION}";
@@ -94,7 +102,7 @@ await App.Window.DispatcherQueue.EnqueueAsync(() =>
94102
return true;
95103
}
96104

97-
async Task<bool> SaveBaseAsync()
105+
async Task<bool> SaveBaseAsync(ListedItem item)
98106
{
99107
// Handle the visibility attribute for a single file
100108
var itemMM = AppInstance?.SlimContentPage?.ItemManipulationModel;
@@ -105,7 +113,7 @@ await App.Window.DispatcherQueue.EnqueueAsync(() =>
105113
);
106114
}
107115

108-
if (!hasNewName)
116+
if (!GetNewName(out var newName))
109117
return true;
110118

111119
return await App.Window.DispatcherQueue.EnqueueAsync(() =>

src/Files.App/Views/Pages/PropertiesLibrary.xaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ private static ContentDialog SetContentDialogRoot(ContentDialog contentDialog)
190190
return contentDialog;
191191
}
192192

193-
public override async Task<bool> SaveChangesAsync(ListedItem item)
193+
public override async Task<bool> SaveChangesAsync()
194194
{
195195
if (BaseProperties is LibraryProperties props)
196196
{

src/Files.App/Views/Pages/PropertiesSecurity.xaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ protected override void OnNavigatedTo(NavigationEventArgs e)
4949
base.OnNavigatedTo(e);
5050
}
5151

52-
public async override Task<bool> SaveChangesAsync(ListedItem item)
52+
public async override Task<bool> SaveChangesAsync()
5353
{
5454
return SecurityProperties is null || SecurityProperties.SetFilePermissions();
5555
}

src/Files.App/Views/Pages/PropertiesShortcut.xaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public PropertiesShortcut()
1111
InitializeComponent();
1212
}
1313

14-
public override Task<bool> SaveChangesAsync(ListedItem item)
14+
public override Task<bool> SaveChangesAsync()
1515
{
1616
return Task.FromResult(true);
1717
}

0 commit comments

Comments
 (0)