diff --git a/NAPS2.Lib.Gtk/EtoForms/Gtk/GtkListView.cs b/NAPS2.Lib.Gtk/EtoForms/Gtk/GtkListView.cs index 67e28f95d9..5ac948d5d2 100644 --- a/NAPS2.Lib.Gtk/EtoForms/Gtk/GtkListView.cs +++ b/NAPS2.Lib.Gtk/EtoForms/Gtk/GtkListView.cs @@ -138,7 +138,7 @@ private Widget GetItemWidget(T item) } else { - using var image = _behavior.GetImage(item, ImageSize); + using var image = _behavior.GetImage(this, item); var imageWidget = image.ToGdk().ToScaledImage(_flowBox.ScaleFactor); // TODO: Is there a better way to prevent the image from expanding in both dimensions? var hframe = new Box(Orientation.Horizontal, 0); diff --git a/NAPS2.Lib.Mac/EtoForms/Mac/ListViewDataSource.cs b/NAPS2.Lib.Mac/EtoForms/Mac/ListViewDataSource.cs index 441a463414..ea0b47e6a5 100644 --- a/NAPS2.Lib.Mac/EtoForms/Mac/ListViewDataSource.cs +++ b/NAPS2.Lib.Mac/EtoForms/Mac/ListViewDataSource.cs @@ -29,7 +29,7 @@ public override NSCollectionViewItem GetItem(NSCollectionView collectionView, NS { var i = (int) indexPath.Item; var item = Items[i]; - var image = _behavior.Checkboxes ? null : _behavior.GetImage(item, _listView.ImageSize); + var image = _behavior.Checkboxes ? null : _behavior.GetImage(_listView, item); var label = _behavior.ShowLabels ? _behavior.GetLabel(item) : null; return new ListViewItem( image, label, _behavior.Checkboxes, _behavior.ColorScheme, diff --git a/NAPS2.Lib.Mac/EtoForms/Mac/ListViewItem.cs b/NAPS2.Lib.Mac/EtoForms/Mac/ListViewItem.cs index 6b4f9c3be0..c1443f4b3e 100644 --- a/NAPS2.Lib.Mac/EtoForms/Mac/ListViewItem.cs +++ b/NAPS2.Lib.Mac/EtoForms/Mac/ListViewItem.cs @@ -47,9 +47,12 @@ public override void LoadView() } else if (_label != null) { + var image = _itemImage.ToNS(); + // Resize high-dpi images so they render correctly on retina displays + image.Size = new CGSize(image.Size.Width / 2, image.Size.Height / 2); _imageView = new NSImageView { - Image = _itemImage.ToNS() + Image = image }; var stack = NSStackView.FromViews(new NSView[] { diff --git a/NAPS2.Lib.Mac/EtoForms/Mac/MacIconProvider.cs b/NAPS2.Lib.Mac/EtoForms/Mac/MacIconProvider.cs index 52a0435ce3..bcfbc209c9 100644 --- a/NAPS2.Lib.Mac/EtoForms/Mac/MacIconProvider.cs +++ b/NAPS2.Lib.Mac/EtoForms/Mac/MacIconProvider.cs @@ -81,7 +81,7 @@ public MacIconProvider(DefaultIconProvider defaultIconProvider) } } } - return _defaultIconProvider.GetIcon(name); + return _defaultIconProvider.GetIcon(name, scale); } public Icon? GetFormIcon(string name, float scale = 1f) => null; diff --git a/NAPS2.Lib.Mac/EtoForms/Mac/MacListView.cs b/NAPS2.Lib.Mac/EtoForms/Mac/MacListView.cs index 9bdded177c..1985affa44 100644 --- a/NAPS2.Lib.Mac/EtoForms/Mac/MacListView.cs +++ b/NAPS2.Lib.Mac/EtoForms/Mac/MacListView.cs @@ -285,7 +285,7 @@ public override CGSize SizeForItem(NSCollectionView collectionView, NSCollection var item = _dataSource.Items[(int) indexPath.Item]; if (_behavior.ShowLabels) { - using var image = _behavior.Checkboxes ? null : _behavior.GetImage(item, ImageSize); + using var image = _behavior.Checkboxes ? null : _behavior.GetImage(this, item); using var listItem = new ListViewItem( image, _behavior.GetLabel(item), _behavior.Checkboxes, _behavior.ColorScheme, null, false, () => { }); listItem.LoadView(); @@ -293,7 +293,7 @@ public override CGSize SizeForItem(NSCollectionView collectionView, NSCollection } else { - var size = _behavior.GetImage(item, ImageSize).Size; + var size = _behavior.GetImage(this, item).Size; var max = (double) Math.Max(size.Width, size.Height); return new CGSize(size.Width * ImageSize.Width / max, size.Height * ImageSize.Width / max); } diff --git a/NAPS2.Lib.WinForms/EtoForms/WinForms/WinFormsImageList.cs b/NAPS2.Lib.WinForms/EtoForms/WinForms/WinFormsImageList.cs index c1a79d6d18..df2c638290 100644 --- a/NAPS2.Lib.WinForms/EtoForms/WinForms/WinFormsImageList.cs +++ b/NAPS2.Lib.WinForms/EtoForms/WinForms/WinFormsImageList.cs @@ -18,7 +18,7 @@ private WinFormsImageList(WinFormsListView listView, ListViewBehavior beha private Image ItemToImage(T item) { - return _behavior.GetImage(item, _listView.ImageSize).ToSD(); + return _behavior.GetImage(_listView, item).ToSD(); } public abstract void Clear(); @@ -95,7 +95,7 @@ public override void Clear() public override void Append(T item, ListViewItem listViewItem) { - _images.Add(_behavior.GetImage(item, _listView.ImageSize).ToSD()); + _images.Add(_behavior.GetImage(_listView, item).ToSD()); listViewItem.ImageIndex = _images.Count - 1; } diff --git a/NAPS2.Lib/EtoForms/Layout/C.cs b/NAPS2.Lib/EtoForms/Layout/C.cs index 153a308a99..a0e9549f0e 100644 --- a/NAPS2.Lib/EtoForms/Layout/C.cs +++ b/NAPS2.Lib/EtoForms/Layout/C.cs @@ -107,8 +107,9 @@ public static Button Button(ActionCommand command, string? iconName, ButtonImage } else if (iconName != null) { + bool oversized = imagePosition == ButtonImagePosition.Above && flags.HasFlag(ButtonFlags.LargeIcon); EtoPlatform.Current.AttachDpiDependency(button, - scale => button.Image = EtoPlatform.Current.IconProvider.GetIcon(iconName, scale)); + scale => button.Image = EtoPlatform.Current.IconProvider.GetIcon(iconName, scale, oversized)); } button.ImagePosition = imagePosition; if (flags.HasFlag(ButtonFlags.LargeText)) diff --git a/NAPS2.Lib/EtoForms/Ui/ProfilesForm.cs b/NAPS2.Lib/EtoForms/Ui/ProfilesForm.cs index 2cdbdece12..8cc002f4f9 100644 --- a/NAPS2.Lib/EtoForms/Ui/ProfilesForm.cs +++ b/NAPS2.Lib/EtoForms/Ui/ProfilesForm.cs @@ -98,11 +98,8 @@ public ProfilesForm(Naps2Config config, IScanPerformer scanPerformer, ProfileNam profilesKsm.Assign("Mod+V", _pasteCommand); EtoPlatform.Current.HandleKeyDown(_listView.Control, profilesKsm.Perform); - EtoPlatform.Current.AttachDpiDependency(this, scale => - { - _listView.ImageSize = Size.Round(new SizeF(48, 48) * scale); - _listView.RegenerateImages(); - }); + EtoPlatform.Current.AttachDpiDependency(this, _ => _listView.RegenerateImages()); + _listView.ImageSize = new Size(48, 48); _listView.ItemClicked += ItemClicked; _listView.SelectionChanged += SelectionChanged; _listView.Drop += Drop; diff --git a/NAPS2.Lib/EtoForms/Ui/ScannerSharingForm.cs b/NAPS2.Lib/EtoForms/Ui/ScannerSharingForm.cs index cb80dc2f63..5a390b0978 100644 --- a/NAPS2.Lib/EtoForms/Ui/ScannerSharingForm.cs +++ b/NAPS2.Lib/EtoForms/Ui/ScannerSharingForm.cs @@ -58,11 +58,8 @@ public ScannerSharingForm(Naps2Config config, SharedDevicesListViewBehavior list // TODO: Enable // _shareAsService.Checked = _osServiceManager.IsRegistered; // _shareAsService.CheckedChanged += ShareAsServiceCheckedChanged; - EtoPlatform.Current.AttachDpiDependency(this, scale => - { - _listView.ImageSize = Size.Round(new SizeF(48, 48) * scale); - _listView.RegenerateImages(); - }); + EtoPlatform.Current.AttachDpiDependency(this, _ => _listView.RegenerateImages()); + _listView.ImageSize = new Size(48, 48); _listView.SelectionChanged += SelectionChanged; _addCommand.Enabled = true; diff --git a/NAPS2.Lib/EtoForms/Widgets/DeviceListViewBehavior.cs b/NAPS2.Lib/EtoForms/Widgets/DeviceListViewBehavior.cs index 48ca2859e2..e13a054c86 100644 --- a/NAPS2.Lib/EtoForms/Widgets/DeviceListViewBehavior.cs +++ b/NAPS2.Lib/EtoForms/Widgets/DeviceListViewBehavior.cs @@ -18,8 +18,8 @@ public DeviceListViewBehavior(ColorScheme colorScheme) : base(colorScheme) public override string GetLabel(ScanDevice item) => item.Name; - public override Image GetImage(ScanDevice item, Size imageSize) + public override Image GetImage(IListView listView, ScanDevice item) { - return (_imageMap.Get(item)?.Clone() ?? Icons.device.ToEtoImage()).PadTo(imageSize); + return (_imageMap.Get(item)?.Clone() ?? Icons.device.ToEtoImage()).PadTo(listView.ImageSize); } } \ No newline at end of file diff --git a/NAPS2.Lib/EtoForms/Widgets/ImageListViewBehavior.cs b/NAPS2.Lib/EtoForms/Widgets/ImageListViewBehavior.cs index 04e3b9400d..5289246774 100644 --- a/NAPS2.Lib/EtoForms/Widgets/ImageListViewBehavior.cs +++ b/NAPS2.Lib/EtoForms/Widgets/ImageListViewBehavior.cs @@ -25,9 +25,9 @@ public ImageListViewBehavior(UiThumbnailProvider thumbnailProvider, public override bool ShowPageNumbers => _config.Get(c => c.ShowPageNumbers); - public override Image GetImage(UiImage item, Size imageSize) + public override Image GetImage(IListView listView, UiImage item) { - using var thumbnail = _thumbnailProvider.GetThumbnail(item, imageSize.Width); + using var thumbnail = _thumbnailProvider.GetThumbnail(item, listView.ImageSize.Width); return thumbnail.ToEtoImage(); } diff --git a/NAPS2.Lib/EtoForms/Widgets/ListViewBehavior.cs b/NAPS2.Lib/EtoForms/Widgets/ListViewBehavior.cs index 40b078fa01..28ebfa8d0c 100644 --- a/NAPS2.Lib/EtoForms/Widgets/ListViewBehavior.cs +++ b/NAPS2.Lib/EtoForms/Widgets/ListViewBehavior.cs @@ -28,7 +28,7 @@ protected ListViewBehavior(ColorScheme colorScheme) public virtual string GetLabel(T item) => throw new NotSupportedException(); - public virtual Image GetImage(T item, Size imageSize) => throw new NotSupportedException(); + public virtual Image GetImage(IListView listView, T item) => throw new NotSupportedException(); public virtual bool AllowDragDrop => false; diff --git a/NAPS2.Lib/EtoForms/Widgets/ProfileListViewBehavior.cs b/NAPS2.Lib/EtoForms/Widgets/ProfileListViewBehavior.cs index 82c4bb8fcf..86c6549b4f 100644 --- a/NAPS2.Lib/EtoForms/Widgets/ProfileListViewBehavior.cs +++ b/NAPS2.Lib/EtoForms/Widgets/ProfileListViewBehavior.cs @@ -20,7 +20,7 @@ public ProfileListViewBehavior(ColorScheme colorScheme) : base(colorScheme) public override string GetLabel(ScanProfile item) => item.DisplayName ?? ""; - public override Image GetImage(ScanProfile item, Size imageSize) + public override Image GetImage(IListView listView, ScanProfile item) { var iconName = (item.IsDefault, item.IsLocked) switch { @@ -29,7 +29,7 @@ public override Image GetImage(ScanProfile item, Size imageSize) (false, true) => "scanner_lock_48", (false, false) => "scanner_48" }; - var scale = imageSize.Height / 48f; + var scale = EtoPlatform.Current.GetScaleFactor(listView.Control.ParentWindow); return EtoPlatform.Current.IconProvider.GetIcon(iconName, scale)!; } diff --git a/NAPS2.Lib/EtoForms/Widgets/SharedDevicesListViewBehavior.cs b/NAPS2.Lib/EtoForms/Widgets/SharedDevicesListViewBehavior.cs index 8da24a0a09..e8ea85b520 100644 --- a/NAPS2.Lib/EtoForms/Widgets/SharedDevicesListViewBehavior.cs +++ b/NAPS2.Lib/EtoForms/Widgets/SharedDevicesListViewBehavior.cs @@ -14,9 +14,9 @@ public SharedDevicesListViewBehavior(ColorScheme colorScheme) : base(colorScheme public override string GetLabel(SharedDevice item) => item.Name; - public override Image GetImage(SharedDevice item, Size imageSize) + public override Image GetImage(IListView listView, SharedDevice item) { - var scale = imageSize.Height / 48f; + var scale = EtoPlatform.Current.GetScaleFactor(listView.Control.ParentWindow); return EtoPlatform.Current.IconProvider.GetIcon("scanner_wireless_48", scale)!; } } \ No newline at end of file