Use IIconProvider more for higher-resolution icons as needed

This commit is contained in:
Ben Olden-Cooligan 2024-08-25 12:27:06 -07:00
parent 1f2f7ed984
commit 35b2e37fee
47 changed files with 290 additions and 194 deletions

View File

@ -39,10 +39,11 @@ public class GtkDesktopForm : DesktopForm
IDesktopSubFormController desktopSubFormController,
Lazy<DesktopCommands> commands,
IDarkModeProvider darkModeProvider,
Sidebar sidebar)
Sidebar sidebar,
IIconProvider iconProvider)
: base(config, keyboardShortcuts, notificationManager, cultureHelper, colorScheme, profileManager, imageList,
thumbnailController, thumbnailProvider, desktopController, desktopScanController, imageListActions,
imageListViewBehavior, desktopFormProvider, desktopSubFormController, commands, sidebar)
imageListViewBehavior, desktopFormProvider, desktopSubFormController, commands, sidebar, iconProvider)
{
((GtkDarkModeProvider) darkModeProvider).StyleContext =
Eto.Forms.Gtk3Helpers.ToNative(this).StyleContext;

View File

@ -8,24 +8,21 @@ public class MacIconProvider : IIconProvider
private static readonly Dictionary<string, string> IconMap = new()
{
{ "control_play_blue", "play" },
{ "control_play_blue_small", "play" },
{ "add_small", "plus.circle" },
{ "pencil_small", "pencil" },
{ "add", "plus.circle" },
{ "pencil", "pencil" },
{ "cross", "trash" },
{ "cross_small", "xmark" },
{ "accept_small", "checkmark.circle" },
{ "accept", "checkmark.circle" },
{ "wireless16", "wifi" },
{ "blueprints", "list.bullet" },
{ "folder_picture", "folder" },
{ "diskette", "square.and.arrow.down" },
{ "zoom", "viewfinder" },
{ "zoom_small", "viewfinder" },
{ "arrow_rotate_anticlockwise", "arrow.counterclockwise" },
{ "arrow_rotate_anticlockwise_small", "arrow.counterclockwise" },
{ "arrow_rotate_clockwise_small", "arrow.clockwise" },
{ "arrow_switch_small", "arrow.2.squarepath" },
{ "arrow_up_small", "arrow.up" },
{ "arrow_down_small", "arrow.down" },
{ "arrow_rotate_clockwise", "arrow.clockwise" },
{ "arrow_switch", "arrow.2.squarepath" },
{ "arrow_up", "arrow.up" },
{ "arrow_down", "arrow.down" },
{ "arrow_left", "arrow.left" },
{ "arrow_right", "arrow.right" },
{ "transform_crop", "crop" },
@ -41,9 +38,9 @@ public class MacIconProvider : IIconProvider
{ "pictures", "photo" },
{ "document", "doc.text" },
{ "split", "squareshape.split.2x2.dotted" },
{ "text_align_justify_small", "text.justify" },
{ "large_tiles_small", "square.grid.2x2" },
{ "exclamation_small", "exclamationmark.triangle" },
{ "text_align_justify", "text.justify" },
{ "large_tiles", "square.grid.2x2" },
{ "exclamation", "exclamationmark.triangle" },
{ "application_side_list", "sidebar.left" },
// TODO: Consider these
// { "ask", "questionmark" },
@ -57,7 +54,7 @@ public class MacIconProvider : IIconProvider
_defaultIconProvider = defaultIconProvider;
}
public Image? GetIcon(string name, bool oversized = false)
public Bitmap? GetIcon(string name, bool oversized = false)
{
if (!OperatingSystem.IsMacOSVersionAtLeast(11) && name == "arrow_rotate_anticlockwise")
{
@ -65,16 +62,23 @@ public class MacIconProvider : IIconProvider
// TODO: Also maybe map other icons to 16x16 versions (e.g. control_play_blue) for better rendering
return _defaultIconProvider.GetIcon("arrow_rotate_anticlockwise_small");
}
if (OperatingSystem.IsMacOSVersionAtLeast(11) && IconMap.ContainsKey(name))
if (OperatingSystem.IsMacOSVersionAtLeast(11))
{
var symbol = NSImage.GetSystemSymbol(IconMap[name], null);
if (symbol != null)
if (!IconMap.ContainsKey(name) && name.EndsWith("_small"))
{
if (oversized)
name = name.Substring(0, name.Length - 6);
}
if (IconMap.ContainsKey(name))
{
var symbol = NSImage.GetSystemSymbol(IconMap[name], null);
if (symbol != null)
{
symbol = symbol.GetImage(NSImageSymbolConfiguration.Create(32, 0.1));
if (oversized)
{
symbol = symbol.GetImage(NSImageSymbolConfiguration.Create(32, 0.1));
}
return new Bitmap(new BitmapHandler(symbol));
}
return new Bitmap(new BitmapHandler(symbol));
}
}
return _defaultIconProvider.GetIcon(name);

View File

@ -29,10 +29,11 @@ public class MacDesktopForm : DesktopForm
DesktopFormProvider desktopFormProvider,
IDesktopSubFormController desktopSubFormController,
Lazy<DesktopCommands> commands,
Sidebar sidebar)
Sidebar sidebar,
IIconProvider iconProvider)
: base(config, keyboardShortcuts, notificationManager, cultureHelper, colorScheme, profileManager, imageList,
thumbnailController, thumbnailProvider, desktopController, desktopScanController, imageListActions,
imageListViewBehavior, desktopFormProvider, desktopSubFormController, commands, sidebar)
imageListViewBehavior, desktopFormProvider, desktopSubFormController, commands, sidebar, iconProvider)
{
// For retina screens
_thumbnailController.Oversample = 2.0;

View File

@ -40,10 +40,11 @@ public class WinFormsDesktopForm : DesktopForm
DesktopFormProvider desktopFormProvider,
IDesktopSubFormController desktopSubFormController,
Lazy<DesktopCommands> commands,
Sidebar sidebar)
Sidebar sidebar,
IIconProvider iconProvider)
: base(config, keyboardShortcuts, notificationManager, cultureHelper, colorScheme, profileManager, imageList,
thumbnailController, thumbnailProvider, desktopController, desktopScanController, imageListActions,
imageListViewBehavior, desktopFormProvider, desktopSubFormController, commands, sidebar)
imageListViewBehavior, desktopFormProvider, desktopSubFormController, commands, sidebar, iconProvider)
{
_form = this.ToNative();
_form.FormClosing += OnFormClosing;
@ -172,7 +173,7 @@ public class WinFormsDesktopForm : DesktopForm
TextImageRelation = WF.TextImageRelation.ImageBeforeText,
ImageAlign = ContentAlignment.MiddleLeft,
TextAlign = ContentAlignment.MiddleLeft,
Image = Image.FromStream(new MemoryStream(Icons.control_play_blue_small))
Image = _iconProvider.GetIcon("control_play_blue_small").ToSD()
};
item.Click += (_, _) => _desktopScanController.ScanWithProfile((ScanProfile) item.Tag!);
toolbarItems.Add(item);

View File

