Catalog/CatalogLite/MainWindow.axaml.cs
Maddo e9142df97c
Some checks failed
Build Windows Avalonia / build (push) Failing after 1m48s
Release Windows Avalonia / build (push) Failing after 1m41s
Release Windows Avalonia / release (push) Has been skipped
feat: Enhance Face AI upload functionality and UI
- Updated MainWindow.axaml to increase height and add new UI elements for SSH upload configuration.
- Implemented commands for opening source and destination paths in file explorer.
- Added FaceUploadPath and SSH configuration properties to DataModel and AiSettingsViewModel.
- Introduced validation for FaceUploadPath format and commands for uploading face encoder output.
- Enhanced PickerPreferenceService to manage SSH credentials and upload preferences.
- Updated settings persistence to include FaceUploadPath and SSH preferences.
- Added tests for FaceUploadPath validation and upload command enabling logic.
2026-06-06 11:54:21 +02:00

153 lines
No EOL
4.5 KiB
C#

using Avalonia.Controls;
using Avalonia.Platform.Storage;
using Avalonia.Threading;
using Microsoft.Extensions.DependencyInjection;
using System.Diagnostics;
using System.IO;
namespace CatalogLite;
public partial class MainWindow : Window
{
private readonly LiteCatalogViewModel _viewModel;
public MainWindow()
: this(Program.ServiceProvider.GetRequiredService<LiteCatalogViewModel>())
{
}
public MainWindow(LiteCatalogViewModel viewModel)
{
InitializeComponent();
_viewModel = viewModel;
DataContext = _viewModel;
_viewModel.UiInvoker = action => Dispatcher.UIThread.Invoke(action);
_viewModel.SelectSourceFolderRequested += OnSelectSourceFolderRequested;
_viewModel.SelectDestinationFolderRequested += OnSelectDestinationFolderRequested;
_viewModel.ShowMessageRequested += OnShowMessageRequested;
_viewModel.LoadEmbeddedConfiguration();
}
private async void OnSelectSourceFolderRequested(object? sender, EventArgs e)
{
var folders = await StorageProvider.OpenFolderPickerAsync(new FolderPickerOpenOptions
{
Title = "Seleziona cartella sorgente"
});
if (folders.Count > 0)
{
_viewModel.SourcePath = LiteCatalogViewModel.NormalizeDirectoryPath(folders[0].Path.LocalPath);
}
}
private async void OnSelectDestinationFolderRequested(object? sender, EventArgs e)
{
var folders = await StorageProvider.OpenFolderPickerAsync(new FolderPickerOpenOptions
{
Title = "Seleziona cartella destinazione"
});
if (folders.Count > 0)
{
_viewModel.DestinationPath = LiteCatalogViewModel.NormalizeDirectoryPath(folders[0].Path.LocalPath);
}
}
private void OpenSourcePath_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
{
OpenInExplorer(_viewModel.SourcePath);
}
private void OpenDestinationPath_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
{
OpenInExplorer(_viewModel.DestinationPath);
}
private async void OnShowMessageRequested(object? sender, LiteMessageEventArgs e)
{
await ShowMessageDialogAsync(e.Title, e.Message);
}
private async Task ShowMessageDialogAsync(string title, string message)
{
var closeButton = new Button
{
Content = "OK",
HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Right,
MinWidth = 92
};
var dialog = new Window
{
Title = title,
Width = 420,
Height = 180,
CanResize = false,
WindowStartupLocation = WindowStartupLocation.CenterOwner,
Content = new Border
{
Padding = new Avalonia.Thickness(20),
Child = new StackPanel
{
Spacing = 14,
Children =
{
new TextBlock
{
Text = message,
TextWrapping = Avalonia.Media.TextWrapping.Wrap
},
closeButton
}
}
}
};
closeButton.Click += (_, _) => dialog.Close();
await dialog.ShowDialog(this);
}
private static void OpenInExplorer(string? path)
{
if (string.IsNullOrWhiteSpace(path))
{
return;
}
var normalizedPath = path.Trim().Trim('"');
try
{
if (File.Exists(normalizedPath))
{
Process.Start("explorer.exe", $"/select,\"{normalizedPath}\"");
return;
}
if (Directory.Exists(normalizedPath))
{
Process.Start(new ProcessStartInfo
{
FileName = normalizedPath,
UseShellExecute = true
});
return;
}
var containingDirectory = Path.GetDirectoryName(normalizedPath);
if (!string.IsNullOrWhiteSpace(containingDirectory) && Directory.Exists(containingDirectory))
{
Process.Start(new ProcessStartInfo
{
FileName = containingDirectory,
UseShellExecute = true
});
}
}
catch
{
}
}
}