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));
}