Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Delete functionality for Peek #35418

Open
wants to merge 10 commits into
base: main
Choose a base branch
from
10 changes: 10 additions & 0 deletions src/modules/peek/Peek.FilePreviewer/FilePreview.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,16 @@
LoadingState="{x:Bind UnsupportedFilePreviewer.State, Mode=OneWay}"
Source="{x:Bind UnsupportedFilePreviewer.Preview, Mode=OneWay}"
Visibility="{x:Bind IsUnsupportedPreviewVisible(UnsupportedFilePreviewer, Previewer.State), Mode=OneWay}" />

<TextBlock
x:Name="NoMoreFiles"
x:Uid="NoMoreFiles"
HorizontalAlignment="Center"
VerticalAlignment="Center"
AutomationProperties.HeadingLevel="1"
Foreground="{StaticResource TextFillColorSecondaryBrush}"
TextWrapping="Wrap"
Visibility="Collapsed" />
</Grid>
<UserControl.KeyboardAccelerators>
<KeyboardAccelerator
Expand Down
5 changes: 5 additions & 0 deletions src/modules/peek/Peek.FilePreviewer/FilePreview.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ public sealed partial class FilePreview : UserControl, IDisposable
typeof(FilePreview),
new PropertyMetadata(false, async (d, e) => await ((FilePreview)d).OnScalingFactorPropertyChanged()));

[ObservableProperty]
private int numberOfFiles;

[ObservableProperty]
[NotifyPropertyChangedFor(nameof(ImagePreviewer))]
[NotifyPropertyChangedFor(nameof(VideoPreviewer))]
Expand Down Expand Up @@ -158,6 +161,8 @@ private async Task OnItemPropertyChanged()
// Clear up any unmanaged resources before creating a new previewer instance.
(Previewer as IDisposable)?.Dispose();

NoMoreFiles.Visibility = NumberOfFiles == 0 ? Visibility.Visible : Visibility.Collapsed;

if (Item == null)
{
Previewer = null;
Expand Down
100 changes: 100 additions & 0 deletions src/modules/peek/Peek.UI/Helpers/DeleteErrorMessageHelper.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using System.Collections.Generic;
using System.Globalization;
using System.Text;
using ManagedCommon;
using static Peek.Common.Helpers.ResourceLoaderInstance;

namespace Peek.UI.Helpers;

public static class DeleteErrorMessageHelper
{
/// <summary>
/// The "Could not delete 'filename'." message, which begins every user-facing error string.
/// </summary>
private static readonly CompositeFormat UserMessagePrefix =
CompositeFormat.Parse(ResourceLoader.GetString("DeleteFileError_Prefix") + " ");

/// <summary>
/// The message displayed if the delete failed but the error code isn't covered in the
/// <see cref="DeleteFileErrors"/> collection.
/// </summary>
private static readonly string GenericErrorMessage = ResourceLoader.GetString("DeleteFileError_Generic");

/// <summary>
/// The collection of the most common error codes with their matching log messages and user-
/// facing descriptions.
/// </summary>
private static readonly Dictionary<int, (string LogMessage, string UserMessage)> DeleteFileErrors = new()
{
{
2,
(
"The system cannot find the file specified.",
ResourceLoader.GetString("DeleteFileError_NotFound")
)
},
{
3,
(
"The system cannot find the path specified.",
ResourceLoader.GetString("DeleteFileError_NotFound")
)
},
{
5,
(
"Access is denied.",
ResourceLoader.GetString("DeleteFileError_AccessDenied")
)
},
{
19,
(
"The media is write protected.",
ResourceLoader.GetString("DeleteFileError_WriteProtected")
)
},
{
32,
(
"The process cannot access the file because it is being used by another process.",
ResourceLoader.GetString("DeleteFileError_FileInUse")
)
},
{
33,
(
"The process cannot access the file because another process has locked a portion of the file.",
ResourceLoader.GetString("DeleteFileError_FileInUse")
)
},
};

/// <summary>
/// Logs an error message in response to a failed file deletion attempt.
/// </summary>
/// <param name="errorCode">The error code returned from the delete call.</param>
public static void LogError(int errorCode) =>
Logger.LogError(DeleteFileErrors.TryGetValue(errorCode, out var messages) ?
messages.LogMessage :
$"Error {errorCode} occurred while deleting the file.");

/// <summary>
/// Gets the message to display in the UI for a specific delete error code.
/// </summary>
/// <param name="filename">The name of the file which could not be deleted.</param>
/// <param name="errorCode">The error code result from the delete call.</param>
/// <returns>A string containing the message to show in the user interface.</returns>
public static string GetUserErrorMessage(string filename, int errorCode)
{
string prefix = string.Format(CultureInfo.InvariantCulture, UserMessagePrefix, filename);

return DeleteFileErrors.TryGetValue(errorCode, out var messages) ?
prefix + messages.UserMessage :
prefix + GenericErrorMessage;
}
}
Loading
Loading