mirror of
https://github.com/riegera2412/UVtools.git
synced 2026-08-01 21:32:18 +02:00
* (Add) RAM usage on title bar * (Add) Clipboard manager: Undo (Ctrl + Z) and Redo (Ctrl + Y) modifications (Memory optimized) * (Add) Current layer properties on information tab * (Fix) Long windows with system zoom bigger than 100% were being hidden and overflow (#90) * (Fix) Do not recompute issues nor properties nor reshow layer if operation is cancelled or failed
293 lines
10 KiB
C#
293 lines
10 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.Linq;
|
|
using System.Reflection;
|
|
using System.Runtime.InteropServices;
|
|
using System.Threading;
|
|
using Avalonia;
|
|
using Avalonia.Controls;
|
|
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
|
|
|
|
#region Assembly Attribute Accessors
|
|
|
|
public static Version Version => Assembly.GetExecutingAssembly().GetName().Version;
|
|
public static string VersionStr => Version.ToString(3);
|
|
|
|
public static string AssemblyTitle
|
|
{
|
|
get
|
|
{
|
|
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false);
|
|
if (attributes.Length > 0)
|
|
{
|
|
AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0];
|
|
if (titleAttribute.Title != "")
|
|
{
|
|
return titleAttribute.Title;
|
|
}
|
|
}
|
|
return System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase);
|
|
}
|
|
}
|
|
|
|
public static string AssemblyVersion => Assembly.GetExecutingAssembly().GetName().Version.ToString();
|
|
|
|
public static string AssemblyDescription
|
|
{
|
|
get
|
|
{
|
|
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false);
|
|
if (attributes.Length == 0)
|
|
{
|
|
return "";
|
|
}
|
|
|
|
string description = ((AssemblyDescriptionAttribute)attributes[0]).Description + $"{Environment.NewLine}{Environment.NewLine}Available File Formats:";
|
|
|
|
return FileFormat.AvaliableFormats.SelectMany(fileFormat => fileFormat.FileExtensions).Aggregate(description, (current, fileExtension) => current + $"{Environment.NewLine}- {fileExtension.Description} (.{fileExtension.Extension})");
|
|
}
|
|
}
|
|
|
|
public static string AssemblyProduct
|
|
{
|
|
get
|
|
{
|
|
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false);
|
|
if (attributes.Length == 0)
|
|
{
|
|
return "";
|
|
}
|
|
return ((AssemblyProductAttribute)attributes[0]).Product;
|
|
}
|
|
}
|
|
|
|
public static string AssemblyCopyright
|
|
{
|
|
get
|
|
{
|
|
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false);
|
|
if (attributes.Length == 0)
|
|
{
|
|
return "";
|
|
}
|
|
return ((AssemblyCopyrightAttribute)attributes[0]).Copyright;
|
|
}
|
|
}
|
|
|
|
public static string AssemblyCompany
|
|
{
|
|
get
|
|
{
|
|
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false);
|
|
if (attributes.Length == 0)
|
|
{
|
|
return "";
|
|
}
|
|
return ((AssemblyCompanyAttribute)attributes[0]).Company;
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|