Refactor thumbnail options to enum and ComboBox UI

Replaced multiple mutually-exclusive boolean properties for thumbnail text options with a single enum (`ThumbnailOption`) in the data model. Updated WinForms UI to use a ComboBox instead of radio buttons for selecting thumbnail mode. Adjusted designer, mapping profile, settings DTO, and settings service for enum support and backward compatibility. Simplified thumbnail generation logic and improved maintainability by ensuring only one mode can be selected at a time.
This commit is contained in:
MaddoScientisto 2026-02-16 19:55:37 +01:00
commit d13ec8abdf
7 changed files with 214 additions and 289 deletions

View file

@ -960,22 +960,16 @@ namespace ImageCatalog_2
private bool _addTimeToThumbnails;
public bool AddTimeToThumbnails
{
get => _addTimeToThumbnails;
get => _thumbnailOption == ThumbnailOptionEnum.Time;
set
{
if (_addTimeToThumbnails == value) return;
_addTimeToThumbnails = value;
if (value)
{
// ensure mutually exclusive choices
_addTextToThumbnails = false;
_showPhotoNumber = false;
_addNumberAndTimeToThumbnails = false;
_addRaceTimeToThumbnails = false;
NotifyPropertyChanged(nameof(AddTextToThumbnails));
NotifyPropertyChanged(nameof(ShowPhotoNumber));
NotifyPropertyChanged(nameof(AddNumberAndTimeToThumbnails));
NotifyPropertyChanged(nameof(AddRaceTimeToThumbnails));
ThumbnailOption = ThumbnailOptionEnum.Time;
}
else if (_thumbnailOption == ThumbnailOptionEnum.Time)
{
ThumbnailOption = ThumbnailOptionEnum.None;
}
NotifyPropertyChanged();
}
@ -984,10 +978,13 @@ namespace ImageCatalog_2
private bool _showFileNameOnThumbnails;
public bool ShowFileNameOnThumbnails
{
get => _showFileNameOnThumbnails;
get => _thumbnailOption == ThumbnailOptionEnum.FileName;
set
{
_showFileNameOnThumbnails = value;
if (value)
ThumbnailOption = ThumbnailOptionEnum.FileName;
else if (_thumbnailOption == ThumbnailOptionEnum.FileName)
ThumbnailOption = ThumbnailOptionEnum.None;
NotifyPropertyChanged();
}
}
@ -1028,23 +1025,13 @@ namespace ImageCatalog_2
private bool _addTextToThumbnails;
public bool AddTextToThumbnails
{
get => _addTextToThumbnails;
get => _thumbnailOption == ThumbnailOptionEnum.Text;
set
{
if (_addTextToThumbnails == value) return;
_addTextToThumbnails = value;
if (value)
{
// ensure mutually exclusive choices
_addTimeToThumbnails = false;
_showPhotoNumber = false;
_addNumberAndTimeToThumbnails = false;
_addRaceTimeToThumbnails = false;
NotifyPropertyChanged(nameof(AddTimeToThumbnails));
NotifyPropertyChanged(nameof(ShowPhotoNumber));
NotifyPropertyChanged(nameof(AddNumberAndTimeToThumbnails));
NotifyPropertyChanged(nameof(AddRaceTimeToThumbnails));
}
ThumbnailOption = ThumbnailOptionEnum.Text;
else if (_thumbnailOption == ThumbnailOptionEnum.Text)
ThumbnailOption = ThumbnailOptionEnum.None;
NotifyPropertyChanged();
}
}
@ -1052,23 +1039,13 @@ namespace ImageCatalog_2
private bool _addRaceTimeToThumbnails;
public bool AddRaceTimeToThumbnails
{
get => _addRaceTimeToThumbnails;
get => _thumbnailOption == ThumbnailOptionEnum.RaceTime;
set
{
if (_addRaceTimeToThumbnails == value) return;
_addRaceTimeToThumbnails = value;
if (value)
{
// ensure mutually exclusive choices
_addTimeToThumbnails = false;
_addTextToThumbnails = false;
_showPhotoNumber = false;
_addNumberAndTimeToThumbnails = false;
NotifyPropertyChanged(nameof(AddTimeToThumbnails));
NotifyPropertyChanged(nameof(AddTextToThumbnails));
NotifyPropertyChanged(nameof(ShowPhotoNumber));
NotifyPropertyChanged(nameof(AddNumberAndTimeToThumbnails));
}
ThumbnailOption = ThumbnailOptionEnum.RaceTime;
else if (_thumbnailOption == ThumbnailOptionEnum.RaceTime)
ThumbnailOption = ThumbnailOptionEnum.None;
NotifyPropertyChanged();
}
}
@ -1076,23 +1053,59 @@ namespace ImageCatalog_2
private bool _addNumberAndTimeToThumbnails;
public bool AddNumberAndTimeToThumbnails
{
get => _addNumberAndTimeToThumbnails;
get => _thumbnailOption == ThumbnailOptionEnum.FileNameAndTime;
set
{
if (_addNumberAndTimeToThumbnails == value) return;
_addNumberAndTimeToThumbnails = value;
if (value)
{
// ensure mutually exclusive choices
_addTimeToThumbnails = false;
_addTextToThumbnails = false;
_showPhotoNumber = false;
_addRaceTimeToThumbnails = false;
NotifyPropertyChanged(nameof(AddTimeToThumbnails));
NotifyPropertyChanged(nameof(AddTextToThumbnails));
NotifyPropertyChanged(nameof(ShowPhotoNumber));
NotifyPropertyChanged(nameof(AddRaceTimeToThumbnails));
}
ThumbnailOption = ThumbnailOptionEnum.FileNameAndTime;
else if (_thumbnailOption == ThumbnailOptionEnum.FileNameAndTime)
ThumbnailOption = ThumbnailOptionEnum.None;
NotifyPropertyChanged();
}
}
// New enum and authoritative property for thumbnail selection
public enum ThumbnailOptionEnum
{
None = 0,
Text = 1,
FileName = 2,
Time = 3,
FileNameAndTime = 4,
RaceTime = 5
}
private ThumbnailOptionEnum _thumbnailOption = ThumbnailOptionEnum.None;
// Name matches DTO property so SettingsService mapping works
public ThumbnailOptionEnum ThumbnailOption
{
get => _thumbnailOption;
set
{
if (_thumbnailOption == value) return;
_thumbnailOption = value;
// Notify all dependent properties so UI updates
NotifyPropertyChanged();
NotifyPropertyChanged(nameof(AddTextToThumbnails));
NotifyPropertyChanged(nameof(AddTimeToThumbnails));
NotifyPropertyChanged(nameof(ShowPhotoNumber));
NotifyPropertyChanged(nameof(AddNumberAndTimeToThumbnails));
NotifyPropertyChanged(nameof(AddRaceTimeToThumbnails));
NotifyPropertyChanged(nameof(ShowFileNameOnThumbnails));
NotifyPropertyChanged(nameof(ThumbnailMode));
}
}
// Helper int property to bind ComboBox SelectedIndex in the WinForms designer
public int ThumbnailOptionIndex
{
get => (int)ThumbnailOption;
set
{
var opt = (ThumbnailOptionEnum)value;
if (opt == ThumbnailOption) return;
ThumbnailOption = opt;
NotifyPropertyChanged();
}
}
@ -1103,52 +1116,40 @@ namespace ImageCatalog_2
{
get
{
if (AddTextToThumbnails) return "Text";
if (AddTimeToThumbnails) return "Time";
if (ShowPhotoNumber) return "Number";
if (AddNumberAndTimeToThumbnails) return "NumberAndTime";
if (AddRaceTimeToThumbnails) return "RaceTime";
return "None";
return _thumbnailOption switch
{
ThumbnailOptionEnum.Text => "Text",
ThumbnailOptionEnum.Time => "Time",
ThumbnailOptionEnum.FileName => "Number",
ThumbnailOptionEnum.FileNameAndTime => "NumberAndTime",
ThumbnailOptionEnum.RaceTime => "RaceTime",
_ => "None",
};
}
set
{
var current = ThumbnailMode;
if (string.Equals(current, value, StringComparison.OrdinalIgnoreCase)) return;
// Set the boolean flags via their public setters so mutual-exclusion logic runs
// Map incoming string to enum and set the authoritative property
switch ((value ?? string.Empty).ToLowerInvariant())
{
case "text":
AddTextToThumbnails = true;
ThumbnailOption = ThumbnailOptionEnum.Text;
break;
case "time":
AddTimeToThumbnails = true;
ThumbnailOption = ThumbnailOptionEnum.Time;
break;
case "number":
ShowPhotoNumber = true;
ThumbnailOption = ThumbnailOptionEnum.FileName;
break;
case "numberandtime":
AddNumberAndTimeToThumbnails = true;
ThumbnailOption = ThumbnailOptionEnum.FileNameAndTime;
break;
case "racetime":
AddRaceTimeToThumbnails = true;
ThumbnailOption = ThumbnailOptionEnum.RaceTime;
break;
default:
// clear all
_addTimeToThumbnails = false;
_addTextToThumbnails = false;
_showPhotoNumber = false;
_addRaceTimeToThumbnails = false;
_addNumberAndTimeToThumbnails = false;
NotifyPropertyChanged(nameof(AddTimeToThumbnails));
NotifyPropertyChanged(nameof(AddTextToThumbnails));
NotifyPropertyChanged(nameof(ShowPhotoNumber));
NotifyPropertyChanged(nameof(AddRaceTimeToThumbnails));
NotifyPropertyChanged(nameof(AddNumberAndTimeToThumbnails));
ThumbnailOption = ThumbnailOptionEnum.None;
break;
}
NotifyPropertyChanged(nameof(ThumbnailMode));
}
}