feat: Update package references and enhance AI extraction service with CSV output functionality

This commit is contained in:
Maddo 2026-05-24 17:29:05 +02:00
commit af74c90ce7
12 changed files with 400 additions and 153 deletions

View file

@ -17,6 +17,7 @@ public partial class AvaloniaMainWindow : Window
private readonly DataModel _model;
private readonly PickerPreferenceService _pickerPreferenceService;
private bool _isDarkTheme;
private bool _startupSettingsRestoreAttempted;
public AvaloniaMainWindow(DataModel model)
{
@ -26,7 +27,11 @@ public partial class AvaloniaMainWindow : Window
_pickerPreferenceService = Program.ServiceProvider.GetRequiredService<PickerPreferenceService>();
DataContext = _model;
Opened += (_, _) => SyncThemeStateFromCurrentTheme();
Opened += async (_, _) =>
{
SyncThemeStateFromCurrentTheme();
await TryLoadLastSettingsOnStartupAsync();
};
Closing += AvaloniaMainWindow_Closing;
// Let DataModel marshal callbacks onto Avalonia UI thread.
@ -120,30 +125,38 @@ public partial class AvaloniaMainWindow : Window
_model.SaveSettingsRequested += async (_, _) =>
{
var suggestedStartLocation = await _pickerPreferenceService.TryGetStartFolderAsync(StorageProvider, PickerPreferenceKeys.SettingsFile);
var file = await StorageProvider.SaveFilePickerAsync(new FilePickerSaveOptions
{
Title = "Salva impostazioni",
DefaultExtension = "xml",
FileTypeChoices = [new FilePickerFileType("Setup") { Patterns = ["*.xml"] }]
FileTypeChoices = [new FilePickerFileType("Setup") { Patterns = ["*.xml"] }],
SuggestedStartLocation = suggestedStartLocation
});
if (file is not null)
{
await _model.SaveSettingsToFileAsync(file.Path.LocalPath);
_pickerPreferenceService.RememberPath(PickerPreferenceKeys.SettingsFile, file.Path.LocalPath);
_pickerPreferenceService.RememberValue(PickerPreferenceKeys.LastSettingsFile, file.Path.LocalPath);
}
};
_model.LoadSettingsRequested += async (_, _) =>
{
var suggestedStartLocation = await _pickerPreferenceService.TryGetStartFolderAsync(StorageProvider, PickerPreferenceKeys.SettingsFile);
var files = await StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions
{
Title = "Carica impostazioni",
FileTypeFilter = [new FilePickerFileType("Setup") { Patterns = ["*.xml"] }]
FileTypeFilter = [new FilePickerFileType("Setup") { Patterns = ["*.xml"] }],
SuggestedStartLocation = suggestedStartLocation
});
if (files.Count > 0)
{
await _model.LoadSettingsFromFileAsync(files[0].Path.LocalPath);
_pickerPreferenceService.RememberPath(PickerPreferenceKeys.SettingsFile, files[0].Path.LocalPath);
_pickerPreferenceService.RememberValue(PickerPreferenceKeys.LastSettingsFile, files[0].Path.LocalPath);
}
};
@ -165,6 +178,38 @@ public partial class AvaloniaMainWindow : Window
private bool _isStoppingFaceEncoderForClose;
private async Task TryLoadLastSettingsOnStartupAsync()
{
if (_startupSettingsRestoreAttempted)
{
return;
}
_startupSettingsRestoreAttempted = true;
var lastSettingsFile = _pickerPreferenceService.GetRememberedValue(PickerPreferenceKeys.LastSettingsFile);
if (string.IsNullOrWhiteSpace(lastSettingsFile))
{
return;
}
if (!File.Exists(lastSettingsFile))
{
_pickerPreferenceService.ForgetValue(PickerPreferenceKeys.LastSettingsFile);
return;
}
try
{
await _model.LoadSettingsFromFileAsync(lastSettingsFile);
_pickerPreferenceService.RememberPath(PickerPreferenceKeys.SettingsFile, lastSettingsFile);
}
catch (Exception ex)
{
await ShowMessageDialogAsync("Impostazioni", $"Impossibile caricare il file impostazioni automatico:\n{ex.GetBaseException().Message}");
}
}
private async void AvaloniaMainWindow_Closing(object? sender, CancelEventArgs e)
{
if (_isStoppingFaceEncoderForClose || (!_model.IsFaceEncoderRunning && !_model.IsFaceMatcherRunning))