Mac: Use high-dpi profile icons

This commit is contained in:
Ben Olden-Cooligan 2024-09-05 23:18:18 -07:00
parent 35ffe28c7e
commit 1ab56c99f1
14 changed files with 26 additions and 28 deletions

View File

@ -138,7 +138,7 @@ public class GtkListView<T> : IListView<T> where T : notnull
}
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);

View File

@ -29,7 +29,7 @@ public class ListViewDataSource<T> : NSCollectionViewDataSource where T : notnul
{
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,

View File

@ -47,9 +47,12 @@ public class ListViewItem : NSCollectionViewItem
}
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[]
{

View File

@ -81,7 +81,7 @@ public class MacIconProvider : IIconProvider
}
}
}
return _defaultIconProvider.GetIcon(name);
return _defaultIconProvider.GetIcon(name, scale);
}
public Icon? GetFormIcon(string name, float scale = 1f) => null;

View File

@ -285,7 +285,7 @@ public class MacListView<T> : NSCollectionViewDelegateFlowLayout, IListView<T> w
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 class MacListView<T> : NSCollectionViewDelegateFlowLayout, IListView<T> w
}
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);
}

View File

@ -18,7 +18,7 @@ public abstract class WinFormsImageList<T> where T : notnull
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 abstract class WinFormsImageList<T> where T : notnull
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;
}

View File

@ -107,8 +107,9 @@ public static class C
}
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))

View File

@ -98,11 +98,8 @@ public class ProfilesForm : EtoDialogBase
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;

View File

@ -58,11 +58,8 @@ public class ScannerSharingForm : EtoDialogBase
// 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;

View File

@ -18,8 +18,8 @@ public class DeviceListViewBehavior : ListViewBehavior<ScanDevice>
public override string GetLabel(ScanDevice item) => item.Name;
public override Image GetImage(ScanDevice item, Size imageSize)
public override Image GetImage(IListView<ScanDevice> listView, ScanDevice item)
{
return (_imageMap.Get(item)?.Clone() ?? Icons.device.ToEtoImage()).PadTo(imageSize);
return (_imageMap.Get(item)?.Clone() ?? Icons.device.ToEtoImage()).PadTo(listView.ImageSize);
}
}

View File

@ -25,9 +25,9 @@ public class ImageListViewBehavior : ListViewBehavior<UiImage>
public override bool ShowPageNumbers => _config.Get(c => c.ShowPageNumbers);
public override Image GetImage(UiImage item, Size imageSize)
public override Image GetImage(IListView<UiImage> listView, UiImage item)
{
using var thumbnail = _thumbnailProvider.GetThumbnail(item, imageSize.Width);
using var thumbnail = _thumbnailProvider.GetThumbnail(item, listView.ImageSize.Width);
return thumbnail.ToEtoImage();
}

View File

@ -28,7 +28,7 @@ public abstract class ListViewBehavior<T> where T : notnull
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<T> listView, T item) => throw new NotSupportedException();
public virtual bool AllowDragDrop => false;

View File

@ -20,7 +20,7 @@ public class ProfileListViewBehavior : ListViewBehavior<ScanProfile>
public override string GetLabel(ScanProfile item) => item.DisplayName ?? "";
public override Image GetImage(ScanProfile item, Size imageSize)
public override Image GetImage(IListView<ScanProfile> listView, ScanProfile item)
{
var iconName = (item.IsDefault, item.IsLocked) switch
{
@ -29,7 +29,7 @@ public class ProfileListViewBehavior : ListViewBehavior<ScanProfile>
(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)!;
}

View File

@ -14,9 +14,9 @@ public class SharedDevicesListViewBehavior : ListViewBehavior<SharedDevice>
public override string GetLabel(SharedDevice item) => item.Name;
public override Image GetImage(SharedDevice item, Size imageSize)
public override Image GetImage(IListView<SharedDevice> 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)!;
}
}