This commit is contained in:
Jojo Zhou
2023-05-09 18:54:57 -04:00
parent 325cfd20e4
commit 971c7a840f
5 changed files with 130 additions and 5 deletions

View File

@@ -26,15 +26,12 @@
ToolTipService.ToolTip="{x:Bind ImageInfoTooltip, Mode=OneWay}"
Visibility="{x:Bind IsPreviewVisible(ImagePreviewer, Previewer.State), Mode=OneWay}" />
<!--<MediaPlayerElement
<MediaPlayerElement
x:Name="VideoPreview"
MaxWidth="{x:Bind ImagePreviewer.MaxImageSize.Width, Mode=OneWay}"
MaxHeight="{x:Bind ImagePreviewer.MaxImageSize.Height, Mode=OneWay}"
AreTransportControlsEnabled="True"
AutoPlay="False"
Source="{x:Bind VideoPreviewer.Preview, Mode=OneWay}"
ToolTipService.ToolTip="{x:Bind ImageInfoTooltip, Mode=OneWay}"
Visibility="Visible" />-->
Visibility="{x:Bind IsPreviewVisible(VideoPreviewer, Previewer.State), Mode=OneWay}" />
<controls:BrowserControl
x:Name="BrowserPreview"

View File

@@ -47,6 +47,7 @@ namespace Peek.FilePreviewer
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(ImagePreviewer))]
[NotifyPropertyChangedFor(nameof(VideoPreviewer))]
[NotifyPropertyChangedFor(nameof(BrowserPreviewer))]
[NotifyPropertyChangedFor(nameof(UnsupportedFilePreviewer))]
@@ -86,6 +87,8 @@ namespace Peek.FilePreviewer
public IImagePreviewer? ImagePreviewer => Previewer as IImagePreviewer;
public IVideoPreviewer? VideoPreviewer => Previewer as IVideoPreviewer;
public IBrowserPreviewer? BrowserPreviewer => Previewer as IBrowserPreviewer;
public IUnsupportedFilePreviewer? UnsupportedFilePreviewer => Previewer as IUnsupportedFilePreviewer;
@@ -131,6 +134,7 @@ namespace Peek.FilePreviewer
{
Previewer = null;
ImagePreview.Visibility = Visibility.Collapsed;
VideoPreview.Visibility = Visibility.Collapsed;
BrowserPreview.Visibility = Visibility.Collapsed;
UnsupportedFilePreview.Visibility = Visibility.Collapsed;
return;

View File

@@ -0,0 +1,13 @@
// 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 Windows.Media.Core;
namespace Peek.FilePreviewer.Previewers.Interfaces
{
public interface IVideoPreviewer : IPreviewer
{
public MediaSource? Preview { get; }
}
}

View File

@@ -0,0 +1,107 @@
// 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;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using CommunityToolkit.Mvvm.ComponentModel;
using Microsoft.UI.Dispatching;
using Peek.Common.Constants;
using Peek.Common.Extensions;
using Peek.Common.Helpers;
using Peek.Common.Models;
using Peek.FilePreviewer.Previewers.Interfaces;
using Windows.Foundation;
using Windows.Media.Core;
using Windows.Storage;
namespace Peek.FilePreviewer.Previewers
{
public partial class VideoPreviewer : ObservableObject, IVideoPreviewer, IDisposable
{
private static readonly HashSet<string> _supportedFileTypes = new HashSet<string>
{
".mp4", ".3g2", ".3gp", ".3gp2", ".3gpp", ".asf", ".avi", ".m2t", ".m2ts",
".m4v", ".mkv", ".mov", ".mp4", ".mp4v", ".mts", ".wm", ".wmv",
};
[ObservableProperty]
private MediaSource? preview;
[ObservableProperty]
private PreviewState state;
public VideoPreviewer(IFileSystemItem file)
{
File = file;
Dispatcher = DispatcherQueue.GetForCurrentThread();
}
public void Dispose()
{
GC.SuppressFinalize(this);
}
private IFileSystemItem File { get; }
public bool IsPreviewLoaded => preview != null;
private DispatcherQueue Dispatcher { get; }
private Task<bool>? DisplayInfoTask { get; set; }
public Task<Size?> GetPreviewSizeAsync(CancellationToken cancellationToken)
{
Size? size = null;
return Task.FromResult(size);
}
public async Task LoadPreviewAsync(CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
State = PreviewState.Loading;
await LoadDisplayInfoAsync(cancellationToken);
if (HasFailedLoadingPreview())
{
State = PreviewState.Error;
}
}
public Task<bool> LoadDisplayInfoAsync(CancellationToken cancellationToken)
{
return TaskExtension.RunSafe(async () =>
{
cancellationToken.ThrowIfCancellationRequested();
await Dispatcher.RunOnUiThread(async () =>
{
var storageItem = await File.GetStorageItemAsync();
Preview = MediaSource.CreateFromStorageFile(storageItem as StorageFile);
});
});
}
public async Task CopyAsync()
{
await Dispatcher.RunOnUiThread(async () =>
{
var storageItem = await File.GetStorageItemAsync();
ClipboardHelper.SaveToClipboard(storageItem);
});
}
public static bool IsFileTypeSupported(string fileExt)
{
return _supportedFileTypes.Contains(fileExt);
}
private bool HasFailedLoadingPreview()
{
return !(DisplayInfoTask?.Result ?? true);
}
}
}

View File

@@ -16,6 +16,10 @@ namespace Peek.FilePreviewer.Previewers
{
return new ImagePreviewer(file);
}
else if (VideoPreviewer.IsFileTypeSupported(file.Extension))
{
return new VideoPreviewer(file);
}
else if (WebBrowserPreviewer.IsFileTypeSupported(file.Extension))
{
return new WebBrowserPreviewer(file);