/*
* GNU AFFERO GENERAL PUBLIC LICENSE
* Version 3, 19 November 2007
* Copyright (C) 2007 Free Software Foundation, Inc.
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
using System;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Threading;
using Avalonia;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Markup.Xaml;
using Avalonia.Media.Imaging;
using Avalonia.Platform;
using Avalonia.ThemeManager;
using Emgu.CV;
using UVtools.Core;
using UVtools.Core.FileFormats;
using UVtools.Core.Operations;
using UVtools.WPF.Extensions;
using UVtools.WPF.Structures;
namespace UVtools.WPF
{
public class App : Application
{
public static IThemeSelector? ThemeSelector { get; set; }
public static MainWindow MainWindow;
public static FileFormat SlicerFile = null;
public static AppVersionChecker VersionChecker { get; } = new AppVersionChecker();
public override void Initialize()
{
AvaloniaXamlLoader.Load(this);
}
public override async void OnFrameworkInitializationCompleted()
{
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;
CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.InvariantCulture;
UserSettings.Load();
UserSettings.SetVersion();
OperationProfiles.Load();
ThemeSelector = Avalonia.ThemeManager.ThemeSelector.Create(Path.Combine(ApplicationPath, "Assets", "Themes"));
ThemeSelector.LoadSelectedTheme(Path.Combine(UserSettings.SettingsFolder, "selected.theme"));
if (ThemeSelector.SelectedTheme.Name == "UVtoolsDark" || ThemeSelector.SelectedTheme.Name == "Light")
{
foreach (var theme in ThemeSelector.Themes)
{
if (theme.Name != "UVtoolsLight") continue;
theme.ApplyTheme();
break;
}
}
MainWindow = new MainWindow();
try
{
CvInvoke.CheckLibraryLoaded();
}
catch (Exception e)
{
await MainWindow.MessageBoxError("UVtools can not run due lack of dependencies from cvextern/OpenCV\n" +
"Please build or install this dependencies in order to run UVtools\n" +
"Check manual or page at 'Requirements' section for help\n\n" +
"Additional information:\n" +
$"{e}", "UVtools can not run");
return;
}
desktop.MainWindow = MainWindow;
desktop.Exit += (sender, e)
=> ThemeSelector.SaveSelectedTheme(Path.Combine(UserSettings.SettingsFolder, "selected.theme"));
}
base.OnFrameworkInitializationCompleted();
}
#region Utilities
public static string AppExecutable = Path.Combine(ApplicationPath, About.Software);
public static string AppExecutableQuoted = $"\"{AppExecutable}\"";
public static void NewInstance(string filePath)
{
try
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
StartProcess($"{AppExecutable}.exe", $"\"{filePath}\"");
}
else if(File.Exists(AppExecutable)) // Direct execute
{
StartProcess(AppExecutable, $"\"{filePath}\"");
}
else
{
StartProcess("dotnet", $"UVtools.dll \"{filePath}\"");
}
}
catch (Exception e)
{
Debug.WriteLine(e);
}
}
public static void OpenBrowser(string url)
{
try
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
Process.Start(new ProcessStartInfo(url) { UseShellExecute = true }).Dispose();
}
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
Process.Start("xdg-open", url).Dispose();
}
else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
{
Process.Start("open", url).Dispose();
}
else
{
// throw
}
}
catch (Exception e)
{
Debug.WriteLine(e);
}
}
public static void StartProcess(string name, string arguments = null)
{
try
{
using (Process.Start(new ProcessStartInfo(name, arguments)
{
UseShellExecute = true
})) { }
}
catch (Exception e)
{
Debug.WriteLine(e);
}
}
public static Stream GetAsset(string url)
{
Uri uri;
// Allow for assembly overrides
if (url.StartsWith("avares://"))
{
uri = new Uri(url);
}
else
{
var assemblyName = Assembly.GetEntryAssembly().GetName().Name;
uri = new Uri($"avares://{assemblyName}{url}");
}
var res = AvaloniaLocator.Current.GetService().Open(uri);
return res;
}
public static Bitmap GetBitmapFromAsset(string url) => new Bitmap(GetAsset(url));
public static string ApplicationPath => Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
public static string GetPrusaSlicerDirectory()
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
return $"{Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)}{Path.DirectorySeparatorChar}PrusaSlicer";
}
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
return $"{Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)}{Path.DirectorySeparatorChar}.PrusaSlicer";
}
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
{
return string.Format("{0}{1}Library{1}Application Support{1}PrusaSlicer",
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), Path.DirectorySeparatorChar);
}
return null;
}
#endregion
}
}