[Peek] Fix race condition when setting preview (#26478)

This commit is contained in:
Stefan Markovic
2023-05-30 16:58:56 +02:00
committed by GitHub
parent ce87952058
commit b50b587a63

View File

@@ -62,8 +62,12 @@ namespace Peek.FilePreviewer.Previewers
private IntPtr lowQualityThumbnail; private IntPtr lowQualityThumbnail;
private ImageSource? lowQualityThumbnailPreview;
private IntPtr highQualityThumbnail; private IntPtr highQualityThumbnail;
private ImageSource? highQualityThumbnailPreview;
public static bool IsFileTypeSupported(string fileExt) public static bool IsFileTypeSupported(string fileExt)
{ {
return _supportedFileTypes.Contains(fileExt); return _supportedFileTypes.Contains(fileExt);
@@ -110,6 +114,19 @@ namespace Peek.FilePreviewer.Previewers
await Task.WhenAll(LowQualityThumbnailTask, HighQualityThumbnailTask, FullQualityImageTask); await Task.WhenAll(LowQualityThumbnailTask, HighQualityThumbnailTask, FullQualityImageTask);
// If Preview is still null, FullQualityImage was not available. Preview the thumbnail instead.
if (Preview == null)
{
if (highQualityThumbnailPreview != null)
{
Preview = highQualityThumbnailPreview;
}
else
{
Preview = lowQualityThumbnailPreview;
}
}
if (Preview == null && HasFailedLoadingPreview()) if (Preview == null && HasFailedLoadingPreview())
{ {
State = PreviewState.Error; State = PreviewState.Error;
@@ -179,7 +196,7 @@ namespace Peek.FilePreviewer.Previewers
if (!IsFullImageLoaded && !IsHighQualityThumbnailLoaded) if (!IsFullImageLoaded && !IsHighQualityThumbnailLoaded)
{ {
var thumbnailBitmap = await BitmapHelper.GetBitmapFromHBitmapAsync(lowQualityThumbnail, IsPng(Item), cancellationToken); var thumbnailBitmap = await BitmapHelper.GetBitmapFromHBitmapAsync(lowQualityThumbnail, IsPng(Item), cancellationToken);
Preview = thumbnailBitmap; lowQualityThumbnailPreview = thumbnailBitmap;
} }
}); });
}); });
@@ -206,7 +223,7 @@ namespace Peek.FilePreviewer.Previewers
if (!IsFullImageLoaded) if (!IsFullImageLoaded)
{ {
var thumbnailBitmap = await BitmapHelper.GetBitmapFromHBitmapAsync(highQualityThumbnail, IsPng(Item), cancellationToken); var thumbnailBitmap = await BitmapHelper.GetBitmapFromHBitmapAsync(highQualityThumbnail, IsPng(Item), cancellationToken);
Preview = thumbnailBitmap; highQualityThumbnailPreview = thumbnailBitmap;
} }
}); });
}); });
@@ -270,6 +287,8 @@ namespace Peek.FilePreviewer.Previewers
private void Clear() private void Clear()
{ {
lowQualityThumbnailPreview = null;
highQualityThumbnailPreview = null;
Preview = null; Preview = null;
if (lowQualityThumbnail != IntPtr.Zero) if (lowQualityThumbnail != IntPtr.Zero)