diff --git a/src/modules/peek/Peek.Common/Converters/VisibilityConverter.cs b/src/modules/peek/Peek.Common/Converters/VisibilityConverter.cs new file mode 100644 index 00000000000..9a2306864e5 --- /dev/null +++ b/src/modules/peek/Peek.Common/Converters/VisibilityConverter.cs @@ -0,0 +1,21 @@ +// 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 Microsoft.UI.Xaml; + +namespace Peek.Common.Converters +{ + public static class VisibilityConverter + { + public static Visibility Convert(bool b) + { + return b ? Visibility.Visible : Visibility.Collapsed; + } + + public static Visibility Invert(bool b) + { + return b ? Visibility.Collapsed : Visibility.Visible; + } + } +} diff --git a/src/modules/peek/Peek.Common/Extensions/IFileSystemItemExtensions.cs b/src/modules/peek/Peek.Common/Extensions/IFileSystemItemExtensions.cs index 8ea7f0c8261..50cc7f9c933 100644 --- a/src/modules/peek/Peek.Common/Extensions/IFileSystemItemExtensions.cs +++ b/src/modules/peek/Peek.Common/Extensions/IFileSystemItemExtensions.cs @@ -85,16 +85,23 @@ public static ulong GetSizeInBytes(this IFileSystemItem item) { ulong sizeInBytes = 0; - switch (item) + try { - case FolderItem _: - FileSystemObject fileSystemObject = new FileSystemObject(); - Folder folder = fileSystemObject.GetFolder(item.Path); - sizeInBytes = (ulong)folder.Size; - break; - case FileItem _: - sizeInBytes = item.FileSizeBytes; - break; + switch (item) + { + case FolderItem _: + FileSystemObject fileSystemObject = new FileSystemObject(); + Folder folder = fileSystemObject.GetFolder(item.Path); + sizeInBytes = (ulong)folder.Size; + break; + case FileItem _: + sizeInBytes = item.FileSizeBytes; + break; + } + } + catch + { + sizeInBytes = 0; } return sizeInBytes; diff --git a/src/modules/peek/Peek.Common/Models/FileItem.cs b/src/modules/peek/Peek.Common/Models/FileItem.cs index 25d06a9d094..da146f3e474 100644 --- a/src/modules/peek/Peek.Common/Models/FileItem.cs +++ b/src/modules/peek/Peek.Common/Models/FileItem.cs @@ -17,11 +17,14 @@ public class FileItem : IFileSystemItem { private StorageFile? storageFile; - public FileItem(string path) + public FileItem(string path, string name) { Path = path; + Name = name; } + public string Name { get; init; } + public string Path { get; init; } public async Task GetStorageItemAsync() diff --git a/src/modules/peek/Peek.Common/Models/FolderItem.cs b/src/modules/peek/Peek.Common/Models/FolderItem.cs index 11244a03af4..77780fb5759 100644 --- a/src/modules/peek/Peek.Common/Models/FolderItem.cs +++ b/src/modules/peek/Peek.Common/Models/FolderItem.cs @@ -17,11 +17,14 @@ public class FolderItem : IFileSystemItem { private StorageFolder? storageFolder; - public FolderItem(string path) + public FolderItem(string path, string name) { Path = path; + Name = name; } + public string Name { get; init; } + public string Path { get; init; } public async Task GetStorageItemAsync() diff --git a/src/modules/peek/Peek.Common/Models/IFileSystemItem.cs b/src/modules/peek/Peek.Common/Models/IFileSystemItem.cs index 544f933f360..e455ca243d1 100644 --- a/src/modules/peek/Peek.Common/Models/IFileSystemItem.cs +++ b/src/modules/peek/Peek.Common/Models/IFileSystemItem.cs @@ -15,11 +15,27 @@ namespace Peek.Common.Models { public interface IFileSystemItem { - public DateTime DateModified => System.IO.File.GetCreationTime(Path); + public DateTime? DateModified + { + get + { + DateTime? dateModified = null; + try + { + dateModified = System.IO.File.GetCreationTime(Path); + } + catch + { + dateModified = null; + } + + return dateModified; + } + } public string Extension => System.IO.Path.GetExtension(Path).ToLower(CultureInfo.InvariantCulture); - public string Name => System.IO.Path.GetFileName(Path); + public string Name { get; init; } public string Path { get; init; } diff --git a/src/modules/peek/Peek.FilePreviewer/Controls/UnsupportedFilePreview.xaml.cs b/src/modules/peek/Peek.FilePreviewer/Controls/UnsupportedFilePreview.xaml.cs deleted file mode 100644 index e86a8250c72..00000000000 --- a/src/modules/peek/Peek.FilePreviewer/Controls/UnsupportedFilePreview.xaml.cs +++ /dev/null @@ -1,44 +0,0 @@ -// 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 CommunityToolkit.Mvvm.ComponentModel; -using Microsoft.UI.Xaml.Controls; -using Microsoft.UI.Xaml.Media; -using Peek.Common.Helpers; - -namespace Peek.FilePreviewer.Controls -{ - [INotifyPropertyChanged] - public sealed partial class UnsupportedFilePreview : UserControl - { - [ObservableProperty] - private ImageSource? iconPreview; - - [ObservableProperty] - private string? fileName; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(FormattedFileType))] - private string? fileType; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(FormattedFileSize))] - private string? fileSize; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(FormattedDateModified))] - private string? dateModified; - - public string FormattedFileType => ReadableStringHelper.FormatResourceString("UnsupportedFile_FileType", FileType); - - public string FormattedFileSize => ReadableStringHelper.FormatResourceString("UnsupportedFile_FileSize", FileSize); - - public string FormattedDateModified => ReadableStringHelper.FormatResourceString("UnsupportedFile_DateModified", DateModified); - - public UnsupportedFilePreview() - { - this.InitializeComponent(); - } - } -} diff --git a/src/modules/peek/Peek.FilePreviewer/Controls/UnsupportedFilePreview/FailedFallbackPreviewControl.xaml b/src/modules/peek/Peek.FilePreviewer/Controls/UnsupportedFilePreview/FailedFallbackPreviewControl.xaml new file mode 100644 index 00000000000..f49062646b1 --- /dev/null +++ b/src/modules/peek/Peek.FilePreviewer/Controls/UnsupportedFilePreview/FailedFallbackPreviewControl.xaml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/peek/Peek.FilePreviewer/Controls/UnsupportedFilePreview/FailedFallbackPreviewControl.xaml.cs b/src/modules/peek/Peek.FilePreviewer/Controls/UnsupportedFilePreview/FailedFallbackPreviewControl.xaml.cs new file mode 100644 index 00000000000..b307263ef76 --- /dev/null +++ b/src/modules/peek/Peek.FilePreviewer/Controls/UnsupportedFilePreview/FailedFallbackPreviewControl.xaml.cs @@ -0,0 +1,16 @@ +// 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 Microsoft.UI.Xaml.Controls; + +namespace Peek.FilePreviewer.Controls +{ + public sealed partial class FailedFallbackPreviewControl : UserControl + { + public FailedFallbackPreviewControl() + { + InitializeComponent(); + } + } +} diff --git a/src/modules/peek/Peek.FilePreviewer/Controls/UnsupportedFilePreview.xaml b/src/modules/peek/Peek.FilePreviewer/Controls/UnsupportedFilePreview/InformationalPreviewControl.xaml similarity index 65% rename from src/modules/peek/Peek.FilePreviewer/Controls/UnsupportedFilePreview.xaml rename to src/modules/peek/Peek.FilePreviewer/Controls/UnsupportedFilePreview/InformationalPreviewControl.xaml index 4d7c5c588c2..20a572a2499 100644 --- a/src/modules/peek/Peek.FilePreviewer/Controls/UnsupportedFilePreview.xaml +++ b/src/modules/peek/Peek.FilePreviewer/Controls/UnsupportedFilePreview/InformationalPreviewControl.xaml @@ -2,29 +2,26 @@ - + + Source="{x:Bind Source.IconPreview, Mode=OneWay}" /> - - - + + + diff --git a/src/modules/peek/Peek.FilePreviewer/Controls/UnsupportedFilePreview/InformationalPreviewControl.xaml.cs b/src/modules/peek/Peek.FilePreviewer/Controls/UnsupportedFilePreview/InformationalPreviewControl.xaml.cs new file mode 100644 index 00000000000..478218202fe --- /dev/null +++ b/src/modules/peek/Peek.FilePreviewer/Controls/UnsupportedFilePreview/InformationalPreviewControl.xaml.cs @@ -0,0 +1,38 @@ +// 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 CommunityToolkit.Mvvm.ComponentModel; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Peek.Common.Helpers; +using Peek.FilePreviewer.Models; + +namespace Peek.FilePreviewer.Controls +{ + public sealed partial class InformationalPreviewControl : UserControl + { + public static readonly DependencyProperty SourceProperty = DependencyProperty.Register( + nameof(Source), + typeof(UnsupportedFilePreviewData), + typeof(InformationalPreviewControl), + new PropertyMetadata(null)); + + public UnsupportedFilePreviewData? Source + { + get { return (UnsupportedFilePreviewData)GetValue(SourceProperty); } + set { SetValue(SourceProperty, value); } + } + + public InformationalPreviewControl() + { + InitializeComponent(); + } + + public string FormatFileType(string? fileType) => ReadableStringHelper.FormatResourceString("UnsupportedFile_FileType", fileType); + + public string FormatFileSize(string? fileSize) => ReadableStringHelper.FormatResourceString("UnsupportedFile_FileSize", fileSize); + + public string FormatFileDateModified(string? fileDateModified) => ReadableStringHelper.FormatResourceString("UnsupportedFile_DateModified", fileDateModified); + } +} diff --git a/src/modules/peek/Peek.FilePreviewer/Controls/UnsupportedFilePreview/UnsupportedFilePreview.xaml b/src/modules/peek/Peek.FilePreviewer/Controls/UnsupportedFilePreview/UnsupportedFilePreview.xaml new file mode 100644 index 00000000000..b77fa3c511d --- /dev/null +++ b/src/modules/peek/Peek.FilePreviewer/Controls/UnsupportedFilePreview/UnsupportedFilePreview.xaml @@ -0,0 +1,27 @@ + + + + + + + + + + + + diff --git a/src/modules/peek/Peek.FilePreviewer/Controls/UnsupportedFilePreview/UnsupportedFilePreview.xaml.cs b/src/modules/peek/Peek.FilePreviewer/Controls/UnsupportedFilePreview/UnsupportedFilePreview.xaml.cs new file mode 100644 index 00000000000..accd18e8452 --- /dev/null +++ b/src/modules/peek/Peek.FilePreviewer/Controls/UnsupportedFilePreview/UnsupportedFilePreview.xaml.cs @@ -0,0 +1,48 @@ +// 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 CommunityToolkit.Mvvm.ComponentModel; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Peek.Common.Converters; +using Peek.FilePreviewer.Models; +using Peek.FilePreviewer.Previewers; + +namespace Peek.FilePreviewer.Controls +{ + [INotifyPropertyChanged] + public sealed partial class UnsupportedFilePreview : UserControl + { + public static readonly DependencyProperty SourceProperty = DependencyProperty.Register( + nameof(Source), + typeof(UnsupportedFilePreviewData), + typeof(UnsupportedFilePreview), + new PropertyMetadata(null)); + + public static readonly DependencyProperty LoadingStateProperty = DependencyProperty.Register( + nameof(LoadingState), + typeof(PreviewState), + typeof(UnsupportedFilePreview), + new PropertyMetadata(PreviewState.Uninitialized)); + + public UnsupportedFilePreviewData? Source + { + get { return (UnsupportedFilePreviewData)GetValue(SourceProperty); } + set { SetValue(SourceProperty, value); } + } + + public PreviewState? LoadingState + { + get { return (PreviewState)GetValue(LoadingStateProperty); } + set { SetValue(LoadingStateProperty, value); } + } + + public UnsupportedFilePreview() + { + InitializeComponent(); + } + + public Visibility IsVisibleIfStatesMatch(PreviewState? a, PreviewState? b) => VisibilityConverter.Convert(a == b); + } +} diff --git a/src/modules/peek/Peek.FilePreviewer/FilePreview.xaml b/src/modules/peek/Peek.FilePreviewer/FilePreview.xaml index 9490cecf7be..c64410551d4 100644 --- a/src/modules/peek/Peek.FilePreviewer/FilePreview.xaml +++ b/src/modules/peek/Peek.FilePreviewer/FilePreview.xaml @@ -30,19 +30,16 @@ x:Name="BrowserPreview" x:Load="True" DOMContentLoaded="BrowserPreview_DOMContentLoaded" + IsDevFilePreview="{x:Bind BrowserPreviewer.IsDevFilePreview, Mode=OneWay}" NavigationCompleted="PreviewBrowser_NavigationCompleted" Source="{x:Bind BrowserPreviewer.Preview, Mode=OneWay}" - IsDevFilePreview="{x:Bind BrowserPreviewer.IsDevFilePreview, Mode=OneWay}" Visibility="{x:Bind IsPreviewVisible(BrowserPreviewer, Previewer.State), Mode=OneWay, FallbackValue=Collapsed}" /> + LoadingState="{x:Bind UnsupportedFilePreviewer.State, Mode=OneWay}" + Source="{x:Bind UnsupportedFilePreviewer.Preview, Mode=OneWay}" + Visibility="{x:Bind IsUnsupportedPreviewVisible(UnsupportedFilePreviewer, Previewer.State), Mode=OneWay}" /> + net7.0-windows10.0.19041.0 @@ -8,8 +8,15 @@ true enable + + + Designer + + + + @@ -29,6 +36,12 @@ + + + MSBuild:Compile + + + MSBuild:Compile @@ -48,6 +61,8 @@ - + + MSBuild:Compile + diff --git a/src/modules/peek/Peek.FilePreviewer/Previewers/Helpers/IconHelper.cs b/src/modules/peek/Peek.FilePreviewer/Previewers/Helpers/IconHelper.cs index 099d1f7d471..34ddde5dfaf 100644 --- a/src/modules/peek/Peek.FilePreviewer/Previewers/Helpers/IconHelper.cs +++ b/src/modules/peek/Peek.FilePreviewer/Previewers/Helpers/IconHelper.cs @@ -9,6 +9,7 @@ using Microsoft.UI.Xaml.Media; using Microsoft.UI.Xaml.Media.Imaging; using Peek.Common; +using Peek.Common.Extensions; using Peek.Common.Models; namespace Peek.FilePreviewer.Previewers.Helpers @@ -20,8 +21,14 @@ public static class IconHelper public static async Task GetIconAsync(string fileName, CancellationToken cancellationToken) { + if (string.IsNullOrEmpty(fileName)) + { + return null; + } + ImageSource? imageSource = null; IShellItem? nativeShellItem = null; + try { Guid shellItem2Guid = new(IShellItem2Guid); @@ -39,15 +46,7 @@ public static class IconHelper cancellationToken.ThrowIfCancellationRequested(); - if (hr == HResult.Ok) - { - imageSource = await BitmapHelper.GetBitmapFromHBitmapAsync(hbitmap, true, cancellationToken); - } - else - { - var svgImageSource = new SvgImageSource(new Uri("ms-appx:///Assets/DefaultFileIcon.svg")); - imageSource = svgImageSource; - } + imageSource = hr == HResult.Ok ? await BitmapHelper.GetBitmapFromHBitmapAsync(hbitmap, true, cancellationToken) : null; } finally { diff --git a/src/modules/peek/Peek.FilePreviewer/Previewers/ImagePreviewer/ImagePreviewer.cs b/src/modules/peek/Peek.FilePreviewer/Previewers/ImagePreviewer/ImagePreviewer.cs index fef92f61154..16ebee4c0bd 100644 --- a/src/modules/peek/Peek.FilePreviewer/Previewers/ImagePreviewer/ImagePreviewer.cs +++ b/src/modules/peek/Peek.FilePreviewer/Previewers/ImagePreviewer/ImagePreviewer.cs @@ -156,7 +156,7 @@ private Task LoadLowQualityThumbnailAsync(CancellationToken cancellationTo { cancellationToken.ThrowIfCancellationRequested(); - var hr = ThumbnailHelper.GetThumbnail(Path.GetFullPath(Item.Path), out IntPtr hbitmap, ThumbnailHelper.LowQualityThumbnailSize); + var hr = ThumbnailHelper.GetThumbnail(Item.Path, out IntPtr hbitmap, ThumbnailHelper.LowQualityThumbnailSize); if (hr != HResult.Ok) { Logger.LogError("Error loading low quality thumbnail - hresult: " + hr); @@ -183,7 +183,7 @@ private Task LoadHighQualityThumbnailAsync(CancellationToken cancellationT { cancellationToken.ThrowIfCancellationRequested(); - var hr = ThumbnailHelper.GetThumbnail(Path.GetFullPath(Item.Path), out IntPtr hbitmap, ThumbnailHelper.HighQualityThumbnailSize); + var hr = ThumbnailHelper.GetThumbnail(Item.Path, out IntPtr hbitmap, ThumbnailHelper.HighQualityThumbnailSize); if (hr != HResult.Ok) { Logger.LogError("Error loading high quality thumbnail - hresult: " + hr); diff --git a/src/modules/peek/Peek.FilePreviewer/Previewers/Interfaces/IUnsupportedFilePreviewer.cs b/src/modules/peek/Peek.FilePreviewer/Previewers/Interfaces/IUnsupportedFilePreviewer.cs index 8c90d54ca35..668a4aaa5d4 100644 --- a/src/modules/peek/Peek.FilePreviewer/Previewers/Interfaces/IUnsupportedFilePreviewer.cs +++ b/src/modules/peek/Peek.FilePreviewer/Previewers/Interfaces/IUnsupportedFilePreviewer.cs @@ -3,19 +3,12 @@ // See the LICENSE file in the project root for more information. using Microsoft.UI.Xaml.Media; +using Peek.FilePreviewer.Models; namespace Peek.FilePreviewer.Previewers { public interface IUnsupportedFilePreviewer : IPreviewer { - public ImageSource? IconPreview { get; } - - public string? FileName { get; } - - public string? FileType { get; } - - public string? FileSize { get; } - - public string? DateModified { get; } + public UnsupportedFilePreviewData? Preview { get; } } } diff --git a/src/modules/peek/Peek.FilePreviewer/Previewers/UnsupportedFilePreviewer/UnsupportedFilePreviewer.cs b/src/modules/peek/Peek.FilePreviewer/Previewers/UnsupportedFilePreviewer/UnsupportedFilePreviewer.cs index 5a3c84a84f0..8fa67383a5a 100644 --- a/src/modules/peek/Peek.FilePreviewer/Previewers/UnsupportedFilePreviewer/UnsupportedFilePreviewer.cs +++ b/src/modules/peek/Peek.FilePreviewer/Previewers/UnsupportedFilePreviewer/UnsupportedFilePreviewer.cs @@ -10,10 +10,11 @@ using CommunityToolkit.Mvvm.ComponentModel; using Microsoft.PowerToys.Settings.UI.Library; using Microsoft.UI.Dispatching; -using Microsoft.UI.Xaml.Media; +using Microsoft.UI.Xaml.Media.Imaging; using Peek.Common.Extensions; using Peek.Common.Helpers; using Peek.Common.Models; +using Peek.FilePreviewer.Models; using Peek.FilePreviewer.Previewers.Helpers; using Windows.Foundation; @@ -22,19 +23,7 @@ namespace Peek.FilePreviewer.Previewers public partial class UnsupportedFilePreviewer : ObservableObject, IUnsupportedFilePreviewer, IDisposable { [ObservableProperty] - private ImageSource? iconPreview; - - [ObservableProperty] - private string? fileName; - - [ObservableProperty] - private string? fileType; - - [ObservableProperty] - private string? fileSize; - - [ObservableProperty] - private string? dateModified; + private UnsupportedFilePreviewData preview = new UnsupportedFilePreviewData(); [ObservableProperty] private PreviewState state; @@ -42,12 +31,12 @@ public partial class UnsupportedFilePreviewer : ObservableObject, IUnsupportedFi public UnsupportedFilePreviewer(IFileSystemItem file) { Item = file; - FileName = file.Name; - DateModified = file.DateModified.ToString(CultureInfo.CurrentCulture); + Preview.FileName = file.Name; + Preview.DateModified = file.DateModified?.ToString(CultureInfo.CurrentCulture); Dispatcher = DispatcherQueue.GetForCurrentThread(); } - public bool IsPreviewLoaded => iconPreview != null; + public bool IsPreviewLoaded => Preview.IconPreview != null; private IFileSystemItem Item { get; } @@ -83,6 +72,10 @@ public async Task LoadPreviewAsync(CancellationToken cancellationToken) { State = PreviewState.Error; } + else + { + State = PreviewState.Loaded; + } } public async Task CopyAsync() @@ -94,23 +87,35 @@ await Dispatcher.RunOnUiThread(async () => }); } - public Task LoadIconPreviewAsync(CancellationToken cancellationToken) + public async Task LoadIconPreviewAsync(CancellationToken cancellationToken) { - return TaskExtension.RunSafe(async () => + bool isIconValid = false; + + var isTaskSuccessful = await TaskExtension.RunSafe(async () => { cancellationToken.ThrowIfCancellationRequested(); await Dispatcher.RunOnUiThread(async () => { cancellationToken.ThrowIfCancellationRequested(); - var iconBitmap = await IconHelper.GetIconAsync(Path.GetFullPath(Item.Path), cancellationToken); - IconPreview = iconBitmap; + + var iconBitmap = await IconHelper.GetIconAsync(Item.Path, cancellationToken); + + cancellationToken.ThrowIfCancellationRequested(); + + isIconValid = iconBitmap != null; + + Preview.IconPreview = iconBitmap ?? new SvgImageSource(new Uri("ms-appx:///Assets/DefaultFileIcon.svg")); }); }); + + return isIconValid && isTaskSuccessful; } - public Task LoadDisplayInfoAsync(CancellationToken cancellationToken) + public async Task LoadDisplayInfoAsync(CancellationToken cancellationToken) { - return TaskExtension.RunSafe(async () => + bool isDisplayValid = false; + + var isTaskSuccessful = await TaskExtension.RunSafe(async () => { // File Properties cancellationToken.ThrowIfCancellationRequested(); @@ -118,31 +123,32 @@ public Task LoadDisplayInfoAsync(CancellationToken cancellationToken) var bytes = await Task.Run(Item.GetSizeInBytes); cancellationToken.ThrowIfCancellationRequested(); + var type = await Task.Run(Item.GetContentTypeAsync); + cancellationToken.ThrowIfCancellationRequested(); + + var readableFileSize = ReadableStringHelper.BytesToReadableString(bytes); + + isDisplayValid = type != null; + await Dispatcher.RunOnUiThread(() => { - FileSize = ReadableStringHelper.BytesToReadableString(bytes); - FileType = type; + Preview.FileSize = readableFileSize; + Preview.FileType = type; return Task.CompletedTask; }); }); - } - partial void OnIconPreviewChanged(ImageSource? value) - { - if (IconPreview != null) - { - State = PreviewState.Loaded; - } + return isDisplayValid && isTaskSuccessful; } private bool HasFailedLoadingPreview() { - var hasFailedLoadingIconPreview = !(IconPreviewTask?.Result ?? true); - var hasFailedLoadingDisplayInfo = !(DisplayInfoTask?.Result ?? true); + var isLoadingIconPreviewSuccessful = IconPreviewTask?.Result ?? false; + var isLoadingDisplayInfoSuccessful = DisplayInfoTask?.Result ?? false; - return hasFailedLoadingIconPreview && hasFailedLoadingDisplayInfo; + return !isLoadingIconPreviewSuccessful || !isLoadingDisplayInfoSuccessful; } } } diff --git a/src/modules/peek/Peek.UI/Extensions/IShellItemExtensions.cs b/src/modules/peek/Peek.UI/Extensions/IShellItemExtensions.cs index 32fdbd9aee7..753b7a61ce5 100644 --- a/src/modules/peek/Peek.UI/Extensions/IShellItemExtensions.cs +++ b/src/modules/peek/Peek.UI/Extensions/IShellItemExtensions.cs @@ -4,6 +4,7 @@ using System; using System.IO; +using System.Runtime.CompilerServices; using Peek.Common.Helpers; using Peek.Common.Models; @@ -12,6 +13,14 @@ namespace Peek.UI.Extensions public static class IShellItemExtensions { public static IFileSystemItem ToIFileSystemItem(this IShellItem shellItem) + { + string path = shellItem.GetPath(); + string name = shellItem.GetName(); + + return File.Exists(path) ? new FileItem(path, name) : new FolderItem(path, name); + } + + private static string GetPath(this IShellItem shellItem) { string path = string.Empty; try @@ -21,10 +30,27 @@ public static IFileSystemItem ToIFileSystemItem(this IShellItem shellItem) catch (Exception ex) { // TODO: Handle cases that do not have a file system path like Recycle Bin. + path = string.Empty; + Logger.LogError("Getting path failed. " + ex.Message); + } + + return path; + } + + private static string GetName(this IShellItem shellItem) + { + string name = string.Empty; + try + { + name = shellItem.GetDisplayName(Windows.Win32.UI.Shell.SIGDN.SIGDN_NORMALDISPLAY); + } + catch (Exception ex) + { + name = string.Empty; Logger.LogError("Getting path failed. " + ex.Message); } - return File.Exists(path) ? new FileItem(path) : new FolderItem(path); + return name; } } } diff --git a/src/modules/peek/Peek.UI/Strings/en-us/Resources.resw b/src/modules/peek/Peek.UI/Strings/en-us/Resources.resw index 49e67578f90..b940d7968f9 100644 --- a/src/modules/peek/Peek.UI/Strings/en-us/Resources.resw +++ b/src/modules/peek/Peek.UI/Strings/en-us/Resources.resw @@ -213,4 +213,12 @@ Unpin the window Tooltip for button to unpin the Peek window. + + Report a bug + Failed fallback preview Report bug hyperlink button content. + + + An error occurred while previewing this file. + Failed fallback preview text. + \ No newline at end of file diff --git a/src/settings-ui/Settings.UI/Views/ShellPage.xaml b/src/settings-ui/Settings.UI/Views/ShellPage.xaml index c82a5556991..30453209345 100644 --- a/src/settings-ui/Settings.UI/Views/ShellPage.xaml +++ b/src/settings-ui/Settings.UI/Views/ShellPage.xaml @@ -22,9 +22,7 @@ - + + SelectedItem="{x:Bind ViewModel.Selected, Mode=OneWay}" + SelectionChanged="NavigationView_SelectionChanged"> - - + + + Icon="{ui:BitmapIcon Source=/Assets/FluentIcons/FluentIconsPeek.png}" /> + Icon="{ui:BitmapIcon Source=/Assets/FluentIcons/FluentIconsRegistryPreview.png}" />