From 9c3e95d99460283b14349f98ad2859c9c1431455 Mon Sep 17 00:00:00 2001 From: Ben Olden-Cooligan Date: Sun, 11 Aug 2024 22:48:05 -0700 Subject: [PATCH] Refactor page size dropdown into a widget --- NAPS2.Lib/EtoForms/Ui/EditProfileForm.cs | 132 ++------------- .../Widgets/PageSizeDropDownWidget.cs | 154 ++++++++++++++++++ 2 files changed, 166 insertions(+), 120 deletions(-) create mode 100644 NAPS2.Lib/EtoForms/Widgets/PageSizeDropDownWidget.cs diff --git a/NAPS2.Lib/EtoForms/Ui/EditProfileForm.cs b/NAPS2.Lib/EtoForms/Ui/EditProfileForm.cs index 5cc821f58b..dc4606b632 100644 --- a/NAPS2.Lib/EtoForms/Ui/EditProfileForm.cs +++ b/NAPS2.Lib/EtoForms/Ui/EditProfileForm.cs @@ -21,7 +21,7 @@ public class EditProfileForm : EtoDialogBase private readonly RadioButton _nativeUi; private readonly LayoutVisibility _nativeUiVis = new(true); private readonly EnumDropDownWidget _paperSource = new(); - private readonly DropDownWidget _pageSize = new(); + private readonly PageSizeDropDownWidget _pageSize; private readonly DropDownWidget _resolution = new(); private readonly EnumDropDownWidget _bitDepth = new(); private readonly EnumDropDownWidget _horAlign = new(); @@ -37,7 +37,6 @@ public class EditProfileForm : EtoDialogBase private bool _result; private bool _suppressChangeEvent; private CancellationTokenSource? _updateCapsCts; - private PageSizeListItem? _customPageSize; public EditProfileForm(Naps2Config config, IScanPerformer scanPerformer, ErrorOutput errorOutput, ProfileNameTracker profileNameTracker, DeviceCapsCache deviceCapsCache) : base(config) @@ -50,14 +49,13 @@ public EditProfileForm(Naps2Config config, IScanPerformer scanPerformer, ErrorOu ProfileFunc = GetUpdatedScanProfile, AllowAlwaysAsk = true }; + _pageSize = new(this); _deviceSelectorWidget.DeviceChanged += DeviceChanged; _predefinedSettings = new RadioButton { Text = UiStrings.UsePredefinedSettings }; _nativeUi = new RadioButton(_predefinedSettings) { Text = UiStrings.UseNativeUi }; _resolution.Format = x => string.Format(SettingsResources.DpiFormat, x.ToString(CultureInfo.InvariantCulture)); _paperSource.SelectedItemChanged += PaperSource_SelectedItemChanged; - _pageSize.Format = x => x.Text; - _pageSize.SelectedItemChanged += PageSize_SelectedItemChanged; _predefinedSettings.CheckedChanged += PredefinedSettings_CheckedChanged; _nativeUi.CheckedChanged += NativeUi_CheckedChanged; @@ -184,45 +182,12 @@ private void UpdateUiForCaps() var allPresets = EnumDropDownWidget.DefaultItems.SkipLast(2).ToList(); var conditionalPresets = new[] { ScanPageSize.A3, ScanPageSize.B4 }; - var includedPresets = allPresets.Where(preset => + _pageSize.VisiblePresets = allPresets.Where(preset => !conditionalPresets.Contains(preset) || sizeCaps.Fits(preset.PageDimensions()!.ToPageSize())); - var presetSizes = includedPresets.Select(size => new PageSizeListItem(size)).ToList(); - - var customSizes = Config.Get(c => c.CustomPageSizePresets) - .OrderBy(x => x.Name) - .Select(preset => new PageSizeListItem - { - Type = ScanPageSize.Custom, - Text = string.Format(MiscResources.NamedPageSizeFormat, preset.Name, preset.Dimens.Width, - preset.Dimens.Height, preset.Dimens.Unit.Description()), - CustomName = preset.Name, - CustomDimens = preset.Dimens - }).ToList(); - - if (_customPageSize != null && !customSizes.Contains(_customPageSize)) - { - customSizes.Add(_customPageSize); - } - _pageSize.Items = presetSizes.Concat(customSizes).Append(new PageSizeListItem(ScanPageSize.Custom)); _suppressChangeEvent = false; } - private PageSizeListItem GetCustomPageSize(string? name, PageDimensions dimens) - { - return new PageSizeListItem - { - Type = ScanPageSize.Custom, - Text = string.IsNullOrEmpty(name) - ? string.Format(MiscResources.CustomPageSizeFormat, dimens.Width, dimens.Height, - dimens.Unit.Description()) - : string.Format(MiscResources.NamedPageSizeFormat, name, dimens.Width, dimens.Height, - dimens.Unit.Description()), - CustomName = name, - CustomDimens = dimens - }; - } - private void UpdateCaps() { var cts = new CancellationTokenSource(); @@ -314,10 +279,6 @@ private void UpdateUiForScanProfile() ? driver : Driver.Default); IconUri = ScanProfile.Device?.IconUri; - if (ScanProfile.PageSize == ScanPageSize.Custom && ScanProfile.CustomPageSize != null) - { - _customPageSize = GetCustomPageSize(ScanProfile.CustomPageSizeName, ScanProfile.CustomPageSize); - } _displayName.Text = ScanProfile.DisplayName; if (_deviceSelectorWidget.Choice == DeviceChoice.None) @@ -334,12 +295,20 @@ private void UpdateUiForScanProfile() } _isDefault = ScanProfile.IsDefault; + if (ScanProfile.PageSize == ScanPageSize.Custom && ScanProfile.CustomPageSize != null) + { + _pageSize.SetCustom(ScanProfile.CustomPageSizeName, ScanProfile.CustomPageSize); + } + else + { + _pageSize.SetPreset(ScanProfile.PageSize); + } + _paperSource.SelectedItem = ScanProfile.PaperSource; _bitDepth.SelectedItem = ScanProfile.BitDepth; _resolution.SelectedItem = ScanProfile.Resolution.Dpi; _contrastSlider.IntValue = ScanProfile.Contrast; _brightnessSlider.IntValue = ScanProfile.Brightness; - _pageSize.SelectedItem = _customPageSize ?? new PageSizeListItem(ScanProfile.PageSize); _scale.SelectedItem = ScanProfile.AfterScanScale; _horAlign.SelectedItem = ScanProfile.PageAlign; @@ -476,7 +445,6 @@ private void UpdateEnabledControls() } } - private PageSizeListItem? _lastPageSizeItem; private void PaperSource_SelectedItemChanged(object? sender, EventArgs e) { @@ -484,35 +452,6 @@ private void PaperSource_SelectedItemChanged(object? sender, EventArgs e) UpdateUiForCaps(); } - private void PageSize_SelectedItemChanged(object? sender, EventArgs e) - { - if (Equals(_pageSize.SelectedItem, new PageSizeListItem(ScanPageSize.Custom))) - { - if (_lastPageSizeItem == null) - { - Log.Error("Expected last page size to be set"); - return; - } - // "Custom..." selected - var form = FormFactory.Create(); - form.PageSizeDimens = _lastPageSizeItem.Type == ScanPageSize.Custom - ? _lastPageSizeItem.CustomDimens - : _lastPageSizeItem.Type.PageDimensions(); - form.ShowModal(); - if (form.Result) - { - _customPageSize = GetCustomPageSize(form.PageSizeName!, form.PageSizeDimens!); - _pageSize.SelectedItem = _customPageSize; - UpdateUiForCaps(); - } - else - { - _pageSize.SelectedItem = _lastPageSizeItem; - } - } - _lastPageSizeItem = _pageSize.SelectedItem; - } - private void AutoSaveSettings_LinkClicked(object? sender, EventArgs eventArgs) { if (Config.Get(c => c.DisableAutoSave)) @@ -552,51 +491,4 @@ private void EnableAutoSave_CheckedChanged(object? sender, EventArgs e) } _autoSaveSettings.Enabled = _enableAutoSave.IsChecked(); } - - private class PageSizeListItem : IListItem - { - public PageSizeListItem() - { - } - - public PageSizeListItem(ScanPageSize size) - { - Type = size; - Text = size.Description(); - } - - public string Text { get; set; } = null!; - - public string Key => Text; - - public ScanPageSize Type { get; set; } - - public string? CustomName { get; set; } - - public PageDimensions? CustomDimens { get; set; } - - protected bool Equals(PageSizeListItem other) - { - return Type == other.Type && CustomName == other.CustomName && Equals(CustomDimens, other.CustomDimens); - } - - public override bool Equals(object? obj) - { - if (ReferenceEquals(null, obj)) return false; - if (ReferenceEquals(this, obj)) return true; - if (obj.GetType() != this.GetType()) return false; - return Equals((PageSizeListItem) obj); - } - - public override int GetHashCode() - { - unchecked - { - var hashCode = (int) Type; - hashCode = (hashCode * 397) ^ (CustomName != null ? CustomName.GetHashCode() : 0); - hashCode = (hashCode * 397) ^ (CustomDimens != null ? CustomDimens.GetHashCode() : 0); - return hashCode; - } - } - } } \ No newline at end of file diff --git a/NAPS2.Lib/EtoForms/Widgets/PageSizeDropDownWidget.cs b/NAPS2.Lib/EtoForms/Widgets/PageSizeDropDownWidget.cs new file mode 100644 index 0000000000..a00093ebbb --- /dev/null +++ b/NAPS2.Lib/EtoForms/Widgets/PageSizeDropDownWidget.cs @@ -0,0 +1,154 @@ +using Eto.Forms; +using NAPS2.EtoForms.Ui; +using NAPS2.Scan; + +namespace NAPS2.EtoForms.Widgets; + +public class PageSizeDropDownWidget : DropDownWidget +{ + private readonly IFormBase _window; + private PageSizeListItem? _customPageSize; + private PageSizeListItem? _lastPageSizeItem; + private List _visiblePresets = new(); + + public PageSizeDropDownWidget(IFormBase window) + { + _window = window; + + SelectedItemChanged += OnSelectedItemChanged; + Format = x => x.Text; + } + + public IEnumerable VisiblePresets + { + get => _visiblePresets; + set + { + _visiblePresets = value.ToList(); + RegenerateItems(); + } + } + + private void RegenerateItems() + { + var presetSizes = _visiblePresets.Select(size => new PageSizeListItem(size)).ToList(); + var customSizes = _window.Config.Get(c => c.CustomPageSizePresets) + .OrderBy(x => x.Name) + .Select(preset => new PageSizeListItem + { + Type = ScanPageSize.Custom, + Text = string.Format(MiscResources.NamedPageSizeFormat, preset.Name, preset.Dimens.Width, + preset.Dimens.Height, preset.Dimens.Unit.Description()), + CustomName = preset.Name, + CustomDimens = preset.Dimens + }).ToList(); + + if (_customPageSize != null && !customSizes.Contains(_customPageSize)) + { + customSizes.Add(_customPageSize); + } + Items = presetSizes.Concat(customSizes).Append(new PageSizeListItem(ScanPageSize.Custom)); + } + + private void OnSelectedItemChanged(object? sender, EventArgs e) + { + if (Equals(SelectedItem, new PageSizeListItem(ScanPageSize.Custom))) + { + if (_lastPageSizeItem == null) + { + Log.Error("Expected last page size to be set"); + return; + } + // "Custom..." selected + var form = _window.FormFactory.Create(); + form.PageSizeDimens = _lastPageSizeItem.Type == ScanPageSize.Custom + ? _lastPageSizeItem.CustomDimens + : _lastPageSizeItem.Type.PageDimensions(); + form.ShowModal(); + if (form.Result) + { + _customPageSize = GetCustomPageSize(form.PageSizeName!, form.PageSizeDimens!); + SelectedItem = _customPageSize; + RegenerateItems(); + } + else + { + SelectedItem = _lastPageSizeItem; + } + } + _lastPageSizeItem = SelectedItem; + } + + private PageSizeListItem GetCustomPageSize(string? name, PageDimensions dimens) + { + return new PageSizeListItem + { + Type = ScanPageSize.Custom, + Text = string.IsNullOrEmpty(name) + ? string.Format(MiscResources.CustomPageSizeFormat, dimens.Width, dimens.Height, + dimens.Unit.Description()) + : string.Format(MiscResources.NamedPageSizeFormat, name, dimens.Width, dimens.Height, + dimens.Unit.Description()), + CustomName = name, + CustomDimens = dimens + }; + } + + public class PageSizeListItem : IListItem + { + public PageSizeListItem() + { + } + + public PageSizeListItem(ScanPageSize size) + { + Type = size; + Text = size.Description(); + } + + public string Text { get; set; } = null!; + + public string Key => Text; + + public ScanPageSize Type { get; set; } + + public string? CustomName { get; set; } + + public PageDimensions? CustomDimens { get; set; } + + protected bool Equals(PageSizeListItem other) + { + return Type == other.Type && CustomName == other.CustomName && Equals(CustomDimens, other.CustomDimens); + } + + public override bool Equals(object? obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != this.GetType()) return false; + return Equals((PageSizeListItem) obj); + } + + public override int GetHashCode() + { + unchecked + { + var hashCode = (int) Type; + hashCode = (hashCode * 397) ^ (CustomName != null ? CustomName.GetHashCode() : 0); + hashCode = (hashCode * 397) ^ (CustomDimens != null ? CustomDimens.GetHashCode() : 0); + return hashCode; + } + } + } + + public void SetCustom(string? customPageSizeName, PageDimensions customPageSize) + { + _customPageSize = GetCustomPageSize(customPageSizeName, customPageSize); + SelectedItem = _customPageSize; + } + + public void SetPreset(ScanPageSize pageSize) + { + SelectedItem = new PageSizeListItem(pageSize); + } +} \ No newline at end of file