Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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<bool> 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;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ internal sealed partial class PreviewPopupService : ObservableObject, IPreviewPo
{
public async Task<IPreviewPopupProvider?> GetProviderAsync()
{
if (await PowerToysPeekProvider.Instance.DetectAvailability())
return await Task.FromResult<IPreviewPopupProvider>(PowerToysPeekProvider.Instance);
if (await QuickLookProvider.Instance.DetectAvailability())
return await Task.FromResult<IPreviewPopupProvider>(QuickLookProvider.Instance);
if (await SeerProProvider.Instance.DetectAvailability())
Expand Down
Loading