From fed31bd677607e9b07dabef561bc4110f594004d Mon Sep 17 00:00:00 2001 From: "seer-by-sentry[bot]" <157164994+seer-by-sentry[bot]@users.noreply.github.com> Date: Mon, 18 Aug 2025 04:42:02 +0000 Subject: [PATCH] UI: Ensure minimum size for UI elements based on DPI scaling --- src/Files.App/Data/Items/WidgetFolderCardItem.cs | 5 ++++- src/Files.App/Data/Models/AppModel.cs | 12 ++++++++++-- .../Utils/Storage/Helpers/FilePropertiesHelpers.cs | 4 ++-- .../Utils/Storage/Helpers/FileThumbnailHelper.cs | 2 ++ 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/Files.App/Data/Items/WidgetFolderCardItem.cs b/src/Files.App/Data/Items/WidgetFolderCardItem.cs index c2398647ea76..c3ea40506d40 100644 --- a/src/Files.App/Data/Items/WidgetFolderCardItem.cs +++ b/src/Files.App/Data/Items/WidgetFolderCardItem.cs @@ -43,7 +43,10 @@ public async Task LoadCardThumbnailAsync() if (string.IsNullOrEmpty(Path)) return; - Item.TryGetThumbnail((int)(Constants.ShellIconSizes.Large * App.AppModel.AppWindowDPI), SIIGBF.SIIGBF_ICONONLY, out var rawThumbnailData); + var thumbnailSize = (int)(Constants.ShellIconSizes.Large * App.AppModel.AppWindowDPI); + // Ensure thumbnail size is at least 1 to prevent layout errors + thumbnailSize = Math.Max(1, thumbnailSize); + Item.TryGetThumbnail(thumbnailSize, SIIGBF.SIIGBF_ICONONLY, out var rawThumbnailData); if (rawThumbnailData is null) return; diff --git a/src/Files.App/Data/Models/AppModel.cs b/src/Files.App/Data/Models/AppModel.cs index e0441f55fddd..9495842f0ae8 100644 --- a/src/Files.App/Data/Models/AppModel.cs +++ b/src/Files.App/Data/Models/AppModel.cs @@ -129,10 +129,18 @@ public string PCloudDrivePath /// /// Gets or sets a value indicating the AppWindow DPI. /// - private float _AppWindowDPI = PInvoke.GetDpiForWindow((HWND)MainWindow.Instance.WindowHandle) / 96f; + private float? _AppWindowDPI = null; public float AppWindowDPI { - get => _AppWindowDPI; + get + { + if (_AppWindowDPI is null || _AppWindowDPI == 0f) + { + var dpi = PInvoke.GetDpiForWindow((HWND)MainWindow.Instance.WindowHandle); + _AppWindowDPI = dpi > 0 ? dpi / 96f : 1.0f; // Fallback to 1.0f if invalid DPI + } + return _AppWindowDPI.Value; + } set => SetProperty(ref _AppWindowDPI, value); } } diff --git a/src/Files.App/Utils/Storage/Helpers/FilePropertiesHelpers.cs b/src/Files.App/Utils/Storage/Helpers/FilePropertiesHelpers.cs index 70b2d66f3090..c08c961aff91 100644 --- a/src/Files.App/Utils/Storage/Helpers/FilePropertiesHelpers.cs +++ b/src/Files.App/Utils/Storage/Helpers/FilePropertiesHelpers.cs @@ -100,8 +100,8 @@ public static void OpenPropertiesWindow(object item, IShellPage associatedInstan propertiesWindow.Closed += PropertiesWindow_Closed; } - var width = Convert.ToInt32(800 * App.AppModel.AppWindowDPI); - var height = Convert.ToInt32(500 * App.AppModel.AppWindowDPI); + var width = Math.Max(1, Convert.ToInt32(800 * App.AppModel.AppWindowDPI)); + var height = Math.Max(1, Convert.ToInt32(500 * App.AppModel.AppWindowDPI)); propertiesWindow.AppWindow.Resize(new(width, height)); propertiesWindow.IsMinimizable = false; diff --git a/src/Files.App/Utils/Storage/Helpers/FileThumbnailHelper.cs b/src/Files.App/Utils/Storage/Helpers/FileThumbnailHelper.cs index 72a838089f47..fb4f292bdf14 100644 --- a/src/Files.App/Utils/Storage/Helpers/FileThumbnailHelper.cs +++ b/src/Files.App/Utils/Storage/Helpers/FileThumbnailHelper.cs @@ -13,6 +13,8 @@ public static class FileThumbnailHelper public static async Task GetIconAsync(string path, uint requestedSize, bool isFolder, IconOptions iconOptions) { var size = iconOptions.HasFlag(IconOptions.UseCurrentScale) ? requestedSize * App.AppModel.AppWindowDPI : requestedSize; + // Ensure size is at least 1 to prevent layout errors + size = Math.Max(1, size); return await Win32Helper.StartSTATask(() => Win32Helper.GetIcon(path, (int)size, isFolder, iconOptions)); }