diff --git a/src/modules/peek/Peek.FilePreviewer/FilePreview.xaml.cs b/src/modules/peek/Peek.FilePreviewer/FilePreview.xaml.cs index 26386c1fcaa..2736607ccd5 100644 --- a/src/modules/peek/Peek.FilePreviewer/FilePreview.xaml.cs +++ b/src/modules/peek/Peek.FilePreviewer/FilePreview.xaml.cs @@ -102,7 +102,8 @@ private async Task UpdatePreviewAsync() if (Previewer != null) { var size = await Previewer.GetPreviewSizeAsync(); - PreviewSizeChanged?.Invoke(this, new PreviewSizeChangedArgs(size)); + SizeFormat windowSizeFormat = UnsupportedFilePreviewer != null ? SizeFormat.Percentage : SizeFormat.Pixels; + PreviewSizeChanged?.Invoke(this, new PreviewSizeChangedArgs(size, windowSizeFormat)); await Previewer.LoadPreviewAsync(); } } diff --git a/src/modules/peek/Peek.FilePreviewer/Models/PreviewSizeChangedArgs.cs b/src/modules/peek/Peek.FilePreviewer/Models/PreviewSizeChangedArgs.cs index a34785e7cbd..34f664835d3 100644 --- a/src/modules/peek/Peek.FilePreviewer/Models/PreviewSizeChangedArgs.cs +++ b/src/modules/peek/Peek.FilePreviewer/Models/PreviewSizeChangedArgs.cs @@ -6,13 +6,22 @@ namespace Peek.FilePreviewer.Models { using Windows.Foundation; + public enum SizeFormat + { + Pixels, + Percentage, + } + public class PreviewSizeChangedArgs { - public PreviewSizeChangedArgs(Size windowSizeRequested) + public PreviewSizeChangedArgs(Size windowSizeRequested, SizeFormat sizeFormat = SizeFormat.Pixels) { WindowSizeRequested = windowSizeRequested; + WindowSizeFormat = sizeFormat; } public Size WindowSizeRequested { get; init; } + + public SizeFormat WindowSizeFormat { get; init; } } } diff --git a/src/modules/peek/Peek.FilePreviewer/Peek.FilePreviewer.csproj b/src/modules/peek/Peek.FilePreviewer/Peek.FilePreviewer.csproj index b9c20d8ca41..53c11befe3a 100644 --- a/src/modules/peek/Peek.FilePreviewer/Peek.FilePreviewer.csproj +++ b/src/modules/peek/Peek.FilePreviewer/Peek.FilePreviewer.csproj @@ -22,6 +22,7 @@ + diff --git a/src/modules/peek/Peek.FilePreviewer/Previewers/UnsupportedFilePreviewer/UnsupportedFilePreviewer.cs b/src/modules/peek/Peek.FilePreviewer/Previewers/UnsupportedFilePreviewer/UnsupportedFilePreviewer.cs index 70ca4af1613..ac5cbf6a0ed 100644 --- a/src/modules/peek/Peek.FilePreviewer/Previewers/UnsupportedFilePreviewer/UnsupportedFilePreviewer.cs +++ b/src/modules/peek/Peek.FilePreviewer/Previewers/UnsupportedFilePreviewer/UnsupportedFilePreviewer.cs @@ -10,6 +10,7 @@ namespace Peek.FilePreviewer.Previewers using System.Threading; using System.Threading.Tasks; using CommunityToolkit.Mvvm.ComponentModel; + using Microsoft.PowerToys.Settings.UI.Library; using Microsoft.UI.Dispatching; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Media.Imaging; @@ -18,6 +19,7 @@ namespace Peek.FilePreviewer.Previewers using Peek.Common.Helpers; using Peek.FilePreviewer.Previewers.Helpers; using Windows.Foundation; + using File = Peek.Common.Models.File; public partial class UnsupportedFilePreviewer : ObservableObject, IUnsupportedFilePreviewer, IDisposable @@ -46,10 +48,24 @@ public UnsupportedFilePreviewer(File file) FileName = file.FileName; DateModified = file.DateModified.ToString(); Dispatcher = DispatcherQueue.GetForCurrentThread(); - PropertyChanged += OnPropertyChanged; + + var settingsUtils = new SettingsUtils(); + var settings = settingsUtils.GetSettingsOrDefault(PeekSettings.ModuleName); + + if (settings != null) + { + UnsupportedFileWidthPercent = settings.Properties.UnsupportedFileWidthPercent / 100.0; + UnsupportedFileHeightPercent = settings.Properties.UnsupportedFileHeightPercent / 100.0; + } } + private double UnsupportedFileWidthPercent { get; set; } + + private double UnsupportedFileHeightPercent { get; set; } + + public bool IsPreviewLoaded => iconPreview != null; + private File File { get; } private DispatcherQueue Dispatcher { get; } @@ -72,8 +88,7 @@ public Task GetPreviewSizeAsync() { return Task.Run(() => { - // TODO: This is the min size. Calculate a 20-25% of the screen. - return new Size(680, 500); + return new Size(UnsupportedFileWidthPercent, UnsupportedFileHeightPercent); }); } diff --git a/src/modules/peek/Peek.UI/MainWindow.xaml.cs b/src/modules/peek/Peek.UI/MainWindow.xaml.cs index 22061ee67a4..6453410c99a 100644 --- a/src/modules/peek/Peek.UI/MainWindow.xaml.cs +++ b/src/modules/peek/Peek.UI/MainWindow.xaml.cs @@ -4,6 +4,7 @@ namespace Peek.UI { + using System.Diagnostics; using interop; using Microsoft.UI.Windowing; using Microsoft.UI.Xaml.Input; @@ -11,8 +12,6 @@ namespace Peek.UI using Peek.UI.Extensions; using Peek.UI.Native; using Windows.Foundation; - using Windows.System; - using Windows.UI.Core; using WinUIEx; /// @@ -86,15 +85,38 @@ private void Uninitialize() /// PreviewSizeChangedArgs private void FilePreviewer_PreviewSizeChanged(object sender, PreviewSizeChangedArgs e) { + // TODO: Use design-defined rules for adjusted window size var requestedSize = e.WindowSizeRequested; var monitorSize = this.GetMonitorSize(); - // TODO: Use design-defined rules for adjusted window size var titleBarHeight = TitleBarControl.ActualHeight; - var maxContentSize = new Size(monitorSize.Width * MaxWindowToMonitorRatio, (monitorSize.Height - titleBarHeight) * MaxWindowToMonitorRatio); + + var maxContentSize = new Size(0, 0); var minContentSize = new Size(MinWindowWidth, MinWindowHeight - titleBarHeight); - var adjustedContentSize = requestedSize.Fit(maxContentSize, minContentSize); + var adjustedContentSize = new Size(0, 0); + + if (e.WindowSizeFormat == SizeFormat.Percentage) + { + maxContentSize = new Size(monitorSize.Width * requestedSize.Width, (monitorSize.Height - titleBarHeight) * requestedSize.Height); + minContentSize = new Size(MinWindowWidth, MinWindowHeight - titleBarHeight); + + adjustedContentSize = maxContentSize.Fit(maxContentSize, minContentSize); + } + else if (e.WindowSizeFormat == SizeFormat.Pixels) + { + maxContentSize = new Size(monitorSize.Width * MaxWindowToMonitorRatio, (monitorSize.Height - titleBarHeight) * MaxWindowToMonitorRatio); + minContentSize = new Size(MinWindowWidth, MinWindowHeight - titleBarHeight); + + adjustedContentSize = requestedSize.Fit(maxContentSize, minContentSize); + } + else + { + Debug.Assert(false, "Unknown SizeFormat set for resizing window."); + adjustedContentSize = minContentSize; + + return; + } // TODO: Only re-center if window has not been resized by user (or use design-defined logic). // TODO: Investigate why portrait images do not perfectly fit edge-to-edge diff --git a/src/settings-ui/Settings.UI.Library/PeekProperties.cs b/src/settings-ui/Settings.UI.Library/PeekProperties.cs index f9355817abe..5515a7ed7b5 100644 --- a/src/settings-ui/Settings.UI.Library/PeekProperties.cs +++ b/src/settings-ui/Settings.UI.Library/PeekProperties.cs @@ -10,13 +10,22 @@ namespace Microsoft.PowerToys.Settings.UI.Library { public class PeekProperties { + public const double DefaultUnsupportedFileWidthPercent = 40.0; + public const double DefaultUnsupportedFileHeightPercent = 40.0; + public PeekProperties() { ActivationShortcut = new HotkeySettings(false, true, false, false, 0x20); + UnsupportedFileWidthPercent = DefaultUnsupportedFileWidthPercent; + UnsupportedFileHeightPercent = DefaultUnsupportedFileHeightPercent; } public HotkeySettings ActivationShortcut { get; set; } + public double UnsupportedFileWidthPercent { get; set; } + + public double UnsupportedFileHeightPercent { get; set; } + public override string ToString() => JsonSerializer.Serialize(this); } diff --git a/src/settings-ui/Settings.UI.Library/ViewModels/PeekViewModel.cs b/src/settings-ui/Settings.UI.Library/ViewModels/PeekViewModel.cs index 7285e15d173..6849a7a1cb4 100644 --- a/src/settings-ui/Settings.UI.Library/ViewModels/PeekViewModel.cs +++ b/src/settings-ui/Settings.UI.Library/ViewModels/PeekViewModel.cs @@ -79,6 +79,35 @@ public HotkeySettings ActivationShortcut } } + public double UnsupportedFileWidthPercent + { + get => _peekSettings.Properties.UnsupportedFileWidthPercent; + set + { + if (_peekSettings.Properties.UnsupportedFileWidthPercent != value) + { + _peekSettings.Properties.UnsupportedFileWidthPercent = value; + OnPropertyChanged(nameof(UnsupportedFileWidthPercent)); + NotifySettingsChanged(); + } + } + } + + public double UnsupportedFileHeightPercent + { + get => _peekSettings.Properties.UnsupportedFileHeightPercent; + + set + { + if (_peekSettings.Properties.UnsupportedFileHeightPercent != value) + { + _peekSettings.Properties.UnsupportedFileHeightPercent = value; + OnPropertyChanged(nameof(UnsupportedFileHeightPercent)); + NotifySettingsChanged(); + } + } + } + private void NotifySettingsChanged() { // Using InvariantCulture as this is an IPC message diff --git a/src/settings-ui/Settings.UI/Strings/en-us/Resources.resw b/src/settings-ui/Settings.UI/Strings/en-us/Resources.resw index 03a8ab9ca6a..6eb98ba70bd 100644 --- a/src/settings-ui/Settings.UI/Strings/en-us/Resources.resw +++ b/src/settings-ui/Settings.UI/Strings/en-us/Resources.resw @@ -2426,6 +2426,14 @@ From there, simply click on one of the supported files in the File Explorer and Enable Peek Peek is a product name, do not loc + + Unsupported file window width (%) + Setting for width percent for unsupported file window. + + + Unsupported file window height (%) + Setting for height percent for unsupported file window. + Disable round corners when window is snapped diff --git a/src/settings-ui/Settings.UI/Views/PeekPage.xaml b/src/settings-ui/Settings.UI/Views/PeekPage.xaml index 2c8faf6c535..f1e968f2a35 100644 --- a/src/settings-ui/Settings.UI/Views/PeekPage.xaml +++ b/src/settings-ui/Settings.UI/Views/PeekPage.xaml @@ -22,6 +22,24 @@ + + + + + + + + + +