/*
* 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.FileFormats;
using UVtools.WPF.Extensions;
namespace UVtools.WPF
{
public class App : Application
{
public static IThemeSelector? ThemeSelector { get; set; }
public static MainWindow MainWindow;
public static FileFormat SlicerFile = null;
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();
ThemeSelector = Avalonia.ThemeManager.ThemeSelector.Create("Assets/Themes");
ThemeSelector.LoadSelectedTheme("Assets/selected.theme");
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("Assets/selected.theme");
}
base.OnFrameworkInitializationCompleted();
}
#region Utilities
public static void NewInstance(string filePath)
{
try
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
var info = new ProcessStartInfo("UVtools.exe", $"\"{filePath}\"")
{
UseShellExecute = true
};
Process.Start(info).Dispose();
}
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
Process.Start("dotnet", $"UVtools.dll \"{filePath}\"").Dispose();
}
}
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)
{
try
{
using (Process.Start(new ProcessStartInfo(name)
{
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 GetApplicationPath()
{
return 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
}
}