Skip to content

Commit 1280b06

Browse files
authored
Feature: Added option to confirm permanent deletion only (#11212)
1 parent 8c76348 commit 1280b06

File tree

13 files changed

+74
-37
lines changed

13 files changed

+74
-37
lines changed

src/Files.App/Filesystem/FilesystemOperations/Helpers/FilesystemHelpers.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ await DialogDisplayHelper.ShowDialogAsync(
116116

117117
#region Delete
118118

119-
public async Task<ReturnResult> DeleteItemsAsync(IEnumerable<IStorageItemWithPath> source, bool showDialog, bool permanently, bool registerHistory)
119+
public async Task<ReturnResult> DeleteItemsAsync(IEnumerable<IStorageItemWithPath> source, DeleteConfirmationPolicies showDialog, bool permanently, bool registerHistory)
120120
{
121121
source = await source.ToListAsync();
122122

@@ -125,7 +125,8 @@ public async Task<ReturnResult> DeleteItemsAsync(IEnumerable<IStorageItemWithPat
125125
var deleteFromRecycleBin = source.Select(item => item.Path).Any(path => RecycleBinHelpers.IsPathUnderRecycleBin(path));
126126
var canBeSentToBin = !deleteFromRecycleBin && await RecycleBinHelpers.HasRecycleBin(source.FirstOrDefault()?.Path);
127127

128-
if (showDialog)
128+
if (showDialog is DeleteConfirmationPolicies.Always
129+
|| showDialog is DeleteConfirmationPolicies.PermanentOnly && (permanently || !canBeSentToBin))
129130
{
130131
var incomingItems = new List<BaseFileSystemDialogItemViewModel>();
131132
List<ShellFileItem>? binItems = null;
@@ -193,13 +194,13 @@ public async Task<ReturnResult> DeleteItemsAsync(IEnumerable<IStorageItemWithPat
193194
return returnStatus;
194195
}
195196

196-
public Task<ReturnResult> DeleteItemAsync(IStorageItemWithPath source, bool showDialog, bool permanently, bool registerHistory)
197+
public Task<ReturnResult> DeleteItemAsync(IStorageItemWithPath source, DeleteConfirmationPolicies showDialog, bool permanently, bool registerHistory)
197198
=> DeleteItemsAsync(source.CreateEnumerable(), showDialog, permanently, registerHistory);
198199

199-
public Task<ReturnResult> DeleteItemsAsync(IEnumerable<IStorageItem> source, bool showDialog, bool permanently, bool registerHistory)
200+
public Task<ReturnResult> DeleteItemsAsync(IEnumerable<IStorageItem> source, DeleteConfirmationPolicies showDialog, bool permanently, bool registerHistory)
200201
=> DeleteItemsAsync(source.Select((item) => item.FromStorageItem()), showDialog, permanently, registerHistory);
201202

202-
public Task<ReturnResult> DeleteItemAsync(IStorageItem source, bool showDialog, bool permanently, bool registerHistory)
203+
public Task<ReturnResult> DeleteItemAsync(IStorageItem source, DeleteConfirmationPolicies showDialog, bool permanently, bool registerHistory)
203204
=> DeleteItemAsync(source.FromStorageItem(), showDialog, permanently, registerHistory);
204205

205206
#endregion Delete
@@ -258,7 +259,7 @@ public async Task<ReturnResult> PerformOperationTypeAsync(DataPackageOperation o
258259
}
259260
if (destination.StartsWith(CommonPaths.RecycleBinPath, StringComparison.Ordinal))
260261
{
261-
return await RecycleItemsFromClipboard(packageView, destination, UserSettingsService.FoldersSettingsService.ShowConfirmDeleteDialog, registerHistory);
262+
return await RecycleItemsFromClipboard(packageView, destination, UserSettingsService.FoldersSettingsService.DeleteConfirmationPolicy, registerHistory);
262263
}
263264
else if (operation.HasFlag(DataPackageOperation.Copy))
264265
{
@@ -625,7 +626,7 @@ public async Task<ReturnResult> CreateShortcutFromClipboard(DataPackageView pack
625626
return returnStatus;
626627
}
627628

628-
public async Task<ReturnResult> RecycleItemsFromClipboard(DataPackageView packageView, string destination, bool showDialog, bool registerHistory)
629+
public async Task<ReturnResult> RecycleItemsFromClipboard(DataPackageView packageView, string destination, DeleteConfirmationPolicies showDialog, bool registerHistory)
629630
{
630631
if (!HasDraggedStorageItems(packageView))
631632
{

src/Files.App/Filesystem/FilesystemOperations/Helpers/IFilesystemHelpers.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public interface IFilesystemHelpers : IDisposable
2828
/// <param name="permanently">Determines whether <paramref name="source"/> is be deleted permanently</param>
2929
/// <param name="registerHistory">Determines whether <see cref="IStorageHistory"/> is saved</param>
3030
/// <returns><see cref="ReturnResult"/> of performed operation</returns>
31-
Task<ReturnResult> DeleteItemsAsync(IEnumerable<IStorageItem> source, bool showDialog, bool permanently, bool registerHistory);
31+
Task<ReturnResult> DeleteItemsAsync(IEnumerable<IStorageItem> source, DeleteConfirmationPolicies showDialog, bool permanently, bool registerHistory);
3232

3333
/// <summary>
3434
/// Deletes provided <paramref name="source"/>
@@ -38,7 +38,7 @@ public interface IFilesystemHelpers : IDisposable
3838
/// <param name="permanently">Determines whether <paramref name="source"/> is be deleted permanently</param>
3939
/// <param name="registerHistory">Determines whether <see cref="IStorageHistory"/> is saved</param>
4040
/// <returns><see cref="ReturnResult"/> of performed operation</returns>
41-
Task<ReturnResult> DeleteItemAsync(IStorageItem source, bool showDialog, bool permanently, bool registerHistory);
41+
Task<ReturnResult> DeleteItemAsync(IStorageItem source, DeleteConfirmationPolicies showDialog, bool permanently, bool registerHistory);
4242

4343
/// <summary>
4444
/// Deletes provided <paramref name="source"/>
@@ -48,7 +48,7 @@ public interface IFilesystemHelpers : IDisposable
4848
/// <param name="permanently">Determines whether <paramref name="source"/> is be deleted permanently</param>
4949
/// <param name="registerHistory">Determines whether <see cref="IStorageHistory"/> is saved</param>
5050
/// <returns><see cref="ReturnResult"/> of performed operation</returns>
51-
Task<ReturnResult> DeleteItemsAsync(IEnumerable<IStorageItemWithPath> source, bool showDialog, bool permanently, bool registerHistory);
51+
Task<ReturnResult> DeleteItemsAsync(IEnumerable<IStorageItemWithPath> source, DeleteConfirmationPolicies showDialog, bool permanently, bool registerHistory);
5252

5353
/// <summary>
5454
/// Deletes provided <paramref name="source"/>
@@ -58,7 +58,7 @@ public interface IFilesystemHelpers : IDisposable
5858
/// <param name="permanently">Determines whether <paramref name="source"/> is be deleted permanently</param>
5959
/// <param name="registerHistory">Determines whether <see cref="IStorageHistory"/> is saved</param>
6060
/// <returns><see cref="ReturnResult"/> of performed operation</returns>
61-
Task<ReturnResult> DeleteItemAsync(IStorageItemWithPath source, bool showDialog, bool permanently, bool registerHistory);
61+
Task<ReturnResult> DeleteItemAsync(IStorageItemWithPath source, DeleteConfirmationPolicies showDialog, bool permanently, bool registerHistory);
6262

6363
#endregion Delete
6464

@@ -175,7 +175,7 @@ public interface IFilesystemHelpers : IDisposable
175175
/// <returns><see cref="ReturnResult"/> of performed operation</returns>
176176
Task<ReturnResult> CopyItemsFromClipboard(DataPackageView packageView, string destination, bool showDialog, bool registerHistory);
177177

178-
Task<ReturnResult> RecycleItemsFromClipboard(DataPackageView packageView, string destination, bool showDialog, bool registerHistory);
178+
Task<ReturnResult> RecycleItemsFromClipboard(DataPackageView packageView, string destination, DeleteConfirmationPolicies showDialog, bool registerHistory);
179179

180180
Task<ReturnResult> CreateShortcutFromClipboard(DataPackageView packageView, string destination, bool showDialog, bool registerHistory);
181181

src/Files.App/Filesystem/StorageHistory/StorageHistoryOperations.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,15 @@ public async Task<ReturnResult> Undo(IStorageHistory history)
3838
case FileOperationType.CreateNew: // Opposite: Delete created items
3939
if (!IsHistoryNull(history.Source))
4040
{
41-
return await helpers.DeleteItemsAsync(history.Source, true, true, false); // Show a dialog to prevent unexpected deletion
41+
// Show a dialog regardless of the setting to prevent unexpected deletion
42+
return await helpers.DeleteItemsAsync(history.Source, DeleteConfirmationPolicies.Always, true, false);
4243
}
4344
break;
4445
case FileOperationType.CreateLink: // Opposite: Delete created items
4546
if (!IsHistoryNull(history.Destination))
4647
{
47-
return await helpers.DeleteItemsAsync(history.Destination, true, true, false); // Show a dialog to prevent unexpected deletion
48+
// Show a dialog regardless of the setting to prevent unexpected deletion
49+
return await helpers.DeleteItemsAsync(history.Destination, DeleteConfirmationPolicies.Always, true, false);
4850
}
4951
break;
5052
case FileOperationType.Rename: // Opposite: Restore original item names
@@ -61,7 +63,8 @@ public async Task<ReturnResult> Undo(IStorageHistory history)
6163
case FileOperationType.Copy: // Opposite: Delete copied items
6264
if (!IsHistoryNull(history.Destination))
6365
{
64-
return await helpers.DeleteItemsAsync(history.Destination, true, true, false); // Show a dialog to prevent unexpected deletion
66+
// Show a dialog regardless of the setting to prevent unexpected deletion
67+
return await helpers.DeleteItemsAsync(history.Destination, DeleteConfirmationPolicies.Always, true, false);
6568
}
6669
break;
6770
case FileOperationType.Move: // Opposite: Move the items to original directory

src/Files.App/Helpers/NavigationHelpers.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ public static async Task<bool> OpenPath(string path, IShellPage associatedInstan
179179

180180
// Delete shortcut
181181
var shortcutItem = StorageHelpers.FromPathAndType(path, FilesystemItemType.File);
182-
await associatedInstance.FilesystemHelpers.DeleteItemAsync(shortcutItem, false, false, true);
182+
await associatedInstance.FilesystemHelpers.DeleteItemAsync(shortcutItem, DeleteConfirmationPolicies.Never, false, true);
183183
}
184184
}
185185
else if (isReparsePoint)

src/Files.App/Helpers/RecycleBinHelpers.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,9 @@ public static async Task EmptyRecycleBin()
6363
SecondaryButtonText = "Cancel".GetLocalizedResource(),
6464
DefaultButton = ContentDialogButton.Primary
6565
};
66-
ContentDialogResult result = await SetContentDialogRoot(ConfirmEmptyBinDialog).ShowAsync();
6766

68-
if (result == ContentDialogResult.Primary)
67+
if (userSettingsService.FoldersSettingsService.DeleteConfirmationPolicy is DeleteConfirmationPolicies.Never
68+
|| await SetContentDialogRoot(ConfirmEmptyBinDialog).ShowAsync() == ContentDialogResult.Primary)
6969
{
7070
string bannerTitle = "EmptyRecycleBin".GetLocalizedResource();
7171
var banner = App.OngoingTasksViewModel.PostBanner(
@@ -173,7 +173,7 @@ public static async Task DeleteItem(IShellPage associatedInstance)
173173
var items = associatedInstance.SlimContentPage.SelectedItems.ToList().Select((item) => StorageHelpers.FromPathAndType(
174174
item.ItemPath,
175175
item.PrimaryItemAttribute == StorageItemTypes.File ? FilesystemItemType.File : FilesystemItemType.Directory));
176-
await associatedInstance.FilesystemHelpers.DeleteItemsAsync(items, userSettingsService.FoldersSettingsService.ShowConfirmDeleteDialog, false, true);
176+
await associatedInstance.FilesystemHelpers.DeleteItemsAsync(items, userSettingsService.FoldersSettingsService.DeleteConfirmationPolicy, false, true);
177177
}
178178
}
179179
}

src/Files.App/ServicesImplementation/Settings/FoldersSettingsService.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -238,10 +238,10 @@ public bool ShowThumbnails
238238
set => Set(value);
239239
}
240240

241-
public bool ShowConfirmDeleteDialog
241+
public DeleteConfirmationPolicies DeleteConfirmationPolicy
242242
{
243-
get => Get(true);
244-
set => Set(value);
243+
get => (DeleteConfirmationPolicies)Get((long)DeleteConfirmationPolicies.Always);
244+
set => Set((long)value);
245245
}
246246

247247
public bool SelectFilesOnHover
@@ -283,7 +283,7 @@ protected override void RaiseOnSettingChangedEvent(object sender, SettingChanged
283283
case nameof(CalculateFolderSizes):
284284
case nameof(ShowFileExtensions):
285285
case nameof(ShowThumbnails):
286-
case nameof(ShowConfirmDeleteDialog):
286+
case nameof(DeleteConfirmationPolicy):
287287
case nameof(SelectFilesOnHover):
288288
case nameof(ShowSelectionCheckboxes):
289289
case nameof(DoubleClickToGoUp):

src/Files.App/Strings/en-US/Resources.resw

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2913,4 +2913,13 @@
29132913
<data name="WindowsVersion" xml:space="preserve">
29142914
<value>Windows version</value>
29152915
</data>
2916+
<data name="Always" xml:space="preserve">
2917+
<value>Always</value>
2918+
</data>
2919+
<data name="PermanentDeletionOnly" xml:space="preserve">
2920+
<value>Permanent deletion only</value>
2921+
</data>
2922+
<data name="Never" xml:space="preserve">
2923+
<value>Never</value>
2924+
</data>
29162925
</root>

src/Files.App/ViewModels/SettingsViewModels/FoldersViewModel.cs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public FoldersViewModel()
2121
SelectedDefaultLayoutModeIndex = (int)DefaultLayoutMode;
2222
SelectedDefaultSortingIndex = UserSettingsService.FoldersSettingsService.DefaultSortOption == SortOption.FileTag ? FileTagSortingIndex : (int)UserSettingsService.FoldersSettingsService.DefaultSortOption;
2323
SelectedDefaultGroupingIndex = UserSettingsService.FoldersSettingsService.DefaultGroupOption == GroupOption.FileTag ? FileTagGroupingIndex : (int)UserSettingsService.FoldersSettingsService.DefaultGroupOption;
24+
SelectedDeleteConfirmationPolicyIndex = (int)DeleteConfirmationPolicy;
2425
}
2526

2627
// Properties
@@ -39,6 +40,20 @@ public int SelectedDefaultLayoutModeIndex
3940
}
4041
}
4142

43+
private int selectedDeleteConfirmationPolicyIndex;
44+
public int SelectedDeleteConfirmationPolicyIndex
45+
{
46+
get => selectedDeleteConfirmationPolicyIndex;
47+
set
48+
{
49+
if (SetProperty(ref selectedDeleteConfirmationPolicyIndex, value))
50+
{
51+
OnPropertyChanged(nameof(SelectedDeleteConfirmationPolicyIndex));
52+
DeleteConfirmationPolicy = (DeleteConfirmationPolicies)value;
53+
}
54+
}
55+
}
56+
4257
public bool SyncFolderPreferencesAcrossDirectories
4358
{
4459
get => UserSettingsService.FoldersSettingsService.SyncFolderPreferencesAcrossDirectories;
@@ -315,14 +330,14 @@ public bool ShowThumbnails
315330
}
316331
}
317332

318-
public bool ShowConfirmDeleteDialog
333+
public DeleteConfirmationPolicies DeleteConfirmationPolicy
319334
{
320-
get => UserSettingsService.FoldersSettingsService.ShowConfirmDeleteDialog;
335+
get => UserSettingsService.FoldersSettingsService.DeleteConfirmationPolicy;
321336
set
322337
{
323-
if (value != UserSettingsService.FoldersSettingsService.ShowConfirmDeleteDialog)
338+
if (value != UserSettingsService.FoldersSettingsService.DeleteConfirmationPolicy)
324339
{
325-
UserSettingsService.FoldersSettingsService.ShowConfirmDeleteDialog = value;
340+
UserSettingsService.FoldersSettingsService.DeleteConfirmationPolicy = value;
326341
OnPropertyChanged();
327342
}
328343
}

src/Files.App/Views/ColumnShellPage.xaml.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -714,7 +714,7 @@ private async void KeyboardAccelerator_Invoked(KeyboardAccelerator sender, Keybo
714714
var items = SlimContentPage.SelectedItems.ToList().Select((item) => StorageHelpers.FromPathAndType(
715715
item.ItemPath,
716716
item.PrimaryItemAttribute == StorageItemTypes.File ? FilesystemItemType.File : FilesystemItemType.Directory));
717-
await FilesystemHelpers.DeleteItemsAsync(items, UserSettingsService.FoldersSettingsService.ShowConfirmDeleteDialog, true, true);
717+
await FilesystemHelpers.DeleteItemsAsync(items, UserSettingsService.FoldersSettingsService.DeleteConfirmationPolicy, true, true);
718718
}
719719

720720
break;
@@ -758,7 +758,7 @@ private async void KeyboardAccelerator_Invoked(KeyboardAccelerator sender, Keybo
758758
var items = SlimContentPage.SelectedItems.ToList().Select((item) => StorageHelpers.FromPathAndType(
759759
item.ItemPath,
760760
item.PrimaryItemAttribute == StorageItemTypes.File ? FilesystemItemType.File : FilesystemItemType.Directory));
761-
await FilesystemHelpers.DeleteItemsAsync(items, UserSettingsService.FoldersSettingsService.ShowConfirmDeleteDialog, false, true);
761+
await FilesystemHelpers.DeleteItemsAsync(items, UserSettingsService.FoldersSettingsService.DeleteConfirmationPolicy, false, true);
762762
}
763763

764764
break;

src/Files.App/Views/ModernShellPage.xaml.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -725,7 +725,7 @@ private async void KeyboardAccelerator_Invoked(KeyboardAccelerator sender, Keybo
725725
var items = SlimContentPage.SelectedItems.ToList().Select((item) => StorageHelpers.FromPathAndType(
726726
item.ItemPath,
727727
item.PrimaryItemAttribute == StorageItemTypes.File ? FilesystemItemType.File : FilesystemItemType.Directory));
728-
await FilesystemHelpers.DeleteItemsAsync(items, UserSettingsService.FoldersSettingsService.ShowConfirmDeleteDialog, true, true);
728+
await FilesystemHelpers.DeleteItemsAsync(items, UserSettingsService.FoldersSettingsService.DeleteConfirmationPolicy, true, true);
729729
}
730730

731731
break;
@@ -761,7 +761,7 @@ private async void KeyboardAccelerator_Invoked(KeyboardAccelerator sender, Keybo
761761
var items = SlimContentPage.SelectedItems.ToList().Select((item) => StorageHelpers.FromPathAndType(
762762
item.ItemPath,
763763
item.PrimaryItemAttribute == StorageItemTypes.File ? FilesystemItemType.File : FilesystemItemType.Directory));
764-
await FilesystemHelpers.DeleteItemsAsync(items, UserSettingsService.FoldersSettingsService.ShowConfirmDeleteDialog, false, true);
764+
await FilesystemHelpers.DeleteItemsAsync(items, UserSettingsService.FoldersSettingsService.DeleteConfirmationPolicy, false, true);
765765
}
766766

767767
break;

0 commit comments

Comments
 (0)