@ -15,7 +15,7 @@ public class WinFormsIconProvider : IIconProvider
_desktopFormProvider = desktopFormProvider;
}
public Image? GetIcon(string name, bool oversized = false)
public Bitmap? GetIcon(string name, bool oversized = false)
{
var dpi = _desktopFormProvider.DesktopForm.ToNative().DeviceDpi;

View File

@ -4,7 +4,7 @@ namespace NAPS2.EtoForms;
public class DefaultIconProvider : IIconProvider
{
public Image? GetIcon(string name, bool oversized = false)
public Bitmap? GetIcon(string name, bool oversized = false)
{
var data = (byte[]?) Icons.ResourceManager.GetObject(name);
if (data == null) return null;

View File

@ -37,7 +37,7 @@ public class Sidebar
{
var profile = _profileManager.Profiles.First();
_deviceSelectorWidget = new DeviceSelectorWidget(_scanPerformer, _deviceCapsCache, parentWindow)
_deviceSelectorWidget = new DeviceSelectorWidget(_scanPerformer, _deviceCapsCache, _iconProvider, parentWindow)
{
ShowChooseDevice = false,
ProfileFunc = () => profile

View File

@ -65,11 +65,11 @@ public static class EtoExtensions
return image;
}
public static Image ResizeTo(this Image image, int size) => ResizeTo(image, new Size(size, size));
public static Bitmap ResizeTo(this Bitmap image, int size) => ResizeTo(image, new Size(size, size));
public static Image ResizeTo(this Image image, int width, int height) => ResizeTo(image, new Size(width, height));
public static Bitmap ResizeTo(this Bitmap image, int width, int height) => ResizeTo(image, new Size(width, height));
public static Image ResizeTo(this Image image, Size size)
public static Bitmap ResizeTo(this Bitmap image, Size size)
{
if (image.Width != size.Width || image.Height != size.Height)
{

View File

@ -4,5 +4,5 @@ namespace NAPS2.EtoForms;
public interface IIconProvider
{
Image? GetIcon(string name, bool oversized = false);
Bitmap? GetIcon(string name, bool oversized = false);
}

View File

@ -17,9 +17,12 @@ public class AboutForm : EtoDialogBase
private readonly UpdateChecker _updateChecker;
private readonly CheckBox _enableDebugLogging = C.CheckBox(UiStrings.EnableDebugLogging);
public AboutForm(Naps2Config config, UpdateChecker updateChecker)
public AboutForm(Naps2Config config, IIconProvider iconProvider, UpdateChecker updateChecker)
: base(config)
{
Title = UiStrings.AboutFormTitle;
Icon = new Icon(1f, iconProvider.GetIcon("information_small"));
_donateButton = EtoPlatform.Current.AccessibleImageButton(
Icons.btn_donate_LG.ToEtoImage(),
UiStrings.Donate,
@ -35,9 +38,6 @@ public class AboutForm : EtoDialogBase
protected override void BuildLayout()
{
Title = UiStrings.AboutFormTitle;
Icon = new Icon(1f, Icons.information_small.ToEtoImage());
FormStateController.Resizable = false;
FormStateController.RestoreFormState = false;

View File

@ -33,8 +33,11 @@ public class AdvancedProfileForm : EtoDialogBase
private readonly CheckBox _twainProgress = new() { Text = UiStrings.ShowNativeTwainProgress };
private readonly Button _restoreDefaults = new() { Text = UiStrings.RestoreDefaults };
public AdvancedProfileForm(Naps2Config config) : base(config)
public AdvancedProfileForm(Naps2Config config, IIconProvider iconProvider) : base(config)
{
Title = UiStrings.AdvancedProfileFormTitle;
Icon = new Icon(1f, iconProvider.GetIcon("blueprints_small"));
_restoreDefaults.Click += RestoreDefaults_Click;
_maximumQuality.CheckedChanged += MaximumQuality_CheckedChanged;
_excludeBlank.CheckedChanged += ExcludeBlank_CheckedChanged;
@ -58,9 +61,6 @@ public class AdvancedProfileForm : EtoDialogBase
UpdateValues(ScanProfile!);
UpdateEnabled();
Title = UiStrings.AdvancedProfileFormTitle;
Icon = new Icon(1f, Icons.blueprints_small.ToEtoImage());
FormStateController.DefaultExtraLayoutSize = new Size(60, 0);
FormStateController.FixedHeightLayout = true;

View File

@ -10,16 +10,16 @@ public class AuthorizeForm : EtoDialogBase
private readonly ErrorOutput _errorOutput;
private CancellationTokenSource? _cancelTokenSource;
public AuthorizeForm(Naps2Config config, ErrorOutput errorOutput) : base(config)
public AuthorizeForm(Naps2Config config, IIconProvider iconProvider, ErrorOutput errorOutput) : base(config)
{
Title = UiStrings.AuthorizeFormTitle;
Icon = new Icon(1f, iconProvider.GetIcon("key_small"));
_errorOutput = errorOutput;
}
protected override void BuildLayout()
{
Title = UiStrings.AuthorizeFormTitle;
Icon = new Icon(1f, Icons.key_small.ToEtoImage());
FormStateController.FixedHeightLayout = true;
FormStateController.RestoreFormState = false;
FormStateController.Resizable = false;

View File

@ -56,6 +56,9 @@ public class BatchScanForm : EtoDialogBase
IBatchScanPerformer batchScanPerformer, ErrorOutput errorOutput, IIconProvider iconProvider)
: base(config)
{
Title = UiStrings.BatchScanFormTitle;
Icon = new Icon(1f, iconProvider.GetIcon("application_cascade_small"));
_profileManager = profileManager;
_batchScanPerformer = batchScanPerformer;
_errorOutput = errorOutput;
@ -104,9 +107,6 @@ public class BatchScanForm : EtoDialogBase
!(Config.Get(c => c.NoUserProfiles) && _profileManager.Profiles.Any(x => x.IsLocked));
UpdateUIFromSettings();
Title = UiStrings.BatchScanFormTitle;
Icon = new Icon(1f, Icons.application_cascade.ToEtoImage());
FormStateController.FixedHeightLayout = true;
AbortButton = _cancel;

View File

@ -11,10 +11,10 @@ public class BlackWhiteForm : UnaryImageFormBase
IIconProvider iconProvider) :
base(config, imageList, thumbnailController)
{
Icon = new Icon(1f, Icons.contrast_high.ToEtoImage());
Icon = new Icon(1f, iconProvider.GetIcon("contrast_high_small"));
Title = UiStrings.BlackAndWhite;
_thresholdSlider.Icon = iconProvider.GetIcon("contrast_high");
_thresholdSlider.Icon = iconProvider.GetIcon("contrast_high_small");
Sliders = [_thresholdSlider];
// BlackWhiteTransform is not commutative with scaling
CanScaleWorkingImage = false;

View File

@ -12,11 +12,11 @@ public class BrightContForm : UnaryImageFormBase
IIconProvider iconProvider) :
base(config, imageList, thumbnailController)
{
Icon = new Icon(1f, Icons.contrast_with_sun.ToEtoImage());
Icon = new Icon(1f, iconProvider.GetIcon("contrast_with_sun_small"));
Title = UiStrings.BrightnessContrast;
_brightnessSlider.Icon = iconProvider.GetIcon("weather_sun");
_contrastSlider.Icon = iconProvider.GetIcon("contrast");
_brightnessSlider.Icon = iconProvider.GetIcon("weather_sun_small");
_contrastSlider.Icon = iconProvider.GetIcon("contrast_small");
Sliders = [_brightnessSlider, _contrastSlider];
}

View File

@ -19,10 +19,11 @@ public class CombineForm : ImageFormBase
IIconProvider iconProvider, ScanningContext scanningContext) :
base(config, imageList, thumbnailController)
{
Title = UiStrings.Combine;
Icon = new Icon(1f, iconProvider.GetIcon("combine_small"));
_iconProvider = iconProvider;
_scanningContext = scanningContext;
Icon = new Icon(1f, Icons.combine.ToEtoImage());
Title = UiStrings.Combine;
}
private UiImage Image1 { get; set; } = null!;
@ -37,23 +38,25 @@ public class CombineForm : ImageFormBase
C.Filler(),
L.Row(
L.Row(
C.IconButton(_iconProvider.GetIcon("shape_align_left")!, () => SetHOffset(0)),
C.IconButton(_iconProvider.GetIcon("shape_align_center")!, () => SetHOffset(0.5)),
C.IconButton(_iconProvider.GetIcon("shape_align_right")!, () => SetHOffset(1.0))
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))
).Visible(_alignVis),
C.IconButton(_iconProvider.GetIcon("combine_hor")!, () => SetOrientation(CombineOrientation.Horizontal))
C.IconButton(_iconProvider.GetIcon("combine_hor_small")!,
() => SetOrientation(CombineOrientation.Horizontal))
.Padding(left: 20),
C.IconButton(_iconProvider.GetIcon("switch_ver")!, SwapImages)
C.IconButton(_iconProvider.GetIcon("switch_ver_small")!, SwapImages)
).Visible(!_horizontalOrientationVis),
L.Row(
L.Row(
C.IconButton(_iconProvider.GetIcon("shape_align_top")!, () => SetVOffset(0)),
C.IconButton(_iconProvider.GetIcon("shape_align_middle")!, () => SetVOffset(0.5)),
C.IconButton(_iconProvider.GetIcon("shape_align_bottom")!, () => SetVOffset(1.0))
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))
).Visible(_alignVis),
C.IconButton(_iconProvider.GetIcon("combine_ver")!, () => SetOrientation(CombineOrientation.Vertical))
C.IconButton(_iconProvider.GetIcon("combine_ver_small")!,
() => SetOrientation(CombineOrientation.Vertical))
.Padding(left: 20),
C.IconButton(_iconProvider.GetIcon("switch_hor")!, SwapImages)
C.IconButton(_iconProvider.GetIcon("switch_hor_small")!, SwapImages)
).Visible(_horizontalOrientationVis),
C.Filler()
);

View File

@ -32,12 +32,13 @@ public class CropForm : UnaryImageFormBase
private bool _freeformActive;
public CropForm(Naps2Config config, UiImageList imageList, ThumbnailController thumbnailController,
ColorScheme colorScheme) :
ColorScheme colorScheme, IIconProvider iconProvider) :
base(config, imageList, thumbnailController)
{
_colorScheme = colorScheme;
Icon = new Icon(1f, Icons.transform_crop.ToEtoImage());
Title = UiStrings.Crop;
Icon = new Icon(1f, iconProvider.GetIcon("transform_crop_small"));
_colorScheme = colorScheme;
OverlayBorderSize = HANDLE_WIDTH;
Overlay.MouseDown += Overlay_MouseDown;

View File

@ -45,7 +45,7 @@ public class DesktopCommands
BatchScan = new ActionCommand(desktopSubFormController.ShowBatchScanForm)
{
Text = UiStrings.BatchScan,
Image = iconProvider.GetIcon("application_cascade")
Image = iconProvider.GetIcon("application_cascade_small")
};
ScannerSharing = new ActionCommand(desktopSubFormController.ShowScannerSharingForm)
{
@ -69,13 +69,11 @@ public class DesktopCommands
};
SaveAll = new ActionCommand(_imageListActions.SaveAllAsPdfOrImages)
{
Text = UiStrings.SaveAll,
Image = iconProvider.GetIcon("diskette")
Text = UiStrings.SaveAll
};
SaveSelected = new ActionCommand(_imageListActions.SaveSelectedAsPdfOrImages)
{
Text = UiStrings.SaveSelected,
Image = iconProvider.GetIcon("diskette")
Text = UiStrings.SaveSelected
};
SavePdf = new ActionCommand(desktopController.SavePdf)
{
@ -146,43 +144,43 @@ public class DesktopCommands
Crop = new ActionCommand(desktopSubFormController.ShowCropForm)
{
Text = UiStrings.Crop,
Image = iconProvider.GetIcon("transform_crop")
Image = iconProvider.GetIcon("transform_crop_small")
};
BrightCont = new ActionCommand(desktopSubFormController.ShowBrightnessContrastForm)
{
Text = UiStrings.BrightnessContrast,
Image = iconProvider.GetIcon("contrast_with_sun")
Image = iconProvider.GetIcon("contrast_with_sun_small")
};
HueSat = new ActionCommand(desktopSubFormController.ShowHueSaturationForm)
{
Text = UiStrings.HueSaturation,
Image = iconProvider.GetIcon("color_management")
Image = iconProvider.GetIcon("color_management_small")
};
BlackWhite = new ActionCommand(desktopSubFormController.ShowBlackWhiteForm)
{
Text = UiStrings.BlackAndWhite,
Image = iconProvider.GetIcon("contrast_high")
Image = iconProvider.GetIcon("contrast_high_small")
};
Sharpen = new ActionCommand(desktopSubFormController.ShowSharpenForm)
{
Text = UiStrings.Sharpen,
Image = iconProvider.GetIcon("sharpen")
Image = iconProvider.GetIcon("sharpen_small")
};
// TODO: Make this an image form with options
DocumentCorrection = new ActionCommand(imageListActions.DocumentCorrection)
{
Text = UiStrings.DocumentCorrection,
Image = iconProvider.GetIcon("document")
Image = iconProvider.GetIcon("document_small")
};
Split = new ActionCommand(desktopSubFormController.ShowSplitForm)
{
Text = UiStrings.Split,
Image = iconProvider.GetIcon("split")
Image = iconProvider.GetIcon("split_small")
};
Combine = new ActionCommand(desktopSubFormController.ShowCombineForm)
{
Text = UiStrings.Combine,
Image = iconProvider.GetIcon("combine")
Image = iconProvider.GetIcon("combine_small")
};
ResetImage = new ActionCommand(desktopController.ResetImage)
{
@ -290,12 +288,12 @@ public class DesktopCommands
ZoomIn = new ActionCommand(() => thumbnailController.StepSize(1))
{
Text = UiStrings.ZoomIn,
Image = iconProvider.GetIcon("zoom_in")
Image = iconProvider.GetIcon("zoom_in_small")
};
ZoomOut = new ActionCommand(() => thumbnailController.StepSize(-1))
{
Text = UiStrings.ZoomOut,
Image = iconProvider.GetIcon("zoom_out")
Image = iconProvider.GetIcon("zoom_out_small")
};
SelectAll = new ActionCommand(imageListActions.SelectAll)
{
@ -304,27 +302,27 @@ public class DesktopCommands
Copy = new ActionCommand(desktopController.Copy)
{
Text = UiStrings.Copy,
Image = iconProvider.GetIcon("copy")
Image = iconProvider.GetIcon("copy_small")
};
Paste = new ActionCommand(desktopController.Paste)
{
Text = UiStrings.Paste,
Image = iconProvider.GetIcon("paste")
Image = iconProvider.GetIcon("paste_small")
};
Undo = new ActionCommand(imageListActions.Undo)
{
Text = UiStrings.Undo,
Image = iconProvider.GetIcon("undo")
Image = iconProvider.GetIcon("undo_small")
};
Redo = new ActionCommand(imageListActions.Redo)
{
Text = UiStrings.Redo,
Image = iconProvider.GetIcon("redo")
Image = iconProvider.GetIcon("redo_small")
};
ToggleSidebar = new ActionCommand(() => _desktopFormProvider.DesktopForm.ToggleSidebar())
{
Text = UiStrings.ToggleSidebar,
Image = iconProvider.GetIcon("application_side_list")
Image = iconProvider.GetIcon("application_side_list_small")
};
}

View File

@ -28,6 +28,8 @@ public abstract class DesktopForm : EtoFormBase
private readonly IDesktopSubFormController _desktopSubFormController;
private readonly ImageTransfer _imageTransfer = new();
private readonly Lazy<DesktopCommands> _commands;
private readonly Sidebar _sidebar;
protected readonly IIconProvider _iconProvider;
protected readonly ListProvider<Command> _scanMenuCommands = new();
private readonly ListProvider<Command> _languageMenuCommands = new();
@ -36,7 +38,6 @@ public abstract class DesktopForm : EtoFormBase
private readonly NotificationArea _notificationArea;
protected IListView<UiImage> _listView;
private ImageListSyncer? _imageListSyncer;
private readonly Sidebar _sidebar;
public DesktopForm(
Naps2Config config,
@ -55,8 +56,11 @@ public abstract class DesktopForm : EtoFormBase
DesktopFormProvider desktopFormProvider,
IDesktopSubFormController desktopSubFormController,
Lazy<DesktopCommands> commands,
Sidebar sidebar) : base(config)
Sidebar sidebar,
IIconProvider iconProvider) : base(config)
{
Icon = Icons.favicon.ToEtoIcon();
_keyboardShortcuts = keyboardShortcuts;
_notificationManager = notificationManager;
_cultureHelper = cultureHelper;
@ -71,6 +75,7 @@ public abstract class DesktopForm : EtoFormBase
_desktopFormProvider = desktopFormProvider;
_desktopSubFormController = desktopSubFormController;
_sidebar = sidebar;
_iconProvider = iconProvider;
_commands = commands;
_desktopFormProvider.DesktopForm = this;
@ -111,8 +116,6 @@ public abstract class DesktopForm : EtoFormBase
protected override void BuildLayout()
{
Icon = Icons.favicon.ToEtoIcon();
FormStateController.AutoLayoutSize = false;
FormStateController.DefaultClientSize = new Size(1210, 600);
@ -526,7 +529,7 @@ public abstract class DesktopForm : EtoFormBase
{
// TODO: Does this need to change on non-WinForms?
MenuText = profile.DisplayName.Replace("&", "&&"),
Image = profile == defaultProfile ? Icons.accept_small.ToEtoImage() : null
Image = profile == defaultProfile ? _iconProvider.GetIcon("accept_small") : null
})
.ToImmutableList<Command>();
for (int i = 0; i < commandList.Count; i++)

View File

@ -14,8 +14,12 @@ public class DownloadProgressForm : EtoDialogBase
private readonly ProgressBar _totalProgressBar = new();
private readonly ProgressBar _fileProgressBar = new();
public DownloadProgressForm(ScanningContext scanningContext, Naps2Config config) : base(config)
public DownloadProgressForm(ScanningContext scanningContext, Naps2Config config, IIconProvider iconProvider) :
base(config)
{
Title = UiStrings.DownloadProgressFormTitle;
Icon = new Icon(1f, iconProvider.GetIcon("text_small"));
Controller = new DownloadController(scanningContext);
Controller.DownloadError += OnDownloadError;
Controller.DownloadComplete += (_, _) => Close();
@ -24,16 +28,14 @@ public class DownloadProgressForm : EtoDialogBase
private void OnDownloadError(object? sender, EventArgs e)
{
MessageBox.Show(MiscResources.FilesCouldNotBeDownloaded, MiscResources.DownloadError, MessageBoxButtons.OK, MessageBoxType.Error);
MessageBox.Show(MiscResources.FilesCouldNotBeDownloaded, MiscResources.DownloadError, MessageBoxButtons.OK,
MessageBoxType.Error);
}
public DownloadController Controller { get; }
protected override void BuildLayout()
{
Title = UiStrings.DownloadProgressFormTitle;
Icon = new Icon(1f, Icons.text_small.ToEtoImage());
FormStateController.RestoreFormState = false;
LayoutController.Content = L.Column(
@ -62,8 +64,9 @@ public class DownloadProgressForm : EtoDialogBase
var cTot = Controller.CurrentFileSize;
_totalStatus.Text = string.Format(MiscResources.FilesProgressFormat, f, fTot);
_totalProgressBar.MaxValue = fTot * 1000;
_totalProgressBar.Value = f * 1000 + (cTot == 0 ? 0 : (int)(c * 1e3 / cTot));
_fileStatus.Text = string.Format(MiscResources.SizeProgress, (c / 1e6).ToString("f1"), (cTot / 1e6).ToString("f1"));
_totalProgressBar.Value = f * 1000 + (cTot == 0 ? 0 : (int) (c * 1e3 / cTot));
_fileStatus.Text =
string.Format(MiscResources.SizeProgress, (c / 1e6).ToString("f1"), (cTot / 1e6).ToString("f1"));
if (c > 0)
{
_fileProgressBar.MaxValue = (int) cTot;
@ -76,5 +79,4 @@ public class DownloadProgressForm : EtoDialogBase
base.OnClosing(e);
Controller.Stop();
}
}

View File

@ -39,12 +39,16 @@ public class EditProfileForm : EtoDialogBase
private CancellationTokenSource? _updateCapsCts;
public EditProfileForm(Naps2Config config, IScanPerformer scanPerformer, ErrorOutput errorOutput,
ProfileNameTracker profileNameTracker, DeviceCapsCache deviceCapsCache) : base(config)
ProfileNameTracker profileNameTracker, DeviceCapsCache deviceCapsCache,
IIconProvider iconProvider) : base(config)
{
Title = UiStrings.EditProfileFormTitle;
Icon = new Icon(1f, iconProvider.GetIcon("blueprints_small"));
_errorOutput = errorOutput;
_profileNameTracker = profileNameTracker;
_deviceCapsCache = deviceCapsCache;
_deviceSelectorWidget = new(scanPerformer, deviceCapsCache, this)
_deviceSelectorWidget = new(scanPerformer, deviceCapsCache, iconProvider, this)
{
ProfileFunc = GetUpdatedScanProfile,
AllowAlwaysAsk = true
@ -85,9 +89,6 @@ public class EditProfileForm : EtoDialogBase
protected override void BuildLayout()
{
Title = UiStrings.EditProfileFormTitle;
Icon = new Icon(1f, Icons.blueprints_small.ToEtoImage());
FormStateController.DefaultExtraLayoutSize = new Size(60, 0);
FormStateController.FixedHeightLayout = true;

View File

@ -9,16 +9,17 @@ internal class EmailProviderForm : EtoDialogBase
{
private readonly EmailProviderController _controller;
public EmailProviderForm(Naps2Config config, EmailProviderController controller) : base(config)
public EmailProviderForm(Naps2Config config, EmailProviderController controller, IIconProvider iconProvider) :
base(config)
{
Title = UiStrings.EmailProviderFormTitle;
Icon = new Icon(1f, iconProvider.GetIcon("email_small"));
_controller = controller;
}
protected override void BuildLayout()
{
Title = UiStrings.EmailProviderFormTitle;
Icon = new Icon(1f, Icons.email_small.ToEtoImage());
FormStateController.FixedHeightLayout = true;
LayoutController.DefaultSpacing = 0;
@ -40,5 +41,4 @@ internal class EmailProviderForm : EtoDialogBase
}
public bool Result { get; private set; }
}

View File

@ -16,8 +16,12 @@ internal class EmailSettingsForm : EtoDialogBase
private readonly CheckBox _rememberSettings = new() { Text = UiStrings.RememberTheseSettings };
private readonly Button _restoreDefaults = new() { Text = UiStrings.RestoreDefaults };
public EmailSettingsForm(Naps2Config config, SystemEmailClients systemEmailClients) : base(config)
public EmailSettingsForm(Naps2Config config, SystemEmailClients systemEmailClients, IIconProvider iconProvider) :
base(config)
{
Title = UiStrings.EmailSettingsFormTitle;
Icon = new Icon(1f, iconProvider.GetIcon("email_small"));
_systemEmailClients = systemEmailClients;
_attachmentName = new(this);
@ -29,9 +33,6 @@ internal class EmailSettingsForm : EtoDialogBase
protected override void BuildLayout()
{
Title = UiStrings.EmailSettingsFormTitle;
Icon = new Icon(1f, Icons.email_small.ToEtoImage());
FormStateController.DefaultExtraLayoutSize = new Size(60, 0);
FormStateController.FixedHeightLayout = true;

View File

@ -5,14 +5,15 @@ namespace NAPS2.EtoForms.Ui;
public class ErrorForm : EtoDialogBase
{
private readonly ImageView _image = new() { Image = Icons.exclamation.ToEtoImage() };
private readonly ImageView _image = new();
private readonly Label _message = new();
private readonly TextArea _details = new() { ReadOnly = true };
private readonly LayoutVisibility _detailsVisibility = new(false);
public ErrorForm(Naps2Config config)
public ErrorForm(Naps2Config config, IIconProvider iconProvider)
: base(config)
{
_image.Image = iconProvider.GetIcon("exclamation");
}
protected override void BuildLayout()

View File

@ -12,11 +12,11 @@ public class HueSatForm : UnaryImageFormBase
IIconProvider iconProvider) :
base(config, imageList, thumbnailController)
{
Icon = new Icon(1f, Icons.color_management.ToEtoImage());
Icon = new Icon(1f, iconProvider.GetIcon("color_management_small"));
Title = UiStrings.HueSaturation;
_hueSlider.Icon = iconProvider.GetIcon("color_wheel");
_saturationSlider.Icon = iconProvider.GetIcon("color_gradient");
_hueSlider.Icon = iconProvider.GetIcon("color_wheel_small");
_saturationSlider.Icon = iconProvider.GetIcon("color_gradient_small");
Sliders = [_hueSlider, _saturationSlider];
}

View File

@ -16,8 +16,11 @@ public class ImageSettingsForm : EtoDialogBase
private readonly CheckBox _rememberSettings = new() { Text = UiStrings.RememberTheseSettings };
private readonly Button _restoreDefaults = new() { Text = UiStrings.RestoreDefaults };
public ImageSettingsForm(Naps2Config config, DialogHelper dialogHelper) : base(config)
public ImageSettingsForm(Naps2Config config, DialogHelper dialogHelper, IIconProvider iconProvider) : base(config)
{
Title = UiStrings.ImageSettingsFormTitle;
Icon = new Icon(1f, iconProvider.GetIcon("picture_small"));
_defaultFilePath = new(this, dialogHelper) { ImagesOnly = true };
UpdateValues(Config);
@ -29,9 +32,6 @@ public class ImageSettingsForm : EtoDialogBase
protected override void BuildLayout()
{
Title = UiStrings.ImageSettingsFormTitle;
Icon = new Icon(1f, Icons.picture_small.ToEtoImage());
FormStateController.DefaultExtraLayoutSize = new Size(60, 0);
FormStateController.FixedHeightLayout = true;

View File

@ -14,9 +14,12 @@ public class ManualIpForm : EtoDialogBase
private readonly ErrorOutput _errorOutput;
public ManualIpForm(Naps2Config config, ErrorOutput errorOutput)
public ManualIpForm(Naps2Config config, ErrorOutput errorOutput, IIconProvider iconProvider)
: base(config)
{
Title = UiStrings.ManualIpFormTitle;
Icon = new Icon(1f, iconProvider.GetIcon("network_ip_small"));
_errorOutput = errorOutput;
}
@ -26,9 +29,6 @@ public class ManualIpForm : EtoDialogBase
protected override void BuildLayout()
{
Title = UiStrings.ManualIpFormTitle;
Icon = new Icon(1f, Icons.network_ip_small.ToEtoImage());
FormStateController.RestoreFormState = false;
FormStateController.FixedHeightLayout = true;

View File

@ -15,8 +15,11 @@ public class OcrDownloadForm : EtoDialogBase
private readonly Button _downloadButton;
public OcrDownloadForm(Naps2Config config, TesseractLanguageManager tesseractLanguageManager,
OcrLanguagesListViewBehavior ocrLanguagesListViewBehavior) : base(config)
OcrLanguagesListViewBehavior ocrLanguagesListViewBehavior, IIconProvider iconProvider) : base(config)
{
Title = UiStrings.OcrDownloadFormTitle;
Icon = new Icon(1f, iconProvider.GetIcon("text_small"));
_tesseractLanguageManager = tesseractLanguageManager;
_languageList = EtoPlatform.Current.CreateListView(ocrLanguagesListViewBehavior);
@ -42,9 +45,6 @@ public class OcrDownloadForm : EtoDialogBase
protected override void BuildLayout()
{
Title = UiStrings.OcrDownloadFormTitle;
Icon = new Icon(1f, Icons.text_small.ToEtoImage());
FormStateController.RestoreFormState = false;
FormStateController.DefaultExtraLayoutSize = new Size(300, 300);

View File

@ -10,8 +10,11 @@ public class OcrMultiLangForm : EtoDialogBase
private readonly IListView<Language> _languageList;
public OcrMultiLangForm(Naps2Config config, TesseractLanguageManager tesseractLanguageManager,
OcrLanguagesListViewBehavior ocrLanguagesListViewBehavior) : base(config)
OcrLanguagesListViewBehavior ocrLanguagesListViewBehavior, IIconProvider iconProvider) : base(config)
{
Title = UiStrings.OcrMultiLangFormTitle;
Icon = new Icon(1f, iconProvider.GetIcon("text_small"));
_languageList = EtoPlatform.Current.CreateListView(ocrLanguagesListViewBehavior);
_languageList.SetItems(tesseractLanguageManager.InstalledLanguages.OrderBy(x => x.Name));
}
@ -20,9 +23,6 @@ public class OcrMultiLangForm : EtoDialogBase
protected override void BuildLayout()
{
Title = UiStrings.OcrMultiLangFormTitle;
Icon = new Icon(1f, Icons.text_small.ToEtoImage());
FormStateController.RestoreFormState = false;
FormStateController.DefaultExtraLayoutSize = new Size(150, 20);

View File

@ -28,8 +28,12 @@ public class OcrSetupForm : EtoDialogBase
private string? _multiLangCode;
private bool _suppressLangChangeEvent;
public OcrSetupForm(Naps2Config config, TesseractLanguageManager tesseractLanguageManager) : base(config)
public OcrSetupForm(Naps2Config config, TesseractLanguageManager tesseractLanguageManager,
IIconProvider iconProvider) : base(config)
{
Title = UiStrings.OcrSetupFormTitle;
Icon = new Icon(1f, iconProvider.GetIcon("text_small"));
_tesseractLanguageManager = tesseractLanguageManager;
_enableOcr.CheckedChanged += EnableOcr_CheckedChanged;
@ -57,9 +61,6 @@ public class OcrSetupForm : EtoDialogBase
protected override void BuildLayout()
{
Title = UiStrings.OcrSetupFormTitle;
Icon = new Icon(1f, Icons.text_small.ToEtoImage());
FormStateController.Resizable = false;
LayoutController.Content = L.Column(

View File

@ -36,8 +36,11 @@ public class PdfSettingsForm : EtoDialogBase
private readonly EnumDropDownWidget<PdfCompat> _compat = new();
public PdfSettingsForm(Naps2Config config, DialogHelper dialogHelper) : base(config)
public PdfSettingsForm(Naps2Config config, DialogHelper dialogHelper, IIconProvider iconProvider) : base(config)
{
Title = UiStrings.PdfSettingsFormTitle;
Icon = new Icon(1f, iconProvider.GetIcon("file_extension_pdf_small"));
_defaultFilePath = new(this, dialogHelper) { PdfOnly = true };
_compat.Format = compat => compat switch
{
@ -59,9 +62,6 @@ public class PdfSettingsForm : EtoDialogBase
protected override void BuildLayout()
{
Title = UiStrings.PdfSettingsFormTitle;
Icon = new Icon(1f, Icons.file_extension_pdf_small.ToEtoImage());
FormStateController.DefaultExtraLayoutSize = new Size(60, 0);
FormStateController.FixedHeightLayout = true;

View File

@ -18,6 +18,9 @@ public class PreviewForm : EtoDialogBase
public PreviewForm(Naps2Config config, DesktopCommands desktopCommands, UiImageList imageList,
IIconProvider iconProvider, ColorScheme colorScheme) : base(config)
{
Title = UiStrings.PreviewFormTitle;
Icon = Icons.favicon.ToEtoIcon();
_desktopCommands = desktopCommands;
ImageList = imageList;
_iconProvider = iconProvider;
@ -29,38 +32,38 @@ public class PreviewForm : EtoDialogBase
GoToPrevCommand = new ActionCommand(() => GoTo(ImageIndex - 1))
{
Text = UiStrings.Previous,
Image = iconProvider.GetIcon("arrow_left")
Image = iconProvider.GetIcon("arrow_left_small")
};
GoToNextCommand = new ActionCommand(() => GoTo(ImageIndex + 1))
{
Text = UiStrings.Next,
Image = iconProvider.GetIcon("arrow_right")
Image = iconProvider.GetIcon("arrow_right_small")
};
ZoomInCommand = new ActionCommand(() => ImageViewer.ChangeZoom(1))
{
Text = UiStrings.ZoomIn,
Image = iconProvider.GetIcon("zoom_in")
Image = iconProvider.GetIcon("zoom_in_small")
};
ZoomOutCommand = new ActionCommand(() => ImageViewer.ChangeZoom(-1))
{
Text = UiStrings.ZoomOut,
Image = iconProvider.GetIcon("zoom_out")
Image = iconProvider.GetIcon("zoom_out_small")
};
ZoomWindowCommand = new ActionCommand(ImageViewer.ZoomToContainer)
{
// TODO: Update this string as it's now a button and not a toggle
Text = UiStrings.ScaleWithWindow,
Image = iconProvider.GetIcon("arrow_out")
Image = iconProvider.GetIcon("arrow_out_small")
};
ZoomActualCommand = new ActionCommand(ImageViewer.ZoomToActual)
{
Text = UiStrings.ZoomActual,
Image = iconProvider.GetIcon("zoom_actual")
Image = iconProvider.GetIcon("zoom_actual_small")
};
DeleteCurrentImageCommand = new ActionCommand(DeleteCurrentImage)
{
Text = UiStrings.Delete,
Image = iconProvider.GetIcon("cross")
Image = iconProvider.GetIcon("cross_small")
};
_previewKsm = new KeyboardShortcutManager();
@ -125,9 +128,6 @@ public class PreviewForm : EtoDialogBase
protected override void BuildLayout()
{
Title = UiStrings.PreviewFormTitle;
Icon = Icons.favicon.ToEtoIcon();
FormStateController.AutoLayoutSize = false;
FormStateController.DefaultClientSize = new Size(800, 600);

View File

@ -33,6 +33,9 @@ public class ProfilesForm : EtoDialogBase
ThumbnailController thumbnailController, IIconProvider iconProvider)
: base(config)
{
Title = UiStrings.ProfilesFormTitle;
Icon = new Icon(1f, iconProvider.GetIcon("blueprints_small"));
_scanPerformer = scanPerformer;
_profileNameTracker = profileNameTracker;
_profileManager = profileManager;
@ -132,9 +135,6 @@ public class ProfilesForm : EtoDialogBase
protected override void BuildLayout()
{
Title = UiStrings.ProfilesFormTitle;
Icon = new Icon(1f, Icons.blueprints_small.ToEtoImage());
FormStateController.DefaultExtraLayoutSize = new Size(200, 0);
LayoutController.Content = L.Column(

View File

@ -17,8 +17,8 @@ public class RotateForm : UnaryImageFormBase
IIconProvider iconProvider) :
base(config, imageList, thumbnailController)
{
Icon = new Icon(1f, Icons.arrow_rotate_anticlockwise_small.ToEtoImage());
Title = UiStrings.Rotate;
Icon = new Icon(1f, iconProvider.GetIcon("arrow_rotate_anticlockwise_small"));
_angleSlider.Icon = iconProvider.GetIcon("arrow_rotate_anticlockwise_small");
Sliders = [_angleSlider];

View File

@ -26,6 +26,9 @@ public class ScannerSharingForm : EtoDialogBase
IIconProvider iconProvider)
: base(config)
{
Title = UiStrings.ScannerSharingFormTitle;
Icon = new Icon(1f, iconProvider.GetIcon("wireless16"));
_sharedDeviceManager = sharedDeviceManager;
_osServiceManager = osServiceManager;
_errorOutput = errorOutput;
@ -73,9 +76,6 @@ public class ScannerSharingForm : EtoDialogBase
protected override void BuildLayout()
{
Title = UiStrings.ScannerSharingFormTitle;
Icon = new Icon(1f, Icons.wireless16.ToEtoImage());
FormStateController.DefaultExtraLayoutSize = new Size(200, 0);
LayoutController.Content = L.Column(

View File

@ -24,8 +24,11 @@ internal class SettingsForm : EtoDialogBase
private readonly Button _restoreDefaults = new() { Text = UiStrings.RestoreDefaults };
public SettingsForm(Naps2Config config, DesktopSubFormController desktopSubFormController,
DesktopFormProvider desktopFormProvider) : base(config)
DesktopFormProvider desktopFormProvider, IIconProvider iconProvider) : base(config)
{
Title = UiStrings.SettingsFormTitle;
Icon = new Icon(1f, iconProvider.GetIcon("cog_small"));
_desktopFormProvider = desktopFormProvider;
UpdateValues(Config);
_restoreDefaults.Click += RestoreDefaults_Click;
@ -33,26 +36,22 @@ internal class SettingsForm : EtoDialogBase
_pdfSettingsCommand = new ActionCommand(desktopSubFormController.ShowPdfSettingsForm)
{
Text = UiStrings.PdfSettings,
Image = Icons.file_extension_pdf_small.ToEtoImage()
Image = iconProvider.GetIcon("file_extension_pdf_small")
};
_imageSettingsCommand = new ActionCommand(desktopSubFormController.ShowImageSettingsForm)
{
Text = UiStrings.ImageSettings,
// TODO: Get an actual 16x16 image
Image = Icons.picture_small.ToEtoImage()
Image = iconProvider.GetIcon("picture_small")
};
_emailSettingsCommand = new ActionCommand(desktopSubFormController.ShowEmailSettingsForm)
{
Text = UiStrings.EmailSettings,
Image = Icons.email_small.ToEtoImage()
Image = iconProvider.GetIcon("email_small")
};
}
protected override void BuildLayout()
{
Title = UiStrings.SettingsFormTitle;
Icon = new Icon(1f, Icons.cog_small.ToEtoImage());
FormStateController.DefaultExtraLayoutSize = new Size(60, 0);
FormStateController.FixedHeightLayout = true;

View File

@ -20,11 +20,15 @@ public class SharedDeviceForm : EtoDialogBase
private readonly DeviceSelectorWidget _deviceSelectorWidget;
public SharedDeviceForm(Naps2Config config, IScanPerformer scanPerformer, ErrorOutput errorOutput,
ISharedDeviceManager sharedDeviceManager, DeviceCapsCache deviceCapsCache) : base(config)
ISharedDeviceManager sharedDeviceManager, DeviceCapsCache deviceCapsCache,
IIconProvider iconProvider) : base(config)
{
Title = UiStrings.SharedDeviceFormTitle;
Icon = new Icon(1f, iconProvider.GetIcon("wireless16"));
_errorOutput = errorOutput;
_sharedDeviceManager = sharedDeviceManager;
_deviceSelectorWidget = new(scanPerformer, deviceCapsCache, this)
_deviceSelectorWidget = new(scanPerformer, deviceCapsCache, iconProvider, this)
{
ProfileFunc = () => new ScanProfile { DriverName = DeviceDriver.ToString().ToLowerInvariant() },
AllowAlwaysAsk = false
@ -44,9 +48,6 @@ public class SharedDeviceForm : EtoDialogBase
protected override void BuildLayout()
{
Title = UiStrings.SharedDeviceFormTitle;
Icon = new Icon(1f, Icons.wireless16.ToEtoImage());
FormStateController.DefaultExtraLayoutSize = new Size(60, 0);
FormStateController.FixedHeightLayout = true;

View File

@ -11,10 +11,10 @@ public class SharpenForm : UnaryImageFormBase
IIconProvider iconProvider) :
base(config, imageList, thumbnailController)
{
Icon = new Icon(1f, Icons.sharpen.ToEtoImage());
Icon = new Icon(1f, iconProvider.GetIcon("sharpen_small"));
Title = UiStrings.Sharpen;
_sharpenSlider.Icon = iconProvider.GetIcon("sharpen");
_sharpenSlider.Icon = iconProvider.GetIcon("sharpen_small");
Sliders = [_sharpenSlider];
}

View File

@ -32,12 +32,15 @@ public class SplitForm : UnaryImageFormBase
IIconProvider iconProvider, ColorScheme colorScheme) :
base(config, imageList, thumbnailController)
{
_colorScheme = colorScheme;
Icon = new Icon(1f, Icons.split.ToEtoImage());
Title = UiStrings.Split;
Icon = new Icon(1f, iconProvider.GetIcon("split_small"));
_vSplit = C.IconButton(iconProvider.GetIcon("split_ver")!, () => SetOrientation(SplitOrientation.Vertical));
_hSplit = C.IconButton(iconProvider.GetIcon("split_hor")!, () => SetOrientation(SplitOrientation.Horizontal));
_colorScheme = colorScheme;
_vSplit = C.IconButton(iconProvider.GetIcon("split_ver_small")!,
() => SetOrientation(SplitOrientation.Vertical));
_hSplit = C.IconButton(iconProvider.GetIcon("split_hor_small")!,
() => SetOrientation(SplitOrientation.Horizontal));
Overlay.MouseDown += Overlay_MouseDown;
Overlay.MouseMove += Overlay_MouseMove;
Overlay.MouseUp += Overlay_MouseUp;
@ -46,7 +49,9 @@ public class SplitForm : UnaryImageFormBase
protected override List<Transform> Transforms => throw new NotSupportedException();
private int HandleClickRadius =>
(int) Math.Max(Math.Round((_orientation == SplitOrientation.Horizontal ? _overlayH : _overlayW) * HANDLE_RADIUS_RATIO), HANDLE_MIN_RADIUS);
(int) Math.Max(
Math.Round((_orientation == SplitOrientation.Horizontal ? _overlayH : _overlayW) * HANDLE_RADIUS_RATIO),
HANDLE_MIN_RADIUS);
protected override void OnPreLoad(EventArgs e)
{
@ -184,12 +189,14 @@ public class SplitForm : UnaryImageFormBase
if (_orientation == SplitOrientation.Horizontal)
{
var y = _overlayT + _cropY * _overlayH;
return e.Location.Y > y - radius && e.Location.Y < y + radius && e.Location.X > _overlayL && e.Location.X < _overlayR;
return e.Location.Y > y - radius && e.Location.Y < y + radius && e.Location.X > _overlayL &&
e.Location.X < _overlayR;
}
else
{
var x = _overlayL + _cropX * _overlayW;
return e.Location.X > x - radius && e.Location.X < x + radius && e.Location.Y > _overlayT && e.Location.Y < _overlayB;
return e.Location.X > x - radius && e.Location.X < x + radius && e.Location.Y > _overlayT &&
e.Location.Y < _overlayB;
}
}

View File

@ -9,6 +9,7 @@ public class DeviceSelectorWidget
{
private readonly IScanPerformer _scanPerformer;
private readonly DeviceCapsCache _deviceCapsCache;
private readonly IIconProvider _iconProvider;
private readonly IFormBase _parentWindow;
private readonly ImageView _deviceIcon = new();
@ -20,10 +21,12 @@ public class DeviceSelectorWidget
private DeviceChoice _choice = DeviceChoice.None;
private CancellationTokenSource? _loadIconCts;
public DeviceSelectorWidget(IScanPerformer scanPerformer, DeviceCapsCache deviceCapsCache, IFormBase parentWindow)
public DeviceSelectorWidget(IScanPerformer scanPerformer, DeviceCapsCache deviceCapsCache,
IIconProvider iconProvider, IFormBase parentWindow)
{
_scanPerformer = scanPerformer;
_deviceCapsCache = deviceCapsCache;
_iconProvider = iconProvider;
_parentWindow = parentWindow;
_chooseDevice.Click += ChooseDevice;
}
@ -72,7 +75,8 @@ public class DeviceSelectorWidget
public event EventHandler<DeviceChangedEventArgs>? DeviceChanged;
private async void ChooseDevice(object? sender, EventArgs args)
{;
{
;
var choice = await _scanPerformer.PromptForDevice(ProfileFunc(), AllowAlwaysAsk, _parentWindow.NativeHandle);
if (choice.Device != null || choice.AlwaysAsk)
{
@ -88,7 +92,7 @@ public class DeviceSelectorWidget
{
var cachedIcon = _deviceCapsCache.GetCachedIcon(iconUri);
_deviceIcon.Image =
cachedIcon ?? (_choice.AlwaysAsk ? Icons.ask.ToEtoImage() : Icons.device.ToEtoImage());
cachedIcon ?? (_choice.AlwaysAsk ? _iconProvider.GetIcon("ask") : _iconProvider.GetIcon("device"));
if (((Window) _parentWindow).Loaded)
{
_parentWindow.LayoutController.Invalidate();

View File

@ -169,6 +169,26 @@ namespace NAPS2 {
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
internal static byte[] arrow_left {
get {
object obj = ResourceManager.GetObject("arrow_left", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
internal static byte[] arrow_left_small {
get {
object obj = ResourceManager.GetObject("arrow_left_small", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
@ -179,6 +199,16 @@ namespace NAPS2 {
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
internal static byte[] arrow_out_small {
get {
object obj = ResourceManager.GetObject("arrow_out_small", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
@ -199,6 +229,26 @@ namespace NAPS2 {
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
internal static byte[] arrow_right {
get {
object obj = ResourceManager.GetObject("arrow_right", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
internal static byte[] arrow_right_small {
get {
object obj = ResourceManager.GetObject("arrow_right_small", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>

View File

@ -127,6 +127,9 @@
<data name="arrow_out" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Icons\arrow_out.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="arrow_out_small" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Icons\arrow_out-small.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="arrow_rotate_anticlockwise" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Icons\arrow_rotate_anticlockwise.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
@ -154,6 +157,18 @@
<data name="arrow_up_small" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Icons\arrow_up-small.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="arrow_left" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Icons\arrow_left.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="arrow_left_small" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Icons\arrow_left-small.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="arrow_right" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Icons\arrow_right.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="arrow_right_small" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Icons\arrow_right-small.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="blueprints" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Icons\blueprints.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>

Binary file not shown.

After

Width:  |  Height:  |  Size: 371 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 570 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 363 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 577 B

View File

@ -15,10 +15,11 @@ internal class EmailProviderController
private readonly GmailOauthProvider _gmailOauthProvider;
private readonly OutlookWebOauthProvider _outlookWebOauthProvider;
private readonly ThunderbirdEmailProvider _thunderbirdProvider;
private readonly IIconProvider _iconProvider;
public EmailProviderController(IFormFactory formFactory, Naps2Config config, SystemEmailClients systemEmailClients,
GmailOauthProvider gmailOauthProvider, OutlookWebOauthProvider outlookWebOauthProvider,
ThunderbirdEmailProvider thunderbirdProvider)
ThunderbirdEmailProvider thunderbirdProvider, IIconProvider iconProvider)
{
_formFactory = formFactory;
_config = config;
@ -26,6 +27,7 @@ internal class EmailProviderController
_gmailOauthProvider = gmailOauthProvider;
_outlookWebOauthProvider = outlookWebOauthProvider;
_thunderbirdProvider = thunderbirdProvider;
_iconProvider = iconProvider;
}
public List<EmailProviderWidget> GetWidgets()
@ -76,14 +78,14 @@ internal class EmailProviderController
EmailProviderType.System => new EmailProviderWidget
{
ProviderType = EmailProviderType.System,
ProviderIcon = GetSystemIcon(clientName!) ?? Icons.mail_yellow.ToEtoImage(),
ProviderIcon = GetSystemIcon(clientName!) ?? _iconProvider.GetIcon("mail_yellow")!,
ProviderName = clientName!,
Choose = () => ChooseSystem(clientName!)
},
EmailProviderType.Thunderbird => new EmailProviderWidget
{
ProviderType = EmailProviderType.Thunderbird,
ProviderIcon = Icons.thunderbird.ToEtoImage(),
ProviderIcon = _iconProvider.GetIcon("thunderbird")!,
ProviderName = EmailProviderType.Thunderbird.Description(),
Choose = ChooseThunderbird,
// When Thunderbird isn't available, we disable it rather than hide it.
@ -93,28 +95,28 @@ internal class EmailProviderController
EmailProviderType.AppleMail => new EmailProviderWidget
{
ProviderType = EmailProviderType.AppleMail,
ProviderIcon = Icons.apple_mail.ToEtoImage(),
ProviderIcon = _iconProvider.GetIcon("apple_mail")!,
ProviderName = EmailProviderType.AppleMail.Description(),
Choose = ChooseAppleMail
},
EmailProviderType.Gmail => new EmailProviderWidget
{
ProviderType = EmailProviderType.Gmail,
ProviderIcon = Icons.gmail.ToEtoImage(),
ProviderIcon = _iconProvider.GetIcon("gmail")!,
ProviderName = EmailProviderType.Gmail.Description(),
Choose = () => ChooseOauth(_gmailOauthProvider)
},
EmailProviderType.OutlookWeb => new EmailProviderWidget
{
ProviderType = EmailProviderType.OutlookWeb,
ProviderIcon = Icons.outlookweb.ToEtoImage(),
ProviderIcon = _iconProvider.GetIcon("outlookweb")!,
ProviderName = EmailProviderType.OutlookWeb.Description(),
Choose = () => ChooseOauth(_outlookWebOauthProvider)
},
// EmailProviderType.CustomSmtp => new EmailProviderWidget
// {
// ProviderType = EmailProviderType.CustomSmtp,
// ProviderIcon = Icons.email_setting.ToEtoImage(),
// ProviderIcon = _iconProvider.GetIcon("email_setting")!,
// ProviderName = EmailProviderType.CustomSmtp.Description(),
// Choose = ChooseCustomSmtp
// },