From 802656cc7ef6b7be94c9843f591317beb9c58334 Mon Sep 17 00:00:00 2001 From: Ben Olden-Cooligan Date: Sun, 1 Sep 2024 22:59:17 -0700 Subject: [PATCH] Use high-dpi versions of more icons --- .../EtoForms/WinForms/WinFormsEtoPlatform.cs | 12 +++++++--- NAPS2.Lib/EtoForms/EtoPlatform.cs | 2 +- NAPS2.Lib/EtoForms/Layout/C.cs | 12 ++++++---- NAPS2.Lib/EtoForms/Ui/BatchPromptForm.cs | 4 ++-- NAPS2.Lib/EtoForms/Ui/BlackWhiteForm.cs | 4 ++-- NAPS2.Lib/EtoForms/Ui/BrightContForm.cs | 8 ++++--- NAPS2.Lib/EtoForms/Ui/ChooseDeviceForm.cs | 4 ++-- NAPS2.Lib/EtoForms/Ui/CombineForm.cs | 24 +++++++++---------- NAPS2.Lib/EtoForms/Ui/HueSatForm.cs | 8 ++++--- NAPS2.Lib/EtoForms/Ui/PreviewForm.cs | 17 ++++++------- NAPS2.Lib/EtoForms/Ui/RotateForm.cs | 3 ++- NAPS2.Lib/EtoForms/Ui/SharpenForm.cs | 3 ++- NAPS2.Lib/EtoForms/Ui/SplitForm.cs | 9 +++---- .../EtoForms/Widgets/SliderWithTextBox.cs | 20 +++++++++++----- 14 files changed, 75 insertions(+), 55 deletions(-) diff --git a/NAPS2.Lib.WinForms/EtoForms/WinForms/WinFormsEtoPlatform.cs b/NAPS2.Lib.WinForms/EtoForms/WinForms/WinFormsEtoPlatform.cs index 1969a16d9e..8d99357af9 100644 --- a/NAPS2.Lib.WinForms/EtoForms/WinForms/WinFormsEtoPlatform.cs +++ b/NAPS2.Lib.WinForms/EtoForms/WinForms/WinFormsEtoPlatform.cs @@ -293,10 +293,16 @@ public override void SetImageSize(ButtonMenuItem menuItem, int size) handler.ImageSize = size; } - public override void SetImageSize(ButtonToolItem menuItem, int size) + public override void SetImageSize(ToolItem menuItem, int size) { - var handler = (ButtonToolItemHandler) menuItem.Handler; - handler.ImageSize = size; + if (menuItem.Handler is ButtonToolItemHandler buttonHandler) + { + buttonHandler.ImageSize = size; + } + if (menuItem.Handler is DropDownToolItemHandler dropDownHandler) + { + dropDownHandler.ImageSize = size; + } } public override void ConfigureZoomButton(Button button, string icon) diff --git a/NAPS2.Lib/EtoForms/EtoPlatform.cs b/NAPS2.Lib/EtoForms/EtoPlatform.cs index dc663f2864..0e4de2a05f 100644 --- a/NAPS2.Lib/EtoForms/EtoPlatform.cs +++ b/NAPS2.Lib/EtoForms/EtoPlatform.cs @@ -168,7 +168,7 @@ public virtual void SetImageSize(ButtonMenuItem menuItem, int size) { } - public virtual void SetImageSize(ButtonToolItem toolItem, int size) + public virtual void SetImageSize(ToolItem toolItem, int size) { } } \ No newline at end of file diff --git a/NAPS2.Lib/EtoForms/Layout/C.cs b/NAPS2.Lib/EtoForms/Layout/C.cs index a26483ffc1..153a308a99 100644 --- a/NAPS2.Lib/EtoForms/Layout/C.cs +++ b/NAPS2.Lib/EtoForms/Layout/C.cs @@ -203,14 +203,18 @@ public static LayoutElement None() return new SkipLayoutElement(); } - public static Button IconButton(Image icon, Action onClick) + public static Button IconButton(string iconName, Action onClick) { var button = new Button { - Image = icon, - ImagePosition = ButtonImagePosition.Overlay, - MinimumSize = new Size(icon.Width + 30, 0) + ImagePosition = ButtonImagePosition.Overlay }; + EtoPlatform.Current.AttachDpiDependency(button, scale => + { + var icon = EtoPlatform.Current.IconProvider.GetIcon(iconName, scale)!; + button.Image = icon; + button.MinimumSize = new Size(icon.Width + 30, 0); + }); button.Click += (_, _) => onClick(); return button; } diff --git a/NAPS2.Lib/EtoForms/Ui/BatchPromptForm.cs b/NAPS2.Lib/EtoForms/Ui/BatchPromptForm.cs index a9749593a9..b070fb05d9 100644 --- a/NAPS2.Lib/EtoForms/Ui/BatchPromptForm.cs +++ b/NAPS2.Lib/EtoForms/Ui/BatchPromptForm.cs @@ -7,7 +7,7 @@ public class BatchPromptForm : EtoDialogBase { private readonly Button _scanButton; - public BatchPromptForm(Naps2Config config, IIconProvider iconProvider) : base(config) + public BatchPromptForm(Naps2Config config) : base(config) { var scanNextCommand = new ActionCommand(() => { @@ -16,7 +16,7 @@ public BatchPromptForm(Naps2Config config, IIconProvider iconProvider) : base(co }) { Text = UiStrings.Scan, - Image = iconProvider.GetIcon("control_play_blue_small") + IconName = "control_play_blue_small" }; _scanButton = C.Button(scanNextCommand, ButtonImagePosition.Left); DefaultButton = _scanButton; diff --git a/NAPS2.Lib/EtoForms/Ui/BlackWhiteForm.cs b/NAPS2.Lib/EtoForms/Ui/BlackWhiteForm.cs index f777bbf6fc..116860989f 100644 --- a/NAPS2.Lib/EtoForms/Ui/BlackWhiteForm.cs +++ b/NAPS2.Lib/EtoForms/Ui/BlackWhiteForm.cs @@ -1,4 +1,3 @@ -using Eto.Drawing; using NAPS2.EtoForms.Widgets; namespace NAPS2.EtoForms.Ui; @@ -14,7 +13,8 @@ public BlackWhiteForm(Naps2Config config, UiImageList imageList, ThumbnailContro IconName = "contrast_high_small"; Title = UiStrings.BlackAndWhite; - _thresholdSlider.Icon = iconProvider.GetIcon("contrast_high_small"); + EtoPlatform.Current.AttachDpiDependency(this, + scale => _thresholdSlider.Icon = iconProvider.GetIcon("contrast_high_small", scale)); Sliders = [_thresholdSlider]; // BlackWhiteTransform is not commutative with scaling CanScaleWorkingImage = false; diff --git a/NAPS2.Lib/EtoForms/Ui/BrightContForm.cs b/NAPS2.Lib/EtoForms/Ui/BrightContForm.cs index ebf0e75da4..0e869807dc 100644 --- a/NAPS2.Lib/EtoForms/Ui/BrightContForm.cs +++ b/NAPS2.Lib/EtoForms/Ui/BrightContForm.cs @@ -1,4 +1,3 @@ -using Eto.Drawing; using NAPS2.EtoForms.Widgets; namespace NAPS2.EtoForms.Ui; @@ -15,8 +14,11 @@ public BrightContForm(Naps2Config config, UiImageList imageList, ThumbnailContro IconName = "contrast_with_sun_small"; Title = UiStrings.BrightnessContrast; - _brightnessSlider.Icon = iconProvider.GetIcon("weather_sun_small"); - _contrastSlider.Icon = iconProvider.GetIcon("contrast_small"); + EtoPlatform.Current.AttachDpiDependency(this, scale => + { + _brightnessSlider.Icon = iconProvider.GetIcon("weather_sun_small", scale); + _contrastSlider.Icon = iconProvider.GetIcon("contrast_small", scale); + }); Sliders = [_brightnessSlider, _contrastSlider]; } diff --git a/NAPS2.Lib/EtoForms/Ui/ChooseDeviceForm.cs b/NAPS2.Lib/EtoForms/Ui/ChooseDeviceForm.cs index 4ceb3b5bbd..536e3f9d4e 100644 --- a/NAPS2.Lib/EtoForms/Ui/ChooseDeviceForm.cs +++ b/NAPS2.Lib/EtoForms/Ui/ChooseDeviceForm.cs @@ -140,9 +140,9 @@ protected override void BuildLayout() L.Row( [ ..driverElements, - C.IconButton(_iconProvider.GetIcon("large_tiles_small")!, () => SetListView(false)) + C.IconButton("large_tiles_small", () => SetListView(false)) .Visible(_textListVis).Width(40), - C.IconButton(_iconProvider.GetIcon("text_align_justify_small")!, () => SetListView(true)) + C.IconButton("text_align_justify_small", () => SetListView(true)) .Visible(!_textListVis).Width(40) ] ), diff --git a/NAPS2.Lib/EtoForms/Ui/CombineForm.cs b/NAPS2.Lib/EtoForms/Ui/CombineForm.cs index 991526e222..493821892d 100644 --- a/NAPS2.Lib/EtoForms/Ui/CombineForm.cs +++ b/NAPS2.Lib/EtoForms/Ui/CombineForm.cs @@ -6,7 +6,6 @@ namespace NAPS2.EtoForms.Ui; public class CombineForm : ImageFormBase { - private readonly IIconProvider _iconProvider; private readonly ScanningContext _scanningContext; private readonly LayoutVisibility _horizontalOrientationVis = new(false); @@ -16,13 +15,12 @@ public class CombineForm : ImageFormBase private double _vOffset = 0.5; public CombineForm(Naps2Config config, UiImageList imageList, ThumbnailController thumbnailController, - IIconProvider iconProvider, ScanningContext scanningContext) : + ScanningContext scanningContext) : base(config, imageList, thumbnailController) { Title = UiStrings.Combine; IconName = "combine_small"; - _iconProvider = iconProvider; _scanningContext = scanningContext; } @@ -38,25 +36,25 @@ protected override LayoutElement CreateControls() C.Filler(), L.Row( L.Row( - C.IconButton(_iconProvider.GetIcon("shape_align_left_small")!, () => SetHOffset(0)), - C.IconButton(_iconProvider.GetIcon("shape_align_center_small")!, () => SetHOffset(0.5)), - C.IconButton(_iconProvider.GetIcon("shape_align_right_small")!, () => SetHOffset(1.0)) + C.IconButton("shape_align_left_small", () => SetHOffset(0)), + C.IconButton("shape_align_center_small", () => SetHOffset(0.5)), + C.IconButton("shape_align_right_small", () => SetHOffset(1.0)) ).Visible(_alignVis), - C.IconButton(_iconProvider.GetIcon("combine_hor_small")!, + C.IconButton("combine_hor_small", () => SetOrientation(CombineOrientation.Horizontal)) .Padding(left: 20), - C.IconButton(_iconProvider.GetIcon("switch_ver_small")!, SwapImages) + C.IconButton("switch_ver_small", SwapImages) ).Visible(!_horizontalOrientationVis), L.Row( L.Row( - C.IconButton(_iconProvider.GetIcon("shape_align_top_small")!, () => SetVOffset(0)), - C.IconButton(_iconProvider.GetIcon("shape_align_middle_small")!, () => SetVOffset(0.5)), - C.IconButton(_iconProvider.GetIcon("shape_align_bottom_small")!, () => SetVOffset(1.0)) + C.IconButton("shape_align_top_small", () => SetVOffset(0)), + C.IconButton("shape_align_middle_small", () => SetVOffset(0.5)), + C.IconButton("shape_align_bottom_small", () => SetVOffset(1.0)) ).Visible(_alignVis), - C.IconButton(_iconProvider.GetIcon("combine_ver_small")!, + C.IconButton("combine_ver_small", () => SetOrientation(CombineOrientation.Vertical)) .Padding(left: 20), - C.IconButton(_iconProvider.GetIcon("switch_hor_small")!, SwapImages) + C.IconButton("switch_hor_small", SwapImages) ).Visible(_horizontalOrientationVis), C.Filler() ); diff --git a/NAPS2.Lib/EtoForms/Ui/HueSatForm.cs b/NAPS2.Lib/EtoForms/Ui/HueSatForm.cs index 71c55fe29c..e5e2bda13c 100644 --- a/NAPS2.Lib/EtoForms/Ui/HueSatForm.cs +++ b/NAPS2.Lib/EtoForms/Ui/HueSatForm.cs @@ -1,4 +1,3 @@ -using Eto.Drawing; using NAPS2.EtoForms.Widgets; namespace NAPS2.EtoForms.Ui; @@ -15,8 +14,11 @@ public HueSatForm(Naps2Config config, UiImageList imageList, ThumbnailController IconName = "color_management_small"; Title = UiStrings.HueSaturation; - _hueSlider.Icon = iconProvider.GetIcon("color_wheel_small"); - _saturationSlider.Icon = iconProvider.GetIcon("color_gradient_small"); + EtoPlatform.Current.AttachDpiDependency(this, scale => + { + _hueSlider.Icon = iconProvider.GetIcon("color_wheel_small", scale); + _saturationSlider.Icon = iconProvider.GetIcon("color_gradient_small", scale); + }); Sliders = [_hueSlider, _saturationSlider]; } diff --git a/NAPS2.Lib/EtoForms/Ui/PreviewForm.cs b/NAPS2.Lib/EtoForms/Ui/PreviewForm.cs index 2607f39683..32126905cf 100644 --- a/NAPS2.Lib/EtoForms/Ui/PreviewForm.cs +++ b/NAPS2.Lib/EtoForms/Ui/PreviewForm.cs @@ -208,9 +208,8 @@ protected virtual void CreateToolbar() MakeToolButton(ZoomOutCommand), _zoomPercentButton, new SeparatorToolItem(), - new DropDownToolItem + WithToolItemIcon(new DropDownToolItem { - Image = _iconProvider.GetIcon("arrow_rotate_anticlockwise_small"), ToolTip = UiStrings.Rotate, Items = { @@ -220,7 +219,7 @@ protected virtual void CreateToolbar() Commands.Deskew, Commands.CustomRotate } - }, + }, "arrow_rotate_anticlockwise_small"), MakeToolButton(Commands.Crop), MakeToolButton(Commands.BrightCont), MakeToolButton(Commands.HueSat), @@ -247,19 +246,21 @@ protected virtual void CreateToolbar() } } - private ToolItem MakeToolButton(ActionCommand command, string? iconName = null) - { - var toolItem = new ButtonToolItem + private ToolItem MakeToolButton(ActionCommand command, string? iconName = null) => + WithToolItemIcon(new ButtonToolItem { Command = command, Text = null, ToolTip = command.Text - }; + }, iconName ?? command.IconName!); + + private ToolItem WithToolItemIcon(ToolItem toolItem, string iconName) + { EtoPlatform.Current.AttachDpiDependency(this, scale => { EtoPlatform.Current.SetImageSize(toolItem, (int) (16 * scale)); - toolItem.Image = EtoPlatform.Current.IconProvider.GetIcon(iconName ?? command.IconName!, scale); + toolItem.Image = EtoPlatform.Current.IconProvider.GetIcon(iconName, scale); }); return toolItem; } diff --git a/NAPS2.Lib/EtoForms/Ui/RotateForm.cs b/NAPS2.Lib/EtoForms/Ui/RotateForm.cs index fe424e64e7..0a1648f9b6 100644 --- a/NAPS2.Lib/EtoForms/Ui/RotateForm.cs +++ b/NAPS2.Lib/EtoForms/Ui/RotateForm.cs @@ -20,7 +20,8 @@ public RotateForm(Naps2Config config, UiImageList imageList, ThumbnailController Title = UiStrings.Rotate; IconName = "arrow_rotate_anticlockwise_small"; - _angleSlider.Icon = iconProvider.GetIcon("arrow_rotate_anticlockwise_small"); + EtoPlatform.Current.AttachDpiDependency(this, + scale => _angleSlider.Icon = iconProvider.GetIcon("arrow_rotate_anticlockwise_small", scale)); Sliders = [_angleSlider]; Overlay.MouseDown += Overlay_MouseDown; Overlay.MouseMove += Overlay_MouseMove; diff --git a/NAPS2.Lib/EtoForms/Ui/SharpenForm.cs b/NAPS2.Lib/EtoForms/Ui/SharpenForm.cs index 180bf3640b..8c5720f7f2 100644 --- a/NAPS2.Lib/EtoForms/Ui/SharpenForm.cs +++ b/NAPS2.Lib/EtoForms/Ui/SharpenForm.cs @@ -14,7 +14,8 @@ public SharpenForm(Naps2Config config, UiImageList imageList, ThumbnailControlle IconName = "sharpen_small"; Title = UiStrings.Sharpen; - _sharpenSlider.Icon = iconProvider.GetIcon("sharpen_small"); + EtoPlatform.Current.AttachDpiDependency(this, + scale => _sharpenSlider.Icon = iconProvider.GetIcon("sharpen_small", scale)); Sliders = [_sharpenSlider]; } diff --git a/NAPS2.Lib/EtoForms/Ui/SplitForm.cs b/NAPS2.Lib/EtoForms/Ui/SplitForm.cs index 34d1a81ea9..e9ee90be91 100644 --- a/NAPS2.Lib/EtoForms/Ui/SplitForm.cs +++ b/NAPS2.Lib/EtoForms/Ui/SplitForm.cs @@ -28,8 +28,7 @@ public class SplitForm : UnaryImageFormBase private bool _dragging; private SplitOrientation _orientation; - public SplitForm(Naps2Config config, UiImageList imageList, ThumbnailController thumbnailController, - IIconProvider iconProvider, ColorScheme colorScheme) : + public SplitForm(Naps2Config config, UiImageList imageList, ThumbnailController thumbnailController, ColorScheme colorScheme) : base(config, imageList, thumbnailController) { Title = UiStrings.Split; @@ -37,10 +36,8 @@ public SplitForm(Naps2Config config, UiImageList imageList, ThumbnailController _colorScheme = colorScheme; - _vSplit = C.IconButton(iconProvider.GetIcon("split_ver_small")!, - () => SetOrientation(SplitOrientation.Vertical)); - _hSplit = C.IconButton(iconProvider.GetIcon("split_hor_small")!, - () => SetOrientation(SplitOrientation.Horizontal)); + _vSplit = C.IconButton("split_ver_small", () => SetOrientation(SplitOrientation.Vertical)); + _hSplit = C.IconButton("split_hor_small", () => SetOrientation(SplitOrientation.Horizontal)); Overlay.MouseDown += Overlay_MouseDown; Overlay.MouseMove += Overlay_MouseMove; Overlay.MouseUp += Overlay_MouseUp; diff --git a/NAPS2.Lib/EtoForms/Widgets/SliderWithTextBox.cs b/NAPS2.Lib/EtoForms/Widgets/SliderWithTextBox.cs index 8a8702f95f..08e7d749c0 100644 --- a/NAPS2.Lib/EtoForms/Widgets/SliderWithTextBox.cs +++ b/NAPS2.Lib/EtoForms/Widgets/SliderWithTextBox.cs @@ -10,6 +10,8 @@ public class SliderWithTextBox private readonly Constraints _constraints; private readonly Slider _slider = new(); + private readonly ImageView _imageView = new(); + private readonly LayoutVisibility? _imageVis = new(false); private readonly TextBox _textBox; private int _valueCache; @@ -78,7 +80,15 @@ public bool Enabled } } - public Image? Icon { get; set; } + public Image? Icon + { + get => _imageView.Image; + set + { + _imageView.Image = value; + _imageVis.IsVisible = value != null; + } + } public static implicit operator LayoutElement(SliderWithTextBox control) { @@ -90,11 +100,9 @@ public static implicit operator LayoutElement(SliderWithTextBox control) public LayoutRow AsControl() { return L.Row( - Icon != null - ? new ImageView { Image = Icon } - .Align(EtoPlatform.Current.IsWinForms ? LayoutAlignment.Leading : LayoutAlignment.Center) - .Padding(top: 2, bottom: 2) - : C.None(), + _imageView + .Align(EtoPlatform.Current.IsWinForms ? LayoutAlignment.Leading : LayoutAlignment.Center) + .Padding(top: 2, bottom: 2).Visible(_imageVis), _slider.Scale(), _textBox.Width(EtoPlatform.Current.IsGtk ? 50 : 40) .Align(EtoPlatform.Current.IsWinForms ? LayoutAlignment.Leading : LayoutAlignment.Center)