Add selectable image library option and refactor processing
Introduce UI option to choose between System.Graphics and ImageSharp for image processing. Update DataModel and MainForm for robust binding and synchronization. Rewrite ImageCreatorAlternate to use ImageSharp for core operations and GDI+ for overlays. Remove test buttons, add radio group for library selection. Update project dependencies to support new features and modernize image handling.
This commit is contained in:
parent
e48c0d266b
commit
63751af18d
7 changed files with 474 additions and 62 deletions
|
|
@ -18,7 +18,6 @@ using ImageCatalog_2.Commands;
|
|||
using ImageCatalog_2.Services;
|
||||
using MaddoShared;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace ImageCatalog;
|
||||
|
||||
|
|
@ -30,6 +29,8 @@ public partial class MainForm
|
|||
|
||||
private readonly ParametriSetup _parametriSetup;
|
||||
private readonly PicSettings _picSettings;
|
||||
// Prevent re-entrant updates between UI events and model PropertyChanged handling
|
||||
private bool _suppressRadioUpdates = false;
|
||||
|
||||
public MainForm(DataModel model, ImageCreationStuff imageCreationStuff, PicSettings picSettings,
|
||||
ParametriSetup parametriSetup, ILogger<MainForm> logger)
|
||||
|
|
@ -42,11 +43,44 @@ public partial class MainForm
|
|||
_logger.LogDebug("Start");
|
||||
|
||||
InitializeComponent();
|
||||
|
||||
// Set this form as the control for thread marshalling in the DataModel
|
||||
Model.SetControl(this);
|
||||
|
||||
BindControls();
|
||||
// Set this form as the control for thread marshalling in the DataModel
|
||||
Model.SetControl(this);
|
||||
|
||||
// Ensure the designer data bindings have a concrete DataSource immediately so
|
||||
// that UI controls (radio buttons) reflect the ViewModel state and propagate
|
||||
// user changes back to the ViewModel.
|
||||
bindingSource1.DataSource = Model;
|
||||
|
||||
BindControls();
|
||||
|
||||
// The designer originally bound the radio buttons to boolean helpers on the ViewModel.
|
||||
// Those two separate bindings can fight with each other. Clear designer bindings and
|
||||
// wire explicit Click handlers that update the single authoritative property
|
||||
// `Model.ImageLibrary`. Also keep a PropertyChanged listener to reflect external
|
||||
// changes back into the radio buttons.
|
||||
rdbLibrary1.DataBindings.Clear();
|
||||
rdbLibrary2.DataBindings.Clear();
|
||||
|
||||
// Initialize radio state from model
|
||||
rdbLibrary1.Checked = Model.UseSystemGraphics;
|
||||
rdbLibrary2.Checked = Model.UseImageSharp;
|
||||
|
||||
// Use Click handlers (not CheckedChanged) to avoid competing binding updates
|
||||
rdbLibrary1.Click += (_, _) =>
|
||||
{
|
||||
if (_suppressRadioUpdates) return;
|
||||
if (Model.ImageLibrary != "System.Graphics")
|
||||
Model.ImageLibrary = "System.Graphics";
|
||||
};
|
||||
rdbLibrary2.Click += (_, _) =>
|
||||
{
|
||||
if (_suppressRadioUpdates) return;
|
||||
if (Model.ImageLibrary != "ImageSharp")
|
||||
Model.ImageLibrary = "ImageSharp";
|
||||
};
|
||||
|
||||
// Watch for model changes so we can reflect external updates
|
||||
Model.PropertyChanged += Model_PropertyChanged;
|
||||
|
||||
// Save user preferences on form close instead of immediately when dialogs are used
|
||||
this.FormClosing += MainForm_FormClosing;
|
||||
|
|
@ -58,17 +92,56 @@ public partial class MainForm
|
|||
// Version label is data-bound to DataModel.AppVersion; DataModel is populated with the version via DI
|
||||
}
|
||||
|
||||
protected void BindControls()
|
||||
private void RdbLibrary_CheckedChanged(object? sender, EventArgs e)
|
||||
{
|
||||
// Bind buttons to ViewModel commands using command binding
|
||||
_btnCreaCatalogoAsync.BindCommand(Model.ProcessImagesCommand);
|
||||
button1.BindCommand(Model.ProcessImagesCommand);
|
||||
_Button2.BindCommand(Model.SelectSourceFolderCommand);
|
||||
_Button3.BindCommand(Model.SelectDestinationFolderCommand);
|
||||
_Button4.BindCommand(Model.SelectLogoFileCommand);
|
||||
_Button5.BindCommand(Model.SaveSettingsCommand);
|
||||
_Button6.BindCommand(Model.LoadSettingsCommand);
|
||||
_Button8.BindCommand(Model.SelectColorCommand);
|
||||
// Keep behavior simple: when a radio button becomes checked, update the ViewModel
|
||||
// so that the designer binding and PicSettings stay in sync.
|
||||
if (sender is RadioButton rb && rb.Checked)
|
||||
{
|
||||
_logger?.LogDebug("Radio library changed: {RadioName}", rb.Name);
|
||||
if (rb == rdbLibrary2)
|
||||
{
|
||||
Model.ImageLibrary = "ImageSharp";
|
||||
}
|
||||
else if (rb == rdbLibrary1)
|
||||
{
|
||||
Model.ImageLibrary = "System.Graphics";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void Model_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)
|
||||
{
|
||||
if (e.PropertyName is null) return;
|
||||
if (e.PropertyName == nameof(Model.ImageLibrary) || e.PropertyName == nameof(Model.UseImageSharp) || e.PropertyName == nameof(Model.UseSystemGraphics))
|
||||
{
|
||||
_logger?.LogDebug("Model property changed: {Property} => ImageLibrary={ImageLibrary}, PicSettings.Provider={Provider}", e.PropertyName, Model.ImageLibrary, _picSettings.ImageCreatorProvider);
|
||||
|
||||
// Reflect authoritative model value into the radio buttons in a thread-safe, re-entrancy-safe way
|
||||
try
|
||||
{
|
||||
_suppressRadioUpdates = true;
|
||||
rdbLibrary1.Checked = Model.UseSystemGraphics;
|
||||
rdbLibrary2.Checked = Model.UseImageSharp;
|
||||
}
|
||||
finally
|
||||
{
|
||||
_suppressRadioUpdates = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void BindControls()
|
||||
{
|
||||
// Bind buttons to ViewModel commands using command binding
|
||||
_btnCreaCatalogoAsync.BindCommand(Model.ProcessImagesCommand);
|
||||
// Note: `button1` control does not exist in the designer. Use the primary create button only.
|
||||
_Button2.BindCommand(Model.SelectSourceFolderCommand);
|
||||
_Button3.BindCommand(Model.SelectDestinationFolderCommand);
|
||||
_Button4.BindCommand(Model.SelectLogoFileCommand);
|
||||
_Button5.BindCommand(Model.SaveSettingsCommand);
|
||||
_Button6.BindCommand(Model.LoadSettingsCommand);
|
||||
_Button8.BindCommand(Model.SelectColorCommand);
|
||||
|
||||
// Subscribe to ViewModel events for UI dialogs (these need UI context)
|
||||
Model.SelectSourceFolderRequested += OnSelectSourceFolderRequested;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue