diff --git a/JavaToCSharpGui/Infrastructure/HostStorageProvider.cs b/JavaToCSharpGui/Infrastructure/HostStorageProvider.cs index f70a1fba..3c8f31c4 100644 --- a/JavaToCSharpGui/Infrastructure/HostStorageProvider.cs +++ b/JavaToCSharpGui/Infrastructure/HostStorageProvider.cs @@ -3,33 +3,44 @@ namespace JavaToCSharpGui.Infrastructure; /// -public class HostStorageProvider : IHostStorageProvider +public class HostStorageProvider(IStorageProvider storageProvider) : IHostStorageProvider { - private readonly IStorageProvider _storageProvider; - - public HostStorageProvider(IStorageProvider storageProvider) => _storageProvider = storageProvider; + /// + public bool CanPickFolder => storageProvider.CanPickFolder; /// - public bool CanPickFolder => _storageProvider.CanPickFolder; + public bool CanOpen => storageProvider.CanOpen; /// - public bool CanOpen => _storageProvider.CanOpen; + public bool CanSave => storageProvider.CanSave; /// public async Task> OpenFilePickerAsync(FilePickerOpenOptions options) { - return await _storageProvider.OpenFilePickerAsync(options); + return await storageProvider.OpenFilePickerAsync(options); } /// public async Task> OpenFolderPickerAsync(FolderPickerOpenOptions options) { - return await _storageProvider.OpenFolderPickerAsync(options); + return await storageProvider.OpenFolderPickerAsync(options); } - + /// public async Task TryGetWellKnownFolderAsync(WellKnownFolder wellKnownFolder) { - return await _storageProvider.TryGetWellKnownFolderAsync(wellKnownFolder); + return await storageProvider.TryGetWellKnownFolderAsync(wellKnownFolder); + } + + /// + public async Task OpenSaveFileDialogAsync(FilePickerSaveOptions options) + { + return await storageProvider.SaveFilePickerAsync(options); + } + + /// + public async Task TryGetFolderFromPathAsync(string path) + { + return await storageProvider.TryGetFolderFromPathAsync(path); } } diff --git a/JavaToCSharpGui/Infrastructure/IHostStorageProvider.cs b/JavaToCSharpGui/Infrastructure/IHostStorageProvider.cs index 6bb0d994..2773e2d8 100644 --- a/JavaToCSharpGui/Infrastructure/IHostStorageProvider.cs +++ b/JavaToCSharpGui/Infrastructure/IHostStorageProvider.cs @@ -17,6 +17,11 @@ public interface IHostStorageProvider /// bool CanOpen { get; } + /// + /// Can the save file picker be opened on the current platform. + /// + bool CanSave { get; } + /// /// Gets the path to a well known folder. /// @@ -37,4 +42,18 @@ public interface IHostStorageProvider /// The file picker configuration. /// A list of selected files. Task> OpenFilePickerAsync(FilePickerOpenOptions options); + + /// + /// Opens the save file picker dialog. + /// + /// The file picker configuration. + /// The selected file. + Task OpenSaveFileDialogAsync(FilePickerSaveOptions options); + + /// + /// Tries to get a folder from a path. + /// + /// The path to the folder. + /// The folder, or null if not found. + Task TryGetFolderFromPathAsync(string path); } diff --git a/JavaToCSharpGui/ViewModels/MainWindowViewModel.cs b/JavaToCSharpGui/ViewModels/MainWindowViewModel.cs index 8b44f406..d167c731 100644 --- a/JavaToCSharpGui/ViewModels/MainWindowViewModel.cs +++ b/JavaToCSharpGui/ViewModels/MainWindowViewModel.cs @@ -324,6 +324,42 @@ private async Task CopyOutput() await _dispatcher.InvokeAsync(() => { ConversionStateLabel = ""; }, DispatcherPriority.Background); } + [RelayCommand] + private async Task SaveOutput() + { + if (_storageProvider?.CanSave is true) + { + IStorageFolder? startLocation = null; + + if (Path.GetDirectoryName(OpenPath) is string dir) + { + startLocation = await _storageProvider.TryGetFolderFromPathAsync(dir); + } + + startLocation ??= await _storageProvider.TryGetWellKnownFolderAsync(WellKnownFolder.Documents); + + var filePickerSaveOptions = new FilePickerSaveOptions + { + SuggestedFileName = Path.GetFileNameWithoutExtension(OpenPath) + ".cs", + SuggestedStartLocation = startLocation, + Title = "Save C# File" + }; + + var result = await _storageProvider.OpenSaveFileDialogAsync(filePickerSaveOptions); + + if (result is not null) + { + await File.WriteAllTextAsync(result.Path.LocalPath, CSharpText); + + ConversionStateLabel = "Saved C# code to file!"; + + await Task.Delay(2000); + + await _dispatcher.InvokeAsync(() => { ConversionStateLabel = ""; }, DispatcherPriority.Background); + } + } + } + [RelayCommand] private static void ForkMeOnGitHub() => Process.Start(new ProcessStartInfo { diff --git a/JavaToCSharpGui/Views/MainWindow.axaml b/JavaToCSharpGui/Views/MainWindow.axaml index 78e318e8..95c3039c 100644 --- a/JavaToCSharpGui/Views/MainWindow.axaml +++ b/JavaToCSharpGui/Views/MainWindow.axaml @@ -93,6 +93,7 @@ +