diff --git a/Source/LibationAvalonia/App.axaml.cs b/Source/LibationAvalonia/App.axaml.cs index f02085c6..bffcebcc 100644 --- a/Source/LibationAvalonia/App.axaml.cs +++ b/Source/LibationAvalonia/App.axaml.cs @@ -11,11 +11,15 @@ using System.Threading.Tasks; using System.Collections.Generic; using System.IO; using ApplicationServices; +using Dinah.Core; namespace LibationAvalonia { public class App : Application { + public static bool IsWindows => PlatformID is PlatformID.Win32NT; + public static bool IsUnix => PlatformID is PlatformID.Unix; + public static readonly PlatformID PlatformID = Environment.OSVersion.Platform; public static IBrush ProcessQueueBookFailedBrush { get; private set; } public static IBrush ProcessQueueBookCompletedBrush { get; private set; } @@ -30,6 +34,30 @@ namespace LibationAvalonia => AssetLoader.Open(new Uri(AssetUriBase, assetRelativePath)); + public static bool GoToFile(string path) + => PlatformID is PlatformID.Win32NT ? Go.To.File(path) + : GoToFolder(path is null ? string.Empty : Path.GetDirectoryName(path)); + + public static bool GoToFolder(string path) + { + if (PlatformID is PlatformID.Win32NT) + return Go.To.Folder(path); + else + { + var startInfo = new System.Diagnostics.ProcessStartInfo() + { + FileName = "/bin/xdg-open", + Arguments = path is null ? string.Empty : $"\"{System.IO.Path.GetDirectoryName(path)}\"", + UseShellExecute = false, //Import in Linux environments + CreateNoWindow = false, + RedirectStandardOutput = true, + RedirectStandardError = true + }; + System.Diagnostics.Process.Start(startInfo); + return true; + } + } + public override void Initialize() { AvaloniaXamlLoader.Load(this); @@ -162,6 +190,7 @@ namespace LibationAvalonia // if 'new user' was clicked, or if 'returning user' chose new install: show basic settings dialog config.Books ??= Path.Combine(Configuration.UserProfile, "Books"); + AppScaffolding.LibationScaffolding.PopulateMissingConfigValues(config); return new SettingsDialog().ShowDialogSynchronously(setupDialog) == DialogResult.OK && config.LibationSettingsAreValid; } diff --git a/Source/LibationAvalonia/Dialogs/ImageDisplayDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/ImageDisplayDialog.axaml.cs index 847abeeb..5ca1722b 100644 --- a/Source/LibationAvalonia/Dialogs/ImageDisplayDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/ImageDisplayDialog.axaml.cs @@ -49,8 +49,11 @@ namespace LibationAvalonia.Dialogs SaveFileDialog saveFileDialog = new(); saveFileDialog.Filters.Add(new FileDialogFilter { Name = "Jpeg", Extensions = new System.Collections.Generic.List() { "jpg" } }); - saveFileDialog.Directory = Directory.Exists(BookSaveDirectory) ? BookSaveDirectory : Path.GetDirectoryName(BookSaveDirectory); saveFileDialog.InitialFileName = PictureFileName; + saveFileDialog.Directory + = App.IsUnix ? null + : Directory.Exists(BookSaveDirectory) ? BookSaveDirectory + : Path.GetDirectoryName(BookSaveDirectory); var fileName = await saveFileDialog.ShowAsync(this); diff --git a/Source/LibationAvalonia/Dialogs/MessageBoxAlertAdminDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/MessageBoxAlertAdminDialog.axaml.cs index 6de5f6bd..b2524f0e 100644 --- a/Source/LibationAvalonia/Dialogs/MessageBoxAlertAdminDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/MessageBoxAlertAdminDialog.axaml.cs @@ -52,7 +52,7 @@ namespace LibationAvalonia.Dialogs try { - Go.To.Folder(dir.ShortPathName); + App.GoToFolder(dir.ShortPathName); } catch { diff --git a/Source/LibationAvalonia/Dialogs/SettingsDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/SettingsDialog.axaml.cs index 369f7491..a961bdc1 100644 --- a/Source/LibationAvalonia/Dialogs/SettingsDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/SettingsDialog.axaml.cs @@ -45,7 +45,7 @@ namespace LibationAvalonia.Dialogs public void OpenLogFolderButton_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e) { - Go.To.Folder(((LongPath)Configuration.Instance.LibationFiles).ShortPathName); + App.GoToFolder(((LongPath)Configuration.Instance.LibationFiles).ShortPathName); } public async void EditFolderTemplateButton_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e) diff --git a/Source/LibationAvalonia/MessageBox.cs b/Source/LibationAvalonia/MessageBox.cs index 0ad54af9..3d25be05 100644 --- a/Source/LibationAvalonia/MessageBox.cs +++ b/Source/LibationAvalonia/MessageBox.cs @@ -150,6 +150,8 @@ Libation. private static DialogResult ShowCoreAsync(Window owner, string message, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton, bool saveAndRestorePosition = true) { + owner ??= (Application.Current.ApplicationLifetime as IClassicDesktopStyleApplicationLifetime).MainWindow; + var dialog = new MessageBoxWindow(saveAndRestorePosition); dialog.HideMinMaxBtns(); @@ -164,7 +166,7 @@ Libation. tbx.MinWidth = vm.TextBlockMinWidth; tbx.Text = message; - var thisScreen = (owner ?? dialog).Screens.ScreenFromVisual(owner ?? dialog); + var thisScreen = owner.Screens.ScreenFromVisual(owner); var maxSize = new Size(0.20 * thisScreen.Bounds.Width, 0.9 * thisScreen.Bounds.Height - 55); diff --git a/Source/LibationAvalonia/Views/MainWindow/MainWindow.ProcessQueue.axaml.cs b/Source/LibationAvalonia/Views/MainWindow/MainWindow.ProcessQueue.axaml.cs index fb1a167e..71d77635 100644 --- a/Source/LibationAvalonia/Views/MainWindow/MainWindow.ProcessQueue.axaml.cs +++ b/Source/LibationAvalonia/Views/MainWindow/MainWindow.ProcessQueue.axaml.cs @@ -35,7 +35,8 @@ namespace LibationAvalonia.Views { // liberated: open explorer to file var filePath = AudibleFileStorage.Audio.GetPath(libraryBook.Book.AudibleProductId); - if (!Go.To.File(filePath?.ShortPathName)) + + if (!App.GoToFile(filePath?.ShortPathName)) { var suffix = string.IsNullOrWhiteSpace(filePath) ? "" : $":\r\n{filePath}"; MessageBox.Show($"File not found" + suffix);