diff --git a/src/Avalonia/Artemis.UI.Linux/.gitignore b/src/Artemis.UI.Linux/.gitignore similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/.gitignore rename to src/Artemis.UI.Linux/.gitignore diff --git a/src/Avalonia/Artemis.UI.Linux/App.axaml b/src/Artemis.UI.Linux/App.axaml similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/App.axaml rename to src/Artemis.UI.Linux/App.axaml diff --git a/src/Avalonia/Artemis.UI.Linux/App.axaml.cs b/src/Artemis.UI.Linux/App.axaml.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/App.axaml.cs rename to src/Artemis.UI.Linux/App.axaml.cs diff --git a/src/Avalonia/Artemis.UI.Linux/ApplicationStateManager.cs b/src/Artemis.UI.Linux/ApplicationStateManager.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/ApplicationStateManager.cs rename to src/Artemis.UI.Linux/ApplicationStateManager.cs diff --git a/src/Avalonia/Artemis.UI.Linux/Artemis.UI.Linux.csproj b/src/Artemis.UI.Linux/Artemis.UI.Linux.csproj similarity index 90% rename from src/Avalonia/Artemis.UI.Linux/Artemis.UI.Linux.csproj rename to src/Artemis.UI.Linux/Artemis.UI.Linux.csproj index 40039f1d5..fce1bf446 100644 --- a/src/Avalonia/Artemis.UI.Linux/Artemis.UI.Linux.csproj +++ b/src/Artemis.UI.Linux/Artemis.UI.Linux.csproj @@ -4,6 +4,7 @@ net6.0 enable x64 + x64 @@ -18,7 +19,7 @@ - + \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Linux/Assets/avalonia-logo.ico b/src/Artemis.UI.Linux/Assets/avalonia-logo.ico similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/Assets/avalonia-logo.ico rename to src/Artemis.UI.Linux/Assets/avalonia-logo.ico diff --git a/src/Avalonia/Artemis.UI.Linux/Program.cs b/src/Artemis.UI.Linux/Program.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/Program.cs rename to src/Artemis.UI.Linux/Program.cs diff --git a/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxAbsoluteAxis.cs b/src/Artemis.UI.Linux/Providers/Input/LinuxAbsoluteAxis.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxAbsoluteAxis.cs rename to src/Artemis.UI.Linux/Providers/Input/LinuxAbsoluteAxis.cs diff --git a/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputDevice.cs b/src/Artemis.UI.Linux/Providers/Input/LinuxInputDevice.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputDevice.cs rename to src/Artemis.UI.Linux/Providers/Input/LinuxInputDevice.cs diff --git a/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputDeviceFinder.cs b/src/Artemis.UI.Linux/Providers/Input/LinuxInputDeviceFinder.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputDeviceFinder.cs rename to src/Artemis.UI.Linux/Providers/Input/LinuxInputDeviceFinder.cs diff --git a/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputDeviceReader.cs b/src/Artemis.UI.Linux/Providers/Input/LinuxInputDeviceReader.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputDeviceReader.cs rename to src/Artemis.UI.Linux/Providers/Input/LinuxInputDeviceReader.cs diff --git a/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputEventArgs.cs b/src/Artemis.UI.Linux/Providers/Input/LinuxInputEventArgs.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputEventArgs.cs rename to src/Artemis.UI.Linux/Providers/Input/LinuxInputEventArgs.cs diff --git a/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputEventType.cs b/src/Artemis.UI.Linux/Providers/Input/LinuxInputEventType.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputEventType.cs rename to src/Artemis.UI.Linux/Providers/Input/LinuxInputEventType.cs diff --git a/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputProvider.cs b/src/Artemis.UI.Linux/Providers/Input/LinuxInputProvider.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputProvider.cs rename to src/Artemis.UI.Linux/Providers/Input/LinuxInputProvider.cs diff --git a/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxKeyboardKeyCodes.cs b/src/Artemis.UI.Linux/Providers/Input/LinuxKeyboardKeyCodes.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxKeyboardKeyCodes.cs rename to src/Artemis.UI.Linux/Providers/Input/LinuxKeyboardKeyCodes.cs diff --git a/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxRelativeAxis.cs b/src/Artemis.UI.Linux/Providers/Input/LinuxRelativeAxis.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxRelativeAxis.cs rename to src/Artemis.UI.Linux/Providers/Input/LinuxRelativeAxis.cs diff --git a/src/Avalonia/Artemis.UI.Linux/Utilities/InputUtilities.cs b/src/Artemis.UI.Linux/Utilities/InputUtilities.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/Utilities/InputUtilities.cs rename to src/Artemis.UI.Linux/Utilities/InputUtilities.cs diff --git a/src/Artemis.UI.Linux/packages.lock.json b/src/Artemis.UI.Linux/packages.lock.json new file mode 100644 index 000000000..66c4330a9 --- /dev/null +++ b/src/Artemis.UI.Linux/packages.lock.json @@ -0,0 +1,1828 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Avalonia": { + "type": "Direct", + "requested": "[0.10.13, )", + "resolved": "0.10.13", + "contentHash": "7st8nMai1C1nqw1a2H+zXiVYTnnfFwZz7JGziEzJK4sF6+x/W77XkdcDgDHyihcK3clQZJexYr4f+PzK4BJhSQ==", + "dependencies": { + "Avalonia.Remote.Protocol": "0.10.13", + "JetBrains.Annotations": "10.3.0", + "System.ComponentModel.Annotations": "4.5.0", + "System.Memory": "4.5.3", + "System.Reactive": "5.0.0", + "System.Runtime.CompilerServices.Unsafe": "4.6.0", + "System.ValueTuple": "4.5.0" + } + }, + "Avalonia.Desktop": { + "type": "Direct", + "requested": "[0.10.13, )", + "resolved": "0.10.13", + "contentHash": "v+siRNQYvSZR9lt/bBgb81t6LGbSC7pUo+APgPmKYGLeYcMij1O6CWk7tCh9hihMxNHYw/PEB06r8ZBQIg9YPg==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.Native": "0.10.13", + "Avalonia.Skia": "0.10.13", + "Avalonia.Win32": "0.10.13", + "Avalonia.X11": "0.10.13" + } + }, + "Avalonia.Diagnostics": { + "type": "Direct", + "requested": "[0.10.13, )", + "resolved": "0.10.13", + "contentHash": "stIGj0Rv/p/Re0GqlXCc061paifG6wT0YvrTUV/fQloNctW8Y4sf1xZNzr9dxdSz6+LG2AZjdZcSUhUGOCe6Zg==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.Controls.DataGrid": "0.10.13", + "Microsoft.CodeAnalysis.CSharp.Scripting": "3.4.0", + "System.Reactive": "5.0.0" + } + }, + "Avalonia.ReactiveUI": { + "type": "Direct", + "requested": "[0.10.13, )", + "resolved": "0.10.13", + "contentHash": "s5UUJ/MG97Jv9i+kxlgNSKx8Q6uJkgYMJ/LdOR3VM+7T32IRyhuxrNNCYygqk6avuJ4QqvMLU02T6v3GhI7WWA==", + "dependencies": { + "Avalonia": "0.10.13", + "ReactiveUI": "13.2.10", + "System.Reactive": "5.0.0" + } + }, + "ReactiveUI": { + "type": "Direct", + "requested": "[17.1.50, )", + "resolved": "17.1.50", + "contentHash": "UofZH1WMwWNLvFkK2SH+gsYTkUmhFFJO0Pix9YG2RzdHQ92mRFCzHzPO1abeU8/cxzyc9hJHX7sBChzUj53Ulg==", + "dependencies": { + "DynamicData": "7.5.2", + "Splat": "14.1.45" + } + }, + "Avalonia.Angle.Windows.Natives": { + "type": "Transitive", + "resolved": "2.1.0.2020091801", + "contentHash": "nGsCPI8FuUknU/e6hZIqlsKRDxClXHZyztmgM8vuwslFC/BIV3LqM2wKefWbr6SORX4Lct4nivhSMkdF/TrKgg==" + }, + "Avalonia.Controls.DataGrid": { + "type": "Transitive", + "resolved": "0.10.13", + "contentHash": "51xcaYtJN41vX/4xUu8rNyoISTO4bdswpfZmTPjeBTdofrhZ6mzOqbxVk6tqT4gt88MPihbaPil4jsD4X4Aixw==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.Remote.Protocol": "0.10.13", + "JetBrains.Annotations": "10.3.0", + "System.Reactive": "5.0.0" + } + }, + "Avalonia.Controls.PanAndZoom": { + "type": "Transitive", + "resolved": "10.12.0", + "contentHash": "ns+2tJTXTpNzNA9YV2mjR4EJOZl2vBFWnGUTSIl/vyOQMrrU5CbsXQxy2MFBvW0vGrRTlw80nUtBnsT759kwKQ==", + "dependencies": { + "Avalonia": "0.10.12" + } + }, + "Avalonia.FreeDesktop": { + "type": "Transitive", + "resolved": "0.10.13", + "contentHash": "/bKzscse/kY4RNMFk8r/jqLY/kS0fSkwp4TpqEF4UJeI8sHUvwe4yecnzNb1qDP9tCX4S6ML38LklAIqAk8gIQ==", + "dependencies": { + "Avalonia": "0.10.13", + "Tmds.DBus": "0.9.0" + } + }, + "Avalonia.Native": { + "type": "Transitive", + "resolved": "0.10.13", + "contentHash": "pq3WiiOyFyhJHnYdxP/fOlcG9DfqhJ0W5CCfPX48QyOdODbPgMF5LY6BU+McDpeAJTwQ4LqVfznHZoCeHH12gg==", + "dependencies": { + "Avalonia": "0.10.13" + } + }, + "Avalonia.Remote.Protocol": { + "type": "Transitive", + "resolved": "0.10.13", + "contentHash": "hnklCHyLCMrzWjMc3T0mYkRKdfUqpw2qCkf9HBRzyqnI6uG5tLw2QIlRF9zYC4BGOpx/B/647IcIjgq6H1ypzQ==" + }, + "Avalonia.Skia": { + "type": "Transitive", + "resolved": "0.10.13", + "contentHash": "aG0JlUhCpwGM/QsN/+rRak7XlPy0Jtd5HaiCdYKtuBOc+ISGs6hmCJDKjklNANp9gZR/TUUgXkqk5VFMQUJkTA==", + "dependencies": { + "Avalonia": "0.10.13", + "HarfBuzzSharp": "2.8.2-preview.178", + "HarfBuzzSharp.NativeAssets.Linux": "2.8.2-preview.178", + "HarfBuzzSharp.NativeAssets.WebAssembly": "2.8.2-preview.178", + "SkiaSharp": "2.88.0-preview.178", + "SkiaSharp.NativeAssets.Linux": "2.88.0-preview.178", + "SkiaSharp.NativeAssets.WebAssembly": "2.88.0-preview.178" + } + }, + "Avalonia.Svg.Skia": { + "type": "Transitive", + "resolved": "0.10.12", + "contentHash": "qsXKdm5eWpfoVPe0xgtxhbOYlhG8QdbYNJZTTihg/c4iPFYuh1G7DldiNskuVFuGiGxLVZ0g6ebql7ZkwbO1pA==", + "dependencies": { + "Avalonia": "0.10.12", + "Avalonia.Skia": "0.10.12", + "SkiaSharp": "2.88.0-preview.178", + "Svg.Skia": "0.5.12" + } + }, + "Avalonia.Win32": { + "type": "Transitive", + "resolved": "0.10.13", + "contentHash": "CNUGWafAonBYYbHMliujDrs4JH2giH435GxU+O1q/nGyO5Mm+PXCG4NYsg+0zwp8yQBapFK7eYwzamU+re+cDw==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.Angle.Windows.Natives": "2.1.0.2020091801", + "System.Drawing.Common": "4.5.0", + "System.Numerics.Vectors": "4.5.0" + } + }, + "Avalonia.X11": { + "type": "Transitive", + "resolved": "0.10.13", + "contentHash": "kXxn79KVB0ZfeZqQL7c2Dlvl96GBlRT8rzAh6g/j0hcgykQ55/e0be8Te6+Ny7hI+tFrob6lxvYdxYVUUCjHYg==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.FreeDesktop": "0.10.13", + "Avalonia.Skia": "0.10.13" + } + }, + "Avalonia.Xaml.Behaviors": { + "type": "Transitive", + "resolved": "0.10.13.2", + "contentHash": "sZlq6FFzNNzYmHK+vARWFpxtDY4XUdnU6q6zVIm4l1iQ3/ZXor4SeUnYDdd3lFZtoJ9yc8K2g4X7d/lVEgV9tA==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.Xaml.Interactions": "0.10.13.2", + "Avalonia.Xaml.Interactivity": "0.10.13.2" + } + }, + "Avalonia.Xaml.Interactions": { + "type": "Transitive", + "resolved": "0.10.13.2", + "contentHash": "bMgr5NtEjJ/qvf+1JD4T4rRt9AbZNnJdYCx5cBfGyXHETbeliTJAt07mqTahcoPY1G2FskF1OSIW5ytljbviLw==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.Xaml.Interactivity": "0.10.13.2" + } + }, + "Avalonia.Xaml.Interactivity": { + "type": "Transitive", + "resolved": "0.10.13.2", + "contentHash": "OIjK5XCsUrBCqog8lxI/DEbubaNQRwy8e8Px4i3dvllomU28EYsJm4XtrPVakY7MC+we825uXY47tsO/benLug==", + "dependencies": { + "Avalonia": "0.10.13" + } + }, + "Castle.Core": { + "type": "Transitive", + "resolved": "4.2.0", + "contentHash": "1TtKHYYVfox7aUZ0akCqkULmAjpG8X5ZRzTzTiONY34xtvvaPuUSSdVL1VaF/1/ljRhOkpy+uKOGn6XoFGvorw==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "System.Collections.Specialized": "4.3.0", + "System.ComponentModel": "4.3.0", + "System.ComponentModel.TypeConverter": "4.3.0", + "System.Diagnostics.TraceSource": "4.3.0", + "System.Dynamic.Runtime": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Xml.XmlDocument": "4.3.0" + } + }, + "DynamicData": { + "type": "Transitive", + "resolved": "7.5.4", + "contentHash": "1OpHPoyQGzHREiP6JXnPaBBx4KWVQZW7zBAZpKXc9kl4rcbEK4fo2/T3bDXZbHWKhDqVAISW9pE4Ug9+ms3RoA==", + "dependencies": { + "System.Reactive": "5.0.0" + } + }, + "EmbedIO": { + "type": "Transitive", + "resolved": "3.4.3", + "contentHash": "YM6hpZNAfvbbixfG9T4lWDGfF0D/TqutbTROL4ogVcHKwPF1hp+xS3ABwd3cxxTxvDFkj/zZl57QgWuFA8Igxw==", + "dependencies": { + "Unosquare.Swan.Lite": "3.0.0" + } + }, + "Fizzler": { + "type": "Transitive", + "resolved": "1.2.0", + "contentHash": "CPxuWF8EPvM0rwAtMTR5G+7EuLoGNXsEfqyx06upN9JyVALZ73KgbGn3SLFwGosifiUAXrvNHtXlUwGGytdECg==" + }, + "FluentAvaloniaUI": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "xzcsuOswakMpz/EdA59NEOgaCtZ/9zsd5QWTB0YYQqSv1GF95Uk2aMVtO5gtfNrCT4lZvGNWVf3HGjYz9cHovQ==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.Desktop": "0.10.13", + "Avalonia.Diagnostics": "0.10.13", + "MicroCom.CodeGenerator.MSBuild": "0.10.4", + "MicroCom.Runtime": "0.10.4" + } + }, + "Flurl": { + "type": "Transitive", + "resolved": "3.0.2", + "contentHash": "1/6mqdzGCTdAekbWkVZBTylCV+8g3JUSTXRBngRVR274S+RsAYNRF79GbDoDsPfMKu8VPc9HkQWdBEAncK1PQQ==" + }, + "Flurl.Http": { + "type": "Transitive", + "resolved": "3.2.0", + "contentHash": "5S8YiJm5CyRFO418GG9PDrsgmGEaZJtZLUqk3xqBKrfx7W9eKtOSpeji/GwAL+tSgNTALKBPvBKTaT4S83Oo+w==", + "dependencies": { + "Flurl": "3.0.2", + "Newtonsoft.Json": "12.0.2", + "System.Text.Encoding.CodePages": "4.5.1" + } + }, + "HarfBuzzSharp": { + "type": "Transitive", + "resolved": "2.8.2-preview.178", + "contentHash": "OUir5qn95QRtlc8RWKfU/63xYwtuAbylL2oAj3eBWgAsVoWnFrEv+Oh1sj0xjW7mogFGaeGtY40lqAD1srWJcQ==", + "dependencies": { + "HarfBuzzSharp.NativeAssets.Win32": "2.8.2-preview.178", + "HarfBuzzSharp.NativeAssets.macOS": "2.8.2-preview.178", + "System.Memory": "4.5.3" + } + }, + "HarfBuzzSharp.NativeAssets.Linux": { + "type": "Transitive", + "resolved": "2.8.2-preview.178", + "contentHash": "4scihdELcRpCEubBsUMHUJn93Xvx6ASj596WfO9y8CEuFNW0LBMDL71HBCyq5zXsn8HyGjLtoBLW0PpXbVnpjQ==", + "dependencies": { + "HarfBuzzSharp": "2.8.2-preview.178" + } + }, + "HarfBuzzSharp.NativeAssets.macOS": { + "type": "Transitive", + "resolved": "2.8.2-preview.178", + "contentHash": "QtmAs62il4vFtt3fFOXhhPDl7TX+NGu4tFB5qmnqUn+EnSJW7mxqNk1n9I7+Z2ORym0nTP4dhcRNtOpOS7Oenw==" + }, + "HarfBuzzSharp.NativeAssets.WebAssembly": { + "type": "Transitive", + "resolved": "2.8.2-preview.178", + "contentHash": "+S8qtBAVTrt+E85jZXPxYthUgSUq7iB6UZ0v0WFsy9gWhZ/hVE3hZJpcgeywT9H/SRX3ZIX+qzpKJlOM+mUcNA==" + }, + "HarfBuzzSharp.NativeAssets.Win32": { + "type": "Transitive", + "resolved": "2.8.2-preview.178", + "contentHash": "EgeF5uCZcAriIHmWq3hKNxz/jBJLeP/PKU4yI87UNkJCt4hYignOMjY0irl/rGVZtTL/G05xxf7TB6sjisi8sQ==" + }, + "HidSharp": { + "type": "Transitive", + "resolved": "2.1.0", + "contentHash": "UTdxWvbgp2xzT1Ajaa2va+Qi3oNHJPasYmVhbKI2VVdu1VYP6yUG+RikhsHvpD7iM0S8e8UYb5Qm/LTWxx9QAA==" + }, + "Humanizer.Core": { + "type": "Transitive", + "resolved": "2.11.10", + "contentHash": "4TBsHSXPocdsEB5dewIHeKykTzIz5Ui7ouXw4JsUGI+ax4jjviVJVD7+gsPCNyA+b3de2EjYI+jcEq8I/1ZFSQ==" + }, + "JetBrains.Annotations": { + "type": "Transitive", + "resolved": "10.3.0", + "contentHash": "0GLU9lwGVXjUNlr9ZIdAgjqLI2Zm/XFGJFaqJ1T1sU+kwfeMLhm68+rblUrNUP9psRl4i8yM7Ghb4ia4oI2E5g==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "LiteDB": { + "type": "Transitive", + "resolved": "5.0.11", + "contentHash": "6cL4bOmVCUB0gIK+6qIr68HeqjjHZicPDGQjvJ87mIOvkFsEsJWkIps3yoKNeLpHhJQur++yoQ9Q8gxsdos0xQ==" + }, + "Live.Avalonia": { + "type": "Transitive", + "resolved": "1.3.1", + "contentHash": "FIzh7k2PWsgIBjS4no51ZzWxYmzTG/RzC0DUO6PzoiKkqyKpvSpOvcRg+41Roz6X8VnYCIVm61R7TFlT4eUFKA==", + "dependencies": { + "Avalonia": "0.10.0" + } + }, + "Material.Icons": { + "type": "Transitive", + "resolved": "1.0.2", + "contentHash": "4UIT91QbedjNfUYU+R3T60U+InozFtIsP1iUzGbkq/G0f1eDE3tXMWUuLEDO3yCEP2MHrPjAOpokwqk1rnWNGA==", + "dependencies": { + "Newtonsoft.Json": "12.0.3" + } + }, + "Material.Icons.Avalonia": { + "type": "Transitive", + "resolved": "1.0.2", + "contentHash": "hK0MQm2XyPwjT+DiviDOBjrJVQe6V0u+XTDVbxohkq58hUBlq0XZXmHHZ27jUJU6ZVP9ybu44aXfWycbVjnY2A==", + "dependencies": { + "Avalonia": "0.10.0", + "Material.Icons": "1.0.2" + } + }, + "McMaster.NETCore.Plugins": { + "type": "Transitive", + "resolved": "1.4.0", + "contentHash": "UKw5Z2/QHhkR7kiAJmqdCwVDMQV0lwsfj10+FG676r8DsJWIpxtachtEjE0qBs9WoK5GUQIqxgyFeYUSwuPszg==", + "dependencies": { + "Microsoft.DotNet.PlatformAbstractions": "3.1.6", + "Microsoft.Extensions.DependencyModel": "5.0.0" + } + }, + "MicroCom.CodeGenerator.MSBuild": { + "type": "Transitive", + "resolved": "0.10.4", + "contentHash": "aG1kLtkgX6lC8qpxVon4OFSCdWYEbQubIg+2/ychWTIFTrDHWFkhcC4YTn0IfGiVCLwh0Yj7eSc8nk5f3UoMKg==" + }, + "MicroCom.Runtime": { + "type": "Transitive", + "resolved": "0.10.4", + "contentHash": "enc2U+/1UnF3rtocxb5ofcg7cJSmJI4adbYPr8DZa5bQzvhqA/VbjlcalxoqjI3CR2RvM5WWpjKT0p3BriFJjw==" + }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Transitive", + "resolved": "2.9.6", + "contentHash": "Kmms3TxGQMNb95Cu/3K+0bIcMnV4qf/phZBLAB0HUi65rBPxP4JO3aM2LoAcb+DFS600RQJMZ7ZLyYDTbLwJOQ==" + }, + "Microsoft.CodeAnalysis.Common": { + "type": "Transitive", + "resolved": "3.4.0", + "contentHash": "3ncA7cV+iXGA1VYwe2UEZXcvWyZSlbexWjM9AvocP7sik5UD93qt9Hq0fMRGk0jFRmvmE4T2g+bGfXiBVZEhLw==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "2.9.6", + "System.Collections.Immutable": "1.5.0", + "System.Memory": "4.5.3", + "System.Reflection.Metadata": "1.6.0", + "System.Runtime.CompilerServices.Unsafe": "4.5.2", + "System.Text.Encoding.CodePages": "4.5.1", + "System.Threading.Tasks.Extensions": "4.5.3" + } + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Transitive", + "resolved": "3.4.0", + "contentHash": "/LsTtgcMN6Tu1oo7/WYbRAHL4/ubXC/miEakwTpcZKJKtFo7D0AK95Hw0dbGxul6C8WJu60v6NP2435TDYZM+Q==", + "dependencies": { + "Microsoft.CodeAnalysis.Common": "[3.4.0]" + } + }, + "Microsoft.CodeAnalysis.CSharp.Scripting": { + "type": "Transitive", + "resolved": "3.4.0", + "contentHash": "tLgqc76qXHmONUhWhxo7z3TcL/LmGFWIUJm1exbQmVJohuQvJnejUMxmVkdxDfMuMZU1fIyJXPZ6Fkp4FEneAg==", + "dependencies": { + "Microsoft.CSharp": "4.3.0", + "Microsoft.CodeAnalysis.CSharp": "[3.4.0]", + "Microsoft.CodeAnalysis.Common": "[3.4.0]", + "Microsoft.CodeAnalysis.Scripting.Common": "[3.4.0]" + } + }, + "Microsoft.CodeAnalysis.Scripting.Common": { + "type": "Transitive", + "resolved": "3.4.0", + "contentHash": "+b6I3DZL2zvck+B/E/aiOveakj5U2G2BcYODQxcGh2IDbatNU3XXxGT1HumkWB5uIZI2Leu0opBgBpjScmjGMA==", + "dependencies": { + "Microsoft.CodeAnalysis.Common": "[3.4.0]" + } + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "P+MBhIM0YX+JqROuf7i306ZLJEjQYA9uUyRDE+OqwUI5sh41e2ZbPQV3LfAPh+29cmceE1pUffXsGfR4eMY3KA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Dynamic.Runtime": "4.3.0", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "Microsoft.DotNet.PlatformAbstractions": { + "type": "Transitive", + "resolved": "3.1.6", + "contentHash": "jek4XYaQ/PGUwDKKhwR8K47Uh1189PFzMeLqO83mXrXQVIpARZCcfuDedH50YDTepBkfijCZN5U/vZi++erxtg==" + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "umBECCoMC+sOUgm083yFr8SxTobUOcPFH4AXigdO2xJiszCHAnmeDl4qPphJt+oaJ/XIfV1wOjIts2nRnki61Q==" + }, + "Microsoft.Extensions.ObjectPool": { + "type": "Transitive", + "resolved": "5.0.9", + "contentHash": "grj0e6Me0EQsgaurV0fxP0xd8sz8eZVK+Jb816DPzNADHaqXaXJD3xZX9SFjyDl3ykAYvD0y77o5vRd9Hzsk9g==" + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.SystemEvents": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "LuI1oG+24TUj1ZRQQjM5Ew73BKnZE5NZ/7eAdh1o8ST5dPhUnJvIkiIn2re3MwnkRy6ELRnvEbBxHP8uALKhJw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "2.0.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "Ninject": { + "type": "Transitive", + "resolved": "3.3.4", + "contentHash": "CmbWW97FfJuh4LEOVZM/spqXl4KAulRUjqeMwRd5J9rDMQArmIYaDMU3pyzXXHT062tbF0OPIMwI7tSOtprPfg==", + "dependencies": { + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0" + } + }, + "Ninject.Extensions.ChildKernel": { + "type": "Transitive", + "resolved": "3.3.0", + "contentHash": "vl/p3f8sIaCCHiKsjhq9R8n3bH705Hu1WJXNpMEz1UC79EV51Mk5TWYXQbRnsK20hxF48CiAgUBb9pMKfX6sLw==", + "dependencies": { + "Ninject": "3.3.4" + } + }, + "Ninject.Extensions.Conventions": { + "type": "Transitive", + "resolved": "3.3.0", + "contentHash": "bAMK7tRHIRQ+gjR1WxwTlNuP+/bKRIFf6NKObkWP3XVzFQhsLEKA0hEo73OXuBdpng0jczhqCGmwu630nIa/bg==", + "dependencies": { + "Ninject.Extensions.Factory": "3.3.2" + } + }, + "Ninject.Extensions.Factory": { + "type": "Transitive", + "resolved": "3.3.2", + "contentHash": "H9s77i9WsbgF6s7OieQ+c51KoW90jJAQqb0ClEqi6SBtL7jySUjh/5HCjnYgyQ8iYcWhvhw9cFnYxX9CB1kL7Q==", + "dependencies": { + "Castle.Core": "4.2.0", + "Ninject": "3.3.3" + } + }, + "NoStringEvaluating": { + "type": "Transitive", + "resolved": "2.2.2", + "contentHash": "hJHivPDA1Vxn0CCgOtHKZ3fmldxQuz7VL1J4lEaPTXCf+Vwcx1FDf05mGMh6olYMSxoKimGX8YK2sEoqeH3pnA==", + "dependencies": { + "Microsoft.Extensions.ObjectPool": "5.0.9" + } + }, + "ReactiveUI.Validation": { + "type": "Transitive", + "resolved": "2.2.1", + "contentHash": "rhEphZ4ErbGfNtbBQ/tYMsLJYHyLVyqidU+sgZ3kXKbS7QrNoM4j6PPxCwLMKsJUuvVL8JN45xgmB9tSwm7+lg==", + "dependencies": { + "ReactiveUI": "16.2.6" + } + }, + "RGB.NET.Core": { + "type": "Transitive", + "resolved": "1.0.0-prerelease7", + "contentHash": "IIja5sC4QZ5pbSNckRCG7TlY4U6j/dRbrl4e2FZqsTGgsevaVB3IqonUQLFY1GGst4xNSl2oh0A23coXQxXGbQ==" + }, + "RGB.NET.Layout": { + "type": "Transitive", + "resolved": "1.0.0-prerelease7", + "contentHash": "S0kfWVa8EfMOAl2WPHsq98dwaO+SNz9TWr1AtMkdo8aZuYIVhaJ1c+mSAMMnH1V+mSbxDWPHWkNzi9ITszJucA==", + "dependencies": { + "RGB.NET.Core": "1.0.0-prerelease7" + } + }, + "RGB.NET.Presets": { + "type": "Transitive", + "resolved": "1.0.0-prerelease7", + "contentHash": "NgShvOPQM0miOsdqMKjkNunngJUZMwr8KR8ME2/Ksir7wgIQfgJj1YwZy8aIj+ar7fDo6VZJZenAshs/Ul+04A==", + "dependencies": { + "RGB.NET.Core": "1.0.0-prerelease7" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "Serilog": { + "type": "Transitive", + "resolved": "2.10.0", + "contentHash": "+QX0hmf37a0/OZLxM3wL7V6/ADvC1XihXN4Kq/p6d8lCPfgkRdiuhbWlMaFjR9Av0dy5F0+MBeDmDdRZN/YwQA==" + }, + "Serilog.Sinks.Console": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "apLOvSJQLlIbKlbx+Y2UDHSP05kJsV7mou+fvJoRGs/iR+jC22r8cuFVMjjfVxz/AD4B2UCltFhE1naRLXwKNw==", + "dependencies": { + "Serilog": "2.10.0" + } + }, + "Serilog.Sinks.Debug": { + "type": "Transitive", + "resolved": "2.0.0", + "contentHash": "Y6g3OBJ4JzTyyw16fDqtFcQ41qQAydnEvEqmXjhwhgjsnG/FaJ8GUqF5ldsC/bVkK8KYmqrPhDO+tm4dF6xx4A==", + "dependencies": { + "Serilog": "2.10.0" + } + }, + "Serilog.Sinks.File": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "uwV5hdhWPwUH1szhO8PJpFiahqXmzPzJT/sOijH/kFgUx+cyoDTMM8MHD0adw9+Iem6itoibbUXHYslzXsLEAg==", + "dependencies": { + "Serilog": "2.10.0" + } + }, + "ShimSkiaSharp": { + "type": "Transitive", + "resolved": "0.5.12", + "contentHash": "oUGM7gQHRzbGPRs3E1pe5e8VwML21YyEz9xdo+r2ov1mAqSDPyXErVQP6pN4gnfYMVf5ADR7BVkVzt4R9Iz3gQ==" + }, + "SkiaSharp": { + "type": "Transitive", + "resolved": "2.88.0-preview.178", + "contentHash": "arzd/44ykiBPqGWUuQqNTuJ49rhsXOg4Zw1p2Mm3B/5PZzV1wcTH4V+J+4ra8RS0KbIoy4KWeNF+zHAifNsiRg==", + "dependencies": { + "SkiaSharp.NativeAssets.Win32": "2.88.0-preview.178", + "SkiaSharp.NativeAssets.macOS": "2.88.0-preview.178", + "System.Memory": "4.5.3" + } + }, + "SkiaSharp.HarfBuzz": { + "type": "Transitive", + "resolved": "2.88.0-preview.178", + "contentHash": "qTf3PbRJsTVOttQkYWOCswa1QnkH0dEOqMSgr3iXZQuKPNlj1qpGY8+OGPs25WKgUEqOpv2nog/AYQ/bpyOXzA==", + "dependencies": { + "HarfBuzzSharp": "2.8.2-preview.178", + "SkiaSharp": "2.88.0-preview.178" + } + }, + "SkiaSharp.NativeAssets.Linux": { + "type": "Transitive", + "resolved": "2.88.0-preview.178", + "contentHash": "nc9C8zGvL2G7p0lcTPhN4EOt2Mozv6KLJinMwjF97sYoI5cpkXCPZSRTcyf8k49gAZaOd+UMGaygCAz/8vaaWg==", + "dependencies": { + "SkiaSharp": "2.88.0-preview.178" + } + }, + "SkiaSharp.NativeAssets.macOS": { + "type": "Transitive", + "resolved": "2.88.0-preview.178", + "contentHash": "+Hs3ku4buimzBHuc8FoyjOcE6eU5r98zcG7WH/s+doYQ1bFIjk+dKfqthgZ2o0NRAv8D3esq9rWrZTj12q+m1w==" + }, + "SkiaSharp.NativeAssets.WebAssembly": { + "type": "Transitive", + "resolved": "2.88.0-preview.178", + "contentHash": "u4Ss81oOlx0dhu5fxl4vK5f2Hm7psHDUSAoQValNV/BmixsW4TkETE3dOnHNRWwI56++tRG9dK33HimZDUrUpw==" + }, + "SkiaSharp.NativeAssets.Win32": { + "type": "Transitive", + "resolved": "2.88.0-preview.178", + "contentHash": "9og9GCkdZc/NYrmbsRzohmIBRlS1oFegJiBMsoG93qYjhh2o6q5QBYxd61zw5Mgeytl3qj4YM+6BNIF4tcF+6w==" + }, + "Splat": { + "type": "Transitive", + "resolved": "14.1.45", + "contentHash": "ayHdfTUklD5ci0s9m4uYMccjtkKVjZ9fVPT5q3PN+SnvyD6bjQVRozOfUHwdwh4LAz9ETZjR/tAgrm+IapXKrw==" + }, + "Splat.Ninject": { + "type": "Transitive", + "resolved": "14.1.45", + "contentHash": "aU851Yb7i4kLzzrpo3KxFZg/U0vd36ORza9nk51pvL/QE+Jkm3ROqoPMf+BPfugEub2J1hHDEuLKJtxU7TAt0w==", + "dependencies": { + "Ninject": "3.3.4", + "Splat": "14.1.45" + } + }, + "Svg.Custom": { + "type": "Transitive", + "resolved": "0.5.12", + "contentHash": "kmjLQf5U5WC7tRGBedUhtrOUCR0NaNL2auzOA2a/oMwEA0Bjrpd6qvMTpJUS3HITxi8vJazGl270K+i0JvdJog==", + "dependencies": { + "Fizzler": "1.2.0", + "System.Memory": "4.5.3", + "System.ObjectModel": "4.3.0", + "System.ValueTuple": "4.5.0" + } + }, + "Svg.Model": { + "type": "Transitive", + "resolved": "0.5.12", + "contentHash": "/CPiXIugg4oVyYlQr26fB1X9iQfICALF8AJXbTWnXGoP2WZa1t6aZbAXPk3HoPApA0w5waf3XXkBiYYnWwawaQ==", + "dependencies": { + "ShimSkiaSharp": "0.5.12", + "Svg.Custom": "0.5.12" + } + }, + "Svg.Skia": { + "type": "Transitive", + "resolved": "0.5.12", + "contentHash": "KjKpjz0FKge+WpRzjD1bqywAW3vZhXwpR5c7Ej5OuP4xDrQjBwtFeB0iZ+yEJMzwXf/Rs4ImuN8m3bmBDJvMHg==", + "dependencies": { + "SkiaSharp": "2.88.0-preview.178", + "SkiaSharp.HarfBuzz": "2.88.0-preview.178", + "Svg.Custom": "0.5.12", + "Svg.Model": "0.5.12" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "1.5.0", + "contentHash": "EXKiDFsChZW0RjrZ4FYHu9aW6+P4MCgEDCklsVseRfhoO0F+dXeMSsMRAlVXIo06kGJ/zv+2w1a2uc2+kxxSaQ==" + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "prtjIEMhGUnQq6RnPEYLpFt8AtLbp9yq2zxOSrY7KJJZrw25Fi97IzBqY7iqssbM61Ek5b8f3MG/sG1N2sN5KA==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Epx8PoVZR0iuOnJJDzp7pWvdfMMOAvpUo95pC4ScH2mJuXkKA2Y4aR3cG9qt2klHgSons1WFh4kcGW7cSXvrxg==", + "dependencies": { + "System.Collections.NonGeneric": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VyGn1jGRZVfxnh8EdvDCi71v3bMXrsu8aYJOwoV7SNDLVhiEqwP86pPMyRGsDsxhXAm2b3o9OIqeETfN5qfezw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==" + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "j8GUkCpM8V4d4vhLIIoBLGey2Z5bCkMVNjEZseyAlm4n5arcsJOeI3zkUP+zvZgzsbLTYh4lYeP/ZD/gdIAPrw==", + "dependencies": { + "System.ComponentModel": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "16pQ6P+EdhcXzPiEK4kbA953Fu0MNG2ovxTZU81/qsCd1zPRsKc3uif5NgvllCY598k6bI0KUyKW8fanlfaDQg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Collections.NonGeneric": "4.3.0", + "System.Collections.Specialized": "4.3.0", + "System.ComponentModel": "4.3.0", + "System.ComponentModel.Primitives": "4.3.0", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VnYp1NxGx8Ww731y2LJ1vpfb/DKVNKEZ8Jsh5SgQTZREL/YpWRArgh9pI8CDLmgHspZmLL697CaLvH85qQpRiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Drawing.Common": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "AiJFxxVPdeITstiRS5aAu8+8Dpf5NawTMoapZ53Gfirml24p7HIfhjmCRxdXnmmf3IUA3AX3CcW7G73CjWxW/Q==", + "dependencies": { + "Microsoft.NETCore.Platforms": "2.0.0", + "Microsoft.Win32.SystemEvents": "4.5.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "SNVi1E/vfWUAs/WYKhE9+qlS6KqK0YVhnlT0HQtr8pMIA8YX3lwy3uPMownDwdYISBdmAF/2holEIldVp85Wag==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "SxHB3nuNrpptVk+vZ/F+7OHEpoHUIKKMl02bUmYHQr1r+glbZQxs7pRtsf4ENO29TVm2TH3AEeep2fJcy92oYw==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.3", + "contentHash": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA==" + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Numerics.Vectors": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Reactive": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "erBZjkQHWL9jpasCE/0qKAryzVBJFxGHVBAvgRN1bzM0q2s1S4oYREEEL0Vb+1kA/6BKb5FjUZMp5VXmy+gzkQ==" + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VR4kk8XLKebQ4MZuKuIni/7oh+QGFmZW3qORd1GvBq/8026OpW501SzT/oypwiQl4TvT8ErnReh/NzY9u+C6wQ==" + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "4.6.0", + "contentHash": "HxozeSlipUK7dAroTYwIcGwKDeOVpQnJlpVaOkBz7CM4TsE5b/tKlQBZecTjh6FzcSbxndYaxxpsBMz+wMJeyw==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "4J2JQXbftjPMppIHJ7IC+VXQ9XfEagN92vZZNoG12i+zReYlim5dMoXFC1Zzg7tsnKDM7JPo5bYfFK4Jheq44w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "System.Runtime.CompilerServices.Unsafe": "4.5.2" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.5.3", + "contentHash": "+MvhNtcvIbqmhANyKu91jQnvIRVSTiaOiFNfKWwXGHG48YAb4I/TyH8spsySiPYla7gKal5ZnF3teJqZAximyQ==" + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.ValueTuple": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==" + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lJ8AxvkX7GQxpC6GFCeBj8ThYVyQczx2+f/cWHJU8tjS7YfI6Cv6bon70jVEgs2CiFbmmM8b9j1oZVx0dSI2Ww==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "Tmds.DBus": { + "type": "Transitive", + "resolved": "0.9.0", + "contentHash": "KcTWL9aKuob9Qo2sOTTKFePs1rKGTwZrcBvMFuGVIVR5RojX3oIFj5UBLYfSGjYgrcImC7LjQI3DdCFwUnhNXw==", + "dependencies": { + "System.Reflection.Emit": "4.7.0", + "System.Security.Principal.Windows": "4.7.0" + } + }, + "Unosquare.Swan.Lite": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "noPwJJl1Q9uparXy1ogtkmyAPGNfSGb0BLT1292nFH1jdMKje6o2kvvrQUvF9Xklj+IoiAI0UzF6Aqxlvo10lw==" + }, + "artemis.core": { + "type": "Project", + "dependencies": { + "Artemis.Storage": "1.0.0", + "EmbedIO": "3.4.3", + "HidSharp": "2.1.0", + "Humanizer.Core": "2.11.10", + "LiteDB": "5.0.11", + "McMaster.NETCore.Plugins": "1.4.0", + "Newtonsoft.Json": "13.0.1", + "Ninject": "3.3.4", + "Ninject.Extensions.ChildKernel": "3.3.0", + "Ninject.Extensions.Conventions": "3.3.0", + "RGB.NET.Core": "1.0.0-prerelease7", + "RGB.NET.Layout": "1.0.0-prerelease7", + "RGB.NET.Presets": "1.0.0-prerelease7", + "Serilog": "2.10.0", + "Serilog.Sinks.Console": "4.0.1", + "Serilog.Sinks.Debug": "2.0.0", + "Serilog.Sinks.File": "5.0.0", + "SkiaSharp": "2.88.0-preview.178", + "System.Buffers": "4.5.1", + "System.IO.FileSystem.AccessControl": "5.0.0", + "System.Numerics.Vectors": "4.5.0", + "System.Reflection.Metadata": "5.0.0", + "System.ValueTuple": "4.5.0" + } + }, + "artemis.storage": { + "type": "Project", + "dependencies": { + "LiteDB": "5.0.11", + "Serilog": "2.10.0" + } + }, + "artemis.ui": { + "type": "Project", + "dependencies": { + "Artemis.Core": "1.0.0", + "Artemis.UI.Shared": "1.0.0", + "Artemis.VisualScripting": "1.0.0", + "Avalonia": "0.10.13", + "Avalonia.Controls.PanAndZoom": "10.12.0", + "Avalonia.Desktop": "0.10.13", + "Avalonia.Diagnostics": "0.10.13", + "Avalonia.ReactiveUI": "0.10.13", + "Avalonia.Svg.Skia": "0.10.12", + "Avalonia.Xaml.Behaviors": "0.10.13.2", + "DynamicData": "7.5.4", + "FluentAvaloniaUI": "1.3.0", + "Flurl.Http": "3.2.0", + "Live.Avalonia": "1.3.1", + "Material.Icons.Avalonia": "1.0.2", + "RGB.NET.Core": "1.0.0-prerelease7", + "RGB.NET.Layout": "1.0.0-prerelease7", + "ReactiveUI": "17.1.50", + "ReactiveUI.Validation": "2.2.1", + "SkiaSharp": "2.88.0-preview.178", + "Splat.Ninject": "14.1.45" + } + }, + "artemis.ui.shared": { + "type": "Project", + "dependencies": { + "Artemis.Core": "1.0.0", + "Avalonia": "0.10.13", + "Avalonia.ReactiveUI": "0.10.13", + "Avalonia.Svg.Skia": "0.10.12", + "Avalonia.Xaml.Behaviors": "0.10.13.2", + "DynamicData": "7.5.4", + "FluentAvaloniaUI": "1.3.0", + "Material.Icons.Avalonia": "1.0.2", + "RGB.NET.Core": "1.0.0-prerelease7", + "ReactiveUI": "17.1.50", + "ReactiveUI.Validation": "2.2.1", + "SkiaSharp": "2.88.0-preview.178" + } + }, + "artemis.visualscripting": { + "type": "Project", + "dependencies": { + "Artemis.Core": "1.0.0", + "Artemis.UI.Shared": "1.0.0", + "Avalonia": "0.10.13", + "Avalonia.ReactiveUI": "0.10.13", + "Avalonia.Xaml.Behaviors": "0.10.13.2", + "Ninject": "3.3.4", + "NoStringEvaluating": "2.2.2", + "ReactiveUI": "17.1.50", + "SkiaSharp": "2.88.0-preview.178" + } + } + } + } +} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.MacOS/.gitignore b/src/Artemis.UI.MacOS/.gitignore similarity index 100% rename from src/Avalonia/Artemis.UI.MacOS/.gitignore rename to src/Artemis.UI.MacOS/.gitignore diff --git a/src/Avalonia/Artemis.UI.MacOS/App.axaml b/src/Artemis.UI.MacOS/App.axaml similarity index 100% rename from src/Avalonia/Artemis.UI.MacOS/App.axaml rename to src/Artemis.UI.MacOS/App.axaml diff --git a/src/Avalonia/Artemis.UI.MacOS/App.axaml.cs b/src/Artemis.UI.MacOS/App.axaml.cs similarity index 100% rename from src/Avalonia/Artemis.UI.MacOS/App.axaml.cs rename to src/Artemis.UI.MacOS/App.axaml.cs diff --git a/src/Avalonia/Artemis.UI.MacOS/Artemis.UI.MacOS.csproj b/src/Artemis.UI.MacOS/Artemis.UI.MacOS.csproj similarity index 90% rename from src/Avalonia/Artemis.UI.MacOS/Artemis.UI.MacOS.csproj rename to src/Artemis.UI.MacOS/Artemis.UI.MacOS.csproj index 40039f1d5..fce1bf446 100644 --- a/src/Avalonia/Artemis.UI.MacOS/Artemis.UI.MacOS.csproj +++ b/src/Artemis.UI.MacOS/Artemis.UI.MacOS.csproj @@ -4,6 +4,7 @@ net6.0 enable x64 + x64 @@ -18,7 +19,7 @@ - + \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.MacOS/Assets/avalonia-logo.ico b/src/Artemis.UI.MacOS/Assets/avalonia-logo.ico similarity index 100% rename from src/Avalonia/Artemis.UI.MacOS/Assets/avalonia-logo.ico rename to src/Artemis.UI.MacOS/Assets/avalonia-logo.ico diff --git a/src/Avalonia/Artemis.UI.MacOS/Program.cs b/src/Artemis.UI.MacOS/Program.cs similarity index 100% rename from src/Avalonia/Artemis.UI.MacOS/Program.cs rename to src/Artemis.UI.MacOS/Program.cs diff --git a/src/Artemis.UI.MacOS/packages.lock.json b/src/Artemis.UI.MacOS/packages.lock.json new file mode 100644 index 000000000..66c4330a9 --- /dev/null +++ b/src/Artemis.UI.MacOS/packages.lock.json @@ -0,0 +1,1828 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Avalonia": { + "type": "Direct", + "requested": "[0.10.13, )", + "resolved": "0.10.13", + "contentHash": "7st8nMai1C1nqw1a2H+zXiVYTnnfFwZz7JGziEzJK4sF6+x/W77XkdcDgDHyihcK3clQZJexYr4f+PzK4BJhSQ==", + "dependencies": { + "Avalonia.Remote.Protocol": "0.10.13", + "JetBrains.Annotations": "10.3.0", + "System.ComponentModel.Annotations": "4.5.0", + "System.Memory": "4.5.3", + "System.Reactive": "5.0.0", + "System.Runtime.CompilerServices.Unsafe": "4.6.0", + "System.ValueTuple": "4.5.0" + } + }, + "Avalonia.Desktop": { + "type": "Direct", + "requested": "[0.10.13, )", + "resolved": "0.10.13", + "contentHash": "v+siRNQYvSZR9lt/bBgb81t6LGbSC7pUo+APgPmKYGLeYcMij1O6CWk7tCh9hihMxNHYw/PEB06r8ZBQIg9YPg==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.Native": "0.10.13", + "Avalonia.Skia": "0.10.13", + "Avalonia.Win32": "0.10.13", + "Avalonia.X11": "0.10.13" + } + }, + "Avalonia.Diagnostics": { + "type": "Direct", + "requested": "[0.10.13, )", + "resolved": "0.10.13", + "contentHash": "stIGj0Rv/p/Re0GqlXCc061paifG6wT0YvrTUV/fQloNctW8Y4sf1xZNzr9dxdSz6+LG2AZjdZcSUhUGOCe6Zg==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.Controls.DataGrid": "0.10.13", + "Microsoft.CodeAnalysis.CSharp.Scripting": "3.4.0", + "System.Reactive": "5.0.0" + } + }, + "Avalonia.ReactiveUI": { + "type": "Direct", + "requested": "[0.10.13, )", + "resolved": "0.10.13", + "contentHash": "s5UUJ/MG97Jv9i+kxlgNSKx8Q6uJkgYMJ/LdOR3VM+7T32IRyhuxrNNCYygqk6avuJ4QqvMLU02T6v3GhI7WWA==", + "dependencies": { + "Avalonia": "0.10.13", + "ReactiveUI": "13.2.10", + "System.Reactive": "5.0.0" + } + }, + "ReactiveUI": { + "type": "Direct", + "requested": "[17.1.50, )", + "resolved": "17.1.50", + "contentHash": "UofZH1WMwWNLvFkK2SH+gsYTkUmhFFJO0Pix9YG2RzdHQ92mRFCzHzPO1abeU8/cxzyc9hJHX7sBChzUj53Ulg==", + "dependencies": { + "DynamicData": "7.5.2", + "Splat": "14.1.45" + } + }, + "Avalonia.Angle.Windows.Natives": { + "type": "Transitive", + "resolved": "2.1.0.2020091801", + "contentHash": "nGsCPI8FuUknU/e6hZIqlsKRDxClXHZyztmgM8vuwslFC/BIV3LqM2wKefWbr6SORX4Lct4nivhSMkdF/TrKgg==" + }, + "Avalonia.Controls.DataGrid": { + "type": "Transitive", + "resolved": "0.10.13", + "contentHash": "51xcaYtJN41vX/4xUu8rNyoISTO4bdswpfZmTPjeBTdofrhZ6mzOqbxVk6tqT4gt88MPihbaPil4jsD4X4Aixw==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.Remote.Protocol": "0.10.13", + "JetBrains.Annotations": "10.3.0", + "System.Reactive": "5.0.0" + } + }, + "Avalonia.Controls.PanAndZoom": { + "type": "Transitive", + "resolved": "10.12.0", + "contentHash": "ns+2tJTXTpNzNA9YV2mjR4EJOZl2vBFWnGUTSIl/vyOQMrrU5CbsXQxy2MFBvW0vGrRTlw80nUtBnsT759kwKQ==", + "dependencies": { + "Avalonia": "0.10.12" + } + }, + "Avalonia.FreeDesktop": { + "type": "Transitive", + "resolved": "0.10.13", + "contentHash": "/bKzscse/kY4RNMFk8r/jqLY/kS0fSkwp4TpqEF4UJeI8sHUvwe4yecnzNb1qDP9tCX4S6ML38LklAIqAk8gIQ==", + "dependencies": { + "Avalonia": "0.10.13", + "Tmds.DBus": "0.9.0" + } + }, + "Avalonia.Native": { + "type": "Transitive", + "resolved": "0.10.13", + "contentHash": "pq3WiiOyFyhJHnYdxP/fOlcG9DfqhJ0W5CCfPX48QyOdODbPgMF5LY6BU+McDpeAJTwQ4LqVfznHZoCeHH12gg==", + "dependencies": { + "Avalonia": "0.10.13" + } + }, + "Avalonia.Remote.Protocol": { + "type": "Transitive", + "resolved": "0.10.13", + "contentHash": "hnklCHyLCMrzWjMc3T0mYkRKdfUqpw2qCkf9HBRzyqnI6uG5tLw2QIlRF9zYC4BGOpx/B/647IcIjgq6H1ypzQ==" + }, + "Avalonia.Skia": { + "type": "Transitive", + "resolved": "0.10.13", + "contentHash": "aG0JlUhCpwGM/QsN/+rRak7XlPy0Jtd5HaiCdYKtuBOc+ISGs6hmCJDKjklNANp9gZR/TUUgXkqk5VFMQUJkTA==", + "dependencies": { + "Avalonia": "0.10.13", + "HarfBuzzSharp": "2.8.2-preview.178", + "HarfBuzzSharp.NativeAssets.Linux": "2.8.2-preview.178", + "HarfBuzzSharp.NativeAssets.WebAssembly": "2.8.2-preview.178", + "SkiaSharp": "2.88.0-preview.178", + "SkiaSharp.NativeAssets.Linux": "2.88.0-preview.178", + "SkiaSharp.NativeAssets.WebAssembly": "2.88.0-preview.178" + } + }, + "Avalonia.Svg.Skia": { + "type": "Transitive", + "resolved": "0.10.12", + "contentHash": "qsXKdm5eWpfoVPe0xgtxhbOYlhG8QdbYNJZTTihg/c4iPFYuh1G7DldiNskuVFuGiGxLVZ0g6ebql7ZkwbO1pA==", + "dependencies": { + "Avalonia": "0.10.12", + "Avalonia.Skia": "0.10.12", + "SkiaSharp": "2.88.0-preview.178", + "Svg.Skia": "0.5.12" + } + }, + "Avalonia.Win32": { + "type": "Transitive", + "resolved": "0.10.13", + "contentHash": "CNUGWafAonBYYbHMliujDrs4JH2giH435GxU+O1q/nGyO5Mm+PXCG4NYsg+0zwp8yQBapFK7eYwzamU+re+cDw==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.Angle.Windows.Natives": "2.1.0.2020091801", + "System.Drawing.Common": "4.5.0", + "System.Numerics.Vectors": "4.5.0" + } + }, + "Avalonia.X11": { + "type": "Transitive", + "resolved": "0.10.13", + "contentHash": "kXxn79KVB0ZfeZqQL7c2Dlvl96GBlRT8rzAh6g/j0hcgykQ55/e0be8Te6+Ny7hI+tFrob6lxvYdxYVUUCjHYg==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.FreeDesktop": "0.10.13", + "Avalonia.Skia": "0.10.13" + } + }, + "Avalonia.Xaml.Behaviors": { + "type": "Transitive", + "resolved": "0.10.13.2", + "contentHash": "sZlq6FFzNNzYmHK+vARWFpxtDY4XUdnU6q6zVIm4l1iQ3/ZXor4SeUnYDdd3lFZtoJ9yc8K2g4X7d/lVEgV9tA==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.Xaml.Interactions": "0.10.13.2", + "Avalonia.Xaml.Interactivity": "0.10.13.2" + } + }, + "Avalonia.Xaml.Interactions": { + "type": "Transitive", + "resolved": "0.10.13.2", + "contentHash": "bMgr5NtEjJ/qvf+1JD4T4rRt9AbZNnJdYCx5cBfGyXHETbeliTJAt07mqTahcoPY1G2FskF1OSIW5ytljbviLw==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.Xaml.Interactivity": "0.10.13.2" + } + }, + "Avalonia.Xaml.Interactivity": { + "type": "Transitive", + "resolved": "0.10.13.2", + "contentHash": "OIjK5XCsUrBCqog8lxI/DEbubaNQRwy8e8Px4i3dvllomU28EYsJm4XtrPVakY7MC+we825uXY47tsO/benLug==", + "dependencies": { + "Avalonia": "0.10.13" + } + }, + "Castle.Core": { + "type": "Transitive", + "resolved": "4.2.0", + "contentHash": "1TtKHYYVfox7aUZ0akCqkULmAjpG8X5ZRzTzTiONY34xtvvaPuUSSdVL1VaF/1/ljRhOkpy+uKOGn6XoFGvorw==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "System.Collections.Specialized": "4.3.0", + "System.ComponentModel": "4.3.0", + "System.ComponentModel.TypeConverter": "4.3.0", + "System.Diagnostics.TraceSource": "4.3.0", + "System.Dynamic.Runtime": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Xml.XmlDocument": "4.3.0" + } + }, + "DynamicData": { + "type": "Transitive", + "resolved": "7.5.4", + "contentHash": "1OpHPoyQGzHREiP6JXnPaBBx4KWVQZW7zBAZpKXc9kl4rcbEK4fo2/T3bDXZbHWKhDqVAISW9pE4Ug9+ms3RoA==", + "dependencies": { + "System.Reactive": "5.0.0" + } + }, + "EmbedIO": { + "type": "Transitive", + "resolved": "3.4.3", + "contentHash": "YM6hpZNAfvbbixfG9T4lWDGfF0D/TqutbTROL4ogVcHKwPF1hp+xS3ABwd3cxxTxvDFkj/zZl57QgWuFA8Igxw==", + "dependencies": { + "Unosquare.Swan.Lite": "3.0.0" + } + }, + "Fizzler": { + "type": "Transitive", + "resolved": "1.2.0", + "contentHash": "CPxuWF8EPvM0rwAtMTR5G+7EuLoGNXsEfqyx06upN9JyVALZ73KgbGn3SLFwGosifiUAXrvNHtXlUwGGytdECg==" + }, + "FluentAvaloniaUI": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "xzcsuOswakMpz/EdA59NEOgaCtZ/9zsd5QWTB0YYQqSv1GF95Uk2aMVtO5gtfNrCT4lZvGNWVf3HGjYz9cHovQ==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.Desktop": "0.10.13", + "Avalonia.Diagnostics": "0.10.13", + "MicroCom.CodeGenerator.MSBuild": "0.10.4", + "MicroCom.Runtime": "0.10.4" + } + }, + "Flurl": { + "type": "Transitive", + "resolved": "3.0.2", + "contentHash": "1/6mqdzGCTdAekbWkVZBTylCV+8g3JUSTXRBngRVR274S+RsAYNRF79GbDoDsPfMKu8VPc9HkQWdBEAncK1PQQ==" + }, + "Flurl.Http": { + "type": "Transitive", + "resolved": "3.2.0", + "contentHash": "5S8YiJm5CyRFO418GG9PDrsgmGEaZJtZLUqk3xqBKrfx7W9eKtOSpeji/GwAL+tSgNTALKBPvBKTaT4S83Oo+w==", + "dependencies": { + "Flurl": "3.0.2", + "Newtonsoft.Json": "12.0.2", + "System.Text.Encoding.CodePages": "4.5.1" + } + }, + "HarfBuzzSharp": { + "type": "Transitive", + "resolved": "2.8.2-preview.178", + "contentHash": "OUir5qn95QRtlc8RWKfU/63xYwtuAbylL2oAj3eBWgAsVoWnFrEv+Oh1sj0xjW7mogFGaeGtY40lqAD1srWJcQ==", + "dependencies": { + "HarfBuzzSharp.NativeAssets.Win32": "2.8.2-preview.178", + "HarfBuzzSharp.NativeAssets.macOS": "2.8.2-preview.178", + "System.Memory": "4.5.3" + } + }, + "HarfBuzzSharp.NativeAssets.Linux": { + "type": "Transitive", + "resolved": "2.8.2-preview.178", + "contentHash": "4scihdELcRpCEubBsUMHUJn93Xvx6ASj596WfO9y8CEuFNW0LBMDL71HBCyq5zXsn8HyGjLtoBLW0PpXbVnpjQ==", + "dependencies": { + "HarfBuzzSharp": "2.8.2-preview.178" + } + }, + "HarfBuzzSharp.NativeAssets.macOS": { + "type": "Transitive", + "resolved": "2.8.2-preview.178", + "contentHash": "QtmAs62il4vFtt3fFOXhhPDl7TX+NGu4tFB5qmnqUn+EnSJW7mxqNk1n9I7+Z2ORym0nTP4dhcRNtOpOS7Oenw==" + }, + "HarfBuzzSharp.NativeAssets.WebAssembly": { + "type": "Transitive", + "resolved": "2.8.2-preview.178", + "contentHash": "+S8qtBAVTrt+E85jZXPxYthUgSUq7iB6UZ0v0WFsy9gWhZ/hVE3hZJpcgeywT9H/SRX3ZIX+qzpKJlOM+mUcNA==" + }, + "HarfBuzzSharp.NativeAssets.Win32": { + "type": "Transitive", + "resolved": "2.8.2-preview.178", + "contentHash": "EgeF5uCZcAriIHmWq3hKNxz/jBJLeP/PKU4yI87UNkJCt4hYignOMjY0irl/rGVZtTL/G05xxf7TB6sjisi8sQ==" + }, + "HidSharp": { + "type": "Transitive", + "resolved": "2.1.0", + "contentHash": "UTdxWvbgp2xzT1Ajaa2va+Qi3oNHJPasYmVhbKI2VVdu1VYP6yUG+RikhsHvpD7iM0S8e8UYb5Qm/LTWxx9QAA==" + }, + "Humanizer.Core": { + "type": "Transitive", + "resolved": "2.11.10", + "contentHash": "4TBsHSXPocdsEB5dewIHeKykTzIz5Ui7ouXw4JsUGI+ax4jjviVJVD7+gsPCNyA+b3de2EjYI+jcEq8I/1ZFSQ==" + }, + "JetBrains.Annotations": { + "type": "Transitive", + "resolved": "10.3.0", + "contentHash": "0GLU9lwGVXjUNlr9ZIdAgjqLI2Zm/XFGJFaqJ1T1sU+kwfeMLhm68+rblUrNUP9psRl4i8yM7Ghb4ia4oI2E5g==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "LiteDB": { + "type": "Transitive", + "resolved": "5.0.11", + "contentHash": "6cL4bOmVCUB0gIK+6qIr68HeqjjHZicPDGQjvJ87mIOvkFsEsJWkIps3yoKNeLpHhJQur++yoQ9Q8gxsdos0xQ==" + }, + "Live.Avalonia": { + "type": "Transitive", + "resolved": "1.3.1", + "contentHash": "FIzh7k2PWsgIBjS4no51ZzWxYmzTG/RzC0DUO6PzoiKkqyKpvSpOvcRg+41Roz6X8VnYCIVm61R7TFlT4eUFKA==", + "dependencies": { + "Avalonia": "0.10.0" + } + }, + "Material.Icons": { + "type": "Transitive", + "resolved": "1.0.2", + "contentHash": "4UIT91QbedjNfUYU+R3T60U+InozFtIsP1iUzGbkq/G0f1eDE3tXMWUuLEDO3yCEP2MHrPjAOpokwqk1rnWNGA==", + "dependencies": { + "Newtonsoft.Json": "12.0.3" + } + }, + "Material.Icons.Avalonia": { + "type": "Transitive", + "resolved": "1.0.2", + "contentHash": "hK0MQm2XyPwjT+DiviDOBjrJVQe6V0u+XTDVbxohkq58hUBlq0XZXmHHZ27jUJU6ZVP9ybu44aXfWycbVjnY2A==", + "dependencies": { + "Avalonia": "0.10.0", + "Material.Icons": "1.0.2" + } + }, + "McMaster.NETCore.Plugins": { + "type": "Transitive", + "resolved": "1.4.0", + "contentHash": "UKw5Z2/QHhkR7kiAJmqdCwVDMQV0lwsfj10+FG676r8DsJWIpxtachtEjE0qBs9WoK5GUQIqxgyFeYUSwuPszg==", + "dependencies": { + "Microsoft.DotNet.PlatformAbstractions": "3.1.6", + "Microsoft.Extensions.DependencyModel": "5.0.0" + } + }, + "MicroCom.CodeGenerator.MSBuild": { + "type": "Transitive", + "resolved": "0.10.4", + "contentHash": "aG1kLtkgX6lC8qpxVon4OFSCdWYEbQubIg+2/ychWTIFTrDHWFkhcC4YTn0IfGiVCLwh0Yj7eSc8nk5f3UoMKg==" + }, + "MicroCom.Runtime": { + "type": "Transitive", + "resolved": "0.10.4", + "contentHash": "enc2U+/1UnF3rtocxb5ofcg7cJSmJI4adbYPr8DZa5bQzvhqA/VbjlcalxoqjI3CR2RvM5WWpjKT0p3BriFJjw==" + }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Transitive", + "resolved": "2.9.6", + "contentHash": "Kmms3TxGQMNb95Cu/3K+0bIcMnV4qf/phZBLAB0HUi65rBPxP4JO3aM2LoAcb+DFS600RQJMZ7ZLyYDTbLwJOQ==" + }, + "Microsoft.CodeAnalysis.Common": { + "type": "Transitive", + "resolved": "3.4.0", + "contentHash": "3ncA7cV+iXGA1VYwe2UEZXcvWyZSlbexWjM9AvocP7sik5UD93qt9Hq0fMRGk0jFRmvmE4T2g+bGfXiBVZEhLw==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "2.9.6", + "System.Collections.Immutable": "1.5.0", + "System.Memory": "4.5.3", + "System.Reflection.Metadata": "1.6.0", + "System.Runtime.CompilerServices.Unsafe": "4.5.2", + "System.Text.Encoding.CodePages": "4.5.1", + "System.Threading.Tasks.Extensions": "4.5.3" + } + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Transitive", + "resolved": "3.4.0", + "contentHash": "/LsTtgcMN6Tu1oo7/WYbRAHL4/ubXC/miEakwTpcZKJKtFo7D0AK95Hw0dbGxul6C8WJu60v6NP2435TDYZM+Q==", + "dependencies": { + "Microsoft.CodeAnalysis.Common": "[3.4.0]" + } + }, + "Microsoft.CodeAnalysis.CSharp.Scripting": { + "type": "Transitive", + "resolved": "3.4.0", + "contentHash": "tLgqc76qXHmONUhWhxo7z3TcL/LmGFWIUJm1exbQmVJohuQvJnejUMxmVkdxDfMuMZU1fIyJXPZ6Fkp4FEneAg==", + "dependencies": { + "Microsoft.CSharp": "4.3.0", + "Microsoft.CodeAnalysis.CSharp": "[3.4.0]", + "Microsoft.CodeAnalysis.Common": "[3.4.0]", + "Microsoft.CodeAnalysis.Scripting.Common": "[3.4.0]" + } + }, + "Microsoft.CodeAnalysis.Scripting.Common": { + "type": "Transitive", + "resolved": "3.4.0", + "contentHash": "+b6I3DZL2zvck+B/E/aiOveakj5U2G2BcYODQxcGh2IDbatNU3XXxGT1HumkWB5uIZI2Leu0opBgBpjScmjGMA==", + "dependencies": { + "Microsoft.CodeAnalysis.Common": "[3.4.0]" + } + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "P+MBhIM0YX+JqROuf7i306ZLJEjQYA9uUyRDE+OqwUI5sh41e2ZbPQV3LfAPh+29cmceE1pUffXsGfR4eMY3KA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Dynamic.Runtime": "4.3.0", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "Microsoft.DotNet.PlatformAbstractions": { + "type": "Transitive", + "resolved": "3.1.6", + "contentHash": "jek4XYaQ/PGUwDKKhwR8K47Uh1189PFzMeLqO83mXrXQVIpARZCcfuDedH50YDTepBkfijCZN5U/vZi++erxtg==" + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "umBECCoMC+sOUgm083yFr8SxTobUOcPFH4AXigdO2xJiszCHAnmeDl4qPphJt+oaJ/XIfV1wOjIts2nRnki61Q==" + }, + "Microsoft.Extensions.ObjectPool": { + "type": "Transitive", + "resolved": "5.0.9", + "contentHash": "grj0e6Me0EQsgaurV0fxP0xd8sz8eZVK+Jb816DPzNADHaqXaXJD3xZX9SFjyDl3ykAYvD0y77o5vRd9Hzsk9g==" + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.SystemEvents": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "LuI1oG+24TUj1ZRQQjM5Ew73BKnZE5NZ/7eAdh1o8ST5dPhUnJvIkiIn2re3MwnkRy6ELRnvEbBxHP8uALKhJw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "2.0.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "Ninject": { + "type": "Transitive", + "resolved": "3.3.4", + "contentHash": "CmbWW97FfJuh4LEOVZM/spqXl4KAulRUjqeMwRd5J9rDMQArmIYaDMU3pyzXXHT062tbF0OPIMwI7tSOtprPfg==", + "dependencies": { + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0" + } + }, + "Ninject.Extensions.ChildKernel": { + "type": "Transitive", + "resolved": "3.3.0", + "contentHash": "vl/p3f8sIaCCHiKsjhq9R8n3bH705Hu1WJXNpMEz1UC79EV51Mk5TWYXQbRnsK20hxF48CiAgUBb9pMKfX6sLw==", + "dependencies": { + "Ninject": "3.3.4" + } + }, + "Ninject.Extensions.Conventions": { + "type": "Transitive", + "resolved": "3.3.0", + "contentHash": "bAMK7tRHIRQ+gjR1WxwTlNuP+/bKRIFf6NKObkWP3XVzFQhsLEKA0hEo73OXuBdpng0jczhqCGmwu630nIa/bg==", + "dependencies": { + "Ninject.Extensions.Factory": "3.3.2" + } + }, + "Ninject.Extensions.Factory": { + "type": "Transitive", + "resolved": "3.3.2", + "contentHash": "H9s77i9WsbgF6s7OieQ+c51KoW90jJAQqb0ClEqi6SBtL7jySUjh/5HCjnYgyQ8iYcWhvhw9cFnYxX9CB1kL7Q==", + "dependencies": { + "Castle.Core": "4.2.0", + "Ninject": "3.3.3" + } + }, + "NoStringEvaluating": { + "type": "Transitive", + "resolved": "2.2.2", + "contentHash": "hJHivPDA1Vxn0CCgOtHKZ3fmldxQuz7VL1J4lEaPTXCf+Vwcx1FDf05mGMh6olYMSxoKimGX8YK2sEoqeH3pnA==", + "dependencies": { + "Microsoft.Extensions.ObjectPool": "5.0.9" + } + }, + "ReactiveUI.Validation": { + "type": "Transitive", + "resolved": "2.2.1", + "contentHash": "rhEphZ4ErbGfNtbBQ/tYMsLJYHyLVyqidU+sgZ3kXKbS7QrNoM4j6PPxCwLMKsJUuvVL8JN45xgmB9tSwm7+lg==", + "dependencies": { + "ReactiveUI": "16.2.6" + } + }, + "RGB.NET.Core": { + "type": "Transitive", + "resolved": "1.0.0-prerelease7", + "contentHash": "IIja5sC4QZ5pbSNckRCG7TlY4U6j/dRbrl4e2FZqsTGgsevaVB3IqonUQLFY1GGst4xNSl2oh0A23coXQxXGbQ==" + }, + "RGB.NET.Layout": { + "type": "Transitive", + "resolved": "1.0.0-prerelease7", + "contentHash": "S0kfWVa8EfMOAl2WPHsq98dwaO+SNz9TWr1AtMkdo8aZuYIVhaJ1c+mSAMMnH1V+mSbxDWPHWkNzi9ITszJucA==", + "dependencies": { + "RGB.NET.Core": "1.0.0-prerelease7" + } + }, + "RGB.NET.Presets": { + "type": "Transitive", + "resolved": "1.0.0-prerelease7", + "contentHash": "NgShvOPQM0miOsdqMKjkNunngJUZMwr8KR8ME2/Ksir7wgIQfgJj1YwZy8aIj+ar7fDo6VZJZenAshs/Ul+04A==", + "dependencies": { + "RGB.NET.Core": "1.0.0-prerelease7" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "Serilog": { + "type": "Transitive", + "resolved": "2.10.0", + "contentHash": "+QX0hmf37a0/OZLxM3wL7V6/ADvC1XihXN4Kq/p6d8lCPfgkRdiuhbWlMaFjR9Av0dy5F0+MBeDmDdRZN/YwQA==" + }, + "Serilog.Sinks.Console": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "apLOvSJQLlIbKlbx+Y2UDHSP05kJsV7mou+fvJoRGs/iR+jC22r8cuFVMjjfVxz/AD4B2UCltFhE1naRLXwKNw==", + "dependencies": { + "Serilog": "2.10.0" + } + }, + "Serilog.Sinks.Debug": { + "type": "Transitive", + "resolved": "2.0.0", + "contentHash": "Y6g3OBJ4JzTyyw16fDqtFcQ41qQAydnEvEqmXjhwhgjsnG/FaJ8GUqF5ldsC/bVkK8KYmqrPhDO+tm4dF6xx4A==", + "dependencies": { + "Serilog": "2.10.0" + } + }, + "Serilog.Sinks.File": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "uwV5hdhWPwUH1szhO8PJpFiahqXmzPzJT/sOijH/kFgUx+cyoDTMM8MHD0adw9+Iem6itoibbUXHYslzXsLEAg==", + "dependencies": { + "Serilog": "2.10.0" + } + }, + "ShimSkiaSharp": { + "type": "Transitive", + "resolved": "0.5.12", + "contentHash": "oUGM7gQHRzbGPRs3E1pe5e8VwML21YyEz9xdo+r2ov1mAqSDPyXErVQP6pN4gnfYMVf5ADR7BVkVzt4R9Iz3gQ==" + }, + "SkiaSharp": { + "type": "Transitive", + "resolved": "2.88.0-preview.178", + "contentHash": "arzd/44ykiBPqGWUuQqNTuJ49rhsXOg4Zw1p2Mm3B/5PZzV1wcTH4V+J+4ra8RS0KbIoy4KWeNF+zHAifNsiRg==", + "dependencies": { + "SkiaSharp.NativeAssets.Win32": "2.88.0-preview.178", + "SkiaSharp.NativeAssets.macOS": "2.88.0-preview.178", + "System.Memory": "4.5.3" + } + }, + "SkiaSharp.HarfBuzz": { + "type": "Transitive", + "resolved": "2.88.0-preview.178", + "contentHash": "qTf3PbRJsTVOttQkYWOCswa1QnkH0dEOqMSgr3iXZQuKPNlj1qpGY8+OGPs25WKgUEqOpv2nog/AYQ/bpyOXzA==", + "dependencies": { + "HarfBuzzSharp": "2.8.2-preview.178", + "SkiaSharp": "2.88.0-preview.178" + } + }, + "SkiaSharp.NativeAssets.Linux": { + "type": "Transitive", + "resolved": "2.88.0-preview.178", + "contentHash": "nc9C8zGvL2G7p0lcTPhN4EOt2Mozv6KLJinMwjF97sYoI5cpkXCPZSRTcyf8k49gAZaOd+UMGaygCAz/8vaaWg==", + "dependencies": { + "SkiaSharp": "2.88.0-preview.178" + } + }, + "SkiaSharp.NativeAssets.macOS": { + "type": "Transitive", + "resolved": "2.88.0-preview.178", + "contentHash": "+Hs3ku4buimzBHuc8FoyjOcE6eU5r98zcG7WH/s+doYQ1bFIjk+dKfqthgZ2o0NRAv8D3esq9rWrZTj12q+m1w==" + }, + "SkiaSharp.NativeAssets.WebAssembly": { + "type": "Transitive", + "resolved": "2.88.0-preview.178", + "contentHash": "u4Ss81oOlx0dhu5fxl4vK5f2Hm7psHDUSAoQValNV/BmixsW4TkETE3dOnHNRWwI56++tRG9dK33HimZDUrUpw==" + }, + "SkiaSharp.NativeAssets.Win32": { + "type": "Transitive", + "resolved": "2.88.0-preview.178", + "contentHash": "9og9GCkdZc/NYrmbsRzohmIBRlS1oFegJiBMsoG93qYjhh2o6q5QBYxd61zw5Mgeytl3qj4YM+6BNIF4tcF+6w==" + }, + "Splat": { + "type": "Transitive", + "resolved": "14.1.45", + "contentHash": "ayHdfTUklD5ci0s9m4uYMccjtkKVjZ9fVPT5q3PN+SnvyD6bjQVRozOfUHwdwh4LAz9ETZjR/tAgrm+IapXKrw==" + }, + "Splat.Ninject": { + "type": "Transitive", + "resolved": "14.1.45", + "contentHash": "aU851Yb7i4kLzzrpo3KxFZg/U0vd36ORza9nk51pvL/QE+Jkm3ROqoPMf+BPfugEub2J1hHDEuLKJtxU7TAt0w==", + "dependencies": { + "Ninject": "3.3.4", + "Splat": "14.1.45" + } + }, + "Svg.Custom": { + "type": "Transitive", + "resolved": "0.5.12", + "contentHash": "kmjLQf5U5WC7tRGBedUhtrOUCR0NaNL2auzOA2a/oMwEA0Bjrpd6qvMTpJUS3HITxi8vJazGl270K+i0JvdJog==", + "dependencies": { + "Fizzler": "1.2.0", + "System.Memory": "4.5.3", + "System.ObjectModel": "4.3.0", + "System.ValueTuple": "4.5.0" + } + }, + "Svg.Model": { + "type": "Transitive", + "resolved": "0.5.12", + "contentHash": "/CPiXIugg4oVyYlQr26fB1X9iQfICALF8AJXbTWnXGoP2WZa1t6aZbAXPk3HoPApA0w5waf3XXkBiYYnWwawaQ==", + "dependencies": { + "ShimSkiaSharp": "0.5.12", + "Svg.Custom": "0.5.12" + } + }, + "Svg.Skia": { + "type": "Transitive", + "resolved": "0.5.12", + "contentHash": "KjKpjz0FKge+WpRzjD1bqywAW3vZhXwpR5c7Ej5OuP4xDrQjBwtFeB0iZ+yEJMzwXf/Rs4ImuN8m3bmBDJvMHg==", + "dependencies": { + "SkiaSharp": "2.88.0-preview.178", + "SkiaSharp.HarfBuzz": "2.88.0-preview.178", + "Svg.Custom": "0.5.12", + "Svg.Model": "0.5.12" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "1.5.0", + "contentHash": "EXKiDFsChZW0RjrZ4FYHu9aW6+P4MCgEDCklsVseRfhoO0F+dXeMSsMRAlVXIo06kGJ/zv+2w1a2uc2+kxxSaQ==" + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "prtjIEMhGUnQq6RnPEYLpFt8AtLbp9yq2zxOSrY7KJJZrw25Fi97IzBqY7iqssbM61Ek5b8f3MG/sG1N2sN5KA==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Epx8PoVZR0iuOnJJDzp7pWvdfMMOAvpUo95pC4ScH2mJuXkKA2Y4aR3cG9qt2klHgSons1WFh4kcGW7cSXvrxg==", + "dependencies": { + "System.Collections.NonGeneric": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VyGn1jGRZVfxnh8EdvDCi71v3bMXrsu8aYJOwoV7SNDLVhiEqwP86pPMyRGsDsxhXAm2b3o9OIqeETfN5qfezw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==" + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "j8GUkCpM8V4d4vhLIIoBLGey2Z5bCkMVNjEZseyAlm4n5arcsJOeI3zkUP+zvZgzsbLTYh4lYeP/ZD/gdIAPrw==", + "dependencies": { + "System.ComponentModel": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "16pQ6P+EdhcXzPiEK4kbA953Fu0MNG2ovxTZU81/qsCd1zPRsKc3uif5NgvllCY598k6bI0KUyKW8fanlfaDQg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Collections.NonGeneric": "4.3.0", + "System.Collections.Specialized": "4.3.0", + "System.ComponentModel": "4.3.0", + "System.ComponentModel.Primitives": "4.3.0", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VnYp1NxGx8Ww731y2LJ1vpfb/DKVNKEZ8Jsh5SgQTZREL/YpWRArgh9pI8CDLmgHspZmLL697CaLvH85qQpRiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Drawing.Common": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "AiJFxxVPdeITstiRS5aAu8+8Dpf5NawTMoapZ53Gfirml24p7HIfhjmCRxdXnmmf3IUA3AX3CcW7G73CjWxW/Q==", + "dependencies": { + "Microsoft.NETCore.Platforms": "2.0.0", + "Microsoft.Win32.SystemEvents": "4.5.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "SNVi1E/vfWUAs/WYKhE9+qlS6KqK0YVhnlT0HQtr8pMIA8YX3lwy3uPMownDwdYISBdmAF/2holEIldVp85Wag==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "SxHB3nuNrpptVk+vZ/F+7OHEpoHUIKKMl02bUmYHQr1r+glbZQxs7pRtsf4ENO29TVm2TH3AEeep2fJcy92oYw==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.3", + "contentHash": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA==" + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Numerics.Vectors": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Reactive": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "erBZjkQHWL9jpasCE/0qKAryzVBJFxGHVBAvgRN1bzM0q2s1S4oYREEEL0Vb+1kA/6BKb5FjUZMp5VXmy+gzkQ==" + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VR4kk8XLKebQ4MZuKuIni/7oh+QGFmZW3qORd1GvBq/8026OpW501SzT/oypwiQl4TvT8ErnReh/NzY9u+C6wQ==" + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "4.6.0", + "contentHash": "HxozeSlipUK7dAroTYwIcGwKDeOVpQnJlpVaOkBz7CM4TsE5b/tKlQBZecTjh6FzcSbxndYaxxpsBMz+wMJeyw==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "4J2JQXbftjPMppIHJ7IC+VXQ9XfEagN92vZZNoG12i+zReYlim5dMoXFC1Zzg7tsnKDM7JPo5bYfFK4Jheq44w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "System.Runtime.CompilerServices.Unsafe": "4.5.2" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.5.3", + "contentHash": "+MvhNtcvIbqmhANyKu91jQnvIRVSTiaOiFNfKWwXGHG48YAb4I/TyH8spsySiPYla7gKal5ZnF3teJqZAximyQ==" + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.ValueTuple": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==" + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lJ8AxvkX7GQxpC6GFCeBj8ThYVyQczx2+f/cWHJU8tjS7YfI6Cv6bon70jVEgs2CiFbmmM8b9j1oZVx0dSI2Ww==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "Tmds.DBus": { + "type": "Transitive", + "resolved": "0.9.0", + "contentHash": "KcTWL9aKuob9Qo2sOTTKFePs1rKGTwZrcBvMFuGVIVR5RojX3oIFj5UBLYfSGjYgrcImC7LjQI3DdCFwUnhNXw==", + "dependencies": { + "System.Reflection.Emit": "4.7.0", + "System.Security.Principal.Windows": "4.7.0" + } + }, + "Unosquare.Swan.Lite": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "noPwJJl1Q9uparXy1ogtkmyAPGNfSGb0BLT1292nFH1jdMKje6o2kvvrQUvF9Xklj+IoiAI0UzF6Aqxlvo10lw==" + }, + "artemis.core": { + "type": "Project", + "dependencies": { + "Artemis.Storage": "1.0.0", + "EmbedIO": "3.4.3", + "HidSharp": "2.1.0", + "Humanizer.Core": "2.11.10", + "LiteDB": "5.0.11", + "McMaster.NETCore.Plugins": "1.4.0", + "Newtonsoft.Json": "13.0.1", + "Ninject": "3.3.4", + "Ninject.Extensions.ChildKernel": "3.3.0", + "Ninject.Extensions.Conventions": "3.3.0", + "RGB.NET.Core": "1.0.0-prerelease7", + "RGB.NET.Layout": "1.0.0-prerelease7", + "RGB.NET.Presets": "1.0.0-prerelease7", + "Serilog": "2.10.0", + "Serilog.Sinks.Console": "4.0.1", + "Serilog.Sinks.Debug": "2.0.0", + "Serilog.Sinks.File": "5.0.0", + "SkiaSharp": "2.88.0-preview.178", + "System.Buffers": "4.5.1", + "System.IO.FileSystem.AccessControl": "5.0.0", + "System.Numerics.Vectors": "4.5.0", + "System.Reflection.Metadata": "5.0.0", + "System.ValueTuple": "4.5.0" + } + }, + "artemis.storage": { + "type": "Project", + "dependencies": { + "LiteDB": "5.0.11", + "Serilog": "2.10.0" + } + }, + "artemis.ui": { + "type": "Project", + "dependencies": { + "Artemis.Core": "1.0.0", + "Artemis.UI.Shared": "1.0.0", + "Artemis.VisualScripting": "1.0.0", + "Avalonia": "0.10.13", + "Avalonia.Controls.PanAndZoom": "10.12.0", + "Avalonia.Desktop": "0.10.13", + "Avalonia.Diagnostics": "0.10.13", + "Avalonia.ReactiveUI": "0.10.13", + "Avalonia.Svg.Skia": "0.10.12", + "Avalonia.Xaml.Behaviors": "0.10.13.2", + "DynamicData": "7.5.4", + "FluentAvaloniaUI": "1.3.0", + "Flurl.Http": "3.2.0", + "Live.Avalonia": "1.3.1", + "Material.Icons.Avalonia": "1.0.2", + "RGB.NET.Core": "1.0.0-prerelease7", + "RGB.NET.Layout": "1.0.0-prerelease7", + "ReactiveUI": "17.1.50", + "ReactiveUI.Validation": "2.2.1", + "SkiaSharp": "2.88.0-preview.178", + "Splat.Ninject": "14.1.45" + } + }, + "artemis.ui.shared": { + "type": "Project", + "dependencies": { + "Artemis.Core": "1.0.0", + "Avalonia": "0.10.13", + "Avalonia.ReactiveUI": "0.10.13", + "Avalonia.Svg.Skia": "0.10.12", + "Avalonia.Xaml.Behaviors": "0.10.13.2", + "DynamicData": "7.5.4", + "FluentAvaloniaUI": "1.3.0", + "Material.Icons.Avalonia": "1.0.2", + "RGB.NET.Core": "1.0.0-prerelease7", + "ReactiveUI": "17.1.50", + "ReactiveUI.Validation": "2.2.1", + "SkiaSharp": "2.88.0-preview.178" + } + }, + "artemis.visualscripting": { + "type": "Project", + "dependencies": { + "Artemis.Core": "1.0.0", + "Artemis.UI.Shared": "1.0.0", + "Avalonia": "0.10.13", + "Avalonia.ReactiveUI": "0.10.13", + "Avalonia.Xaml.Behaviors": "0.10.13.2", + "Ninject": "3.3.4", + "NoStringEvaluating": "2.2.2", + "ReactiveUI": "17.1.50", + "SkiaSharp": "2.88.0-preview.178" + } + } + } + } +} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Shared/Artemis.UI.Avalonia.Shared.csproj.DotSettings b/src/Artemis.UI.Shared/Artemis.UI.Avalonia.Shared.csproj.DotSettings similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Artemis.UI.Avalonia.Shared.csproj.DotSettings rename to src/Artemis.UI.Shared/Artemis.UI.Avalonia.Shared.csproj.DotSettings diff --git a/src/Avalonia/Artemis.UI.Shared/Artemis.UI.Avalonia.Shared.xml b/src/Artemis.UI.Shared/Artemis.UI.Avalonia.Shared.xml similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Artemis.UI.Avalonia.Shared.xml rename to src/Artemis.UI.Shared/Artemis.UI.Avalonia.Shared.xml diff --git a/src/Artemis.UI.Shared/Artemis.UI.Shared.csproj b/src/Artemis.UI.Shared/Artemis.UI.Shared.csproj index 78be76ec5..a55751eb4 100644 --- a/src/Artemis.UI.Shared/Artemis.UI.Shared.csproj +++ b/src/Artemis.UI.Shared/Artemis.UI.Shared.csproj @@ -1,76 +1,50 @@  - net6.0-windows - false - {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - false - Artemis.UI.Shared - Artemis.UI.Shared - Artemis.UI.Shared - Copyright © Robert Beekman - 2020 + Library + net6.0 + enable + + bin\ - true + x64 x64 - x64 - bin\Artemis.UI.Shared.xml - - - - 2.0-{chash:6} - true - true - true - v[0-9]* - true - git - true - 2.0.0 - enable - - - bin\Artemis.UI.Shared.xml + bin\Artemis.UI.Avalonia.Shared.xml - - - - - - + + + + + + + + + + + + + + - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - + + + + $(DefaultXamlRuntime) + MSBuild:Compile + - - - - - - - - - + - - + + + HotkeyBox.axaml + + + %(Filename) + - - - false - - - - - - \ No newline at end of file + diff --git a/src/Artemis.UI.Shared/Artemis.UI.Shared.csproj.DotSettings b/src/Artemis.UI.Shared/Artemis.UI.Shared.csproj.DotSettings index 5a02b2339..22557dc59 100644 --- a/src/Artemis.UI.Shared/Artemis.UI.Shared.csproj.DotSettings +++ b/src/Artemis.UI.Shared/Artemis.UI.Shared.csproj.DotSettings @@ -1,20 +1,6 @@  - True - True - True - True - True - True - True True - True - True - True True - True - True - True - True - True True - True \ No newline at end of file + True + True \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Shared/AttachedProperties/NumberBoxAssist.cs b/src/Artemis.UI.Shared/AttachedProperties/NumberBoxAssist.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/AttachedProperties/NumberBoxAssist.cs rename to src/Artemis.UI.Shared/AttachedProperties/NumberBoxAssist.cs diff --git a/src/Avalonia/Artemis.UI.Shared/AttachedProperties/TextBoxAssist.cs b/src/Artemis.UI.Shared/AttachedProperties/TextBoxAssist.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/AttachedProperties/TextBoxAssist.cs rename to src/Artemis.UI.Shared/AttachedProperties/TextBoxAssist.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Behaviors/LostFocusNumberBoxBindingBehavior.cs b/src/Artemis.UI.Shared/Behaviors/LostFocusNumberBoxBindingBehavior.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Behaviors/LostFocusNumberBoxBindingBehavior.cs rename to src/Artemis.UI.Shared/Behaviors/LostFocusNumberBoxBindingBehavior.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Behaviors/LostFocusTextBoxBindingBehavior.cs b/src/Artemis.UI.Shared/Behaviors/LostFocusTextBoxBindingBehavior.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Behaviors/LostFocusTextBoxBindingBehavior.cs rename to src/Artemis.UI.Shared/Behaviors/LostFocusTextBoxBindingBehavior.cs diff --git a/src/Artemis.UI.Shared/Behaviors/OpenInBrowser.cs b/src/Artemis.UI.Shared/Behaviors/OpenInBrowser.cs deleted file mode 100644 index e9c980033..000000000 --- a/src/Artemis.UI.Shared/Behaviors/OpenInBrowser.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System.Windows.Documents; -using System.Windows.Navigation; -using Artemis.Core; -using Microsoft.Xaml.Behaviors; - -namespace Artemis.UI.Shared -{ - /// - /// Represents a behavior that opens the URI of the hyperlink in the browser when requested - /// - public class OpenInBrowser : Behavior - { - private Hyperlink? _hyperLink; - - /// - protected override void OnAttached() - { - base.OnAttached(); - - _hyperLink = AssociatedObject; - if (_hyperLink == null) - return; - - _hyperLink.RequestNavigate += HyperLinkOnRequestNavigate; - } - - /// - protected override void OnDetaching() - { - if (_hyperLink == null) return; - _hyperLink.RequestNavigate -= HyperLinkOnRequestNavigate; - - base.OnDetaching(); - } - - private void HyperLinkOnRequestNavigate(object sender, RequestNavigateEventArgs e) - { - Utilities.OpenUrl(e.Uri.AbsoluteUri); - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Behaviors/PutCursorAtEndTextBoxBehavior.cs b/src/Artemis.UI.Shared/Behaviors/PutCursorAtEndTextBoxBehavior.cs deleted file mode 100644 index e5da6147d..000000000 --- a/src/Artemis.UI.Shared/Behaviors/PutCursorAtEndTextBoxBehavior.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System.Windows; -using System.Windows.Controls; -using Microsoft.Xaml.Behaviors; - -namespace Artemis.UI.Shared -{ - /// - /// Represents a behavior that puts the cursor at the end of a text box when it receives focus - /// - public class PutCursorAtEndTextBox : Behavior - { - private TextBox? _textBox; - - /// - protected override void OnAttached() - { - base.OnAttached(); - - _textBox = AssociatedObject as TextBox; - - if (_textBox == null) return; - _textBox.GotFocus += TextBoxGotFocus; - } - - /// - protected override void OnDetaching() - { - if (_textBox == null) return; - _textBox.GotFocus -= TextBoxGotFocus; - - base.OnDetaching(); - } - - private void TextBoxGotFocus(object sender, RoutedEventArgs routedEventArgs) - { - if (_textBox == null) return; - _textBox.CaretIndex = _textBox.Text.Length; - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Behaviors/ScrollParentWhenAtMax.cs b/src/Artemis.UI.Shared/Behaviors/ScrollParentWhenAtMax.cs deleted file mode 100644 index aa91b1beb..000000000 --- a/src/Artemis.UI.Shared/Behaviors/ScrollParentWhenAtMax.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System.Windows; -using System.Windows.Controls; -using System.Windows.Input; -using System.Windows.Media; -using Microsoft.Xaml.Behaviors; - -namespace Artemis.UI.Shared -{ - /// - /// A behavior that makes a scroll viewer bubble up its events if it is at its scroll limit - /// - public class ScrollParentWhenAtMax : Behavior - { - /// - protected override void OnAttached() - { - base.OnAttached(); - AssociatedObject.PreviewMouseWheel += PreviewMouseWheel; - } - - /// - protected override void OnDetaching() - { - AssociatedObject.PreviewMouseWheel -= PreviewMouseWheel; - base.OnDetaching(); - } - - private void PreviewMouseWheel(object sender, MouseWheelEventArgs e) - { - ScrollViewer? scrollViewer = GetVisualChild(AssociatedObject); - if (scrollViewer == null) - return; - double scrollPos = scrollViewer.ContentVerticalOffset; - // ReSharper disable once CompareOfFloatsByEqualityOperator - if (scrollPos == scrollViewer.ScrollableHeight && e.Delta < 0 || scrollPos == 0 && e.Delta > 0) - { - e.Handled = true; - MouseWheelEventArgs e2 = new(e.MouseDevice, e.Timestamp, e.Delta); - e2.RoutedEvent = UIElement.MouseWheelEvent; - AssociatedObject.RaiseEvent(e2); - } - } - - private static T? GetVisualChild(DependencyObject parent) where T : Visual - { - T? child = default; - - int numVisuals = VisualTreeHelper.GetChildrenCount(parent); - for (int i = 0; i < numVisuals; i++) - { - Visual v = (Visual) VisualTreeHelper.GetChild(parent, i); - child = v as T; - if (child == null) child = GetVisualChild(v); - if (child != null) break; - } - - return child; - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Bootstrapper.cs b/src/Artemis.UI.Shared/Bootstrapper.cs deleted file mode 100644 index c253012f8..000000000 --- a/src/Artemis.UI.Shared/Bootstrapper.cs +++ /dev/null @@ -1,34 +0,0 @@ -using Artemis.UI.Shared.Controls; -using Artemis.UI.Shared.Services; -using Ninject; - -namespace Artemis.UI.Shared -{ - /// - /// Represents the main entry point for the shared UI library - /// The Artemis UI calls this so there's no need to deal with this in a plugin - /// - public static class Bootstrapper - { - /// - /// Gets a boolean indicating whether or not the shared UI library has been initialized - /// - public static bool Initialized { get; private set; } - - /// - /// Initializes the shared UI library - /// - /// - public static void Initialize(IKernel kernel) - { - if (Initialized) - return; - - GradientPicker.ColorPickerService = kernel.Get(); - ColorPicker.ColorPickerService = kernel.Get(); - DataModelPicker.DataModelUIService = kernel.Get(); - - Initialized = true; - } - } -} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/ArtemisIcon.axaml b/src/Artemis.UI.Shared/Controls/ArtemisIcon.axaml similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/ArtemisIcon.axaml rename to src/Artemis.UI.Shared/Controls/ArtemisIcon.axaml diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/ArtemisIcon.axaml.cs b/src/Artemis.UI.Shared/Controls/ArtemisIcon.axaml.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/ArtemisIcon.axaml.cs rename to src/Artemis.UI.Shared/Controls/ArtemisIcon.axaml.cs diff --git a/src/Artemis.UI.Shared/Controls/ArtemisIcon.xaml b/src/Artemis.UI.Shared/Controls/ArtemisIcon.xaml deleted file mode 100644 index 33405a778..000000000 --- a/src/Artemis.UI.Shared/Controls/ArtemisIcon.xaml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/src/Artemis.UI.Shared/Controls/ArtemisIcon.xaml.cs b/src/Artemis.UI.Shared/Controls/ArtemisIcon.xaml.cs deleted file mode 100644 index 586eb0657..000000000 --- a/src/Artemis.UI.Shared/Controls/ArtemisIcon.xaml.cs +++ /dev/null @@ -1,101 +0,0 @@ -using System; -using System.Windows; -using System.Windows.Controls; -using MaterialDesignThemes.Wpf; - -namespace Artemis.UI.Shared -{ - /// - /// Interaction logic for ArtemisIcon.xaml - /// - public partial class ArtemisIcon : UserControl - { - /// - /// Gets or sets the currently displayed icon as either a or an pointing - /// to an SVG - /// - public static readonly DependencyProperty IconProperty = DependencyProperty.Register(nameof(Icon), typeof(object), typeof(ArtemisIcon), - new FrameworkPropertyMetadata(IconPropertyChangedCallback)); - - /// - /// Gets or sets the - /// - public static readonly DependencyProperty PackIconProperty = DependencyProperty.Register(nameof(PackIcon), typeof(PackIconKind?), typeof(ArtemisIcon), - new FrameworkPropertyMetadata(IconPropertyChangedCallback)); - - /// - /// Gets or sets the pointing to the SVG - /// - public static readonly DependencyProperty SvgSourceProperty = DependencyProperty.Register(nameof(SvgSource), typeof(Uri), typeof(ArtemisIcon), - new FrameworkPropertyMetadata(IconPropertyChangedCallback)); - - private bool _inCallback; - - /// - /// Creates a new instance of the class - /// - public ArtemisIcon() - { - InitializeComponent(); - } - - /// - /// Gets or sets the currently displayed icon as either a or an pointing - /// to an SVG - /// - public object? Icon - { - get => GetValue(IconProperty); - set => SetValue(IconProperty, value); - } - - /// - /// Gets or sets the - /// - public PackIconKind? PackIcon - { - get => (PackIconKind?) GetValue(PackIconProperty); - set => SetValue(PackIconProperty, value); - } - - /// - /// Gets or sets the pointing to the SVG - /// - public Uri SvgSource - { - get => (Uri) GetValue(SvgSourceProperty); - set => SetValue(SvgSourceProperty, value); - } - - private static void IconPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - ArtemisIcon artemisIcon = (ArtemisIcon) d; - if (artemisIcon._inCallback) - return; - - try - { - artemisIcon._inCallback = true; - if (artemisIcon.PackIcon != null) - { - artemisIcon.Icon = artemisIcon.PackIcon; - } - else if (artemisIcon.SvgSource != null) - { - artemisIcon.Icon = artemisIcon.SvgSource; - } - else if (artemisIcon.Icon is string iconString) - { - if (Uri.TryCreate(iconString, UriKind.Absolute, out Uri? uriResult)) - artemisIcon.Icon = uriResult; - else if (Enum.TryParse(typeof(PackIconKind), iconString, true, out object? result)) - artemisIcon.Icon = result; - } - } - finally - { - artemisIcon._inCallback = false; - } - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Controls/ColorPicker.xaml b/src/Artemis.UI.Shared/Controls/ColorPicker.xaml deleted file mode 100644 index 4077a0948..000000000 --- a/src/Artemis.UI.Shared/Controls/ColorPicker.xaml +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - « Invalid » - - - - \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Controls/DataModelPicker.xaml.cs b/src/Artemis.UI.Shared/Controls/DataModelPicker.xaml.cs deleted file mode 100644 index 84d3b4d33..000000000 --- a/src/Artemis.UI.Shared/Controls/DataModelPicker.xaml.cs +++ /dev/null @@ -1,343 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.ComponentModel; -using System.Linq; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Media; -using System.Windows.Threading; -using Artemis.Core; -using Artemis.Core.Modules; -using Artemis.UI.Shared.Services; - -namespace Artemis.UI.Shared.Controls -{ - /// - /// Interaction logic for DataModelPicker.xaml - /// - public partial class DataModelPicker : INotifyPropertyChanged - { - private static IDataModelUIService _dataModelUIService; - - /// - /// Gets or sets data model path - /// - public static readonly DependencyProperty DataModelPathProperty = DependencyProperty.Register( - nameof(DataModelPath), typeof(DataModelPath), typeof(DataModelPicker), - new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, DataModelPathPropertyChangedCallback) - ); - - /// - /// Gets or sets the brush to use when drawing the button - /// - public static readonly DependencyProperty PlaceholderProperty = DependencyProperty.Register( - nameof(Placeholder), typeof(string), typeof(DataModelPicker), - new FrameworkPropertyMetadata("Click to select") - ); - - /// - /// Gets or sets the brush to use when drawing the button - /// - public static readonly DependencyProperty ShowDataModelValuesProperty = DependencyProperty.Register(nameof(ShowDataModelValues), typeof(bool), typeof(DataModelPicker)); - - /// - /// Gets or sets the brush to use when drawing the button - /// - public static readonly DependencyProperty ShowFullPathProperty = DependencyProperty.Register( - nameof(ShowFullPath), typeof(bool), typeof(DataModelPicker), - new FrameworkPropertyMetadata(ShowFullPathPropertyCallback) - ); - - /// - /// Gets or sets the brush to use when drawing the button - /// - public static readonly DependencyProperty ButtonBrushProperty = DependencyProperty.Register(nameof(ButtonBrush), typeof(Brush), typeof(DataModelPicker)); - - /// - /// A list of extra modules to show data models of - /// - public static readonly DependencyProperty ModulesProperty = DependencyProperty.Register( - nameof(Modules), typeof(ObservableCollection), typeof(DataModelPicker), - new FrameworkPropertyMetadata(new ObservableCollection(), FrameworkPropertyMetadataOptions.None, ModulesPropertyChangedCallback) - ); - - /// - /// The data model view model to show, if not provided one will be retrieved by the control - /// - public static readonly DependencyProperty DataModelViewModelProperty = DependencyProperty.Register( - nameof(DataModelViewModel), typeof(DataModelPropertiesViewModel), typeof(DataModelPicker), - new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.None, DataModelViewModelPropertyChangedCallback) - ); - - /// - /// A list of data model view models to show - /// - public static readonly DependencyProperty ExtraDataModelViewModelsProperty = DependencyProperty.Register( - nameof(ExtraDataModelViewModels), typeof(ObservableCollection), typeof(DataModelPicker), - new FrameworkPropertyMetadata(new ObservableCollection(), FrameworkPropertyMetadataOptions.None, ExtraDataModelViewModelsPropertyChangedCallback) - ); - - /// - /// A list of data model view models to show - /// - public static readonly DependencyProperty FilterTypesProperty = DependencyProperty.Register( - nameof(FilterTypes), typeof(ObservableCollection), typeof(DataModelPicker), - new FrameworkPropertyMetadata(new ObservableCollection()) - ); - - public DataModelPicker() - { - SelectPropertyCommand = new DelegateCommand(ExecuteSelectPropertyCommand); - Unloaded += OnUnloaded; - InitializeComponent(); - GetDataModel(); - UpdateValueDisplay(); - } - - /// - /// Gets or sets the brush to use when drawing the button - /// - public DataModelPath? DataModelPath - { - get => (DataModelPath) GetValue(DataModelPathProperty); - set => SetValue(DataModelPathProperty, value); - } - - /// - /// Gets or sets the brush to use when drawing the button - /// - public string Placeholder - { - get => (string) GetValue(PlaceholderProperty); - set => SetValue(PlaceholderProperty, value); - } - - /// - /// Gets or sets the brush to use when drawing the button - /// - public bool ShowDataModelValues - { - get => (bool) GetValue(ShowDataModelValuesProperty); - set => SetValue(ShowDataModelValuesProperty, value); - } - - /// - /// Gets or sets the brush to use when drawing the button - /// - public bool ShowFullPath - { - get => (bool) GetValue(ShowFullPathProperty); - set => SetValue(ShowFullPathProperty, value); - } - - /// - /// Gets or sets the brush to use when drawing the button - /// - public Brush ButtonBrush - { - get => (Brush) GetValue(ButtonBrushProperty); - set => SetValue(ButtonBrushProperty, value); - } - - /// - /// Gets or sets a list of extra modules to show data models of - /// - public ObservableCollection? Modules - { - get => (ObservableCollection) GetValue(ModulesProperty); - set => SetValue(ModulesProperty, value); - } - - /// - /// Gets or sets the data model view model to show - /// - public DataModelPropertiesViewModel? DataModelViewModel - { - get => (DataModelPropertiesViewModel) GetValue(DataModelViewModelProperty); - set => SetValue(DataModelViewModelProperty, value); - } - - /// - /// Gets or sets a list of data model view models to show - /// - public ObservableCollection? ExtraDataModelViewModels - { - get => (ObservableCollection) GetValue(ExtraDataModelViewModelsProperty); - set => SetValue(ExtraDataModelViewModelsProperty, value); - } - - /// - /// Gets or sets the types of properties this view model will allow to be selected - /// - public ObservableCollection? FilterTypes - { - get => (ObservableCollection) GetValue(FilterTypesProperty); - set => SetValue(FilterTypesProperty, value); - } - - /// - /// Command used by view - /// - public DelegateCommand SelectPropertyCommand { get; } - - internal static IDataModelUIService DataModelUIService - { - set - { - if (_dataModelUIService != null) - throw new AccessViolationException("This is not for you to touch"); - _dataModelUIService = value; - } - } - - /// - /// Occurs when a new path has been selected - /// - public event EventHandler? DataModelPathSelected; - - /// - /// Invokes the event - /// - /// - protected virtual void OnDataModelPathSelected(DataModelSelectedEventArgs e) - { - DataModelPathSelected?.Invoke(this, e); - } - - private void GetDataModel() - { - ChangeDataModel(_dataModelUIService.GetPluginDataModelVisualization(Modules?.ToList() ?? new List(), true)); - } - - private void ChangeDataModel(DataModelPropertiesViewModel? dataModel) - { - if (DataModelViewModel != null) - { - DataModelViewModel.Dispose(); - DataModelViewModel.UpdateRequested -= DataModelOnUpdateRequested; - } - - DataModelViewModel = dataModel; - if (DataModelViewModel != null) - DataModelViewModel.UpdateRequested += DataModelOnUpdateRequested; - } - - private void UpdateValueDisplay() - { - ValueDisplay.Visibility = DataModelPath == null || DataModelPath.IsValid ? Visibility.Visible : Visibility.Collapsed; - ValuePlaceholder.Visibility = DataModelPath == null || DataModelPath.IsValid ? Visibility.Collapsed : Visibility.Visible; - - string? formattedPath = null; - if (DataModelPath != null && DataModelPath.IsValid) - formattedPath = string.Join(" › ", DataModelPath.Segments.Where(s => s.GetPropertyDescription() != null).Select(s => s.GetPropertyDescription()!.Name)); - - DataModelButton.ToolTip = formattedPath; - ValueDisplayTextBlock.Text = ShowFullPath - ? formattedPath - : DataModelPath?.Segments.LastOrDefault()?.GetPropertyDescription()?.Name ?? DataModelPath?.Segments.LastOrDefault()?.Identifier; - } - - private void DataModelOnUpdateRequested(object? sender, EventArgs e) - { - DataModelViewModel?.ApplyTypeFilter(true, FilterTypes?.ToArray() ?? Type.EmptyTypes); - if (ExtraDataModelViewModels == null) return; - foreach (DataModelPropertiesViewModel extraDataModelViewModel in ExtraDataModelViewModels) - extraDataModelViewModel.ApplyTypeFilter(true, FilterTypes?.ToArray() ?? Type.EmptyTypes); - } - - private void ExecuteSelectPropertyCommand(object? context) - { - if (context is not DataModelVisualizationViewModel selected) - return; - - if (selected.DataModelPath == null) - return; - if (selected.DataModelPath.Equals(DataModelPath)) - return; - - DataModelPath = new DataModelPath(selected.DataModelPath); - OnDataModelPathSelected(new DataModelSelectedEventArgs(DataModelPath)); - } - - private void PropertyButton_OnClick(object sender, RoutedEventArgs e) - { - // DataContext is not set when using left button, I don't know why but there it is - if (sender is Button button && button.ContextMenu != null) - { - button.ContextMenu.DataContext = button.DataContext; - button.ContextMenu.IsOpen = true; - } - } - - private static void DataModelPathPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - if (d is not DataModelPicker dataModelPicker) - return; - - if (e.OldValue is DataModelPath oldPath) - { - oldPath.PathInvalidated -= dataModelPicker.PathValidationChanged; - oldPath.PathValidated -= dataModelPicker.PathValidationChanged; - oldPath.Dispose(); - } - - dataModelPicker.UpdateValueDisplay(); - if (e.NewValue is DataModelPath newPath) - { - newPath.PathInvalidated += dataModelPicker.PathValidationChanged; - newPath.PathValidated += dataModelPicker.PathValidationChanged; - } - } - - private static void ShowFullPathPropertyCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - if (d is not DataModelPicker dataModelPicker) - return; - - dataModelPicker.UpdateValueDisplay(); - } - - private static void ModulesPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - if (d is not DataModelPicker dataModelPicker) - return; - - dataModelPicker.GetDataModel(); - } - - private static void DataModelViewModelPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - if (d is not DataModelPicker dataModelPicker) - return; - - if (e.OldValue is DataModelPropertiesViewModel vm) - vm.Dispose(); - } - - private static void ExtraDataModelViewModelsPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - if (d is not DataModelPicker dataModelPicker) - return; - } - - private void PathValidationChanged(object? sender, EventArgs e) - { - Dispatcher.Invoke(UpdateValueDisplay, DispatcherPriority.DataBind); - } - - private void OnUnloaded(object o, RoutedEventArgs routedEventArgs) - { - if (DataModelPath != null) - { - DataModelPath.PathInvalidated -= PathValidationChanged; - DataModelPath.PathValidated -= PathValidationChanged; - } - - DataModelViewModel?.Dispose(); - } - - /// - public event PropertyChangedEventHandler? PropertyChanged; - } -} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/DataModelPicker/DataModelPicker.cs b/src/Artemis.UI.Shared/Controls/DataModelPicker/DataModelPicker.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/DataModelPicker/DataModelPicker.cs rename to src/Artemis.UI.Shared/Controls/DataModelPicker/DataModelPicker.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/DataModelPicker/DataModelPickerButton.cs b/src/Artemis.UI.Shared/Controls/DataModelPicker/DataModelPickerButton.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/DataModelPicker/DataModelPickerButton.cs rename to src/Artemis.UI.Shared/Controls/DataModelPicker/DataModelPickerButton.cs diff --git a/src/Artemis.UI.Shared/Controls/DeviceVisualizer.cs b/src/Artemis.UI.Shared/Controls/DeviceVisualizer.cs index 427ad1808..b5a944faf 100644 --- a/src/Artemis.UI.Shared/Controls/DeviceVisualizer.cs +++ b/src/Artemis.UI.Shared/Controls/DeviceVisualizer.cs @@ -1,94 +1,93 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; -using System.Collections.Specialized; using System.ComponentModel; using System.IO; using System.Linq; -using System.Timers; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Threading; +using System.Threading.Tasks; using Artemis.Core; +using Artemis.UI.Shared.Events; +using Avalonia; +using Avalonia.Controls; +using Avalonia.Input; +using Avalonia.LogicalTree; +using Avalonia.Media; +using Avalonia.Media.Imaging; +using Avalonia.Platform; +using Avalonia.Rendering; +using Avalonia.Threading; +using Avalonia.Visuals.Media.Imaging; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.Controls { /// /// Visualizes an with optional per-LED colors /// - public class DeviceVisualizer : FrameworkElement + public class DeviceVisualizer : Control { - /// - /// The device to visualize - /// - public static readonly DependencyProperty DeviceProperty = DependencyProperty.Register(nameof(Device), typeof(ArtemisDevice), typeof(DeviceVisualizer), - new FrameworkPropertyMetadata(default(ArtemisDevice), FrameworkPropertyMetadataOptions.AffectsRender, DevicePropertyChangedCallback)); - - /// - /// Whether or not to show per-LED colors - /// - public static readonly DependencyProperty ShowColorsProperty = DependencyProperty.Register(nameof(ShowColors), typeof(bool), typeof(DeviceVisualizer), - new FrameworkPropertyMetadata(default(bool), FrameworkPropertyMetadataOptions.AffectsRender, ShowColorsPropertyChangedCallback)); - - /// - /// A list of LEDs to highlight - /// - public static readonly DependencyProperty HighlightedLedsProperty = DependencyProperty.Register(nameof(HighlightedLeds), typeof(ObservableCollection), typeof(DeviceVisualizer), - new FrameworkPropertyMetadata(default(ObservableCollection), HighlightedLedsPropertyChanged)); - - private readonly DrawingGroup _backingStore; + private const double UpdateFrameRate = 25.0; private readonly List _deviceVisualizerLeds; private readonly DispatcherTimer _timer; - private BitmapImage? _deviceImage; - private ArtemisDevice? _oldDevice; - private List _highlightedLeds; - private List _dimmedLeds; - /// - /// Creates a new instance of the class - /// + private Rect _deviceBounds; + private RenderTargetBitmap? _deviceImage; + private List? _dimmedLeds; + private List? _highlightedLeds; + private ArtemisDevice? _oldDevice; + + /// public DeviceVisualizer() { - _backingStore = new DrawingGroup(); + _timer = new DispatcherTimer(DispatcherPriority.Render) {Interval = TimeSpan.FromMilliseconds(1000.0 / UpdateFrameRate)}; _deviceVisualizerLeds = new List(); - _dimmedLeds = new List(); - // Run an update timer at 25 fps - _timer = new DispatcherTimer(DispatcherPriority.Render) {Interval = TimeSpan.FromMilliseconds(40)}; - - MouseLeftButtonUp += OnMouseLeftButtonUp; - Loaded += OnLoaded; - Unloaded += OnUnloaded; + PointerReleased += OnPointerReleased; } - /// - /// Gets or sets the device to visualize - /// - public ArtemisDevice? Device + /// + public override void Render(DrawingContext drawingContext) { - get => (ArtemisDevice) GetValue(DeviceProperty); - set => SetValue(DeviceProperty, value); - } + if (Device == null) + return; - /// - /// Gets or sets whether or not to show per-LED colors - /// - public bool ShowColors - { - get => (bool) GetValue(ShowColorsProperty); - set => SetValue(ShowColorsProperty, value); - } + // Determine the scale required to fit the desired size of the control + double scale = Math.Min(Bounds.Width / _deviceBounds.Width, Bounds.Height / _deviceBounds.Height); - /// - /// Gets or sets a list of LEDs to highlight - /// - public ObservableCollection? HighlightedLeds - { - get => (ObservableCollection) GetValue(HighlightedLedsProperty); - set => SetValue(HighlightedLedsProperty, value); + DrawingContext.PushedState? boundsPush = null; + try + { + // Scale the visualization in the desired bounding box + if (Bounds.Width > 0 && Bounds.Height > 0) + boundsPush = drawingContext.PushPreTransform(Matrix.CreateScale(scale, scale)); + + // Apply device rotation + using DrawingContext.PushedState translationPush = drawingContext.PushPreTransform(Matrix.CreateTranslation(0 - _deviceBounds.Left, 0 - _deviceBounds.Top)); + using DrawingContext.PushedState rotationPush = drawingContext.PushPreTransform(Matrix.CreateRotation(Matrix.ToRadians(Device.Rotation))); + + // Apply device scale + using DrawingContext.PushedState scalePush = drawingContext.PushPreTransform(Matrix.CreateScale(Device.Scale, Device.Scale)); + + // Render device and LED images + if (_deviceImage != null) + { + drawingContext.DrawImage( + _deviceImage, + new Rect(_deviceImage.Size), + new Rect(0, 0, Device.RgbDevice.ActualSize.Width, Device.RgbDevice.ActualSize.Height), + RenderOptions.GetBitmapInterpolationMode(this) + ); + } + + if (!ShowColors) + return; + + foreach (DeviceVisualizerLed deviceVisualizerLed in _deviceVisualizerLeds) + deviceVisualizerLed.RenderGeometry(drawingContext, false); + } + finally + { + boundsPush?.Dispose(); + } } /// @@ -96,54 +95,6 @@ namespace Artemis.UI.Shared /// public event EventHandler? LedClicked; - /// - protected override void OnRender(DrawingContext drawingContext) - { - if (Device == null) - return; - - // Determine the scale required to fit the desired size of the control - Size measureSize = MeasureDevice(); - double scale = Math.Min(RenderSize.Width / measureSize.Width, RenderSize.Height / measureSize.Height); - - // Scale the visualization in the desired bounding box - if (RenderSize.Width > 0 && RenderSize.Height > 0) - drawingContext.PushTransform(new ScaleTransform(scale, scale)); - - // Determine the offset required to rotate within bounds - Rect rotationRect = new(0, 0, Device.RgbDevice.ActualSize.Width, Device.RgbDevice.ActualSize.Height); - rotationRect.Transform(new RotateTransform(Device.Rotation).Value); - - // Apply device rotation - drawingContext.PushTransform(new TranslateTransform(0 - rotationRect.Left, 0 - rotationRect.Top)); - drawingContext.PushTransform(new RotateTransform(Device.Rotation)); - - // Apply device scale - drawingContext.PushTransform(new ScaleTransform(Device.Scale, Device.Scale)); - - // Render device and LED images - if (_deviceImage != null) - drawingContext.DrawImage(_deviceImage, new Rect(0, 0, Device.RgbDevice.Size.Width, Device.RgbDevice.Size.Height)); - - foreach (DeviceVisualizerLed deviceVisualizerLed in _deviceVisualizerLeds) - deviceVisualizerLed.RenderImage(drawingContext); - - drawingContext.DrawDrawing(_backingStore); - } - - /// - protected override Size MeasureOverride(Size availableSize) - { - if (Device == null) - return Size.Empty; - - Size deviceSize = MeasureDevice(); - if (deviceSize.Width <= 0 || deviceSize.Height <= 0) - return Size.Empty; - - return ResizeKeepAspect(deviceSize, availableSize.Width, availableSize.Height); - } - /// /// Invokes the event /// @@ -153,72 +104,37 @@ namespace Artemis.UI.Shared LedClicked?.Invoke(this, e); } - /// - /// Releases the unmanaged resources used by the object and optionally releases the managed resources. - /// - /// - /// to release both managed and unmanaged resources; - /// to release only unmanaged resources. - /// - protected virtual void Dispose(bool disposing) + private void Update() { - if (disposing) - _timer.Stop(); + InvalidateVisual(); } - private static Size ResizeKeepAspect(Size src, double maxWidth, double maxHeight) - { - double scale; - if (double.IsPositiveInfinity(maxWidth) && !double.IsPositiveInfinity(maxHeight)) - scale = maxHeight / src.Height; - else if (!double.IsPositiveInfinity(maxWidth) && double.IsPositiveInfinity(maxHeight)) - scale = maxWidth / src.Width; - else if (double.IsPositiveInfinity(maxWidth) && double.IsPositiveInfinity(maxHeight)) - return src; - else - scale = Math.Min(maxWidth / src.Width, maxHeight / src.Height); - - return new Size(src.Width * scale, src.Height * scale); - } - - private Size MeasureDevice() + private Rect MeasureDevice() { if (Device == null) - return Size.Empty; + return Rect.Empty; - Rect rotationRect = new(0, 0, Device.RgbDevice.ActualSize.Width, Device.RgbDevice.ActualSize.Height); - rotationRect.Transform(new RotateTransform(Device.Rotation).Value); + Rect deviceRect = new(0, 0, Device.RgbDevice.ActualSize.Width, Device.RgbDevice.ActualSize.Height); + Geometry geometry = new RectangleGeometry(deviceRect); + geometry.Transform = new RotateTransform(Device.Rotation); - return rotationRect.Size; + return geometry.Bounds; } - private void OnUnloaded(object? sender, RoutedEventArgs e) + private void TimerOnTick(object? sender, EventArgs e) { - _timer.Stop(); - _timer.Tick -= TimerOnTick; - - if (HighlightedLeds != null) - HighlightedLeds.CollectionChanged -= HighlightedLedsChanged; - if (_oldDevice != null) - { - if (Device != null) - { - Device.RgbDevice.PropertyChanged -= DevicePropertyChanged; - Device.DeviceUpdated -= DeviceUpdated; - } - - _oldDevice = null; - } + if (ShowColors && IsVisible && Opacity > 0) + Update(); } - private void OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e) + private void OnPointerReleased(object? sender, PointerReleasedEventArgs e) { if (Device == null) return; Point position = e.GetPosition(this); - double x = position.X / RenderSize.Width; - double y = position.Y / RenderSize.Height; + double x = position.X / Bounds.Width; + double y = position.Y / Bounds.Height; Point scaledPosition = new(x * Device.Rectangle.Width, y * Device.Rectangle.Height); DeviceVisualizerLed? deviceVisualizerLed = _deviceVisualizerLeds.FirstOrDefault(l => l.HitTest(scaledPosition)); @@ -226,154 +142,173 @@ namespace Artemis.UI.Shared OnLedClicked(new LedClickedEventArgs(deviceVisualizerLed.Led.Device, deviceVisualizerLed.Led)); } - private void OnLoaded(object? sender, RoutedEventArgs e) + private void DevicePropertyChanged(object? sender, PropertyChangedEventArgs e) { - _timer.Start(); - _timer.Tick += TimerOnTick; + Dispatcher.UIThread.Post(SetupForDevice, DispatcherPriority.Background); } - private void TimerOnTick(object? sender, EventArgs e) + private void DeviceUpdated(object? sender, EventArgs e) { - if (ShowColors && Visibility == Visibility.Visible) - Render(); + Dispatcher.UIThread.Post(SetupForDevice, DispatcherPriority.Background); } - private void Render() + #region Properties + + /// + /// Gets or sets the to display + /// + public static readonly StyledProperty DeviceProperty = + AvaloniaProperty.Register(nameof(Device), notifying: DeviceUpdated); + + private static void DeviceUpdated(IAvaloniaObject sender, bool before) { - DrawingContext drawingContext = _backingStore.Append(); - - if (_highlightedLeds.Any()) - { - foreach (DeviceVisualizerLed deviceVisualizerLed in _highlightedLeds) - deviceVisualizerLed.RenderColor(_backingStore, drawingContext, false); - - foreach (DeviceVisualizerLed deviceVisualizerLed in _dimmedLeds) - deviceVisualizerLed.RenderColor(_backingStore, drawingContext, true); - } - else - { - foreach (DeviceVisualizerLed deviceVisualizerLed in _deviceVisualizerLeds) - deviceVisualizerLed.RenderColor(_backingStore, drawingContext, false); - } - - drawingContext.Close(); + if (!before) + ((DeviceVisualizer) sender).SetupForDevice(); } - private void UpdateTransform() + /// + /// Gets or sets the to display + /// + public ArtemisDevice? Device { - InvalidateVisual(); - InvalidateMeasure(); + get => GetValue(DeviceProperty); + set => SetValue(DeviceProperty, value); } - private void SetupForDevice() + /// + /// Gets or sets boolean indicating whether or not to show per-LED colors + /// + public static readonly StyledProperty ShowColorsProperty = + AvaloniaProperty.Register(nameof(ShowColors)); + + /// + /// Gets or sets a boolean indicating whether or not to show per-LED colors + /// + public bool ShowColors { + get => GetValue(ShowColorsProperty); + set => SetValue(ShowColorsProperty, value); + } + + /// + /// Gets or sets a list of LEDs to highlight + /// + public static readonly StyledProperty?> HighlightedLedsProperty = + AvaloniaProperty.Register?>(nameof(HighlightedLeds)); + + /// + /// Gets or sets a list of LEDs to highlight + /// + public ObservableCollection? HighlightedLeds + { + get => GetValue(HighlightedLedsProperty); + set => SetValue(HighlightedLedsProperty, value); + } + + #endregion + + #region Lifetime management + + /// + protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e) + { + _deviceImage?.Dispose(); _deviceImage = null; - _deviceVisualizerLeds.Clear(); - _highlightedLeds = new List(); - _dimmedLeds = new List(); - if (Device == null) - return; - - if (_oldDevice != null) + if (Device != null) { Device.RgbDevice.PropertyChanged -= DevicePropertyChanged; Device.DeviceUpdated -= DeviceUpdated; } + base.OnDetachedFromVisualTree(e); + } + + /// + protected override void OnAttachedToLogicalTree(LogicalTreeAttachmentEventArgs e) + { + _timer.Start(); + _timer.Tick += TimerOnTick; + base.OnAttachedToLogicalTree(e); + } + + /// + protected override void OnDetachedFromLogicalTree(LogicalTreeAttachmentEventArgs e) + { + _timer.Stop(); + _timer.Tick -= TimerOnTick; + base.OnDetachedFromLogicalTree(e); + } + + private void SetupForDevice() + { + _deviceImage?.Dispose(); + _deviceImage = null; + _deviceVisualizerLeds.Clear(); + _highlightedLeds = new List(); + _dimmedLeds = new List(); + + if (_oldDevice != null) + { + _oldDevice.RgbDevice.PropertyChanged -= DevicePropertyChanged; + _oldDevice.DeviceUpdated -= DeviceUpdated; + } + _oldDevice = Device; + if (Device == null) + return; + + _deviceBounds = MeasureDevice(); Device.RgbDevice.PropertyChanged += DevicePropertyChanged; Device.DeviceUpdated += DeviceUpdated; - UpdateTransform(); - - // Load the device main image - if (Device.Layout?.Image != null && File.Exists(Device.Layout.Image.LocalPath)) - _deviceImage = new BitmapImage(Device.Layout.Image); // Create all the LEDs foreach (ArtemisLed artemisLed in Device.Leds) _deviceVisualizerLeds.Add(new DeviceVisualizerLed(artemisLed)); - if (!ShowColors) + // Load the device main image on a background thread + ArtemisDevice? device = Device; + Task.Run(() => { - InvalidateMeasure(); - return; - } + if (device.Layout?.Image == null || !File.Exists(device.Layout.Image.LocalPath)) + return; - // Create the opacity drawing group - DrawingGroup opacityDrawingGroup = new(); - DrawingContext drawingContext = opacityDrawingGroup.Open(); - foreach (DeviceVisualizerLed deviceVisualizerLed in _deviceVisualizerLeds) - deviceVisualizerLed.RenderOpacityMask(drawingContext); - drawingContext.Close(); + try + { + // Create a bitmap that'll be used to render the device and LED images just once + RenderTargetBitmap renderTargetBitmap = new(new PixelSize((int) device.RgbDevice.Size.Width * 4, (int) device.RgbDevice.Size.Height * 4)); - // Render the store as a bitmap - DrawingImage drawingImage = new(opacityDrawingGroup); - Image image = new() {Source = drawingImage}; - RenderTargetBitmap bitmap = new( - Math.Max(1, (int) (opacityDrawingGroup.Bounds.Width * 2.5)), - Math.Max(1, (int) (opacityDrawingGroup.Bounds.Height * 2.5)), - 96, - 96, - PixelFormats.Pbgra32 - ); - image.Arrange(new Rect(0, 0, bitmap.Width, bitmap.Height)); - bitmap.Render(image); - bitmap.Freeze(); + using IDrawingContextImpl context = renderTargetBitmap.CreateDrawingContext(new ImmediateRenderer(this)); + using Bitmap bitmap = new(device.Layout.Image.LocalPath); + context.DrawBitmap(bitmap.PlatformImpl, 1, new Rect(bitmap.Size), new Rect(renderTargetBitmap.Size), BitmapInterpolationMode.HighQuality); + foreach (DeviceVisualizerLed deviceVisualizerLed in _deviceVisualizerLeds) + deviceVisualizerLed.DrawBitmap(context); - // Set the bitmap as the opacity mask for the colors backing store - ImageBrush bitmapBrush = new(bitmap); - bitmapBrush.Freeze(); - _backingStore.OpacityMask = bitmapBrush; - _backingStore.Children.Clear(); + _deviceImage = renderTargetBitmap; - InvalidateMeasure(); + Dispatcher.UIThread.Post(InvalidateMeasure); + } + catch + { + // ignored + } + }); } - private void DeviceUpdated(object? sender, EventArgs e) + /// + protected override Size MeasureOverride(Size availableSize) { - Dispatcher.Invoke(SetupForDevice); + if (_deviceBounds.Width <= 0 || _deviceBounds.Height <= 0) + return new Size(0, 0); + + double availableWidth = double.IsInfinity(availableSize.Width) ? _deviceBounds.Width : availableSize.Width; + double availableHeight = double.IsInfinity(availableSize.Height) ? _deviceBounds.Height : availableSize.Height; + double bestRatio = Math.Min(availableWidth / _deviceBounds.Width, availableHeight / _deviceBounds.Height); + + return new Size(_deviceBounds.Width * bestRatio, _deviceBounds.Height * bestRatio); } - private void DevicePropertyChanged(object? sender, PropertyChangedEventArgs e) - { - Dispatcher.Invoke(SetupForDevice); - } - - private static void DevicePropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - DeviceVisualizer deviceVisualizer = (DeviceVisualizer) d; - deviceVisualizer.Dispatcher.Invoke(() => { deviceVisualizer.SetupForDevice(); }); - } - - private static void ShowColorsPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - DeviceVisualizer deviceVisualizer = (DeviceVisualizer) d; - deviceVisualizer.Dispatcher.Invoke(() => { deviceVisualizer.SetupForDevice(); }); - } - - private static void HighlightedLedsPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - DeviceVisualizer deviceVisualizer = (DeviceVisualizer) d; - if (e.OldValue is ObservableCollection oldCollection) - oldCollection.CollectionChanged -= deviceVisualizer.HighlightedLedsChanged; - if (e.NewValue is ObservableCollection newCollection) - newCollection.CollectionChanged += deviceVisualizer.HighlightedLedsChanged; - } - - private void HighlightedLedsChanged(object? sender, NotifyCollectionChangedEventArgs notifyCollectionChangedEventArgs) - { - if (HighlightedLeds != null) - { - _highlightedLeds = _deviceVisualizerLeds.Where(l => HighlightedLeds.Contains(l.Led)).ToList(); - _dimmedLeds = _deviceVisualizerLeds.Where(l => !HighlightedLeds.Contains(l.Led)).ToList(); - } - else - { - _highlightedLeds = new List(); - _dimmedLeds = new List(); - } - } + #endregion } } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Controls/DeviceVisualizerLed.cs b/src/Artemis.UI.Shared/Controls/DeviceVisualizerLed.cs index b6cdae397..9ccc4bcb6 100644 --- a/src/Artemis.UI.Shared/Controls/DeviceVisualizerLed.cs +++ b/src/Artemis.UI.Shared/Controls/DeviceVisualizerLed.cs @@ -1,24 +1,23 @@ using System; using System.IO; -using System.Windows; -using System.Windows.Media; -using System.Windows.Media.Imaging; using Artemis.Core; +using Avalonia; +using Avalonia.Media; +using Avalonia.Media.Imaging; +using Avalonia.Platform; +using Avalonia.Visuals.Media.Imaging; using RGB.NET.Core; -using Color = System.Windows.Media.Color; -using Point = System.Windows.Point; -using SolidColorBrush = System.Windows.Media.SolidColorBrush; +using Color = Avalonia.Media.Color; +using Point = Avalonia.Point; +using SolidColorBrush = Avalonia.Media.SolidColorBrush; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.Controls { internal class DeviceVisualizerLed { - private const byte Dimmed = 100; - private const byte NonDimmed = 255; - private GeometryDrawing? _geometryDrawing; - private DrawingGroup? _lastBackingStore; - private Color _renderColor; - private SolidColorBrush? _renderColorBrush; + private readonly SolidColorBrush _penBrush; + private readonly SolidColorBrush _fillBrush; + private readonly Pen _pen; public DeviceVisualizerLed(ArtemisLed led) { @@ -30,83 +29,63 @@ namespace Artemis.UI.Shared Led.RgbLed.Size.Height ); - if (Led.Layout?.Image != null && File.Exists(Led.Layout.Image.LocalPath)) - LedImage = new BitmapImage(Led.Layout.Image); + _fillBrush = new SolidColorBrush(); + _penBrush = new SolidColorBrush(); + _pen = new Pen(_penBrush) {LineJoin = PenLineJoin.Round}; CreateLedGeometry(); } - public ArtemisLed Led { get; } public Rect LedRect { get; set; } - public BitmapImage? LedImage { get; set; } public Geometry? DisplayGeometry { get; private set; } - public void RenderColor(DrawingGroup backingStore, DrawingContext drawingContext, bool isDimmed) + public void DrawBitmap(IDrawingContextImpl drawingContext) { - if (DisplayGeometry == null || backingStore == null) + if (Led.Layout?.Image == null || !File.Exists(Led.Layout.Image.LocalPath)) return; - _renderColorBrush ??= new SolidColorBrush(); - _geometryDrawing ??= new GeometryDrawing(_renderColorBrush, null, new RectangleGeometry(LedRect)); + try + { + using Bitmap bitmap = new(Led.Layout.Image.LocalPath); + drawingContext.DrawBitmap( + bitmap.PlatformImpl, + 1, + new Rect(bitmap.Size), + new Rect(Led.RgbLed.Location.X * 4, Led.RgbLed.Location.Y * 4, Led.RgbLed.Size.Width * 4, Led.RgbLed.Size.Height * 4), + BitmapInterpolationMode.HighQuality + ); + } + catch + { + // ignored + } + } + public void RenderGeometry(DrawingContext drawingContext, bool dimmed) + { byte r = Led.RgbLed.Color.GetR(); byte g = Led.RgbLed.Color.GetG(); byte b = Led.RgbLed.Color.GetB(); - _renderColor.A = isDimmed ? Dimmed : NonDimmed; - _renderColor.R = r; - _renderColor.G = g; - _renderColor.B = b; - _renderColorBrush.Color = _renderColor; - - if (_lastBackingStore != backingStore) + if (dimmed) { - backingStore.Children.Add(_geometryDrawing); - _lastBackingStore = backingStore; + _fillBrush.Color = new Color(50, r, g, b); + _penBrush.Color = new Color(100, r, g, b); + } + else + { + _fillBrush.Color = new Color(100, r, g, b); + _penBrush.Color = new Color(255, r, g, b); } - } - public void RenderImage(DrawingContext drawingContext) - { - if (LedImage == null) - return; - - drawingContext.DrawImage(LedImage, LedRect); - } - - public void RenderOpacityMask(DrawingContext drawingContext) - { - if (DisplayGeometry == null) - return; - - SolidColorBrush fillBrush = new(Color.FromArgb(100, 255, 255, 255)); - fillBrush.Freeze(); - SolidColorBrush penBrush = new(Color.FromArgb(255, 255, 255, 255)); - penBrush.Freeze(); - - // Create transparent pixels covering the entire LedRect so the image size matched the LedRect size - drawingContext.DrawRectangle(new SolidColorBrush(Colors.Transparent), new Pen(new SolidColorBrush(Colors.Transparent), 1), LedRect); - // Translate to the top-left of the LedRect - drawingContext.PushTransform(new TranslateTransform(LedRect.X, LedRect.Y)); // Render the LED geometry - drawingContext.DrawGeometry(fillBrush, new Pen(penBrush, 1) {LineJoin = PenLineJoin.Round}, DisplayGeometry.GetOutlinedPathGeometry()); - // Restore the drawing context - drawingContext.Pop(); + drawingContext.DrawGeometry(_fillBrush, _pen, DisplayGeometry); } public bool HitTest(Point position) { - if (DisplayGeometry == null) - return false; - - PathGeometry translatedGeometry = Geometry.Combine( - Geometry.Empty, - DisplayGeometry, - GeometryCombineMode.Union, - new TranslateTransform(Led.RgbLed.Location.X, Led.RgbLed.Location.Y) - ); - return translatedGeometry.FillContains(position); + return DisplayGeometry != null && DisplayGeometry.FillContains(position); } private void CreateLedGeometry() @@ -139,17 +118,17 @@ namespace Artemis.UI.Shared private void CreateRectangleGeometry() { - DisplayGeometry = new RectangleGeometry(new Rect(0.5, 0.5, Led.RgbLed.Size.Width - 1, Led.RgbLed.Size.Height - 1)); + DisplayGeometry = new RectangleGeometry(new Rect(Led.RgbLed.Location.X + 0.5, Led.RgbLed.Location.Y + 0.5, Led.RgbLed.Size.Width - 1, Led.RgbLed.Size.Height - 1)); } private void CreateCircleGeometry() { - DisplayGeometry = new EllipseGeometry(new Rect(0.5, 0.5, Led.RgbLed.Size.Width - 1, Led.RgbLed.Size.Height - 1)); + DisplayGeometry = new EllipseGeometry(new Rect(Led.RgbLed.Location.X + 0.5, Led.RgbLed.Location.Y + 0.5, Led.RgbLed.Size.Width - 1, Led.RgbLed.Size.Height - 1)); } private void CreateKeyCapGeometry() { - DisplayGeometry = new RectangleGeometry(new Rect(1, 1, Led.RgbLed.Size.Width - 2, Led.RgbLed.Size.Height - 2), 1.6, 1.6); + DisplayGeometry = new RectangleGeometry(new Rect(Led.RgbLed.Location.X + 1, Led.RgbLed.Location.Y + 1, Led.RgbLed.Size.Width - 2, Led.RgbLed.Size.Height - 2)); } private void CreateCustomGeometry(double deflateAmount) @@ -158,36 +137,17 @@ namespace Artemis.UI.Shared { double width = Led.RgbLed.Size.Width - deflateAmount; double height = Led.RgbLed.Size.Height - deflateAmount; - // DisplayGeometry = Geometry.Parse(Led.RgbLed.ShapeData); - DisplayGeometry = Geometry.Combine( - Geometry.Empty, - Geometry.Parse(Led.RgbLed.ShapeData), - GeometryCombineMode.Union, - new TransformGroup + + Geometry geometry = Geometry.Parse(Led.RgbLed.ShapeData); + geometry.Transform = new TransformGroup + { + Children = new Transforms { - Children = new TransformCollection - { - new ScaleTransform(width, height), - new TranslateTransform(deflateAmount / 2, deflateAmount / 2) - } + new ScaleTransform(width, height), + new TranslateTransform(Led.RgbLed.Location.X + deflateAmount / 2, Led.RgbLed.Location.Y + deflateAmount / 2) } - ); - - if (DisplayGeometry.Bounds.Width > width) - { - DisplayGeometry = Geometry.Combine(Geometry.Empty, DisplayGeometry, GeometryCombineMode.Union, new TransformGroup - { - Children = new TransformCollection {new ScaleTransform(width / DisplayGeometry.Bounds.Width, 1)} - }); - } - - if (DisplayGeometry.Bounds.Height > height) - { - DisplayGeometry = Geometry.Combine(Geometry.Empty, DisplayGeometry, GeometryCombineMode.Union, new TransformGroup - { - Children = new TransformCollection {new ScaleTransform(1, height / DisplayGeometry.Bounds.Height)} - }); - } + }; + DisplayGeometry = geometry; } catch (Exception) { diff --git a/src/Artemis.UI.Shared/Controls/DraggableFloat.xaml b/src/Artemis.UI.Shared/Controls/DraggableFloat.xaml deleted file mode 100644 index e7dcffe2d..000000000 --- a/src/Artemis.UI.Shared/Controls/DraggableFloat.xaml +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Controls/DraggableFloat.xaml.cs b/src/Artemis.UI.Shared/Controls/DraggableFloat.xaml.cs deleted file mode 100644 index 499afb5d7..000000000 --- a/src/Artemis.UI.Shared/Controls/DraggableFloat.xaml.cs +++ /dev/null @@ -1,303 +0,0 @@ -using System; -using System.ComponentModel; -using System.Globalization; -using System.Runtime.CompilerServices; -using System.Text.RegularExpressions; -using System.Windows; -using System.Windows.Input; - -namespace Artemis.UI.Shared -{ - /// - /// Interaction logic for DraggableFloat.xaml - /// - public partial class DraggableFloat : INotifyPropertyChanged - { - /// - /// Gets or sets the current value - /// - public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(nameof(Value), typeof(float), typeof(DraggableFloat), - new FrameworkPropertyMetadata(default(float), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, FloatPropertyChangedCallback)); - - /// - /// Gets or sets the step size when dragging - /// - public static readonly DependencyProperty StepSizeProperty = DependencyProperty.Register(nameof(StepSize), typeof(float), typeof(DraggableFloat)); - - /// - /// Gets or sets the minimum value - /// - public static readonly DependencyProperty MinProperty = DependencyProperty.Register(nameof(Min), typeof(object), typeof(DraggableFloat)); - - /// - /// Gets or sets the maximum value - /// - public static readonly DependencyProperty MaxProperty = DependencyProperty.Register(nameof(Max), typeof(object), typeof(DraggableFloat)); - - /// - /// Occurs when the value has changed - /// - public static readonly RoutedEvent ValueChangedEvent = - EventManager.RegisterRoutedEvent( - nameof(Value), - RoutingStrategy.Bubble, - typeof(RoutedPropertyChangedEventHandler), - typeof(DraggableFloat)); - - private readonly Regex _inputRegex = new("^[.][-|0-9]+$|^-?[0-9]*[.]{0,1}[0-9]*$"); - - private bool _calledDragStarted; - - private bool _inCallback; - private Point _mouseDragStartPoint; - private float _startValue; - - /// - /// Creates a new instance of the class - /// - public DraggableFloat() - { - InitializeComponent(); - } - - /// - /// Gets or sets the current value - /// - public float Value - { - get => (float) GetValue(ValueProperty); - set => SetValue(ValueProperty, value); - } - - /// - /// Gets or sets the current value as a string - /// - public string InputValue - { - get => Value.ToString("N3", CultureInfo.InvariantCulture); - set => UpdateValue(value); - } - - /// - /// Gets or sets the step size when dragging - /// - public float StepSize - { - get => (float) GetValue(StepSizeProperty); - set => SetValue(StepSizeProperty, value); - } - - /// - /// Gets or sets the minimum value - /// - public object? Min - { - get => (object?) GetValue(MinProperty); - set => SetValue(MinProperty, value); - } - - /// - /// Gets or sets the maximum value - /// - public object? Max - { - get => (object?) GetValue(MaxProperty); - set => SetValue(MaxProperty, value); - } - - private void UpdateValue(string value) - { - if (!float.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out float parsedResult)) - return; - - Value = parsedResult; - OnPropertyChanged(nameof(InputValue)); - } - - - private void DisplayInput() - { - DragHandle.Visibility = Visibility.Collapsed; - DraggableFloatInputTextBox.Visibility = Visibility.Visible; - DraggableFloatInputTextBox.Focus(); - DraggableFloatInputTextBox.SelectAll(); - } - - private void DisplayDragHandle() - { - DraggableFloatInputTextBox.Visibility = Visibility.Collapsed; - DragHandle.Visibility = Visibility.Visible; - } - - - /// - /// Rounds the provided decimal to the nearest value of x with a given threshold - /// Source: https://stackoverflow.com/a/25922075/5015269 - /// - /// The value to round - /// The value to round down towards - private static decimal RoundToNearestOf(decimal input, decimal nearestOf) - { - return Math.Floor(input / nearestOf + 0.5m) * nearestOf; - } - - #region Event handlers - - private static void FloatPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - DraggableFloat draggableFloat = (DraggableFloat) d; - if (draggableFloat._inCallback) - return; - - draggableFloat._inCallback = true; - draggableFloat.OnPropertyChanged(nameof(Value)); - draggableFloat.OnPropertyChanged(nameof(InputValue)); - draggableFloat._inCallback = false; - } - - private void InputMouseDown(object sender, MouseButtonEventArgs e) - { - e.Handled = true; - - _startValue = Value; - ((IInputElement) sender).CaptureMouse(); - _mouseDragStartPoint = e.GetPosition((IInputElement) sender); - } - - private void InputMouseUp(object sender, MouseButtonEventArgs e) - { - e.Handled = true; - - Point position = e.GetPosition((IInputElement) sender); - if (position == _mouseDragStartPoint) - { - DisplayInput(); - } - else - { - OnDragEnded(); - _calledDragStarted = false; - } - - ((IInputElement) sender).ReleaseMouseCapture(); - } - - private void InputMouseMove(object sender, MouseEventArgs e) - { - if (e.LeftButton != MouseButtonState.Pressed) - return; - - e.Handled = true; - - if (!_calledDragStarted) - { - OnDragStarted(); - _calledDragStarted = true; - } - - // Use decimals for everything to avoid floating point errors - decimal startValue = new(_startValue); - decimal startX = new(_mouseDragStartPoint.X); - decimal x = new(e.GetPosition((IInputElement) sender).X); - decimal stepSize = new(StepSize); - if (stepSize == 0) - stepSize = 0.1m; - - if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift)) - stepSize = stepSize * 10; - - float value = (float) RoundToNearestOf(startValue + stepSize * (x - startX), stepSize); - - if (Min != null && float.TryParse(Min.ToString(), out float minFloat)) - value = Math.Max(value, minFloat); - if (Max != null && float.TryParse(Max.ToString(), out float maxFloat)) - value = Math.Min(value, maxFloat); - - Value = value; - } - - private void InputLostFocus(object sender, RoutedEventArgs e) - { - DisplayDragHandle(); - } - - private void InputKeyDown(object sender, KeyEventArgs e) - { - if (e.Key == Key.Enter) - { - DisplayDragHandle(); - } - else if (e.Key == Key.Escape) - { - DraggableFloatInputTextBox.Text = _startValue.ToString(CultureInfo.InvariantCulture); - DisplayDragHandle(); - } - } - - private void Input_OnRequestBringIntoView(object sender, RequestBringIntoViewEventArgs e) - { - e.Handled = true; - } - - private void Input_PreviewTextInput(object sender, TextCompositionEventArgs e) - { - e.Handled = !_inputRegex.IsMatch(e.Text); - } - - private void Input_OnPasting(object sender, DataObjectPastingEventArgs e) - { - if (e.DataObject.GetDataPresent(typeof(string))) - { - if (e.DataObject.GetData(typeof(string)) is string text && !_inputRegex.IsMatch(text)) - e.CancelCommand(); - } - else - { - e.CancelCommand(); - } - } - - #endregion - - #region Events - - /// - public event PropertyChangedEventHandler? PropertyChanged; - - /// - /// Occurs when dragging has started - /// - public event EventHandler? DragStarted; - - /// - /// Occurs when dragging has ended - /// - public event EventHandler? DragEnded; - - /// - /// Invokes the event - /// - protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null) - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } - - /// - /// Invokes the event - /// - protected virtual void OnDragStarted() - { - DragStarted?.Invoke(this, EventArgs.Empty); - } - - /// - /// Invokes the event - /// - protected virtual void OnDragEnded() - { - DragEnded?.Invoke(this, EventArgs.Empty); - } - - #endregion - } -} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/EnumComboBox.axaml b/src/Artemis.UI.Shared/Controls/EnumComboBox.axaml similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/EnumComboBox.axaml rename to src/Artemis.UI.Shared/Controls/EnumComboBox.axaml diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/EnumComboBox.axaml.cs b/src/Artemis.UI.Shared/Controls/EnumComboBox.axaml.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/EnumComboBox.axaml.cs rename to src/Artemis.UI.Shared/Controls/EnumComboBox.axaml.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/Flyouts/DataModelPickerFlyout.cs b/src/Artemis.UI.Shared/Controls/Flyouts/DataModelPickerFlyout.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/Flyouts/DataModelPickerFlyout.cs rename to src/Artemis.UI.Shared/Controls/Flyouts/DataModelPickerFlyout.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/Flyouts/GradientPickerFlyout.cs b/src/Artemis.UI.Shared/Controls/Flyouts/GradientPickerFlyout.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/Flyouts/GradientPickerFlyout.cs rename to src/Artemis.UI.Shared/Controls/Flyouts/GradientPickerFlyout.cs diff --git a/src/Artemis.UI.Shared/Controls/GradientPicker.xaml b/src/Artemis.UI.Shared/Controls/GradientPicker.xaml deleted file mode 100644 index c13770ec8..000000000 --- a/src/Artemis.UI.Shared/Controls/GradientPicker.xaml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Controls/GradientPicker.xaml.cs b/src/Artemis.UI.Shared/Controls/GradientPicker.xaml.cs deleted file mode 100644 index aaedaa6bc..000000000 --- a/src/Artemis.UI.Shared/Controls/GradientPicker.xaml.cs +++ /dev/null @@ -1,171 +0,0 @@ -using System; -using System.Collections.Specialized; -using System.ComponentModel; -using System.Runtime.CompilerServices; -using System.Windows; -using System.Windows.Input; -using System.Windows.Media; -using Artemis.Core; -using Artemis.UI.Shared.Properties; -using Artemis.UI.Shared.Services; -using Stylet; - -namespace Artemis.UI.Shared -{ - /// - /// Interaction logic for GradientPicker.xaml - /// - public partial class GradientPicker : INotifyPropertyChanged - { - private static IColorPickerService? _colorPickerService; - private bool _inCallback; - private ColorGradientToGradientStopsConverter _gradientConverter; - - /// - /// Creates a new instance of the class - /// - public GradientPicker() - { - _gradientConverter = new ColorGradientToGradientStopsConverter(); - InitializeComponent(); - Unloaded += OnUnloaded; - } - - /// - /// Gets or sets the color gradient - /// - public ColorGradient ColorGradient - { - get => (ColorGradient) GetValue(ColorGradientProperty); - set => SetValue(ColorGradientProperty, value); - } - - /// - /// Gets or sets the dialog host in which to show the gradient dialog - /// - public string DialogHost - { - get => (string) GetValue(DialogHostProperty); - set => SetValue(DialogHostProperty, value); - } - - /// - /// Used by the gradient picker to load saved gradients, do not touch or it'll just throw an exception - /// - internal static IColorPickerService ColorPickerService - { - set - { - if (_colorPickerService != null) - throw new AccessViolationException("This is not for you to touch"); - _colorPickerService = value; - } - } - - /// - /// Occurs when the dialog has opened - /// - public event EventHandler? DialogOpened; - - /// - /// Occurs when the dialog has closed - /// - public event EventHandler? DialogClosed; - - /// - /// Invokes the event - /// - [NotifyPropertyChangedInvocator] - protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null) - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } - - /// - /// Invokes the event - /// - protected virtual void OnDialogOpened() - { - DialogOpened?.Invoke(this, EventArgs.Empty); - } - - /// - /// Invokes the event - /// - protected virtual void OnDialogClosed() - { - DialogClosed?.Invoke(this, EventArgs.Empty); - } - - private static void ColorGradientPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - GradientPicker gradientPicker = (GradientPicker) d; - if (gradientPicker._inCallback) - return; - - gradientPicker._inCallback = true; - - if (e.OldValue is ColorGradient oldGradient) - oldGradient.CollectionChanged -= gradientPicker.GradientChanged; - if (e.NewValue is ColorGradient newGradient) - newGradient.CollectionChanged += gradientPicker.GradientChanged; - gradientPicker.UpdateGradientStops(); - gradientPicker.OnPropertyChanged(nameof(ColorGradient)); - - gradientPicker._inCallback = false; - } - - private void GradientChanged(object? sender, NotifyCollectionChangedEventArgs e) - { - Dispatcher.Invoke(UpdateGradientStops); - } - - private void UpdateGradientStops() - { - GradientPreview.GradientStops = (GradientStopCollection) _gradientConverter.Convert(ColorGradient, null!, null!, null!); - } - - private void UIElement_OnMouseUp(object sender, MouseButtonEventArgs e) - { - if (_colorPickerService == null) - return; - - Execute.OnUIThread(async () => - { - OnDialogOpened(); - await _colorPickerService.ShowGradientPicker(ColorGradient, DialogHost); - OnDialogClosed(); - }); - } - - private void OnUnloaded(object sender, RoutedEventArgs e) - { - ColorGradient.CollectionChanged -= GradientChanged; - } - - /// - public event PropertyChangedEventHandler? PropertyChanged; - - #region Static WPF fields - - /// - /// Gets or sets the color gradient - /// - public static readonly DependencyProperty ColorGradientProperty = DependencyProperty.Register(nameof(ColorGradient), typeof(ColorGradient), typeof(GradientPicker), - new FrameworkPropertyMetadata(default(ColorGradient), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, ColorGradientPropertyChangedCallback)); - - /// - /// Gets or sets the dialog host in which to show the gradient dialog - /// - public static readonly DependencyProperty DialogHostProperty = DependencyProperty.Register(nameof(DialogHost), typeof(string), typeof(GradientPicker), - new FrameworkPropertyMetadata(default(string))); - - /// - /// Occurs when the color gradient has changed - /// - public static readonly RoutedEvent ColorGradientChangedEvent = - EventManager.RegisterRoutedEvent(nameof(ColorGradient), RoutingStrategy.Bubble, typeof(RoutedPropertyChangedEventHandler), typeof(GradientPicker)); - - #endregion - } -} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/GradientPicker/GradientPicker.cs b/src/Artemis.UI.Shared/Controls/GradientPicker/GradientPicker.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/GradientPicker/GradientPicker.cs rename to src/Artemis.UI.Shared/Controls/GradientPicker/GradientPicker.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/GradientPicker/GradientPickerButton.cs b/src/Artemis.UI.Shared/Controls/GradientPicker/GradientPickerButton.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/GradientPicker/GradientPickerButton.cs rename to src/Artemis.UI.Shared/Controls/GradientPicker/GradientPickerButton.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/GradientPicker/GradientPickerColorStop.cs b/src/Artemis.UI.Shared/Controls/GradientPicker/GradientPickerColorStop.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/GradientPicker/GradientPickerColorStop.cs rename to src/Artemis.UI.Shared/Controls/GradientPicker/GradientPickerColorStop.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/HotkeyBox.axaml b/src/Artemis.UI.Shared/Controls/HotkeyBox.axaml similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/HotkeyBox.axaml rename to src/Artemis.UI.Shared/Controls/HotkeyBox.axaml diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/HotkeyBox.axaml.cs b/src/Artemis.UI.Shared/Controls/HotkeyBox.axaml.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/HotkeyBox.axaml.cs rename to src/Artemis.UI.Shared/Controls/HotkeyBox.axaml.cs diff --git a/src/Artemis.UI.Shared/Controls/LockableToggleButton.cs b/src/Artemis.UI.Shared/Controls/LockableToggleButton.cs deleted file mode 100644 index 52748cc0e..000000000 --- a/src/Artemis.UI.Shared/Controls/LockableToggleButton.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System.Windows; -using System.Windows.Controls.Primitives; - -namespace Artemis.UI.Shared -{ - /// - /// Represents a toggle button that can be locked using a property - /// - public class LockableToggleButton : ToggleButton - { - /// - /// Gets or sets a boolean indicating whether the toggle button is locked - /// - public static readonly DependencyProperty IsLockedProperty = - DependencyProperty.Register("IsLocked", typeof(bool), typeof(LockableToggleButton), new UIPropertyMetadata(false)); - - /// - /// Gets or sets a boolean indicating whether the toggle button is locked - /// - public bool IsLocked - { - get => (bool) GetValue(IsLockedProperty); - set => SetValue(IsLockedProperty, value); - } - - /// - protected override void OnToggle() - { - if (!IsLocked) base.OnToggle(); - } - } -} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/NoInputTextBox.cs b/src/Artemis.UI.Shared/Controls/NoInputTextBox.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/NoInputTextBox.cs rename to src/Artemis.UI.Shared/Controls/NoInputTextBox.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.axaml b/src/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.axaml similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.axaml rename to src/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.axaml diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.axaml.cs b/src/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.axaml.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.axaml.cs rename to src/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.axaml.cs diff --git a/src/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.xaml b/src/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.xaml deleted file mode 100644 index 1572fc3d9..000000000 --- a/src/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.xaml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.xaml.cs b/src/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.xaml.cs deleted file mode 100644 index d63317f28..000000000 --- a/src/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.xaml.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Windows; -using System.Windows.Controls; - -namespace Artemis.UI.Shared - -{ - /// - /// Interaction logic for ProfileConfigurationIcon.xaml - /// - public partial class ProfileConfigurationIcon : UserControl - { - /// - /// Gets or sets the to display - /// - public static readonly DependencyProperty ConfigurationIconProperty = - DependencyProperty.Register(nameof(ConfigurationIcon), typeof(Core.ProfileConfigurationIcon), typeof(ProfileConfigurationIcon)); - - /// - /// Creates a new instance of the class - /// - public ProfileConfigurationIcon() - { - InitializeComponent(); - } - - /// - /// Gets or sets the to display - /// - public Core.ProfileConfigurationIcon ConfigurationIcon - { - get => (Core.ProfileConfigurationIcon) GetValue(ConfigurationIconProperty); - set => SetValue(ConfigurationIconProperty, value); - } - } -} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/SelectionRectangle.cs b/src/Artemis.UI.Shared/Controls/SelectionRectangle.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/SelectionRectangle.cs rename to src/Artemis.UI.Shared/Controls/SelectionRectangle.cs diff --git a/src/Artemis.UI.Shared/Converters/ColorGradientToGradientStopsConverter.cs b/src/Artemis.UI.Shared/Converters/ColorGradientToGradientStopsConverter.cs index 2a1c9de0a..29f562d47 100644 --- a/src/Artemis.UI.Shared/Converters/ColorGradientToGradientStopsConverter.cs +++ b/src/Artemis.UI.Shared/Converters/ColorGradientToGradientStopsConverter.cs @@ -1,46 +1,41 @@ using System; -using System.Collections.Generic; using System.Globalization; using System.Linq; -using System.Windows.Data; -using System.Windows.Media; using Artemis.Core; +using Avalonia.Data.Converters; +using Avalonia.Media; using SkiaSharp; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.Converters; + +/// +/// Converts into a . +/// +public class ColorGradientToGradientStopsConverter : IValueConverter { /// - /// - /// Converts into a - /// . - /// - [ValueConversion(typeof(ColorGradient), typeof(GradientStopCollection))] - public class ColorGradientToGradientStopsConverter : IValueConverter + public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture) { - /// - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - ColorGradient? colorGradient = value as ColorGradient; - GradientStopCollection collection = new(); - if (colorGradient == null) - return collection; - - foreach (ColorGradientStop c in colorGradient.OrderBy(s => s.Position)) - collection.Add(new GradientStop(Color.FromArgb(c.Color.Alpha, c.Color.Red, c.Color.Green, c.Color.Blue), c.Position)); + ColorGradient? colorGradient = value as ColorGradient; + GradientStops collection = new(); + if (colorGradient == null) return collection; - } - /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - GradientStopCollection? collection = value as GradientStopCollection; - ColorGradient colorGradients = new(); - if (collection == null) - return colorGradients; + foreach (ColorGradientStop c in colorGradient.OrderBy(s => s.Position)) + collection.Add(new GradientStop(Color.FromArgb(c.Color.Alpha, c.Color.Red, c.Color.Green, c.Color.Blue), c.Position)); + return collection; + } - foreach (GradientStop c in collection.OrderBy(s => s.Offset)) - colorGradients.Add(new ColorGradientStop(new SKColor(c.Color.R, c.Color.G, c.Color.B, c.Color.A), (float) c.Offset)); + /// + public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + { + GradientStops? collection = value as GradientStops; + ColorGradient colorGradients = new(); + if (collection == null) return colorGradients; - } + + foreach (GradientStop c in collection.OrderBy(s => s.Offset)) + colorGradients.Add(new ColorGradientStop(new SKColor(c.Color.R, c.Color.G, c.Color.B, c.Color.A), (float) c.Offset)); + return colorGradients; } } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Converters/ColorToSKColorConverter.cs b/src/Artemis.UI.Shared/Converters/ColorToSKColorConverter.cs index 6f612d002..b09052e65 100644 --- a/src/Artemis.UI.Shared/Converters/ColorToSKColorConverter.cs +++ b/src/Artemis.UI.Shared/Converters/ColorToSKColorConverter.cs @@ -1,30 +1,38 @@ using System; using System.Globalization; -using System.Windows.Data; -using System.Windows.Media; +using Avalonia.Data.Converters; +using Avalonia.Media; +using FluentAvalonia.UI.Media; using SkiaSharp; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.Converters { - /// /// - /// Converts into a . + /// Converts into . /// - [ValueConversion(typeof(Color), typeof(SKColor))] - public class SKColorToColorConverter : IValueConverter + public class ColorToSKColorConverter : IValueConverter { /// - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture) { - SKColor skColor = (SKColor) value; - return Color.FromArgb(skColor.Alpha, skColor.Red, skColor.Green, skColor.Blue); + if (value is Color avaloniaColor) + return new SKColor(avaloniaColor.R, avaloniaColor.G, avaloniaColor.B, avaloniaColor.A); + if (value is Color2 fluentAvaloniaColor) + return new SKColor(fluentAvaloniaColor.R, fluentAvaloniaColor.G, fluentAvaloniaColor.B, fluentAvaloniaColor.A); + + return SKColor.Empty; } /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) { - Color color = (Color) value; - return new SKColor(color.R, color.G, color.B, color.A); + Color result = new(0, 0, 0, 0); + if (value is SKColor skColor) + result = new Color(skColor.Alpha, skColor.Red, skColor.Green, skColor.Blue); + + if (targetType == typeof(Color2)) + return (Color2) result; + return result; } } } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Converters/ColorToSolidColorConverter.cs b/src/Artemis.UI.Shared/Converters/ColorToSolidColorConverter.cs deleted file mode 100644 index 85fc3bdd0..000000000 --- a/src/Artemis.UI.Shared/Converters/ColorToSolidColorConverter.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using System.Globalization; -using System.Windows.Data; -using System.Windows.Media; - -namespace Artemis.UI.Shared -{ - /// - /// - /// Converts into a with full - /// opacity. - /// - [ValueConversion(typeof(Color), typeof(string))] - public class ColorToSolidColorConverter : IValueConverter - { - /// - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - Color color = (Color) value; - return Color.FromRgb(color.R, color.G, color.B); - } - - /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Converters/ColorToStringConverter.cs b/src/Artemis.UI.Shared/Converters/ColorToStringConverter.cs deleted file mode 100644 index 4519d8b83..000000000 --- a/src/Artemis.UI.Shared/Converters/ColorToStringConverter.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Globalization; -using System.Windows.Data; -using System.Windows.Media; - -namespace Artemis.UI.Shared -{ - /// - /// - /// Converts into . - /// - [ValueConversion(typeof(Color), typeof(string))] - public class ColorToStringConverter : IValueConverter - { - /// - public object? Convert(object? value, Type targetType, object parameter, CultureInfo culture) - { - return value?.ToString()?.ToUpper(); - } - - /// - public object? ConvertBack(object? value, Type targetType, object parameter, CultureInfo culture) - { - try - { - if (string.IsNullOrWhiteSpace(value as string)) - return default(Color); - - object? color = ColorConverter.ConvertFromString((string) value!); - if (color is Color c) - return c; - - return default(Color); - } - catch (FormatException) - { - return default(Color); - } - } - } -} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Shared/Converters/EnumToBooleanConverter.cs b/src/Artemis.UI.Shared/Converters/EnumToBooleanConverter.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Converters/EnumToBooleanConverter.cs rename to src/Artemis.UI.Shared/Converters/EnumToBooleanConverter.cs diff --git a/src/Artemis.UI.Shared/Converters/IntToVisibilityConverter.cs b/src/Artemis.UI.Shared/Converters/IntToVisibilityConverter.cs deleted file mode 100644 index 2db2cd50a..000000000 --- a/src/Artemis.UI.Shared/Converters/IntToVisibilityConverter.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using System.Globalization; -using System.Windows; -using System.Windows.Data; - -namespace Artemis.UI.Shared -{ - /// - /// Converts to - /// - public class IntToVisibilityConverter : IValueConverter - { - /// - public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - Parameters direction; - if (parameter == null) - direction = Parameters.Normal; - else - direction = (Parameters) Enum.Parse(typeof(Parameters), (string) parameter); - - return direction == Parameters.Normal - ? value is > 1 ? Visibility.Visible : Visibility.Collapsed - : value is > 1 ? Visibility.Collapsed : Visibility.Visible; - } - - /// - public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - - private enum Parameters - { - Normal, - Inverted - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Converters/NullToVisibilityConverter.cs b/src/Artemis.UI.Shared/Converters/NullToVisibilityConverter.cs deleted file mode 100644 index dd70fbac2..000000000 --- a/src/Artemis.UI.Shared/Converters/NullToVisibilityConverter.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Globalization; -using System.Windows; -using System.Windows.Data; - -namespace Artemis.UI.Shared -{ - /// - /// Converts to - /// - public class NullToVisibilityConverter : IValueConverter - { - /// - public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - Parameters direction; - if (parameter == null) - direction = Parameters.Normal; - else - direction = (Parameters) Enum.Parse(typeof(Parameters), (string) parameter); - - if (value is string stringValue && string.IsNullOrWhiteSpace(stringValue)) - value = null; - - if (direction == Parameters.Normal) - return value == null ? Visibility.Collapsed : Visibility.Visible; - return value == null ? Visibility.Visible : Visibility.Collapsed; - } - - /// - public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - - private enum Parameters - { - Normal, - Inverted - } - } -} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Shared/Converters/ParentWidthPercentageConverter.cs b/src/Artemis.UI.Shared/Converters/ParentWidthPercentageConverter.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Converters/ParentWidthPercentageConverter.cs rename to src/Artemis.UI.Shared/Converters/ParentWidthPercentageConverter.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Converters/SKColorToBrushConverter.cs b/src/Artemis.UI.Shared/Converters/SKColorToBrushConverter.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Converters/SKColorToBrushConverter.cs rename to src/Artemis.UI.Shared/Converters/SKColorToBrushConverter.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Converters/SKColorToColorConverter.cs b/src/Artemis.UI.Shared/Converters/SKColorToColorConverter.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Converters/SKColorToColorConverter.cs rename to src/Artemis.UI.Shared/Converters/SKColorToColorConverter.cs diff --git a/src/Artemis.UI.Shared/Converters/SKColorToStringConverter.cs b/src/Artemis.UI.Shared/Converters/SKColorToStringConverter.cs index d1dbfcde8..7837c188e 100644 --- a/src/Artemis.UI.Shared/Converters/SKColorToStringConverter.cs +++ b/src/Artemis.UI.Shared/Converters/SKColorToStringConverter.cs @@ -1,31 +1,28 @@ using System; using System.Globalization; -using System.Windows.Data; -using System.Windows.Media; +using Avalonia.Data.Converters; using SkiaSharp; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.Converters; + +/// +/// +/// Converts into . +/// +public class SKColorToStringConverter : IValueConverter { /// - /// - /// Converts into . - /// - [ValueConversion(typeof(Color), typeof(string))] - public class SKColorToStringConverter : IValueConverter + public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) { - /// - public object? Convert(object? value, Type targetType, object parameter, CultureInfo culture) - { - return value?.ToString(); - } + return value?.ToString(); + } - /// - public object ConvertBack(object? value, Type targetType, object parameter, CultureInfo culture) - { - if (string.IsNullOrWhiteSpace(value as string)) - return SKColor.Empty; + /// + public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + { + if (string.IsNullOrWhiteSpace(value as string)) + return SKColor.Empty; - return SKColor.TryParse((string) value!, out SKColor color) ? color : SKColor.Empty; - } + return SKColor.TryParse((string) value!, out SKColor color) ? color : SKColor.Empty; } } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Converters/StreamToBitmapImageConverter.cs b/src/Artemis.UI.Shared/Converters/StreamToBitmapImageConverter.cs deleted file mode 100644 index 9e4c7cb20..000000000 --- a/src/Artemis.UI.Shared/Converters/StreamToBitmapImageConverter.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Globalization; -using System.IO; -using System.Windows.Data; -using System.Windows.Media.Imaging; - -namespace Artemis.UI.Shared -{ - /// - /// - /// Converts bitmap file in the form of a into . - /// - [ValueConversion(typeof(Stream), typeof(BitmapImage))] - public class StreamToBitmapImageConverter : IValueConverter - { - /// - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (value is not Stream stream) - return Binding.DoNothing; - - stream.Position = 0; - - BitmapImage selectedBitmap = new(); - selectedBitmap.BeginInit(); - selectedBitmap.StreamSource = stream; - selectedBitmap.CacheOption = BitmapCacheOption.OnLoad; - selectedBitmap.EndInit(); - selectedBitmap.Freeze(); - - stream.Position = 0; - return selectedBitmap; - } - - - /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - return Binding.DoNothing; - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Converters/StreamToSvgImageConverter.cs b/src/Artemis.UI.Shared/Converters/StreamToSvgImageConverter.cs deleted file mode 100644 index e157daa1f..000000000 --- a/src/Artemis.UI.Shared/Converters/StreamToSvgImageConverter.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System; -using System.Globalization; -using System.IO; -using System.Windows.Data; -using System.Windows.Media.Imaging; -using SharpVectors.Converters; -using SharpVectors.Renderers.Wpf; - -namespace Artemis.UI.Shared -{ - /// - /// - /// Converts SVG file in the form of a into . - /// - [ValueConversion(typeof(Stream), typeof(BitmapImage))] - public class StreamToSvgImageConverter : IValueConverter - { - /// - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (value is not Stream stream) - return Binding.DoNothing; - - stream.Position = 0; - - StreamSvgConverter converter = new(new WpfDrawingSettings()); - using MemoryStream imageStream = new(); - converter.Convert(stream, imageStream); - - BitmapImage selectedBitmap = new(); - selectedBitmap.BeginInit(); - selectedBitmap.StreamSource = imageStream; - selectedBitmap.CacheOption = BitmapCacheOption.OnLoad; - selectedBitmap.EndInit(); - selectedBitmap.Freeze(); - - stream.Position = 0; - return selectedBitmap; - } - - - /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - return Binding.DoNothing; - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Converters/StringToNumericConverter.cs b/src/Artemis.UI.Shared/Converters/StringToNumericConverter.cs deleted file mode 100644 index ced2709ae..000000000 --- a/src/Artemis.UI.Shared/Converters/StringToNumericConverter.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using System.Globalization; -using System.Windows.Data; -using Artemis.Core; - -namespace Artemis.UI.Shared -{ - /// - /// Converts into . - /// - [ValueConversion(typeof(string), typeof(Numeric))] - public class StringToNumericConverter : IValueConverter - { - /// - public object? Convert(object? value, Type targetType, object parameter, CultureInfo culture) - { - return value?.ToString(); - } - - /// - public object ConvertBack(object? value, Type targetType, object parameter, CultureInfo culture) - { - Numeric.TryParse(value as string, out Numeric result); - return result; - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Converters/TypeToStringConverter.cs b/src/Artemis.UI.Shared/Converters/TypeToStringConverter.cs index 10570fa8a..8bec6ce70 100644 --- a/src/Artemis.UI.Shared/Converters/TypeToStringConverter.cs +++ b/src/Artemis.UI.Shared/Converters/TypeToStringConverter.cs @@ -1,9 +1,9 @@ using System; using System.Globalization; -using System.Windows.Data; using Artemis.Core; +using Avalonia.Data.Converters; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.Converters { /// /// Converts into . @@ -11,7 +11,7 @@ namespace Artemis.UI.Shared public class TypeToStringConverter : IValueConverter { /// - public object? Convert(object value, Type targetType, object? parameter, CultureInfo culture) + public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) { bool humanizeProvided = bool.TryParse(parameter?.ToString(), out bool humanize); if (value is Type type) @@ -21,7 +21,7 @@ namespace Artemis.UI.Shared } /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) { throw new NotImplementedException(); } diff --git a/src/Avalonia/Artemis.UI.Shared/Converters/WidthNormalizedConverter.cs b/src/Artemis.UI.Shared/Converters/WidthNormalizedConverter.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Converters/WidthNormalizedConverter.cs rename to src/Artemis.UI.Shared/Converters/WidthNormalizedConverter.cs diff --git a/src/Artemis.UI.Shared/DataModelVisualization/DataModelDisplayViewModel.cs b/src/Artemis.UI.Shared/DataModelVisualization/DataModelDisplayViewModel.cs index abbc4171d..6dd1d3ded 100644 --- a/src/Artemis.UI.Shared/DataModelVisualization/DataModelDisplayViewModel.cs +++ b/src/Artemis.UI.Shared/DataModelVisualization/DataModelDisplayViewModel.cs @@ -1,8 +1,8 @@ using System.Diagnostics.CodeAnalysis; using Artemis.Core.Modules; -using Stylet; +using ReactiveUI; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.DataModelVisualization { /// /// Represents a display view model @@ -10,8 +10,7 @@ namespace Artemis.UI.Shared /// The type of the data model public abstract class DataModelDisplayViewModel : DataModelDisplayViewModel { - [AllowNull] - private T _displayValue = default!; + [AllowNull] private T _displayValue = default!; /// /// Gets or sets value that the view model must display @@ -22,7 +21,8 @@ namespace Artemis.UI.Shared get => _displayValue; set { - if (!SetAndNotify(ref _displayValue, value)) return; + if (Equals(value, _displayValue)) return; + RaiseAndSetIfChanged(ref _displayValue, value); OnDisplayValueUpdated(); } } @@ -46,7 +46,7 @@ namespace Artemis.UI.Shared /// /// For internal use only, implement instead. /// - public abstract class DataModelDisplayViewModel : PropertyChangedBase + public abstract class DataModelDisplayViewModel : ViewModelBase { private DataModelPropertyAttribute? _propertyDescription; @@ -56,7 +56,7 @@ namespace Artemis.UI.Shared public DataModelPropertyAttribute? PropertyDescription { get => _propertyDescription; - internal set => SetAndNotify(ref _propertyDescription, value); + internal set => RaiseAndSetIfChanged(ref _propertyDescription, value); } /// diff --git a/src/Artemis.UI.Shared/DataModelVisualization/DataModelInputViewModel.cs b/src/Artemis.UI.Shared/DataModelVisualization/DataModelInputViewModel.cs index 1c9574dfb..cd3bd505c 100644 --- a/src/Artemis.UI.Shared/DataModelVisualization/DataModelInputViewModel.cs +++ b/src/Artemis.UI.Shared/DataModelVisualization/DataModelInputViewModel.cs @@ -1,14 +1,10 @@ using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Data; -using System.Windows.Input; using Artemis.Core.Modules; -using Stylet; +using ReactiveUI; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.DataModelVisualization { /// /// Represents a input view model @@ -37,7 +33,7 @@ namespace Artemis.UI.Shared public T InputValue { get => _inputValue; - set => SetAndNotify(ref _inputValue, value); + set => this.RaiseAndSetIfChanged(ref _inputValue, value); } /// @@ -54,9 +50,6 @@ namespace Artemis.UI.Shared return; _closed = true; - foreach (BindingExpressionBase sourceUpdatingBinding in BindingOperations.GetSourceUpdatingBindings(View)) - sourceUpdatingBinding.UpdateSource(); - OnSubmit(); UpdateCallback(InputValue, true); } @@ -76,7 +69,7 @@ namespace Artemis.UI.Shared /// /// For internal use only, implement instead. /// - public abstract class DataModelInputViewModel : PropertyChangedBase, IViewAware + public abstract class DataModelInputViewModel : ReactiveObject { /// /// Prevents this type being implemented directly, implement instead. @@ -117,24 +110,5 @@ namespace Artemis.UI.Shared protected virtual void OnCancel() { } - - /// - public void AttachView(UIElement view) - { - if (View != null) - throw new InvalidOperationException(string.Format("Tried to attach View {0} to ViewModel {1}, but it already has a view attached", view.GetType().Name, GetType().Name)); - - View = view; - - // After the animation finishes attempt to focus the input field - Task.Run(async () => - { - await Task.Delay(50); - await Execute.OnUIThreadAsync(() => View.MoveFocus(new TraversalRequest(FocusNavigationDirection.First))); - }); - } - - /// - public UIElement? View { get; set; } } } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/DataModelVisualization/DataModelVisualizationRegistration.cs b/src/Artemis.UI.Shared/DataModelVisualization/DataModelVisualizationRegistration.cs index 310063ef0..e867a2995 100644 --- a/src/Artemis.UI.Shared/DataModelVisualization/DataModelVisualizationRegistration.cs +++ b/src/Artemis.UI.Shared/DataModelVisualization/DataModelVisualizationRegistration.cs @@ -2,8 +2,9 @@ using System.Collections.Generic; using Artemis.Core; using Artemis.UI.Shared.Services; +using Artemis.UI.Shared.Services.Interfaces; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.DataModelVisualization { /// /// Represents a layer brush registered through diff --git a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelEventViewModel.cs b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelEventViewModel.cs index 55ccdf424..c6b3b1478 100644 --- a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelEventViewModel.cs +++ b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelEventViewModel.cs @@ -3,8 +3,10 @@ using System.Linq; using Artemis.Core; using Artemis.Core.Modules; using Artemis.UI.Shared.Services; +using Artemis.UI.Shared.Services.Interfaces; +using ReactiveUI; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.DataModelVisualization.Shared { /// /// Represents a view model that visualizes an event data model property @@ -23,7 +25,7 @@ namespace Artemis.UI.Shared public Type? DisplayValueType { get => _displayValueType; - set => SetAndNotify(ref _displayValueType, value); + set => this.RaiseAndSetIfChanged(ref _displayValueType, value); } /// diff --git a/src/Avalonia/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListItemViewModel.cs b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListItemViewModel.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListItemViewModel.cs rename to src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListItemViewModel.cs diff --git a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListPropertiesViewModel.cs b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListPropertiesViewModel.cs deleted file mode 100644 index d9060f943..000000000 --- a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListPropertiesViewModel.cs +++ /dev/null @@ -1,82 +0,0 @@ -using System; -using System.Linq; -using Artemis.Core; -using Artemis.UI.Shared.Services; - -namespace Artemis.UI.Shared -{ - /// - /// Represents a view model that wraps a regular but contained in - /// a - /// - public class DataModelListPropertiesViewModel : DataModelPropertiesViewModel - { - private object? _displayValue; - private int _index; - private Type? _listType; - - internal DataModelListPropertiesViewModel(Type listType, string? name) : base(null, null, null) - { - ListType = listType; - } - - /// - /// Gets the index of the element within the list - /// - public int Index - { - get => _index; - set => SetAndNotify(ref _index, value); - } - - /// - /// Gets the type of elements contained in the list - /// - public Type? ListType - { - get => _listType; - set => SetAndNotify(ref _listType, value); - } - - /// - /// Gets the value of the property that is being visualized - /// - public new object? DisplayValue - { - get => _displayValue; - set => SetAndNotify(ref _displayValue, value); - } - - /// - /// Gets the view model that handles displaying the property - /// - public DataModelVisualizationViewModel? DisplayViewModel => Children.FirstOrDefault(); - - /// - public override string? DisplayPath => null; - - /// - public override void Update(IDataModelUIService dataModelUIService, DataModelUpdateConfiguration? configuration) - { - PopulateProperties(dataModelUIService, configuration); - if (DisplayViewModel == null) - return; - - if (IsVisualizationExpanded && !DisplayViewModel.IsVisualizationExpanded) - DisplayViewModel.IsVisualizationExpanded = IsVisualizationExpanded; - DisplayViewModel.Update(dataModelUIService, null); - } - - /// - public override object? GetCurrentValue() - { - return DisplayValue; - } - - /// - public override string ToString() - { - return $"[List item {Index}] {DisplayPath ?? Path}"; - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListPropertyViewModel.cs b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListPropertyViewModel.cs deleted file mode 100644 index 29bdeb259..000000000 --- a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListPropertyViewModel.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using Artemis.Core; -using Artemis.UI.Shared.Services; - -namespace Artemis.UI.Shared -{ - /// - /// Represents a view model that visualizes a single data model property contained in a - /// - /// - public class DataModelListPropertyViewModel : DataModelPropertyViewModel - { - private int _index; - private Type? _listType; - - internal DataModelListPropertyViewModel(Type listType, DataModelDisplayViewModel displayViewModel, string? name) : base(null, null, null) - { - ListType = listType; - DisplayViewModel = displayViewModel; - } - - internal DataModelListPropertyViewModel(Type listType, string? name) : base(null, null, null) - { - ListType = listType; - } - - /// - /// Gets the index of the element within the list - /// - public int Index - { - get => _index; - internal set => SetAndNotify(ref _index, value); - } - - /// - /// Gets the type of elements contained in the list - /// - public Type? ListType - { - get => _listType; - private set => SetAndNotify(ref _listType, value); - } - - /// - public override object? GetCurrentValue() - { - return DisplayValue; - } - - /// - public override void Update(IDataModelUIService dataModelUIService, DataModelUpdateConfiguration? configuration) - { - // Display value gets updated by parent, don't do anything if it is null - if (DisplayValue == null) - return; - - if (DisplayViewModel == null) - DisplayViewModel = dataModelUIService.GetDataModelDisplayViewModel(DisplayValue.GetType(), PropertyDescription, true); - - ListType = DisplayValue.GetType(); - DisplayViewModel?.UpdateValue(DisplayValue); - } - - /// - public override string ToString() - { - return $"[List item {Index}] {DisplayPath ?? Path} - {DisplayValue}"; - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListViewModel.cs b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListViewModel.cs index 3605c43a0..9ec4838d9 100644 --- a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListViewModel.cs +++ b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListViewModel.cs @@ -1,12 +1,13 @@ using System; using System.Collections; -using System.Windows.Documents; +using System.Collections.ObjectModel; using Artemis.Core; using Artemis.Core.Modules; using Artemis.UI.Shared.Services; -using Stylet; +using Artemis.UI.Shared.Services.Interfaces; +using ReactiveUI; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.DataModelVisualization.Shared { /// /// Represents a view model that visualizes a list data model property @@ -16,14 +17,14 @@ namespace Artemis.UI.Shared private string _countDisplay; private Type? _displayValueType; private IEnumerable? _list; - private BindableCollection _listChildren; + private ObservableCollection _listChildren; private int _listCount; internal DataModelListViewModel(DataModel dataModel, DataModelVisualizationViewModel parent, DataModelPath dataModelPath) : base(dataModel, parent, dataModelPath) { _countDisplay = "0 items"; - _listChildren = new BindableCollection(); + _listChildren = new ObservableCollection(); } /// @@ -32,7 +33,7 @@ namespace Artemis.UI.Shared public IEnumerable? List { get => _list; - private set => SetAndNotify(ref _list, value); + private set => this.RaiseAndSetIfChanged(ref _list, value); } /// @@ -41,7 +42,7 @@ namespace Artemis.UI.Shared public int ListCount { get => _listCount; - private set => SetAndNotify(ref _listCount, value); + private set => this.RaiseAndSetIfChanged(ref _listCount, value); } /// @@ -50,7 +51,7 @@ namespace Artemis.UI.Shared public Type? DisplayValueType { get => _displayValueType; - set => SetAndNotify(ref _displayValueType, value); + set => this.RaiseAndSetIfChanged(ref _displayValueType, value); } /// @@ -59,16 +60,16 @@ namespace Artemis.UI.Shared public string CountDisplay { get => _countDisplay; - set => SetAndNotify(ref _countDisplay, value); + set => this.RaiseAndSetIfChanged(ref _countDisplay, value); } /// /// Gets a list of child view models that visualize the elements in the list /// - public BindableCollection ListChildren + public ObservableCollection ListChildren { get => _listChildren; - private set => SetAndNotify(ref _listChildren, value); + private set => this.RaiseAndSetIfChanged(ref _listChildren, value); } /// @@ -97,22 +98,15 @@ namespace Artemis.UI.Shared ListChildren.Add(child); } else - { child = ListChildren[index]; - } - if (child is DataModelListPropertiesViewModel dataModelListClassViewModel) - { - dataModelListClassViewModel.DisplayValue = item; - dataModelListClassViewModel.Index = index; - } - else if (child is DataModelListPropertyViewModel dataModelListPropertyViewModel) + if (child is DataModelListItemViewModel dataModelListPropertyViewModel) { dataModelListPropertyViewModel.DisplayValue = item; dataModelListPropertyViewModel.Index = index; + dataModelListPropertyViewModel.Update(dataModelUIService, configuration); } - child.Update(dataModelUIService, configuration); index++; } @@ -134,16 +128,10 @@ namespace Artemis.UI.Shared { // If a display VM was found, prefer to use that in any case DataModelDisplayViewModel? typeViewModel = dataModelUIService.GetDataModelDisplayViewModel(listType, PropertyDescription); - if (typeViewModel != null) - return new DataModelListPropertyViewModel(listType, typeViewModel, name); - // For primitives, create a property view model, it may be null that is fine - if (listType.IsPrimitive || listType.IsEnum || listType == typeof(string)) - return new DataModelListPropertyViewModel(listType, name); - // For other value types create a child view model - if (listType.IsClass || listType.IsStruct()) - return new DataModelListPropertiesViewModel(listType, name); - return null; + return typeViewModel != null + ? new DataModelListItemViewModel(listType, typeViewModel, name) + : new DataModelListItemViewModel(listType, name); } } } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelPropertiesViewModel.cs b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelPropertiesViewModel.cs index 423af79e9..e162f0599 100644 --- a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelPropertiesViewModel.cs +++ b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelPropertiesViewModel.cs @@ -2,8 +2,10 @@ using Artemis.Core; using Artemis.Core.Modules; using Artemis.UI.Shared.Services; +using Artemis.UI.Shared.Services.Interfaces; +using ReactiveUI; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.DataModelVisualization.Shared { /// /// Represents a view model that visualizes a class (POCO) data model property containing child properties @@ -24,7 +26,7 @@ namespace Artemis.UI.Shared public Type? DisplayValueType { get => _displayValueType; - private set => SetAndNotify(ref _displayValueType, value); + private set => this.RaiseAndSetIfChanged(ref _displayValueType, value); } /// @@ -33,7 +35,7 @@ namespace Artemis.UI.Shared public object? DisplayValue { get => _displayValue; - private set => SetAndNotify(ref _displayValue, value); + private set => this.RaiseAndSetIfChanged(ref _displayValue, value); } /// diff --git a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelPropertyViewModel.cs b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelPropertyViewModel.cs index 5f4b35891..f6215d7af 100644 --- a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelPropertyViewModel.cs +++ b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelPropertyViewModel.cs @@ -2,8 +2,10 @@ using Artemis.Core; using Artemis.Core.Modules; using Artemis.UI.Shared.Services; +using Artemis.UI.Shared.Services.Interfaces; +using ReactiveUI; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.DataModelVisualization.Shared { /// /// Represents a view model that visualizes a single data model property contained in a @@ -26,7 +28,7 @@ namespace Artemis.UI.Shared public object? DisplayValue { get => _displayValue; - internal set => SetAndNotify(ref _displayValue, value); + internal set => this.RaiseAndSetIfChanged(ref _displayValue, value); } /// @@ -35,7 +37,7 @@ namespace Artemis.UI.Shared public Type? DisplayValueType { get => _displayValueType; - protected set => SetAndNotify(ref _displayValueType, value); + protected set => this.RaiseAndSetIfChanged(ref _displayValueType, value); } /// @@ -44,7 +46,7 @@ namespace Artemis.UI.Shared public DataModelDisplayViewModel? DisplayViewModel { get => _displayViewModel; - internal set => SetAndNotify(ref _displayViewModel, value); + internal set => this.RaiseAndSetIfChanged(ref _displayViewModel, value); } /// diff --git a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelUpdateConfiguration.cs b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelUpdateConfiguration.cs index bd4747b1d..fe41f0644 100644 --- a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelUpdateConfiguration.cs +++ b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelUpdateConfiguration.cs @@ -1,4 +1,4 @@ -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.DataModelVisualization.Shared { /// /// Represents a configuration to use while updating a diff --git a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelVisualizationViewModel.cs b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelVisualizationViewModel.cs index 17432d696..9a212bae1 100644 --- a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelVisualizationViewModel.cs +++ b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelVisualizationViewModel.cs @@ -6,368 +6,396 @@ using System.Reflection; using System.Text; using Artemis.Core; using Artemis.Core.Modules; -using Artemis.UI.Shared.Services; -using Stylet; +using Artemis.UI.Shared.Services.Interfaces; +using ReactiveUI; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.DataModelVisualization.Shared; + +/// +/// Represents a base class for a view model that visualizes a part of the data model +/// +public abstract class DataModelVisualizationViewModel : ReactiveObject, IDisposable { - /// - /// Represents a base class for a view model that visualizes a part of the data model - /// - public abstract class DataModelVisualizationViewModel : PropertyChangedBase, IDisposable + private const int MaxDepth = 4; + private ObservableCollection _children; + private DataModel? _dataModel; + private bool _isMatchingFilteredTypes; + private bool _isVisualizationExpanded; + private DataModelVisualizationViewModel? _parent; + private bool _populatedStaticChildren; + private DataModelPropertyAttribute? _propertyDescription; + + internal DataModelVisualizationViewModel(DataModel? dataModel, DataModelVisualizationViewModel? parent, DataModelPath? dataModelPath) { - private const int MaxDepth = 4; - private BindableCollection _children; - private DataModel? _dataModel; - private bool _isMatchingFilteredTypes; - private bool _isVisualizationExpanded; - private DataModelVisualizationViewModel? _parent; - private DataModelPropertyAttribute? _propertyDescription; - private bool _populatedStaticChildren; + _dataModel = dataModel; + _children = new ObservableCollection(); + _parent = parent; + DataModelPath = dataModelPath; + IsMatchingFilteredTypes = true; - internal DataModelVisualizationViewModel(DataModel? dataModel, DataModelVisualizationViewModel? parent, DataModelPath? dataModelPath) + if (parent == null) + IsRootViewModel = true; + else + PropertyDescription = DataModelPath?.GetPropertyDescription() ?? DataModel?.DataModelDescription; + } + + /// + /// Gets a boolean indicating whether this view model is at the root of the data model + /// + public bool IsRootViewModel { get; protected set; } + + /// + /// Gets the data model path to the property this view model is visualizing + /// + public DataModelPath? DataModelPath { get; } + + /// + /// Gets a string representation of the path backing this model + /// + public string? Path => DataModelPath?.Path; + + /// + /// Gets the property depth of the view model + /// + public int Depth { get; private set; } + + /// + /// Gets the data model backing this view model + /// + public DataModel? DataModel + { + get => _dataModel; + protected set => this.RaiseAndSetIfChanged(ref _dataModel, value); + } + + /// + /// Gets the property description of the property this view model is visualizing + /// + public DataModelPropertyAttribute? PropertyDescription + { + get => _propertyDescription; + protected set => this.RaiseAndSetIfChanged(ref _propertyDescription, value); + } + + /// + /// Gets the parent of this view model + /// + public DataModelVisualizationViewModel? Parent + { + get => _parent; + protected set => this.RaiseAndSetIfChanged(ref _parent, value); + } + + /// + /// Gets or sets an observable collection containing the children of this view model + /// + public ObservableCollection Children + { + get => _children; + set => this.RaiseAndSetIfChanged(ref _children, value); + } + + /// + /// Gets a boolean indicating whether the property being visualized matches the types last provided to + /// + /// + public bool IsMatchingFilteredTypes + { + get => _isMatchingFilteredTypes; + private set => this.RaiseAndSetIfChanged(ref _isMatchingFilteredTypes, value); + } + + /// + /// Gets or sets a boolean indicating whether the visualization is expanded, exposing the + /// + public bool IsVisualizationExpanded + { + get => _isVisualizationExpanded; + set { - _dataModel = dataModel; - _children = new BindableCollection(); - _parent = parent; - DataModelPath = dataModelPath; - IsMatchingFilteredTypes = true; - - if (parent == null) - IsRootViewModel = true; - else - PropertyDescription = DataModelPath?.GetPropertyDescription() ?? DataModel?.DataModelDescription; + if (!this.RaiseAndSetIfChanged(ref _isVisualizationExpanded, value)) return; + RequestUpdate(); } + } - /// - /// Gets a boolean indicating whether this view model is at the root of the data model - /// - public bool IsRootViewModel { get; protected set; } + /// + /// Gets a user-friendly representation of the + /// + public virtual string? DisplayPath => DataModelPath != null + ? string.Join(" › ", DataModelPath.Segments.Select(s => s.GetPropertyDescription()?.Name ?? s.Identifier)) + : null; - /// - /// Gets the data model path to the property this view model is visualizing - /// - public DataModelPath? DataModelPath { get; } - - /// - /// Gets a string representation of the path backing this model - /// - public string? Path => DataModelPath?.Path; - - /// - /// Gets the property depth of the view model - /// - public int Depth { get; private set; } - - /// - /// Gets the data model backing this view model - /// - public DataModel? DataModel - { - get => _dataModel; - protected set => SetAndNotify(ref _dataModel, value); - } - - /// - /// Gets the property description of the property this view model is visualizing - /// - public DataModelPropertyAttribute? PropertyDescription - { - get => _propertyDescription; - protected set => SetAndNotify(ref _propertyDescription, value); - } - - /// - /// Gets the parent of this view model - /// - public DataModelVisualizationViewModel? Parent - { - get => _parent; - protected set => SetAndNotify(ref _parent, value); - } - - /// - /// Gets or sets a bindable collection containing the children of this view model - /// - public BindableCollection Children - { - get => _children; - set => SetAndNotify(ref _children, value); - } - - /// - /// Gets a boolean indicating whether the property being visualized matches the types last provided to - /// - /// - public bool IsMatchingFilteredTypes - { - get => _isMatchingFilteredTypes; - private set => SetAndNotify(ref _isMatchingFilteredTypes, value); - } - - /// - /// Gets or sets a boolean indicating whether the visualization is expanded, exposing the - /// - public bool IsVisualizationExpanded - { - get => _isVisualizationExpanded; - set - { - if (!SetAndNotify(ref _isVisualizationExpanded, value)) return; - RequestUpdate(); - } - } - - /// - /// Gets a user-friendly representation of the - /// - public virtual string? DisplayPath => DataModelPath != null - ? string.Join(" › ", DataModelPath.Segments.Select(s => s.GetPropertyDescription()?.Name ?? s.Identifier)) - : null; - - /// - /// Updates the datamodel and if in an parent, any children - /// - /// The data model UI service used during update - /// The configuration to apply while updating - public abstract void Update(IDataModelUIService dataModelUIService, DataModelUpdateConfiguration? configuration); - - /// - /// Gets the current value of the property being visualized - /// - /// The current value of the property being visualized - public virtual object? GetCurrentValue() - { - if (IsRootViewModel) - return null; - - return DataModelPath?.GetValue(); - } - - /// - /// Determines whether the provided types match the type of the property being visualized and sets the result in - /// - /// - /// Whether the type may be a loose match, meaning it can be cast or converted - /// The types to filter - public void ApplyTypeFilter(bool looseMatch, params Type[]? filteredTypes) - { - if (filteredTypes != null) - { - if (filteredTypes.All(t => t == null)) - filteredTypes = null; - else - filteredTypes = filteredTypes.Where(t => t != null).ToArray(); - } - - // If the VM has children, its own type is not relevant - if (Children.Any()) - { - foreach (DataModelVisualizationViewModel child in Children) - child?.ApplyTypeFilter(looseMatch, filteredTypes); - - IsMatchingFilteredTypes = true; - return; - } - - // If null is passed, clear the type filter - if (filteredTypes == null || filteredTypes.Length == 0) - { - IsMatchingFilteredTypes = true; - return; - } - - // If the type couldn't be retrieved either way, assume false - Type? type = DataModelPath?.GetPropertyType(); - if (type == null) - { - IsMatchingFilteredTypes = false; - return; - } - - if (looseMatch) - IsMatchingFilteredTypes = filteredTypes.Any(t => t.IsCastableFrom(type) || - t == typeof(Enum) && type.IsEnum || - t == typeof(IEnumerable<>) && type.IsGenericEnumerable() || - type.IsGenericType && t == type.GetGenericTypeDefinition()); - else - IsMatchingFilteredTypes = filteredTypes.Any(t => t == type || t == typeof(Enum) && type.IsEnum); - } - - internal virtual int GetChildDepth() - { - return 0; - } - - internal void PopulateProperties(IDataModelUIService dataModelUIService, DataModelUpdateConfiguration? dataModelUpdateConfiguration) - { - if (IsRootViewModel && DataModel == null) - return; - - Type? modelType = IsRootViewModel ? DataModel?.GetType() : DataModelPath?.GetPropertyType(); - if (modelType == null) - throw new ArtemisSharedUIException("Failed to populate data model visualization properties, couldn't get a property type"); - - // Add missing static children only once, they're static after all - if (!_populatedStaticChildren) - { - foreach (PropertyInfo propertyInfo in modelType.GetProperties(BindingFlags.Public | BindingFlags.Instance).OrderBy(t => t.MetadataToken)) - { - string childPath = AppendToPath(propertyInfo.Name); - if (Children.Any(c => c.Path != null && c.Path.Equals(childPath))) - continue; - if (propertyInfo.GetCustomAttribute() != null) - continue; - MethodInfo? getMethod = propertyInfo.GetGetMethod(); - if (getMethod == null || getMethod.GetParameters().Any()) - continue; - - DataModelVisualizationViewModel? child = CreateChild(dataModelUIService, childPath, GetChildDepth()); - if (child != null) - Children.Add(child); - } - - _populatedStaticChildren = true; - } - - // Remove static children that should be hidden - if (DataModel != null) - { - ReadOnlyCollection hiddenProperties = DataModel.GetHiddenProperties(); - foreach (PropertyInfo hiddenProperty in hiddenProperties) - { - string childPath = AppendToPath(hiddenProperty.Name); - DataModelVisualizationViewModel? toRemove = Children.FirstOrDefault(c => c.Path != null && c.Path == childPath); - if (toRemove != null) - Children.Remove(toRemove); - } - } - - // Add missing dynamic children - object? value = Parent == null || Parent.IsRootViewModel ? DataModel : DataModelPath?.GetValue(); - if (value is DataModel dataModel) - { - foreach (string key in dataModel.DynamicChildren.Keys.ToList()) - { - string childPath = AppendToPath(key); - if (Children.Any(c => c.Path != null && c.Path.Equals(childPath))) - continue; - - DataModelVisualizationViewModel? child = CreateChild(dataModelUIService, childPath, GetChildDepth()); - if (child != null) - Children.Add(child); - } - } - - // Remove dynamic children that have been removed from the data model - List toRemoveDynamic = Children.Where(c => c.DataModelPath != null && !c.DataModelPath.IsValid).ToList(); - if (toRemoveDynamic.Any()) - Children.RemoveRange(toRemoveDynamic); - } - - private DataModelVisualizationViewModel? CreateChild(IDataModelUIService dataModelUIService, string path, int depth) - { - if (DataModel == null) - throw new ArtemisSharedUIException("Cannot create a data model visualization child VM for a parent without a data model"); - if (depth > MaxDepth) - return null; - - DataModelPath dataModelPath = new(DataModel, path); - if (!dataModelPath.IsValid) - return null; - - PropertyInfo? propertyInfo = dataModelPath.GetPropertyInfo(); - Type? propertyType = dataModelPath.GetPropertyType(); - - // Skip properties decorated with DataModelIgnore - if (propertyInfo != null && Attribute.IsDefined(propertyInfo, typeof(DataModelIgnoreAttribute))) - return null; - // Skip properties that are in the ignored properties list of the respective profile module/data model expansion - if (DataModel.GetHiddenProperties().Any(p => p.Equals(propertyInfo))) - return null; - - if (propertyType == null) - return null; - - // If a display VM was found, prefer to use that in any case - DataModelDisplayViewModel? typeViewModel = dataModelUIService.GetDataModelDisplayViewModel(propertyType, PropertyDescription); - if (typeViewModel != null) - return new DataModelPropertyViewModel(DataModel, this, dataModelPath) {DisplayViewModel = typeViewModel, Depth = depth}; - // For primitives, create a property view model, it may be null that is fine - if (propertyType.IsPrimitive || propertyType.IsEnum || propertyType == typeof(string) || propertyType.IsGenericType && propertyType.GetGenericTypeDefinition() == typeof(Nullable<>)) - return new DataModelPropertyViewModel(DataModel, this, dataModelPath) {Depth = depth}; - if (propertyType.IsGenericEnumerable()) - return new DataModelListViewModel(DataModel, this, dataModelPath) {Depth = depth}; - if (propertyType == typeof(DataModelEvent) || propertyType.IsGenericType && propertyType.GetGenericTypeDefinition() == typeof(DataModelEvent<>)) - return new DataModelEventViewModel(DataModel, this, dataModelPath) {Depth = depth}; - // For other value types create a child view model - if (propertyType.IsClass || propertyType.IsStruct()) - return new DataModelPropertiesViewModel(DataModel, this, dataModelPath) {Depth = depth}; + /// + /// Updates the datamodel and if in an parent, any children + /// + /// The data model UI service used during update + /// The configuration to apply while updating + public abstract void Update(IDataModelUIService dataModelUIService, DataModelUpdateConfiguration? configuration); + /// + /// Gets the current value of the property being visualized + /// + /// The current value of the property being visualized + public virtual object? GetCurrentValue() + { + if (IsRootViewModel) return null; + + return DataModelPath?.GetValue(); + } + + /// + /// Determines whether the provided types match the type of the property being visualized and sets the result in + /// + /// + /// Whether the type may be a loose match, meaning it can be cast or converted + /// The types to filter + public void ApplyTypeFilter(bool looseMatch, params Type[]? filteredTypes) + { + if (filteredTypes != null) + { + if (filteredTypes.All(t => t == null)) + filteredTypes = null; + else + filteredTypes = filteredTypes.Where(t => t != null).ToArray(); } - private string AppendToPath(string toAppend) + // If the VM has children, its own type is not relevant + if (Children.Any()) { - if (string.IsNullOrEmpty(Path)) - return toAppend; + foreach (DataModelVisualizationViewModel child in Children) + child?.ApplyTypeFilter(looseMatch, filteredTypes); - StringBuilder builder = new(); - builder.Append(Path); - builder.Append("."); - builder.Append(toAppend); - return builder.ToString(); + IsMatchingFilteredTypes = true; + return; } - private void RequestUpdate() + // If null is passed, clear the type filter + if (filteredTypes == null || filteredTypes.Length == 0) { - Parent?.RequestUpdate(); - OnUpdateRequested(); + IsMatchingFilteredTypes = true; + return; } - #region Events - - /// - /// Occurs when an update to the property this view model visualizes is requested - /// - public event EventHandler? UpdateRequested; - - /// - /// Invokes the event - /// - protected virtual void OnUpdateRequested() + // If the type couldn't be retrieved either way, assume false + Type? type = DataModelPath?.GetPropertyType(); + if (type == null) { - UpdateRequested?.Invoke(this, EventArgs.Empty); + IsMatchingFilteredTypes = false; + return; } - #endregion + if (looseMatch) + IsMatchingFilteredTypes = filteredTypes.Any(t => t.IsCastableFrom(type) || + t == typeof(Enum) && type.IsEnum || + t == typeof(IEnumerable<>) && type.IsGenericEnumerable() || + type.IsGenericType && t == type.GetGenericTypeDefinition()); + else + IsMatchingFilteredTypes = filteredTypes.Any(t => t == type || t == typeof(Enum) && type.IsEnum); + } - #region IDisposable + /// + /// Occurs when an update to the property this view model visualizes is requested + /// + public event EventHandler? UpdateRequested; - /// - /// Releases the unmanaged resources used by the object and optionally releases the managed resources. - /// - /// - /// to release both managed and unmanaged resources; - /// to release only unmanaged resources. - /// - protected virtual void Dispose(bool disposing) + /// + /// Expands this view model and any children to expose the provided . + /// + /// The data model path to expose. + public void ExpandToPath(DataModelPath dataModelPath) + { + if (dataModelPath.Target != DataModel) + throw new ArtemisSharedUIException("Can't expand to a path that doesn't belong to this data model."); + + IsVisualizationExpanded = true; + DataModelPathSegment current = dataModelPath.Segments.Skip(1).First(); + Children.FirstOrDefault(c => c.Path == current.Path)?.ExpandToPath(current.Next); + } + + /// + /// Finds the view model that hosts the given path. + /// + /// The path to find + /// The matching view model, may be null if the path doesn't exist or isn't expanded + public DataModelVisualizationViewModel? GetViewModelForPath(DataModelPath dataModelPath) + { + if (dataModelPath.Target != DataModel) + throw new ArtemisSharedUIException("Can't expand to a path that doesn't belong to this data model."); + + if (DataModelPath?.Path == dataModelPath.Path) + return this; + + return Children.Select(c => c.GetViewModelForPath(dataModelPath)).FirstOrDefault(match => match != null); + } + + /// + /// Invokes the event + /// + protected virtual void OnUpdateRequested() + { + UpdateRequested?.Invoke(this, EventArgs.Empty); + } + + /// + /// Releases the unmanaged resources used by the object and optionally releases the managed resources. + /// + /// + /// to release both managed and unmanaged resources; + /// to release only unmanaged resources. + /// + protected virtual void Dispose(bool disposing) + { + if (disposing) { - if (disposing) + DataModelPath?.Dispose(); + foreach (DataModelVisualizationViewModel dataModelVisualizationViewModel in Children) + dataModelVisualizationViewModel.Dispose(true); + } + } + + internal virtual int GetChildDepth() + { + return 0; + } + + internal void PopulateProperties(IDataModelUIService dataModelUIService, DataModelUpdateConfiguration? dataModelUpdateConfiguration) + { + if (IsRootViewModel && DataModel == null) + return; + + Type? modelType = IsRootViewModel ? DataModel?.GetType() : DataModelPath?.GetPropertyType(); + if (modelType == null) + throw new ArtemisSharedUIException("Failed to populate data model visualization properties, couldn't get a property type"); + + // Add missing static children only once, they're static after all + if (!_populatedStaticChildren) + { + foreach (PropertyInfo propertyInfo in modelType.GetProperties(BindingFlags.Public | BindingFlags.Instance).OrderBy(t => t.MetadataToken)) { - DataModelPath?.Dispose(); - foreach (DataModelVisualizationViewModel dataModelVisualizationViewModel in Children) - dataModelVisualizationViewModel.Dispose(true); + string childPath = AppendToPath(propertyInfo.Name); + if (Children.Any(c => c?.Path != null && c.Path.Equals(childPath))) + continue; + if (propertyInfo.GetCustomAttribute() != null) + continue; + MethodInfo? getMethod = propertyInfo.GetGetMethod(); + if (getMethod == null || getMethod.GetParameters().Any()) + continue; + + DataModelVisualizationViewModel? child = CreateChild(dataModelUIService, childPath, GetChildDepth()); + if (child != null) + Children.Add(child); + } + + _populatedStaticChildren = true; + } + + // Remove static children that should be hidden + if (DataModel != null) + { + ReadOnlyCollection hiddenProperties = DataModel.GetHiddenProperties(); + foreach (PropertyInfo hiddenProperty in hiddenProperties) + { + string childPath = AppendToPath(hiddenProperty.Name); + DataModelVisualizationViewModel? toRemove = Children.FirstOrDefault(c => c.Path != null && c.Path == childPath); + if (toRemove != null) + Children.Remove(toRemove); } } - /// - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } + // Add missing dynamic children + object? value = Parent == null || Parent.IsRootViewModel ? DataModel : DataModelPath?.GetValue(); + if (value is DataModel dataModel) + foreach (string key in dataModel.DynamicChildren.Keys.ToList()) + { + string childPath = AppendToPath(key); + if (Children.Any(c => c.Path != null && c.Path.Equals(childPath))) + continue; - #endregion + DataModelVisualizationViewModel? child = CreateChild(dataModelUIService, childPath, GetChildDepth()); + if (child != null) + Children.Add(child); + } + + // Remove dynamic children that have been removed from the data model + List toRemoveDynamic = Children.Where(c => c.DataModelPath != null && !c.DataModelPath.IsValid).ToList(); + foreach (DataModelVisualizationViewModel dataModelVisualizationViewModel in toRemoveDynamic) + Children.Remove(dataModelVisualizationViewModel); + } + + private DataModelVisualizationViewModel? CreateChild(IDataModelUIService dataModelUIService, string path, int depth) + { + if (DataModel == null) + throw new ArtemisSharedUIException("Cannot create a data model visualization child VM for a parent without a data model"); + if (depth > MaxDepth) + return null; + + DataModelPath dataModelPath = new(DataModel, path); + if (!dataModelPath.IsValid) + return null; + + PropertyInfo? propertyInfo = dataModelPath.GetPropertyInfo(); + Type? propertyType = dataModelPath.GetPropertyType(); + + // Skip properties decorated with DataModelIgnore + if (propertyInfo != null && Attribute.IsDefined(propertyInfo, typeof(DataModelIgnoreAttribute))) + return null; + // Skip properties that are in the ignored properties list of the respective profile module/data model expansion + if (DataModel.GetHiddenProperties().Any(p => p.Equals(propertyInfo))) + return null; + + if (propertyType == null) + return null; + + // If a display VM was found, prefer to use that in any case + DataModelDisplayViewModel? typeViewModel = dataModelUIService.GetDataModelDisplayViewModel(propertyType, PropertyDescription); + if (typeViewModel != null) + return new DataModelPropertyViewModel(DataModel, this, dataModelPath) {DisplayViewModel = typeViewModel, Depth = depth}; + // For primitives, create a property view model, it may be null that is fine + if (propertyType.IsPrimitive || propertyType.IsEnum || propertyType == typeof(string) || propertyType.IsGenericType && propertyType.GetGenericTypeDefinition() == typeof(Nullable<>)) + return new DataModelPropertyViewModel(DataModel, this, dataModelPath) {Depth = depth}; + if (propertyType.IsGenericEnumerable()) + return new DataModelListViewModel(DataModel, this, dataModelPath) {Depth = depth}; + if (propertyType == typeof(DataModelEvent) || propertyType.IsGenericType && propertyType.GetGenericTypeDefinition() == typeof(DataModelEvent<>)) + return new DataModelEventViewModel(DataModel, this, dataModelPath) {Depth = depth}; + // For other value types create a child view model + if (propertyType.IsClass || propertyType.IsStruct()) + return new DataModelPropertiesViewModel(DataModel, this, dataModelPath) {Depth = depth}; + + return null; + } + + private string AppendToPath(string toAppend) + { + if (string.IsNullOrEmpty(Path)) + return toAppend; + + StringBuilder builder = new(); + builder.Append(Path); + builder.Append("."); + builder.Append(toAppend); + return builder.ToString(); + } + + private void RequestUpdate() + { + Parent?.RequestUpdate(); + OnUpdateRequested(); + } + + private void ExpandToPath(DataModelPathSegment? segment) + { + if (segment == null) + return; + + IsVisualizationExpanded = true; + Children.FirstOrDefault(c => c.Path == segment.Path)?.ExpandToPath(segment.Next); + } + + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); } } \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Shared/DefaultTypes/DataModel/Display/DefaultDataModelDisplayView.axaml b/src/Artemis.UI.Shared/DefaultTypes/DataModel/Display/DefaultDataModelDisplayView.axaml similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/DefaultTypes/DataModel/Display/DefaultDataModelDisplayView.axaml rename to src/Artemis.UI.Shared/DefaultTypes/DataModel/Display/DefaultDataModelDisplayView.axaml diff --git a/src/Avalonia/Artemis.UI.Shared/DefaultTypes/DataModel/Display/DefaultDataModelDisplayView.axaml.cs b/src/Artemis.UI.Shared/DefaultTypes/DataModel/Display/DefaultDataModelDisplayView.axaml.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/DefaultTypes/DataModel/Display/DefaultDataModelDisplayView.axaml.cs rename to src/Artemis.UI.Shared/DefaultTypes/DataModel/Display/DefaultDataModelDisplayView.axaml.cs diff --git a/src/Artemis.UI.Shared/DefaultTypes/DataModel/Display/DefaultDataModelDisplayViewModel.cs b/src/Artemis.UI.Shared/DefaultTypes/DataModel/Display/DefaultDataModelDisplayViewModel.cs index cced51797..40a265190 100644 --- a/src/Artemis.UI.Shared/DefaultTypes/DataModel/Display/DefaultDataModelDisplayViewModel.cs +++ b/src/Artemis.UI.Shared/DefaultTypes/DataModel/Display/DefaultDataModelDisplayViewModel.cs @@ -1,4 +1,8 @@ using System; +using Artemis.Core; +using Artemis.UI.Shared.DataModelVisualization; +using Newtonsoft.Json; +using ReactiveUI; namespace Artemis.UI.Shared.DefaultTypes.DataModel.Display { @@ -8,33 +12,33 @@ namespace Artemis.UI.Shared.DefaultTypes.DataModel.Display /// internal class DefaultDataModelDisplayViewModel : DataModelDisplayViewModel { - private bool _showNull; - private bool _showToString; + private readonly JsonSerializerSettings _serializerSettings; + private string _display; - internal DefaultDataModelDisplayViewModel() + public DefaultDataModelDisplayViewModel() { - ShowNull = true; + _serializerSettings = new JsonSerializerSettings() + { + ReferenceLoopHandling = ReferenceLoopHandling.Ignore, + PreserveReferencesHandling = PreserveReferencesHandling.None + }; + _display = "null"; } - public bool ShowToString + public string Display { - get => _showToString; - private set => SetAndNotify(ref _showToString, value); + get => _display; + set => RaiseAndSetIfChanged(ref _display, value); } - - public bool ShowNull - { - get => _showNull; - set => SetAndNotify(ref _showNull, value); - } - + protected override void OnDisplayValueUpdated() { if (DisplayValue is Enum enumDisplayValue) - DisplayValue = EnumUtilities.HumanizeValue(enumDisplayValue); - - ShowToString = DisplayValue != null; - ShowNull = DisplayValue == null; + Display = EnumUtilities.HumanizeValue(enumDisplayValue); + else if (DisplayValue is not string) + Display = JsonConvert.SerializeObject(DisplayValue, _serializerSettings); + else + Display = DisplayValue?.ToString() ?? "null"; } } } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/DependencyProperties/SizeObserver.cs b/src/Artemis.UI.Shared/DependencyProperties/SizeObserver.cs deleted file mode 100644 index 9f085f67b..000000000 --- a/src/Artemis.UI.Shared/DependencyProperties/SizeObserver.cs +++ /dev/null @@ -1,109 +0,0 @@ -using System.Windows; - -namespace Artemis.UI.Shared -{ - /// - /// Provides a dependency property that can observe the size of an element and apply it to bindings - /// - public static class SizeObserver - { - /// - /// Gets or sets whether the element should be observed - /// - public static readonly DependencyProperty ObserveProperty = DependencyProperty.RegisterAttached( - "Observe", - typeof(bool), - typeof(SizeObserver), - new FrameworkPropertyMetadata(OnObserveChanged)); - - /// - /// Gets or sets the observed width of the element - /// - public static readonly DependencyProperty ObservedWidthProperty = DependencyProperty.RegisterAttached( - "ObservedWidth", - typeof(double), - typeof(SizeObserver)); - - /// - /// Gets or sets the observed height of the element - /// - public static readonly DependencyProperty ObservedHeightProperty = DependencyProperty.RegisterAttached( - "ObservedHeight", - typeof(double), - typeof(SizeObserver)); - - /// - /// Gets whether the provided is being observed - /// - public static bool GetObserve(FrameworkElement frameworkElement) - { - return (bool) frameworkElement.GetValue(ObserveProperty); - } - - /// - /// Sets whether the provided is being observed - /// - public static void SetObserve(FrameworkElement frameworkElement, bool observe) - { - frameworkElement.SetValue(ObserveProperty, observe); - } - - /// - /// Gets the observed width of the the provided - /// - public static double GetObservedWidth(FrameworkElement frameworkElement) - { - return (double) frameworkElement.GetValue(ObservedWidthProperty); - } - - /// - /// Sets the observed width of the the provided - /// - public static void SetObservedWidth(FrameworkElement frameworkElement, double observedWidth) - { - frameworkElement.SetValue(ObservedWidthProperty, observedWidth); - } - - /// - /// Gets the observed height of the the provided - /// - public static double GetObservedHeight(FrameworkElement frameworkElement) - { - return (double) frameworkElement.GetValue(ObservedHeightProperty); - } - - /// - /// Sets the observed height of the the provided - /// - public static void SetObservedHeight(FrameworkElement frameworkElement, double observedHeight) - { - frameworkElement.SetValue(ObservedHeightProperty, observedHeight); - } - - private static void OnObserveChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) - { - FrameworkElement frameworkElement = (FrameworkElement) dependencyObject; - - if ((bool) e.NewValue) - { - frameworkElement.SizeChanged += OnFrameworkElementSizeChanged; - UpdateObservedSizesForFrameworkElement(frameworkElement); - } - else - { - frameworkElement.SizeChanged -= OnFrameworkElementSizeChanged; - } - } - - private static void OnFrameworkElementSizeChanged(object sender, SizeChangedEventArgs e) - { - UpdateObservedSizesForFrameworkElement((FrameworkElement) sender); - } - - private static void UpdateObservedSizesForFrameworkElement(FrameworkElement frameworkElement) - { - frameworkElement.SetCurrentValue(ObservedWidthProperty, frameworkElement.ActualWidth); - frameworkElement.SetCurrentValue(ObservedHeightProperty, frameworkElement.ActualHeight); - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Events/DataModelSelectedEventArgs.cs b/src/Artemis.UI.Shared/Events/DataModelSelectedEventArgs.cs index 9306237ed..7f59aedad 100644 --- a/src/Artemis.UI.Shared/Events/DataModelSelectedEventArgs.cs +++ b/src/Artemis.UI.Shared/Events/DataModelSelectedEventArgs.cs @@ -2,7 +2,7 @@ using Artemis.Core; using Artemis.UI.Shared.Controls; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.Events { /// /// Provides data about selection events raised by diff --git a/src/Avalonia/Artemis.UI.Shared/Events/DialogClosedEventArgs.cs b/src/Artemis.UI.Shared/Events/DialogClosedEventArgs.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Events/DialogClosedEventArgs.cs rename to src/Artemis.UI.Shared/Events/DialogClosedEventArgs.cs diff --git a/src/Artemis.UI.Shared/Events/LedClickedEventArgs.cs b/src/Artemis.UI.Shared/Events/LedClickedEventArgs.cs index 3455b9800..cfaa9a160 100644 --- a/src/Artemis.UI.Shared/Events/LedClickedEventArgs.cs +++ b/src/Artemis.UI.Shared/Events/LedClickedEventArgs.cs @@ -1,7 +1,7 @@ using System; using Artemis.Core; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.Events { /// /// Provides data on LED click events raised by the device visualizer diff --git a/src/Artemis.UI.Shared/Events/ProfileConfigurationEventArgs.cs b/src/Artemis.UI.Shared/Events/ProfileConfigurationEventArgs.cs index 3ec9ac748..fc79d770b 100644 --- a/src/Artemis.UI.Shared/Events/ProfileConfigurationEventArgs.cs +++ b/src/Artemis.UI.Shared/Events/ProfileConfigurationEventArgs.cs @@ -1,7 +1,7 @@ using System; using Artemis.Core; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.Events { /// /// Provides data on profile related events raised by the profile editor diff --git a/src/Artemis.UI.Shared/Events/RenderProfileElementEventArgs.cs b/src/Artemis.UI.Shared/Events/RenderProfileElementEventArgs.cs index e2555f3ab..67cd4d5ba 100644 --- a/src/Artemis.UI.Shared/Events/RenderProfileElementEventArgs.cs +++ b/src/Artemis.UI.Shared/Events/RenderProfileElementEventArgs.cs @@ -1,7 +1,7 @@ using System; using Artemis.Core; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.Events { /// /// Provides data on profile element related events raised by the profile editor diff --git a/src/Avalonia/Artemis.UI.Shared/Events/SelectionRectangleEventArgs.cs b/src/Artemis.UI.Shared/Events/SelectionRectangleEventArgs.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Events/SelectionRectangleEventArgs.cs rename to src/Artemis.UI.Shared/Events/SelectionRectangleEventArgs.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Extensions/ControlExtensions.cs b/src/Artemis.UI.Shared/Extensions/ControlExtensions.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Extensions/ControlExtensions.cs rename to src/Artemis.UI.Shared/Extensions/ControlExtensions.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Extensions/LayerExtensions.cs b/src/Artemis.UI.Shared/Extensions/LayerExtensions.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Extensions/LayerExtensions.cs rename to src/Artemis.UI.Shared/Extensions/LayerExtensions.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Extensions/PointExtensions.cs b/src/Artemis.UI.Shared/Extensions/PointExtensions.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Extensions/PointExtensions.cs rename to src/Artemis.UI.Shared/Extensions/PointExtensions.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Extensions/SKColorExtensions.cs b/src/Artemis.UI.Shared/Extensions/SKColorExtensions.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Extensions/SKColorExtensions.cs rename to src/Artemis.UI.Shared/Extensions/SKColorExtensions.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Extensions/SKMatrixExtensions.cs b/src/Artemis.UI.Shared/Extensions/SKMatrixExtensions.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Extensions/SKMatrixExtensions.cs rename to src/Artemis.UI.Shared/Extensions/SKMatrixExtensions.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Extensions/SKRectExtensions.cs b/src/Artemis.UI.Shared/Extensions/SKRectExtensions.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Extensions/SKRectExtensions.cs rename to src/Artemis.UI.Shared/Extensions/SKRectExtensions.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Extensions/TypeExtensions.cs b/src/Artemis.UI.Shared/Extensions/TypeExtensions.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Extensions/TypeExtensions.cs rename to src/Artemis.UI.Shared/Extensions/TypeExtensions.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Extensions/VisualExtensions.cs b/src/Artemis.UI.Shared/Extensions/VisualExtensions.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Extensions/VisualExtensions.cs rename to src/Artemis.UI.Shared/Extensions/VisualExtensions.cs diff --git a/src/Artemis.UI.Shared/Ninject/Factories/ISharedVMFactory.cs b/src/Artemis.UI.Shared/Ninject/Factories/ISharedVMFactory.cs deleted file mode 100644 index 228b34c6e..000000000 --- a/src/Artemis.UI.Shared/Ninject/Factories/ISharedVMFactory.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Artemis.UI.Shared -{ - /// - /// Represents a factory for view models provided by the Artemis Shared UI library - /// - public interface ISharedVmFactory - { - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Ninject/SharedUIModule.cs b/src/Artemis.UI.Shared/Ninject/SharedUIModule.cs index 328e6fe06..b3469aa43 100644 --- a/src/Artemis.UI.Shared/Ninject/SharedUIModule.cs +++ b/src/Artemis.UI.Shared/Ninject/SharedUIModule.cs @@ -1,10 +1,9 @@ using System; -using Artemis.UI.Shared.Services; -using MaterialDesignThemes.Wpf; +using Artemis.UI.Shared.Services.Interfaces; using Ninject.Extensions.Conventions; using Ninject.Modules; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.Ninject { /// /// The main of the Artemis Shared UI toolkit that binds all services @@ -27,17 +26,6 @@ namespace Artemis.UI.Shared .BindAllInterfaces() .Configure(c => c.InSingletonScope()); }); - - Kernel.Bind().ToConstant(new SnackbarMessageQueue(TimeSpan.FromSeconds(5))).InSingletonScope(); - - // Bind UI factories - Kernel.Bind(x => - { - x.FromThisAssembly() - .SelectAllInterfaces() - .InheritedFrom() - .BindToFactory(); - }); } } } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Plugins/LayerBrushes/BrushConfigurationViewModel.cs b/src/Artemis.UI.Shared/Plugins/LayerBrushes/BrushConfigurationViewModel.cs index 0c61885b0..73f045f94 100644 --- a/src/Artemis.UI.Shared/Plugins/LayerBrushes/BrushConfigurationViewModel.cs +++ b/src/Artemis.UI.Shared/Plugins/LayerBrushes/BrushConfigurationViewModel.cs @@ -1,12 +1,13 @@ -using Artemis.Core.LayerBrushes; -using Stylet; +using System; +using System.Threading.Tasks; +using Artemis.Core.LayerBrushes; namespace Artemis.UI.Shared.LayerBrushes { /// /// Represents a view model for a brush configuration window /// - public abstract class BrushConfigurationViewModel : Screen + public abstract class BrushConfigurationViewModel : ActivatableViewModelBase { /// /// Creates a new instance of the class @@ -17,19 +18,40 @@ namespace Artemis.UI.Shared.LayerBrushes LayerBrush = layerBrush; } - /// - /// Creates a new instance of the class with a validator - /// - /// - /// - protected BrushConfigurationViewModel(BaseLayerBrush layerBrush, IModelValidator validator) : base(validator) - { - LayerBrush = layerBrush; - } - /// /// Gets the layer brush this view model is associated with /// public BaseLayerBrush LayerBrush { get; } + + /// + /// Closes the dialog + /// + public void RequestClose() + { + CloseRequested?.Invoke(this, EventArgs.Empty); + } + + /// + /// Called when the window wants to close, returning will cause the window to stay open. + /// + /// if the window may close; otherwise . + public virtual bool CanClose() + { + return true; + } + + /// + /// Called when the window wants to close, returning will cause the window to stay open. + /// + /// A task if the window may close; otherwise . + public virtual Task CanCloseAsync() + { + return Task.FromResult(true); + } + + /// + /// Occurs when a close was requested + /// + public event EventHandler? CloseRequested; } } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Plugins/LayerBrushes/LayerBrushConfigurationDialog.cs b/src/Artemis.UI.Shared/Plugins/LayerBrushes/LayerBrushConfigurationDialog.cs index daf80ed91..7f7b94fa8 100644 --- a/src/Artemis.UI.Shared/Plugins/LayerBrushes/LayerBrushConfigurationDialog.cs +++ b/src/Artemis.UI.Shared/Plugins/LayerBrushes/LayerBrushConfigurationDialog.cs @@ -38,7 +38,7 @@ namespace Artemis.UI.Shared.LayerBrushes public int DialogHeight { get; set; } = 800; /// - /// The type of view model the tab contains + /// The type of view model the dialog contains /// public abstract Type Type { get; } } diff --git a/src/Artemis.UI.Shared/Plugins/LayerEffects/EffectConfigurationViewModel.cs b/src/Artemis.UI.Shared/Plugins/LayerEffects/EffectConfigurationViewModel.cs index aac795039..2645faddc 100644 --- a/src/Artemis.UI.Shared/Plugins/LayerEffects/EffectConfigurationViewModel.cs +++ b/src/Artemis.UI.Shared/Plugins/LayerEffects/EffectConfigurationViewModel.cs @@ -1,35 +1,57 @@ -using Artemis.Core.LayerEffects; -using Stylet; +using System; +using System.Threading.Tasks; +using Artemis.Core.LayerEffects; +using Avalonia.Threading; -namespace Artemis.UI.Shared.LayerEffects +namespace Artemis.UI.Shared.LayerEffects; + +/// +/// Represents a view model for an effect configuration window +/// +public abstract class EffectConfigurationViewModel : ActivatableViewModelBase { /// - /// Represents a view model for an effect configuration window + /// Creates a new instance of the class /// - public abstract class EffectConfigurationViewModel : Screen + /// + protected EffectConfigurationViewModel(BaseLayerEffect layerEffect) { - /// - /// Creates a new instance of the class - /// - /// - protected EffectConfigurationViewModel(BaseLayerEffect layerEffect) - { - LayerEffect = layerEffect; - } - - /// - /// Creates a new instance of the class with a validator - /// - /// - /// - protected EffectConfigurationViewModel(BaseLayerEffect layerEffect, IModelValidator validator) : base(validator) - { - LayerEffect = layerEffect; - } - - /// - /// Gets the layer effect this view model is associated with - /// - public BaseLayerEffect LayerEffect { get; } + LayerEffect = layerEffect; } + + /// + /// Gets the layer effect this view model is associated with + /// + public BaseLayerEffect LayerEffect { get; } + + /// + /// Closes the dialog + /// + public void RequestClose() + { + CloseRequested?.Invoke(this, EventArgs.Empty); + } + + /// + /// Called when the window wants to close, returning will cause the window to stay open. + /// + /// if the window may close; otherwise . + public virtual bool CanClose() + { + return true; + } + + /// + /// Called when the window wants to close, returning will cause the window to stay open. + /// + /// A task if the window may close; otherwise . + public virtual Task CanCloseAsync() + { + return Task.FromResult(true); + } + + /// + /// Occurs when a close was requested + /// + public event EventHandler? CloseRequested; } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Plugins/LayerEffects/LayerEffectConfigurationDialog.cs b/src/Artemis.UI.Shared/Plugins/LayerEffects/LayerEffectConfigurationDialog.cs index bb043fa93..f5810e74c 100644 --- a/src/Artemis.UI.Shared/Plugins/LayerEffects/LayerEffectConfigurationDialog.cs +++ b/src/Artemis.UI.Shared/Plugins/LayerEffects/LayerEffectConfigurationDialog.cs @@ -39,7 +39,7 @@ namespace Artemis.UI.Shared.LayerEffects public int DialogHeight { get; set; } = 800; /// - /// The type of view model the tab contains + /// The type of view model the dialog contains /// public abstract Type Type { get; } } diff --git a/src/Artemis.UI.Shared/Plugins/Modules/ModuleViewModel.cs b/src/Artemis.UI.Shared/Plugins/Modules/ModuleViewModel.cs deleted file mode 100644 index 05222aed1..000000000 --- a/src/Artemis.UI.Shared/Plugins/Modules/ModuleViewModel.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Artemis.Core.Modules; -using Stylet; - -namespace Artemis.UI.Shared.Modules -{ - /// - /// The base class for any view model that belongs to a module - /// - public abstract class ModuleViewModel : Screen, IModuleViewModel - { - /// - /// The base class for any view model that belongs to a module - /// - /// The module this view model belongs to - /// The name of the tab that's shown on the modules UI page - protected ModuleViewModel(Module module, string displayName) - { - Module = module; - DisplayName = displayName.ToUpper(); - } - - /// - /// Gets the module this view model belongs to - /// - public Module Module { get; } - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Plugins/PluginConfigurationDialog.cs b/src/Artemis.UI.Shared/Plugins/PluginConfigurationDialog.cs index 23f1fd0ed..cbc4f7413 100644 --- a/src/Artemis.UI.Shared/Plugins/PluginConfigurationDialog.cs +++ b/src/Artemis.UI.Shared/Plugins/PluginConfigurationDialog.cs @@ -15,9 +15,7 @@ namespace Artemis.UI.Shared /// public abstract class PluginConfigurationDialog : IPluginConfigurationDialog { - /// - /// The type of view model the tab contains - /// + /// public abstract Type Type { get; } } } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Plugins/PluginConfigurationViewModel.cs b/src/Artemis.UI.Shared/Plugins/PluginConfigurationViewModel.cs index 61e88a503..4fcfaa4fd 100644 --- a/src/Artemis.UI.Shared/Plugins/PluginConfigurationViewModel.cs +++ b/src/Artemis.UI.Shared/Plugins/PluginConfigurationViewModel.cs @@ -1,12 +1,12 @@ -using Artemis.Core; -using Stylet; +using System; +using Artemis.Core; namespace Artemis.UI.Shared { /// /// Represents a view model for a plugin configuration window /// - public abstract class PluginConfigurationViewModel : Screen, IPluginConfigurationViewModel + public abstract class PluginConfigurationViewModel : ViewModelValidationBase, IPluginConfigurationViewModel { /// /// Creates a new instance of the class @@ -17,19 +17,30 @@ namespace Artemis.UI.Shared Plugin = plugin; } - /// - /// Creates a new instance of the class with a validator - /// - /// - /// - protected PluginConfigurationViewModel(Plugin plugin, IModelValidator validator) : base(validator) - { - Plugin = plugin; - } - /// /// Gets the plugin this configuration view model is associated with /// public Plugin Plugin { get; } + + /// + /// Closes the window hosting the view model + /// + public void Close() + { + CloseRequested?.Invoke(this, EventArgs.Empty); + OnCloseRequested(); + } + + /// + /// Called when the the window hosting the view model should close + /// + public virtual void OnCloseRequested() + { + } + + /// + /// Occurs when the the window hosting the view model should close + /// + public event EventHandler? CloseRequested; } } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Plugins/ScriptingProviders/ScriptEditorViewModel.cs b/src/Artemis.UI.Shared/Plugins/ScriptingProviders/ScriptEditorViewModel.cs index 957c8429e..416d2614a 100644 --- a/src/Artemis.UI.Shared/Plugins/ScriptingProviders/ScriptEditorViewModel.cs +++ b/src/Artemis.UI.Shared/Plugins/ScriptingProviders/ScriptEditorViewModel.cs @@ -1,12 +1,12 @@ using Artemis.Core.ScriptingProviders; -using Stylet; +using ReactiveUI; namespace Artemis.UI.Shared.ScriptingProviders { /// /// Represents a Stylet view model containing a script editor /// - public class ScriptEditorViewModel : Screen, IScriptEditorViewModel + public class ScriptEditorViewModel : ActivatableViewModelBase, IScriptEditorViewModel { private Script? _script; @@ -42,7 +42,7 @@ namespace Artemis.UI.Shared.ScriptingProviders public Script? Script { get => _script; - internal set => SetAndNotify(ref _script, value); + internal set => RaiseAndSetIfChanged(ref _script, value); } /// diff --git a/src/Artemis.UI.Shared/Properties/Annotations.cs b/src/Artemis.UI.Shared/Properties/Annotations.cs deleted file mode 100644 index 227caf7b8..000000000 --- a/src/Artemis.UI.Shared/Properties/Annotations.cs +++ /dev/null @@ -1,1383 +0,0 @@ -/* MIT License - -Copyright (c) 2016 JetBrains http://www.jetbrains.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. */ - -using System; - -#pragma warning disable 8618 -#pragma warning disable 1591 - -// ReSharper disable InheritdocConsiderUsage -// ReSharper disable UnusedMember.Global -// ReSharper disable MemberCanBePrivate.Global -// ReSharper disable UnusedAutoPropertyAccessor.Global -// ReSharper disable IntroduceOptionalParameters.Global -// ReSharper disable MemberCanBeProtected.Global -// ReSharper disable InconsistentNaming - -namespace Artemis.UI.Shared.Properties -{ - /// - /// Indicates that the value of the marked element could be null sometimes, - /// so checking for null is required before its usage. - /// - /// - /// - /// [CanBeNull] object Test() => null; - /// - /// void UseTest() { - /// var p = Test(); - /// var s = p.ToString(); // Warning: Possible 'System.NullReferenceException' - /// } - /// - /// - [AttributeUsage( - AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property | - AttributeTargets.Delegate | AttributeTargets.Field | AttributeTargets.Event | - AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.GenericParameter)] - public sealed class CanBeNullAttribute : Attribute - { - } - - /// - /// Indicates that the value of the marked element can never be null. - /// - /// - /// - /// [NotNull] object Foo() { - /// return null; // Warning: Possible 'null' assignment - /// } - /// - /// - [AttributeUsage( - AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property | - AttributeTargets.Delegate | AttributeTargets.Field | AttributeTargets.Event | - AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.GenericParameter)] - public sealed class NotNullAttribute : Attribute - { - } - - /// - /// Can be applied to symbols of types derived from IEnumerable as well as to symbols of Task - /// and Lazy classes to indicate that the value of a collection item, of the Task.Result property - /// or of the Lazy.Value property can never be null. - /// - /// - /// - /// public void Foo([ItemNotNull]List<string> books) - /// { - /// foreach (var book in books) { - /// if (book != null) // Warning: Expression is always true - /// Console.WriteLine(book.ToUpper()); - /// } - /// } - /// - /// - [AttributeUsage( - AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property | - AttributeTargets.Delegate | AttributeTargets.Field)] - public sealed class ItemNotNullAttribute : Attribute - { - } - - /// - /// Can be applied to symbols of types derived from IEnumerable as well as to symbols of Task - /// and Lazy classes to indicate that the value of a collection item, of the Task.Result property - /// or of the Lazy.Value property can be null. - /// - /// - /// - /// public void Foo([ItemCanBeNull]List<string> books) - /// { - /// foreach (var book in books) - /// { - /// // Warning: Possible 'System.NullReferenceException' - /// Console.WriteLine(book.ToUpper()); - /// } - /// } - /// - /// - [AttributeUsage( - AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property | - AttributeTargets.Delegate | AttributeTargets.Field)] - public sealed class ItemCanBeNullAttribute : Attribute - { - } - - /// - /// Indicates that the marked method builds string by the format pattern and (optional) arguments. - /// The parameter, which contains the format string, should be given in constructor. The format string - /// should be in -like form. - /// - /// - /// - /// [StringFormatMethod("message")] - /// void ShowError(string message, params object[] args) { /* do something */ } - /// - /// void Foo() { - /// ShowError("Failed: {0}"); // Warning: Non-existing argument in format string - /// } - /// - /// - [AttributeUsage( - AttributeTargets.Constructor | AttributeTargets.Method | - AttributeTargets.Property | AttributeTargets.Delegate)] - public sealed class StringFormatMethodAttribute : Attribute - { - /// - /// Specifies which parameter of an annotated method should be treated as the format string - /// - public StringFormatMethodAttribute([NotNull] string formatParameterName) - { - FormatParameterName = formatParameterName; - } - - [NotNull] - public string FormatParameterName { get; } - } - - /// - /// Use this annotation to specify a type that contains static or const fields - /// with values for the annotated property/field/parameter. - /// The specified type will be used to improve completion suggestions. - /// - /// - /// - /// namespace TestNamespace - /// { - /// public class Constants - /// { - /// public static int INT_CONST = 1; - /// public const string STRING_CONST = "1"; - /// } - /// - /// public class Class1 - /// { - /// [ValueProvider("TestNamespace.Constants")] public int myField; - /// public void Foo([ValueProvider("TestNamespace.Constants")] string str) { } - /// - /// public void Test() - /// { - /// Foo(/*try completion here*/);// - /// myField = /*try completion here*/ - /// } - /// } - /// } - /// - /// - [AttributeUsage( - AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.Field, - AllowMultiple = true)] - public sealed class ValueProviderAttribute : Attribute - { - public ValueProviderAttribute([NotNull] string name) - { - Name = name; - } - - [NotNull] - public string Name { get; } - } - - /// - /// Indicates that the function argument should be a string literal and match one - /// of the parameters of the caller function. For example, ReSharper annotates - /// the parameter of . - /// - /// - /// - /// void Foo(string param) { - /// if (param == null) - /// throw new ArgumentNullException("par"); // Warning: Cannot resolve symbol - /// } - /// - /// - [AttributeUsage(AttributeTargets.Parameter)] - public sealed class InvokerParameterNameAttribute : Attribute - { - } - - /// - /// Indicates that the method is contained in a type that implements - /// System.ComponentModel.INotifyPropertyChanged interface and this method - /// is used to notify that some property value changed. - /// - /// - /// The method should be non-static and conform to one of the supported signatures: - /// - /// - /// NotifyChanged(string) - /// - /// - /// NotifyChanged(params string[]) - /// - /// - /// NotifyChanged{T}(Expression{Func{T}}) - /// - /// - /// NotifyChanged{T,U}(Expression{Func{T,U}}) - /// - /// - /// SetProperty{T}(ref T, T, string) - /// - /// - /// - /// - /// - /// public class Foo : INotifyPropertyChanged { - /// public event PropertyChangedEventHandler PropertyChanged; - /// - /// [NotifyPropertyChangedInvocator] - /// protected virtual void NotifyChanged(string propertyName) { ... } - /// - /// string _name; - /// - /// public string Name { - /// get { return _name; } - /// set { _name = value; NotifyChanged("LastName"); /* Warning */ } - /// } - /// } - /// - /// Examples of generated notifications: - /// - /// - /// NotifyChanged("Property") - /// - /// - /// NotifyChanged(() => Property) - /// - /// - /// NotifyChanged((VM x) => x.Property) - /// - /// - /// SetProperty(ref myField, value, "Property") - /// - /// - /// - [AttributeUsage(AttributeTargets.Method)] - public sealed class NotifyPropertyChangedInvocatorAttribute : Attribute - { - public NotifyPropertyChangedInvocatorAttribute() - { - } - - public NotifyPropertyChangedInvocatorAttribute([NotNull] string parameterName) - { - ParameterName = parameterName; - } - - [CanBeNull] - public string ParameterName { get; } - } - - /// - /// Describes dependency between method input and output. - /// - /// - ///

Function Definition Table syntax:

- /// - /// FDT ::= FDTRow [;FDTRow]* - /// FDTRow ::= Input => Output | Output <= Input - /// Input ::= ParameterName: Value [, Input]* - /// Output ::= [ParameterName: Value]* {halt|stop|void|nothing|Value} - /// Value ::= true | false | null | notnull | canbenull - /// - /// If the method has a single input parameter, its name could be omitted.
- /// Using halt (or void/nothing, which is the same) for the method output - /// means that the method doesn't return normally (throws or terminates the process).
- /// Value canbenull is only applicable for output parameters.
- /// You can use multiple [ContractAnnotation] for each FDT row, or use single attribute - /// with rows separated by semicolon. There is no notion of order rows, all rows are checked - /// for applicability and applied per each program state tracked by the analysis engine.
- ///
- /// - /// - /// - /// - /// [ContractAnnotation("=> halt")] - /// public void TerminationMethod() - /// - /// - /// - /// - /// [ContractAnnotation("null <= param:null")] // reverse condition syntax - /// public string GetName(string surname) - /// - /// - /// - /// - /// [ContractAnnotation("s:null => true")] - /// public bool IsNullOrEmpty(string s) // string.IsNullOrEmpty() - /// - /// - /// - /// - /// // A method that returns null if the parameter is null, - /// // and not null if the parameter is not null - /// [ContractAnnotation("null => null; notnull => notnull")] - /// public object Transform(object data) - /// - /// - /// - /// - /// [ContractAnnotation("=> true, result: notnull; => false, result: null")] - /// public bool TryParse(string s, out Person result) - /// - /// - /// - /// - [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] - public sealed class ContractAnnotationAttribute : Attribute - { - public ContractAnnotationAttribute([NotNull] string contract) - : this(contract, false) - { - } - - public ContractAnnotationAttribute([NotNull] string contract, bool forceFullStates) - { - Contract = contract; - ForceFullStates = forceFullStates; - } - - [NotNull] - public string Contract { get; } - - public bool ForceFullStates { get; } - } - - /// - /// Indicates whether the marked element should be localized. - /// - /// - /// - /// [LocalizationRequiredAttribute(true)] - /// class Foo { - /// string str = "my string"; // Warning: Localizable string - /// } - /// - /// - [AttributeUsage(AttributeTargets.All)] - public sealed class LocalizationRequiredAttribute : Attribute - { - public LocalizationRequiredAttribute() : this(true) - { - } - - public LocalizationRequiredAttribute(bool required) - { - Required = required; - } - - public bool Required { get; } - } - - /// - /// Indicates that the value of the marked type (or its derivatives) - /// cannot be compared using '==' or '!=' operators and Equals() - /// should be used instead. However, using '==' or '!=' for comparison - /// with null is always permitted. - /// - /// - /// - /// [CannotApplyEqualityOperator] - /// class NoEquality { } - /// - /// class UsesNoEquality { - /// void Test() { - /// var ca1 = new NoEquality(); - /// var ca2 = new NoEquality(); - /// if (ca1 != null) { // OK - /// bool condition = ca1 == ca2; // Warning - /// } - /// } - /// } - /// - /// - [AttributeUsage(AttributeTargets.Interface | AttributeTargets.Class | AttributeTargets.Struct)] - public sealed class CannotApplyEqualityOperatorAttribute : Attribute - { - } - - /// - /// When applied to a target attribute, specifies a requirement for any type marked - /// with the target attribute to implement or inherit specific type or types. - /// - /// - /// - /// [BaseTypeRequired(typeof(IComponent)] // Specify requirement - /// class ComponentAttribute : Attribute { } - /// - /// [Component] // ComponentAttribute requires implementing IComponent interface - /// class MyComponent : IComponent { } - /// - /// - [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] - [BaseTypeRequired(typeof(Attribute))] - public sealed class BaseTypeRequiredAttribute : Attribute - { - public BaseTypeRequiredAttribute([NotNull] Type baseType) - { - BaseType = baseType; - } - - [NotNull] - public Type BaseType { get; } - } - - /// - /// Indicates that the marked symbol is used implicitly (e.g. via reflection, in external library), - /// so this symbol will not be reported as unused (as well as by other usage inspections). - /// - [AttributeUsage(AttributeTargets.All, Inherited = false)] - public sealed class UsedImplicitlyAttribute : Attribute - { - public UsedImplicitlyAttribute() - : this(ImplicitUseKindFlags.Default, ImplicitUseTargetFlags.Default) - { - } - - public UsedImplicitlyAttribute(ImplicitUseKindFlags useKindFlags) - : this(useKindFlags, ImplicitUseTargetFlags.Default) - { - } - - public UsedImplicitlyAttribute(ImplicitUseTargetFlags targetFlags) - : this(ImplicitUseKindFlags.Default, targetFlags) - { - } - - public UsedImplicitlyAttribute(ImplicitUseKindFlags useKindFlags, ImplicitUseTargetFlags targetFlags) - { - UseKindFlags = useKindFlags; - TargetFlags = targetFlags; - } - - public ImplicitUseKindFlags UseKindFlags { get; } - - public ImplicitUseTargetFlags TargetFlags { get; } - } - - /// - /// Can be applied to attributes, type parameters, and parameters of a type assignable from - /// . - /// When applied to an attribute, the decorated attribute behaves the same as . - /// When applied to a type parameter or to a parameter of type , indicates that the - /// corresponding type - /// is used implicitly. - /// - [AttributeUsage(AttributeTargets.Class | AttributeTargets.GenericParameter | AttributeTargets.Parameter)] - public sealed class MeansImplicitUseAttribute : Attribute - { - public MeansImplicitUseAttribute() - : this(ImplicitUseKindFlags.Default, ImplicitUseTargetFlags.Default) - { - } - - public MeansImplicitUseAttribute(ImplicitUseKindFlags useKindFlags) - : this(useKindFlags, ImplicitUseTargetFlags.Default) - { - } - - public MeansImplicitUseAttribute(ImplicitUseTargetFlags targetFlags) - : this(ImplicitUseKindFlags.Default, targetFlags) - { - } - - public MeansImplicitUseAttribute(ImplicitUseKindFlags useKindFlags, ImplicitUseTargetFlags targetFlags) - { - UseKindFlags = useKindFlags; - TargetFlags = targetFlags; - } - - [UsedImplicitly] - public ImplicitUseKindFlags UseKindFlags { get; } - - [UsedImplicitly] - public ImplicitUseTargetFlags TargetFlags { get; } - } - - /// - /// Specify the details of implicitly used symbol when it is marked - /// with or . - /// - [Flags] - public enum ImplicitUseKindFlags - { - Default = Access | Assign | InstantiatedWithFixedConstructorSignature, - - /// Only entity marked with attribute considered used. - Access = 1, - - /// Indicates implicit assignment to a member. - Assign = 2, - - /// - /// Indicates implicit instantiation of a type with fixed constructor signature. - /// That means any unused constructor parameters won't be reported as such. - /// - InstantiatedWithFixedConstructorSignature = 4, - - /// Indicates implicit instantiation of a type. - InstantiatedNoFixedConstructorSignature = 8 - } - - /// - /// Specify what is considered to be used implicitly when marked - /// with or . - /// - [Flags] - public enum ImplicitUseTargetFlags - { - Default = Itself, - Itself = 1, - - /// Members of entity marked with attribute are considered used. - Members = 2, - - /// Entity marked with attribute and all its members considered used. - WithMembers = Itself | Members - } - - /// - /// This attribute is intended to mark publicly available API - /// which should not be removed and so is treated as used. - /// - [MeansImplicitUse(ImplicitUseTargetFlags.WithMembers)] - [AttributeUsage(AttributeTargets.All, Inherited = false)] - public sealed class PublicAPIAttribute : Attribute - { - public PublicAPIAttribute() - { - } - - public PublicAPIAttribute([NotNull] string comment) - { - Comment = comment; - } - - [CanBeNull] - public string Comment { get; } - } - - /// - /// Tells code analysis engine if the parameter is completely handled when the invoked method is on stack. - /// If the parameter is a delegate, indicates that delegate is executed while the method is executed. - /// If the parameter is an enumerable, indicates that it is enumerated while the method is executed. - /// - [AttributeUsage(AttributeTargets.Parameter)] - public sealed class InstantHandleAttribute : Attribute - { - } - - /// - /// Indicates that a method does not make any observable state changes. - /// The same as System.Diagnostics.Contracts.PureAttribute. - /// - /// - /// - /// [Pure] int Multiply(int x, int y) => x * y; - /// - /// void M() { - /// Multiply(123, 42); // Waring: Return value of pure method is not used - /// } - /// - /// - [AttributeUsage(AttributeTargets.Method)] - public sealed class PureAttribute : Attribute - { - } - - /// - /// Indicates that the return value of the method invocation must be used. - /// - /// - /// Methods decorated with this attribute (in contrast to pure methods) might change state, - /// but make no sense without using their return value.
- /// Similarly to , this attribute - /// will help detecting usages of the method when the return value in not used. - /// Additionally, you can optionally specify a custom message, which will be used when showing warnings, e.g. - /// [MustUseReturnValue("Use the return value to...")]. - ///
- [AttributeUsage(AttributeTargets.Method)] - public sealed class MustUseReturnValueAttribute : Attribute - { - public MustUseReturnValueAttribute() - { - } - - public MustUseReturnValueAttribute([NotNull] string justification) - { - Justification = justification; - } - - [CanBeNull] - public string Justification { get; } - } - - /// - /// Indicates the type member or parameter of some type, that should be used instead of all other ways - /// to get the value of that type. This annotation is useful when you have some "context" value evaluated - /// and stored somewhere, meaning that all other ways to get this value must be consolidated with existing one. - /// - /// - /// - /// class Foo { - /// [ProvidesContext] IBarService _barService = ...; - /// - /// void ProcessNode(INode node) { - /// DoSomething(node, node.GetGlobalServices().Bar); - /// // ^ Warning: use value of '_barService' field - /// } - /// } - /// - /// - [AttributeUsage( - AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Parameter | AttributeTargets.Method | - AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Struct | AttributeTargets.GenericParameter)] - public sealed class ProvidesContextAttribute : Attribute - { - } - - /// - /// Indicates that a parameter is a path to a file or a folder within a web project. - /// Path can be relative or absolute, starting from web root (~). - /// - [AttributeUsage(AttributeTargets.Parameter)] - public sealed class PathReferenceAttribute : Attribute - { - public PathReferenceAttribute() - { - } - - public PathReferenceAttribute([NotNull] [PathReference] string basePath) - { - BasePath = basePath; - } - - [CanBeNull] - public string BasePath { get; } - } - - /// - /// An extension method marked with this attribute is processed by code completion - /// as a 'Source Template'. When the extension method is completed over some expression, its source code - /// is automatically expanded like a template at call site. - /// - /// - /// Template method body can contain valid source code and/or special comments starting with '$'. - /// Text inside these comments is added as source code when the template is applied. Template parameters - /// can be used either as additional method parameters or as identifiers wrapped in two '$' signs. - /// Use the attribute to specify macros for parameters. - /// - /// - /// In this example, the 'forEach' method is a source template available over all values - /// of enumerable types, producing ordinary C# 'foreach' statement and placing caret inside block: - /// - /// [SourceTemplate] - /// public static void forEach<T>(this IEnumerable<T> xs) { - /// foreach (var x in xs) { - /// //$ $END$ - /// } - /// } - /// - /// - [AttributeUsage(AttributeTargets.Method)] - public sealed class SourceTemplateAttribute : Attribute - { - } - - /// - /// Allows specifying a macro for a parameter of a source template. - /// - /// - /// You can apply the attribute on the whole method or on any of its additional parameters. The macro expression - /// is defined in the property. When applied on a method, the target - /// template parameter is defined in the property. To apply the macro silently - /// for the parameter, set the property value = -1. - /// - /// - /// Applying the attribute on a source template method: - /// - /// [SourceTemplate, Macro(Target = "item", Expression = "suggestVariableName()")] - /// public static void forEach<T>(this IEnumerable<T> collection) { - /// foreach (var item in collection) { - /// //$ $END$ - /// } - /// } - /// - /// Applying the attribute on a template method parameter: - /// - /// [SourceTemplate] - /// public static void something(this Entity x, [Macro(Expression = "guid()", Editable = -1)] string newguid) { - /// /*$ var $x$Id = "$newguid$" + x.ToString(); - /// x.DoSomething($x$Id); */ - /// } - /// - /// - [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method, AllowMultiple = true)] - public sealed class MacroAttribute : Attribute - { - /// - /// Allows specifying a macro that will be executed for a source template - /// parameter when the template is expanded. - /// - [CanBeNull] - public string Expression { get; set; } - - /// - /// Allows specifying which occurrence of the target parameter becomes editable when the template is deployed. - /// - /// - /// If the target parameter is used several times in the template, only one occurrence becomes editable; - /// other occurrences are changed synchronously. To specify the zero-based index of the editable occurrence, - /// use values >= 0. To make the parameter non-editable when the template is expanded, use -1. - /// - public int Editable { get; set; } - - /// - /// Identifies the target parameter of a source template if the - /// is applied on a template method. - /// - [CanBeNull] - public string Target { get; set; } - } - - [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = true)] - public sealed class AspMvcAreaMasterLocationFormatAttribute : Attribute - { - public AspMvcAreaMasterLocationFormatAttribute([NotNull] string format) - { - Format = format; - } - - [NotNull] - public string Format { get; } - } - - [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = true)] - public sealed class AspMvcAreaPartialViewLocationFormatAttribute : Attribute - { - public AspMvcAreaPartialViewLocationFormatAttribute([NotNull] string format) - { - Format = format; - } - - [NotNull] - public string Format { get; } - } - - [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = true)] - public sealed class AspMvcAreaViewLocationFormatAttribute : Attribute - { - public AspMvcAreaViewLocationFormatAttribute([NotNull] string format) - { - Format = format; - } - - [NotNull] - public string Format { get; } - } - - [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = true)] - public sealed class AspMvcMasterLocationFormatAttribute : Attribute - { - public AspMvcMasterLocationFormatAttribute([NotNull] string format) - { - Format = format; - } - - [NotNull] - public string Format { get; } - } - - [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = true)] - public sealed class AspMvcPartialViewLocationFormatAttribute : Attribute - { - public AspMvcPartialViewLocationFormatAttribute([NotNull] string format) - { - Format = format; - } - - [NotNull] - public string Format { get; } - } - - [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = true)] - public sealed class AspMvcViewLocationFormatAttribute : Attribute - { - public AspMvcViewLocationFormatAttribute([NotNull] string format) - { - Format = format; - } - - [NotNull] - public string Format { get; } - } - - /// - /// ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter - /// is an MVC action. If applied to a method, the MVC action name is calculated - /// implicitly from the context. Use this attribute for custom wrappers similar to - /// System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper, String). - /// - [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method | AttributeTargets.Field | AttributeTargets.Property)] - public sealed class AspMvcActionAttribute : Attribute - { - public AspMvcActionAttribute() - { - } - - public AspMvcActionAttribute([NotNull] string anonymousProperty) - { - AnonymousProperty = anonymousProperty; - } - - [CanBeNull] - public string AnonymousProperty { get; } - } - - /// - /// ASP.NET MVC attribute. Indicates that the marked parameter is an MVC area. - /// Use this attribute for custom wrappers similar to - /// System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper, String). - /// - [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property)] - public sealed class AspMvcAreaAttribute : Attribute - { - public AspMvcAreaAttribute() - { - } - - public AspMvcAreaAttribute([NotNull] string anonymousProperty) - { - AnonymousProperty = anonymousProperty; - } - - [CanBeNull] - public string AnonymousProperty { get; } - } - - /// - /// ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter is - /// an MVC controller. If applied to a method, the MVC controller name is calculated - /// implicitly from the context. Use this attribute for custom wrappers similar to - /// System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper, String, String). - /// - [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method | AttributeTargets.Field | AttributeTargets.Property)] - public sealed class AspMvcControllerAttribute : Attribute - { - public AspMvcControllerAttribute() - { - } - - public AspMvcControllerAttribute([NotNull] string anonymousProperty) - { - AnonymousProperty = anonymousProperty; - } - - [CanBeNull] - public string AnonymousProperty { get; } - } - - /// - /// ASP.NET MVC attribute. Indicates that the marked parameter is an MVC Master. Use this attribute - /// for custom wrappers similar to System.Web.Mvc.Controller.View(String, String). - /// - [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property)] - public sealed class AspMvcMasterAttribute : Attribute - { - } - - /// - /// ASP.NET MVC attribute. Indicates that the marked parameter is an MVC model type. Use this attribute - /// for custom wrappers similar to System.Web.Mvc.Controller.View(String, Object). - /// - [AttributeUsage(AttributeTargets.Parameter)] - public sealed class AspMvcModelTypeAttribute : Attribute - { - } - - /// - /// ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter is an MVC - /// partial view. If applied to a method, the MVC partial view name is calculated implicitly - /// from the context. Use this attribute for custom wrappers similar to - /// System.Web.Mvc.Html.RenderPartialExtensions.RenderPartial(HtmlHelper, String). - /// - [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method | AttributeTargets.Field | AttributeTargets.Property)] - public sealed class AspMvcPartialViewAttribute : Attribute - { - } - - /// - /// ASP.NET MVC attribute. Allows disabling inspections for MVC views within a class or a method. - /// - [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] - public sealed class AspMvcSuppressViewErrorAttribute : Attribute - { - } - - /// - /// ASP.NET MVC attribute. Indicates that a parameter is an MVC display template. - /// Use this attribute for custom wrappers similar to - /// System.Web.Mvc.Html.DisplayExtensions.DisplayForModel(HtmlHelper, String). - /// - [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property)] - public sealed class AspMvcDisplayTemplateAttribute : Attribute - { - } - - /// - /// ASP.NET MVC attribute. Indicates that the marked parameter is an MVC editor template. - /// Use this attribute for custom wrappers similar to - /// System.Web.Mvc.Html.EditorExtensions.EditorForModel(HtmlHelper, String). - /// - [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property)] - public sealed class AspMvcEditorTemplateAttribute : Attribute - { - } - - /// - /// ASP.NET MVC attribute. Indicates that the marked parameter is an MVC template. - /// Use this attribute for custom wrappers similar to - /// System.ComponentModel.DataAnnotations.UIHintAttribute(System.String). - /// - [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property)] - public sealed class AspMvcTemplateAttribute : Attribute - { - } - - /// - /// ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter - /// is an MVC view component. If applied to a method, the MVC view name is calculated implicitly - /// from the context. Use this attribute for custom wrappers similar to - /// System.Web.Mvc.Controller.View(Object). - /// - [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method | AttributeTargets.Field | AttributeTargets.Property)] - public sealed class AspMvcViewAttribute : Attribute - { - } - - /// - /// ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter - /// is an MVC view component name. - /// - [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property)] - public sealed class AspMvcViewComponentAttribute : Attribute - { - } - - /// - /// ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter - /// is an MVC view component view. If applied to a method, the MVC view component view name is default. - /// - [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method | AttributeTargets.Field | AttributeTargets.Property)] - public sealed class AspMvcViewComponentViewAttribute : Attribute - { - } - - /// - /// ASP.NET MVC attribute. When applied to a parameter of an attribute, - /// indicates that this parameter is an MVC action name. - /// - /// - /// - /// [ActionName("Foo")] - /// public ActionResult Login(string returnUrl) { - /// ViewBag.ReturnUrl = Url.Action("Foo"); // OK - /// return RedirectToAction("Bar"); // Error: Cannot resolve action - /// } - /// - /// - [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property)] - public sealed class AspMvcActionSelectorAttribute : Attribute - { - } - - [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.Field)] - public sealed class HtmlElementAttributesAttribute : Attribute - { - public HtmlElementAttributesAttribute() - { - } - - public HtmlElementAttributesAttribute([NotNull] string name) - { - Name = name; - } - - [CanBeNull] - public string Name { get; } - } - - [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property)] - public sealed class HtmlAttributeValueAttribute : Attribute - { - public HtmlAttributeValueAttribute([NotNull] string name) - { - Name = name; - } - - [NotNull] - public string Name { get; } - } - - /// - /// Razor attribute. Indicates that the marked parameter or method is a Razor section. - /// Use this attribute for custom wrappers similar to - /// System.Web.WebPages.WebPageBase.RenderSection(String). - /// - [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method)] - public sealed class RazorSectionAttribute : Attribute - { - } - - /// - /// Indicates how method, constructor invocation, or property access - /// over collection type affects the contents of the collection. - /// Use to specify the access type. - /// - /// - /// Using this attribute only makes sense if all collection methods are marked with this attribute. - /// - /// - /// - /// public class MyStringCollection : List<string> - /// { - /// [CollectionAccess(CollectionAccessType.Read)] - /// public string GetFirstString() - /// { - /// return this.ElementAt(0); - /// } - /// } - /// class Test - /// { - /// public void Foo() - /// { - /// // Warning: Contents of the collection is never updated - /// var col = new MyStringCollection(); - /// string x = col.GetFirstString(); - /// } - /// } - /// - /// - [AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor | AttributeTargets.Property)] - public sealed class CollectionAccessAttribute : Attribute - { - public CollectionAccessAttribute(CollectionAccessType collectionAccessType) - { - CollectionAccessType = collectionAccessType; - } - - public CollectionAccessType CollectionAccessType { get; } - } - - /// - /// Provides a value for the to define - /// how the collection method invocation affects the contents of the collection. - /// - [Flags] - public enum CollectionAccessType - { - /// Method does not use or modify content of the collection. - None = 0, - - /// Method only reads content of the collection but does not modify it. - Read = 1, - - /// Method can change content of the collection but does not add new elements. - ModifyExistingContent = 2, - - /// Method can add new elements to the collection. - UpdatedContent = ModifyExistingContent | 4 - } - - /// - /// Indicates that the marked method is assertion method, i.e. it halts the control flow if - /// one of the conditions is satisfied. To set the condition, mark one of the parameters with - /// attribute. - /// - [AttributeUsage(AttributeTargets.Method)] - public sealed class AssertionMethodAttribute : Attribute - { - } - - /// - /// Indicates the condition parameter of the assertion method. The method itself should be - /// marked by attribute. The mandatory argument of - /// the attribute is the assertion type. - /// - [AttributeUsage(AttributeTargets.Parameter)] - public sealed class AssertionConditionAttribute : Attribute - { - public AssertionConditionAttribute(AssertionConditionType conditionType) - { - ConditionType = conditionType; - } - - public AssertionConditionType ConditionType { get; } - } - - /// - /// Specifies assertion type. If the assertion method argument satisfies the condition, - /// then the execution continues. Otherwise, execution is assumed to be halted. - /// - public enum AssertionConditionType - { - /// Marked parameter should be evaluated to true. - IS_TRUE = 0, - - /// Marked parameter should be evaluated to false. - IS_FALSE = 1, - - /// Marked parameter should be evaluated to null value. - IS_NULL = 2, - - /// Marked parameter should be evaluated to not null value. - IS_NOT_NULL = 3 - } - - /// - /// Indicates that the marked method unconditionally terminates control flow execution. - /// For example, it could unconditionally throw exception. - /// - [Obsolete("Use [ContractAnnotation('=> halt')] instead")] - [AttributeUsage(AttributeTargets.Method)] - public sealed class TerminatesProgramAttribute : Attribute - { - } - - /// - /// Indicates that method is pure LINQ method, with postponed enumeration (like Enumerable.Select, - /// .Where). This annotation allows inference of [InstantHandle] annotation for parameters - /// of delegate type by analyzing LINQ method chains. - /// - [AttributeUsage(AttributeTargets.Method)] - public sealed class LinqTunnelAttribute : Attribute - { - } - - /// - /// Indicates that IEnumerable passed as a parameter is not enumerated. - /// Use this annotation to suppress the 'Possible multiple enumeration of IEnumerable' inspection. - /// - /// - /// - /// static void ThrowIfNull<T>([NoEnumeration] T v, string n) where T : class - /// { - /// // custom check for null but no enumeration - /// } - /// - /// void Foo(IEnumerable<string> values) - /// { - /// ThrowIfNull(values, nameof(values)); - /// var x = values.ToList(); // No warnings about multiple enumeration - /// } - /// - /// - [AttributeUsage(AttributeTargets.Parameter)] - public sealed class NoEnumerationAttribute : Attribute - { - } - - /// - /// Indicates that the marked parameter is a regular expression pattern. - /// - [AttributeUsage(AttributeTargets.Parameter)] - public sealed class RegexPatternAttribute : Attribute - { - } - - /// - /// Prevents the Member Reordering feature from tossing members of the marked class. - /// - /// - /// The attribute must be mentioned in your member reordering patterns. - /// - [AttributeUsage( - AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Struct | AttributeTargets.Enum)] - public sealed class NoReorderAttribute : Attribute - { - } - - /// - /// XAML attribute. Indicates the type that has ItemsSource property and should be treated - /// as ItemsControl-derived type, to enable inner items DataContext type resolve. - /// - [AttributeUsage(AttributeTargets.Class)] - public sealed class XamlItemsControlAttribute : Attribute - { - } - - /// - /// XAML attribute. Indicates the property of some BindingBase-derived type, that - /// is used to bind some item of ItemsControl-derived type. This annotation will - /// enable the DataContext type resolve for XAML bindings for such properties. - /// - /// - /// Property should have the tree ancestor of the ItemsControl type or - /// marked with the attribute. - /// - [AttributeUsage(AttributeTargets.Property)] - public sealed class XamlItemBindingOfItemsControlAttribute : Attribute - { - } - - [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] - public sealed class AspChildControlTypeAttribute : Attribute - { - public AspChildControlTypeAttribute([NotNull] string tagName, [NotNull] Type controlType) - { - TagName = tagName; - ControlType = controlType; - } - - [NotNull] - public string TagName { get; } - - [NotNull] - public Type ControlType { get; } - } - - [AttributeUsage(AttributeTargets.Property | AttributeTargets.Method)] - public sealed class AspDataFieldAttribute : Attribute - { - } - - [AttributeUsage(AttributeTargets.Property | AttributeTargets.Method)] - public sealed class AspDataFieldsAttribute : Attribute - { - } - - [AttributeUsage(AttributeTargets.Property)] - public sealed class AspMethodPropertyAttribute : Attribute - { - } - - [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] - public sealed class AspRequiredAttributeAttribute : Attribute - { - public AspRequiredAttributeAttribute([NotNull] string attribute) - { - Attribute = attribute; - } - - [NotNull] - public string Attribute { get; } - } - - [AttributeUsage(AttributeTargets.Property)] - public sealed class AspTypePropertyAttribute : Attribute - { - public AspTypePropertyAttribute(bool createConstructorReferences) - { - CreateConstructorReferences = createConstructorReferences; - } - - public bool CreateConstructorReferences { get; } - } - - [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] - public sealed class RazorImportNamespaceAttribute : Attribute - { - public RazorImportNamespaceAttribute([NotNull] string name) - { - Name = name; - } - - [NotNull] - public string Name { get; } - } - - [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] - public sealed class RazorInjectionAttribute : Attribute - { - public RazorInjectionAttribute([NotNull] string type, [NotNull] string fieldName) - { - Type = type; - FieldName = fieldName; - } - - [NotNull] - public string Type { get; } - - [NotNull] - public string FieldName { get; } - } - - [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] - public sealed class RazorDirectiveAttribute : Attribute - { - public RazorDirectiveAttribute([NotNull] string directive) - { - Directive = directive; - } - - [NotNull] - public string Directive { get; } - } - - [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] - public sealed class RazorPageBaseTypeAttribute : Attribute - { - public RazorPageBaseTypeAttribute([NotNull] string baseType) - { - BaseType = baseType; - } - - public RazorPageBaseTypeAttribute([NotNull] string baseType, string pageName) - { - BaseType = baseType; - PageName = pageName; - } - - [NotNull] - public string BaseType { get; } - - [CanBeNull] - public string PageName { get; } - } - - [AttributeUsage(AttributeTargets.Method)] - public sealed class RazorHelperCommonAttribute : Attribute - { - } - - [AttributeUsage(AttributeTargets.Property)] - public sealed class RazorLayoutAttribute : Attribute - { - } - - [AttributeUsage(AttributeTargets.Method)] - public sealed class RazorWriteLiteralMethodAttribute : Attribute - { - } - - [AttributeUsage(AttributeTargets.Method)] - public sealed class RazorWriteMethodAttribute : Attribute - { - } - - [AttributeUsage(AttributeTargets.Parameter)] - public sealed class RazorWriteMethodParameterAttribute : Attribute - { - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Properties/AssemblyInfo.cs b/src/Artemis.UI.Shared/Properties/AssemblyInfo.cs deleted file mode 100644 index 412a20daf..000000000 --- a/src/Artemis.UI.Shared/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Runtime.InteropServices; -using System.Windows; - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -//In order to begin building localizable applications, set -//CultureYouAreCodingWith in your .csproj file -//inside a . For example, if you are using US english -//in your source files, set the to en-US. Then uncomment -//the NeutralResourceLanguage attribute below. Update the "en-US" in -//the line below to match the UICulture setting in the project file. - -//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] - - -[assembly: ThemeInfo( - ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located - //(used if a resource is not found in the page, - // or application resource dictionaries) - ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located - //(used if a resource is not found in the page, - // app, or any theme specific resource dictionaries) -)] \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Properties/DesignTimeResources.xaml b/src/Artemis.UI.Shared/Properties/DesignTimeResources.xaml deleted file mode 100644 index dec7a9dd8..000000000 --- a/src/Artemis.UI.Shared/Properties/DesignTimeResources.xaml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Properties/Resources.Designer.cs b/src/Artemis.UI.Shared/Properties/Resources.Designer.cs deleted file mode 100644 index f931adadc..000000000 --- a/src/Artemis.UI.Shared/Properties/Resources.Designer.cs +++ /dev/null @@ -1,62 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Artemis.UI.Shared.Properties { - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if ((resourceMan == null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Artemis.UI.Shared.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - } -} diff --git a/src/Artemis.UI.Shared/Properties/Resources.resx b/src/Artemis.UI.Shared/Properties/Resources.resx deleted file mode 100644 index af7dbebba..000000000 --- a/src/Artemis.UI.Shared/Properties/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Properties/Settings.Designer.cs b/src/Artemis.UI.Shared/Properties/Settings.Designer.cs deleted file mode 100644 index d2346eb37..000000000 --- a/src/Artemis.UI.Shared/Properties/Settings.Designer.cs +++ /dev/null @@ -1,30 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Artemis.UI.Shared.Properties -{ - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase - { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default - { - get - { - return defaultInstance; - } - } - } -} diff --git a/src/Artemis.UI.Shared/Properties/Settings.settings b/src/Artemis.UI.Shared/Properties/Settings.settings deleted file mode 100644 index c14891b94..000000000 --- a/src/Artemis.UI.Shared/Properties/Settings.settings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/src/Artemis.UI.Shared/PropertyInput/PropertyInputRegistration.cs b/src/Artemis.UI.Shared/PropertyInput/PropertyInputRegistration.cs deleted file mode 100644 index e118e36c6..000000000 --- a/src/Artemis.UI.Shared/PropertyInput/PropertyInputRegistration.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using Artemis.Core; -using Artemis.UI.Shared.Services; - -namespace Artemis.UI.Shared -{ - /// - /// Represents a property input registration registered through - /// - public class PropertyInputRegistration - { - private readonly IProfileEditorService _profileEditorService; - - internal PropertyInputRegistration(IProfileEditorService profileEditorService, Plugin plugin, Type supportedType, Type viewModelType) - { - _profileEditorService = profileEditorService; - Plugin = plugin; - SupportedType = supportedType; - ViewModelType = viewModelType; - - if (Plugin != Constants.CorePlugin) - Plugin.Disabled += InstanceOnDisabled; - } - - /// - /// Gets the plugin that registered the property input - /// - public Plugin Plugin { get; } - - /// - /// Gets the type supported by the property input - /// - public Type SupportedType { get; } - - /// - /// Gets the view model type of the property input - /// - public Type ViewModelType { get; } - - internal void Unsubscribe() - { - if (Plugin != Constants.CorePlugin) - Plugin.Disabled -= InstanceOnDisabled; - } - - private void InstanceOnDisabled(object? sender, EventArgs e) - { - // Profile editor service will call Unsubscribe - _profileEditorService.RemovePropertyInput(this); - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/PropertyInput/PropertyInputViewModel.cs b/src/Artemis.UI.Shared/PropertyInput/PropertyInputViewModel.cs deleted file mode 100644 index f03156dd0..000000000 --- a/src/Artemis.UI.Shared/PropertyInput/PropertyInputViewModel.cs +++ /dev/null @@ -1,236 +0,0 @@ -using System; -using System.Diagnostics.CodeAnalysis; -using Artemis.Core; -using Artemis.UI.Shared.Services; -using Stylet; - -namespace Artemis.UI.Shared -{ - /// - /// Represents the base class for a property input view model that is used to edit layer properties - /// - /// The type of property this input view model supports - public abstract class PropertyInputViewModel : PropertyInputViewModel - { - private bool _inputDragging; - [AllowNull] - private T _inputValue = default!; - - /// - /// Creates a new instance of the class - /// - /// The layer property this view model will edit - /// The profile editor service - protected PropertyInputViewModel(LayerProperty layerProperty, IProfileEditorService profileEditorService) - { - LayerProperty = layerProperty; - ProfileEditorService = profileEditorService; - } - - /// - /// Creates a new instance of the class - /// - /// The layer property this view model will edit - /// The profile editor service - /// The validator used to validate the input - protected PropertyInputViewModel(LayerProperty layerProperty, IProfileEditorService profileEditorService, IModelValidator validator) : base(validator) - { - LayerProperty = layerProperty; - ProfileEditorService = profileEditorService; - } - - /// - /// Gets the layer property this view model is editing - /// - public LayerProperty LayerProperty { get; } - - /// - /// Gets a boolean indicating whether the layer property should be enabled - /// - public bool IsEnabled => !LayerProperty.HasDataBinding; - - /// - /// Gets the profile editor service - /// - public IProfileEditorService ProfileEditorService { get; } - - /// - /// Gets or sets a boolean indicating whether the input is currently being dragged - /// - /// Only applicable when using something like a , see - /// and - /// - /// - public bool InputDragging - { - get => _inputDragging; - private set => SetAndNotify(ref _inputDragging, value); - } - - /// - /// Gets or sets the input value - /// - [AllowNull] - public T InputValue - { - get => _inputValue; - set - { - SetAndNotify(ref _inputValue, value); - ApplyInputValue(); - } - } - - internal override object InternalGuard { get; } = new(); - - #region Overrides of Screen - - /// - protected override void OnInitialActivate() - { - LayerProperty.Updated += LayerPropertyOnUpdated; - LayerProperty.CurrentValueSet += LayerPropertyOnUpdated; - LayerProperty.DataBinding.DataBindingEnabled += OnDataBindingChange; - LayerProperty.DataBinding.DataBindingDisabled += OnDataBindingChange; - UpdateInputValue(); - base.OnInitialActivate(); - } - - /// - protected override void OnClose() - { - LayerProperty.Updated -= LayerPropertyOnUpdated; - LayerProperty.CurrentValueSet -= LayerPropertyOnUpdated; - LayerProperty.DataBinding.DataBindingEnabled -= OnDataBindingChange; - LayerProperty.DataBinding.DataBindingDisabled -= OnDataBindingChange; - base.OnClose(); - } - - #endregion - - /// - /// Called when the input value has been applied to the layer property - /// - protected virtual void OnInputValueApplied() - { - } - - /// - /// Called when the input value has changed - /// - protected virtual void OnInputValueChanged() - { - } - - /// - /// Called when data bindings have been enabled or disabled on the layer property - /// - protected virtual void OnDataBindingsChanged() - { - } - - /// - /// Applies the input value to the layer property - /// - protected void ApplyInputValue() - { - // Force the validator to run - if (Validator != null) - Validate(); - // Only apply the input value to the layer property if the validator found no errors - if (!HasErrors) - { - OnInputValueChanged(); - LayerProperty.SetCurrentValue(_inputValue, ProfileEditorService.CurrentTime); - OnInputValueApplied(); - - if (InputDragging) - ProfileEditorService.UpdateProfilePreview(); - else - ProfileEditorService.SaveSelectedProfileElement(); - } - } - - private void UpdateInputValue() - { - // Avoid unnecessary UI updates and validator cycles - if (_inputValue != null && _inputValue.Equals(LayerProperty.CurrentValue) || _inputValue == null && LayerProperty.CurrentValue == null) - return; - - // Override the input value - _inputValue = LayerProperty.CurrentValue; - - // Notify a change in the input value - OnInputValueChanged(); - NotifyOfPropertyChange(nameof(InputValue)); - - // Force the validator to run with the overridden value - if (Validator != null) - Validate(); - } - - #region Event handlers - - /// - /// Called by the view input drag has started - /// - /// To use, add the following to DraggableFloat in your xaml: DragStarted="{s:Action InputDragStarted}" - /// - /// - public void InputDragStarted(object sender, EventArgs e) - { - InputDragging = true; - } - - /// - /// Called by the view when input drag has ended - /// - /// To use, add the following to DraggableFloat in your xaml: DragEnded="{s:Action InputDragEnded}" - /// - /// - public void InputDragEnded(object sender, EventArgs e) - { - InputDragging = false; - ProfileEditorService.SaveSelectedProfileElement(); - } - - private void LayerPropertyOnUpdated(object? sender, EventArgs e) - { - UpdateInputValue(); - } - - private void OnDataBindingChange(object? sender, DataBindingEventArgs e) - { - NotifyOfPropertyChange(nameof(IsEnabled)); - OnDataBindingsChanged(); - } - - #endregion - } - - /// - /// For internal use only, implement instead. - /// - public abstract class PropertyInputViewModel : Screen - { - /// - /// For internal use only, implement instead. - /// - protected PropertyInputViewModel() - { - } - - /// - /// For internal use only, implement instead. - /// - protected PropertyInputViewModel(IModelValidator validator) : base(validator) - { - } - - /// - /// Prevents this type being implemented directly, implement instead. - /// - // ReSharper disable once UnusedMember.Global - internal abstract object InternalGuard { get; } - } -} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Shared/Providers/IColorGradientStorageProvider.cs b/src/Artemis.UI.Shared/Providers/IColorGradientStorageProvider.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Providers/IColorGradientStorageProvider.cs rename to src/Artemis.UI.Shared/Providers/IColorGradientStorageProvider.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Providers/ICursorProvider.cs b/src/Artemis.UI.Shared/Providers/ICursorProvider.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Providers/ICursorProvider.cs rename to src/Artemis.UI.Shared/Providers/ICursorProvider.cs diff --git a/src/Artemis.UI.Shared/ResourceDictionaries/DataModelConditions.xaml b/src/Artemis.UI.Shared/ResourceDictionaries/DataModelConditions.xaml deleted file mode 100644 index f29058c56..000000000 --- a/src/Artemis.UI.Shared/ResourceDictionaries/DataModelConditions.xaml +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Resources/ArtemisShared.xaml b/src/Artemis.UI.Shared/Resources/ArtemisShared.xaml deleted file mode 100644 index 329817f4b..000000000 --- a/src/Artemis.UI.Shared/Resources/ArtemisShared.xaml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Resources/Fonts/RobotoMono-Regular.ttf b/src/Artemis.UI.Shared/Resources/Fonts/RobotoMono-Regular.ttf deleted file mode 100644 index 5919b5d1b..000000000 Binary files a/src/Artemis.UI.Shared/Resources/Fonts/RobotoMono-Regular.ttf and /dev/null differ diff --git a/src/Artemis.UI.Shared/Screens/Dialogs/ConfirmDialogView.xaml b/src/Artemis.UI.Shared/Screens/Dialogs/ConfirmDialogView.xaml deleted file mode 100644 index a65e58422..000000000 --- a/src/Artemis.UI.Shared/Screens/Dialogs/ConfirmDialogView.xaml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Screens/Exceptions/ExceptionViewModel.cs b/src/Artemis.UI.Shared/Screens/Exceptions/ExceptionViewModel.cs deleted file mode 100644 index 9750c9eb7..000000000 --- a/src/Artemis.UI.Shared/Screens/Exceptions/ExceptionViewModel.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Windows; -using MaterialDesignThemes.Wpf; -using Stylet; - -namespace Artemis.UI.Shared.Screens.Exceptions -{ - internal class ExceptionViewModel : Screen - { - public ExceptionViewModel(string message, Exception exception) - { - Header = message; - Exception = exception.ToString(); - MessageQueue = new SnackbarMessageQueue(TimeSpan.FromSeconds(2)); - } - - public string Header { get; } - public string Exception { get; } - public SnackbarMessageQueue MessageQueue { get; } - - public void CopyException() - { - Clipboard.SetText(Exception); - MessageQueue.Enqueue("Copied exception to clipboard"); - } - - public void Close() - { - RequestClose(); - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Screens/GradientEditor/ColorStopView.xaml b/src/Artemis.UI.Shared/Screens/GradientEditor/ColorStopView.xaml deleted file mode 100644 index af5fdcf45..000000000 --- a/src/Artemis.UI.Shared/Screens/GradientEditor/ColorStopView.xaml +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Screens/GradientEditor/ColorStopViewModel.cs b/src/Artemis.UI.Shared/Screens/GradientEditor/ColorStopViewModel.cs deleted file mode 100644 index 60080f009..000000000 --- a/src/Artemis.UI.Shared/Screens/GradientEditor/ColorStopViewModel.cs +++ /dev/null @@ -1,127 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Linq; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Input; -using Artemis.Core; -using Stylet; - -namespace Artemis.UI.Shared.Screens.GradientEditor -{ - internal class ColorStopViewModel : PropertyChangedBase - { - private readonly GradientEditorViewModel _gradientEditorViewModel; - private bool _isSelected; - private bool _willRemoveColorStop; - - public ColorStopViewModel(GradientEditorViewModel gradientEditorViewModel, ColorGradientStop colorStop) - { - _gradientEditorViewModel = gradientEditorViewModel; - ColorStop = colorStop; - } - - public ColorGradientStop ColorStop { get; } - - public double Offset - { - get => ColorStop.Position * _gradientEditorViewModel.PreviewWidth; - set - { - ColorStop.Position = (float) Math.Round(value / _gradientEditorViewModel.PreviewWidth, 3, MidpointRounding.AwayFromZero); - NotifyOfPropertyChange(nameof(Offset)); - NotifyOfPropertyChange(nameof(OffsetPercent)); - NotifyOfPropertyChange(nameof(OffsetFloat)); - } - } - - public float OffsetPercent - { - get => (float) Math.Round(ColorStop.Position * 100.0, MidpointRounding.AwayFromZero); - set - { - ColorStop.Position = Math.Min(100, Math.Max(0, value)) / 100f; - NotifyOfPropertyChange(nameof(Offset)); - NotifyOfPropertyChange(nameof(OffsetPercent)); - NotifyOfPropertyChange(nameof(OffsetFloat)); - } - } - - // Functionally similar to Offset Percent, but doesn't round on get in order to prevent inconsistencies (and is 0 to 1) - public float OffsetFloat - { - get => ColorStop.Position; - set - { - ColorStop.Position = Math.Min(1, Math.Max(0, value)); - NotifyOfPropertyChange(nameof(Offset)); - NotifyOfPropertyChange(nameof(OffsetPercent)); - NotifyOfPropertyChange(nameof(OffsetFloat)); - } - } - - public bool IsSelected - { - get => _isSelected; - set => SetAndNotify(ref _isSelected, value); - } - - public bool WillRemoveColorStop - { - get => _willRemoveColorStop; - set => SetAndNotify(ref _willRemoveColorStop, value); - } - - #region Movement - - public void StopMouseDown(object sender, MouseButtonEventArgs e) - { - e.Handled = true; - - ((IInputElement) sender).CaptureMouse(); - _gradientEditorViewModel.SelectColorStop(this); - } - - public void StopMouseUp(object sender, MouseButtonEventArgs e) - { - e.Handled = true; - - ((IInputElement) sender).ReleaseMouseCapture(); - if (WillRemoveColorStop) - _gradientEditorViewModel.RemoveColorStop(this); - } - - public void StopMouseMove(object sender, MouseEventArgs e) - { - e.Handled = true; - - if (!((IInputElement) sender).IsMouseCaptured) - return; - - Canvas? parent = VisualTreeUtilities.FindParent((DependencyObject) sender, null); - Point position = e.GetPosition(parent); - if (position.Y > 50) - { - WillRemoveColorStop = true; - return; - } - - WillRemoveColorStop = false; - - double minValue = 0.0; - double maxValue = _gradientEditorViewModel.PreviewWidth; - List stops = _gradientEditorViewModel.ColorGradient.ToList(); - ColorGradientStop? previous = stops.IndexOf(ColorStop) >= 1 ? stops[stops.IndexOf(ColorStop) - 1] : null; - ColorGradientStop? next = stops.IndexOf(ColorStop) + 1 < stops.Count ? stops[stops.IndexOf(ColorStop) + 1] : null; - if (previous != null) - minValue = previous.Position * _gradientEditorViewModel.PreviewWidth; - if (next != null) - maxValue = next.Position * _gradientEditorViewModel.PreviewWidth; - - Offset = Math.Max(minValue, Math.Min(maxValue, position.X)); - } - - #endregion - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Screens/GradientEditor/GradientEditorView.xaml b/src/Artemis.UI.Shared/Screens/GradientEditor/GradientEditorView.xaml deleted file mode 100644 index ee74e5784..000000000 --- a/src/Artemis.UI.Shared/Screens/GradientEditor/GradientEditorView.xaml +++ /dev/null @@ -1,219 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gradient saving not implemented yet - - - Soon you'll be able to store different gradients for usage throughout your profiles and quickly select them - - - - - - Gradient - - - - - - - - - - Clear Gradient? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Selected stop: - - - - - - - - - - - - - - - - - - - - -