diff --git a/src/Files.App/Services/PreviewPopupProviders/PowerToysPeekProvider.cs b/src/Files.App/Services/PreviewPopupProviders/PowerToysPeekProvider.cs new file mode 100644 index 000000000000..ca6bbf81d9da --- /dev/null +++ b/src/Files.App/Services/PreviewPopupProviders/PowerToysPeekProvider.cs @@ -0,0 +1,75 @@ +// Copyright (c) Files Community +// Licensed under the MIT License. + +using System.IO; + +namespace Files.App.Services.PreviewPopupProviders +{ + public sealed class PowerToysPeekProvider : IPreviewPopupProvider + { + public static PowerToysPeekProvider Instance { get; } = new(); + + private static string? _peekExecutablePath; + + public async Task TogglePreviewPopupAsync(string path) + { + await DoPreviewAsync(path); + } + + public async Task SwitchPreviewAsync(string path) + { + // Not used + } + + private async Task DoPreviewAsync(string path) + { + if (_peekExecutablePath != null) + { + try + { + var psi = new ProcessStartInfo + { + FileName = _peekExecutablePath, + Arguments = $"\"{path}\"", + UseShellExecute = true, + CreateNoWindow = true, + WindowStyle = ProcessWindowStyle.Hidden + }; + + Process.Start(psi); + } + catch + { + // Ignore + } + } + } + + public async Task DetectAvailability() + { + var exeName = "PowerToys.Peek.UI.exe"; + var localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); + var perUserPath = Path.Combine(localAppData, "PowerToys", "WinUI3Apps", exeName); + + // User path + if (File.Exists(perUserPath)) + { + _peekExecutablePath = perUserPath; + return true; + } + + // Machine-wide path + string programFiles = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles); + string machinePath = Path.Combine(programFiles, "PowerToys", "WinUI3Apps", exeName); + + if (File.Exists(machinePath)) + { + _peekExecutablePath = machinePath; + return true; + } + + // Not found + return false; + } + } +} diff --git a/src/Files.App/Services/PreviewPopupProviders/PreviewPopupService.cs b/src/Files.App/Services/PreviewPopupProviders/PreviewPopupService.cs index a09e4849c72c..7d105418192d 100644 --- a/src/Files.App/Services/PreviewPopupProviders/PreviewPopupService.cs +++ b/src/Files.App/Services/PreviewPopupProviders/PreviewPopupService.cs @@ -8,6 +8,8 @@ internal sealed partial class PreviewPopupService : ObservableObject, IPreviewPo { public async Task GetProviderAsync() { + if (await PowerToysPeekProvider.Instance.DetectAvailability()) + return await Task.FromResult(PowerToysPeekProvider.Instance); if (await QuickLookProvider.Instance.DetectAvailability()) return await Task.FromResult(QuickLookProvider.Instance); if (await SeerProProvider.Instance.DetectAvailability())