mirror of
https://github.com/riegera2412/UVtools.git
synced 2026-08-01 21:32:18 +02:00
* (Add) Auto-updater: When a new version is detected UVtools still show the same green button at top, on click, it will prompt for auto or manual update. On Linux and Mac the script will kill all UVtools instances and auto-upgrade. On Windows the user must close all instances and continue with the shown MSI installation * (Add) Tool profiles: Create and remove named presets for some tools * (Add) Event handler for handling non-UI thread exceptions * (Fix) Mac: File - Open in a new window was not working * (Fix) Tool - Rotate: Allow negative angles * (Fix) Tool - Rotate: The operation was inverting the angle * (Fix) Tools: Select normal layers can crash the program with small files with low layer count, eg: 3 layers total
210 lines
7.1 KiB
C#
210 lines
7.1 KiB
C#
/*
|
|
* GNU AFFERO GENERAL PUBLIC LICENSE
|
|
* Version 3, 19 November 2007
|
|
* Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
|
* 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<IAssetLoader>().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
|
|
}
|
|
}
|