diff --git a/src/Artemis.Benchmarking/Artemis.Benchmarking.csproj b/src/Artemis.Benchmarking/Artemis.Benchmarking.csproj
new file mode 100644
index 000000000..991772870
--- /dev/null
+++ b/src/Artemis.Benchmarking/Artemis.Benchmarking.csproj
@@ -0,0 +1,18 @@
+
+
+
+ Exe
+ net6.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Artemis.Benchmarking/NumericConversion.cs b/src/Artemis.Benchmarking/NumericConversion.cs
new file mode 100644
index 000000000..60ad9a013
--- /dev/null
+++ b/src/Artemis.Benchmarking/NumericConversion.cs
@@ -0,0 +1,40 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Artemis.Core;
+using BenchmarkDotNet.Attributes;
+
+namespace Artemis.Benchmarking
+{
+ public class NumericConversion
+ {
+ private readonly float _float;
+ private readonly Numeric _numeric;
+
+ public NumericConversion()
+ {
+ _float = 255235235f;
+ _numeric = new Numeric(_float);
+ }
+
+ [Benchmark]
+ public void FloatToIntCast()
+ {
+ var integer = (int) _float;
+ }
+
+ [Benchmark]
+ public void NumericToIntCast()
+ {
+ var integer = (int) _numeric;
+ }
+
+ [Benchmark]
+ public void NumericToIntConvertTo()
+ {
+ var integer = Convert.ChangeType(_numeric, typeof(int));
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Artemis.Benchmarking/Program.cs b/src/Artemis.Benchmarking/Program.cs
new file mode 100644
index 000000000..67d6ed32f
--- /dev/null
+++ b/src/Artemis.Benchmarking/Program.cs
@@ -0,0 +1,3 @@
+using BenchmarkDotNet.Running;
+
+BenchmarkRunner.Run(typeof(Program).Assembly);
\ No newline at end of file
diff --git a/src/Artemis.Benchmarking/packages.lock.json b/src/Artemis.Benchmarking/packages.lock.json
new file mode 100644
index 000000000..3176875ef
--- /dev/null
+++ b/src/Artemis.Benchmarking/packages.lock.json
@@ -0,0 +1,1524 @@
+{
+ "version": 1,
+ "dependencies": {
+ "net6.0": {
+ "BenchmarkDotNet": {
+ "type": "Direct",
+ "requested": "[0.13.1, )",
+ "resolved": "0.13.1",
+ "contentHash": "LWR6kL3MWc4ByzSrqi6nccbO4UT5pySiB5h9L2LSHoqVdHySTbtLYYulz3atWhPyhtIQIMz6kQjvuBjFM03zkA==",
+ "dependencies": {
+ "BenchmarkDotNet.Annotations": "0.13.1",
+ "CommandLineParser": "2.4.3",
+ "Iced": "1.8.0",
+ "Microsoft.CodeAnalysis.CSharp": "2.10.0",
+ "Microsoft.Diagnostics.NETCore.Client": "0.2.61701",
+ "Microsoft.Diagnostics.Runtime": "1.1.126102",
+ "Microsoft.Diagnostics.Tracing.TraceEvent": "2.0.61",
+ "Microsoft.DotNet.PlatformAbstractions": "2.1.0",
+ "Microsoft.Win32.Registry": "4.5.0",
+ "Perfolizer": "0.2.1",
+ "System.Management": "4.5.0",
+ "System.Reflection.Emit": "4.3.0",
+ "System.Reflection.Emit.Lightweight": "4.3.0",
+ "System.Threading.Tasks.Extensions": "4.5.2",
+ "System.ValueTuple": "4.5.0"
+ }
+ },
+ "BenchmarkDotNet.Annotations": {
+ "type": "Transitive",
+ "resolved": "0.13.1",
+ "contentHash": "OvHMw/GYfdrrJAM28zOXQ94kdv1s0s92ZrbkH+/79I557ONPEH/urMF8iNKuYYgLsziC4isw233L3GKq6Twe/A=="
+ },
+ "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"
+ }
+ },
+ "CommandLineParser": {
+ "type": "Transitive",
+ "resolved": "2.4.3",
+ "contentHash": "U2FC9Y8NyIxxU6MpFFdWWu1xwiqz/61v/Doou7kmVjpeIEMLWyiNNkzNlSE84kyJ0O1LKApuEj5z48Ow0Hi4OQ=="
+ },
+ "EmbedIO": {
+ "type": "Transitive",
+ "resolved": "3.4.3",
+ "contentHash": "YM6hpZNAfvbbixfG9T4lWDGfF0D/TqutbTROL4ogVcHKwPF1hp+xS3ABwd3cxxTxvDFkj/zZl57QgWuFA8Igxw==",
+ "dependencies": {
+ "Unosquare.Swan.Lite": "3.0.0"
+ }
+ },
+ "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=="
+ },
+ "Iced": {
+ "type": "Transitive",
+ "resolved": "1.8.0",
+ "contentHash": "KQqoTZg3wf+eqG8ztGqlz9TozC/Dw/jnN82JkIRGZXTg/by0aPiQIMGb+b7hvvkOLnmCuWr3Ghr0mA2I+ASX1A=="
+ },
+ "LiteDB": {
+ "type": "Transitive",
+ "resolved": "5.0.11",
+ "contentHash": "6cL4bOmVCUB0gIK+6qIr68HeqjjHZicPDGQjvJ87mIOvkFsEsJWkIps3yoKNeLpHhJQur++yoQ9Q8gxsdos0xQ=="
+ },
+ "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"
+ }
+ },
+ "Microsoft.CodeAnalysis.Analyzers": {
+ "type": "Transitive",
+ "resolved": "2.6.1",
+ "contentHash": "VsT6gg2SPeToP8SK7PEcsH6Ftryb7aOqnXh9xg11zBeov05+63gP3k/TvrR+v85XIa8Nn0y3+qNl4M+qzNLBfw=="
+ },
+ "Microsoft.CodeAnalysis.Common": {
+ "type": "Transitive",
+ "resolved": "2.10.0",
+ "contentHash": "w57ebW3QIRFPoFFX6GCa6eF2FmuHYaWEJ/sMMHq+PBnHB51dEzLIoAQft1Byqe5nrSo4UUV6v4tad8fkTrKl8w==",
+ "dependencies": {
+ "Microsoft.CodeAnalysis.Analyzers": "2.6.1",
+ "System.AppContext": "4.3.0",
+ "System.Collections": "4.3.0",
+ "System.Collections.Concurrent": "4.3.0",
+ "System.Collections.Immutable": "1.5.0",
+ "System.Console": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Diagnostics.FileVersionInfo": "4.3.0",
+ "System.Diagnostics.StackTrace": "4.3.0",
+ "System.Diagnostics.Tools": "4.3.0",
+ "System.Dynamic.Runtime": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.IO.Compression": "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.Reflection": "4.3.0",
+ "System.Reflection.Metadata": "1.6.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.Runtime.Numerics": "4.3.0",
+ "System.Security.Cryptography.Algorithms": "4.3.0",
+ "System.Security.Cryptography.Encoding": "4.3.0",
+ "System.Security.Cryptography.X509Certificates": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Text.Encoding.CodePages": "4.3.0",
+ "System.Text.Encoding.Extensions": "4.3.0",
+ "System.Threading": "4.3.0",
+ "System.Threading.Tasks": "4.3.0",
+ "System.Threading.Tasks.Extensions": "4.3.0",
+ "System.Threading.Tasks.Parallel": "4.3.0",
+ "System.Threading.Thread": "4.3.0",
+ "System.ValueTuple": "4.3.0",
+ "System.Xml.ReaderWriter": "4.3.0",
+ "System.Xml.XDocument": "4.3.0",
+ "System.Xml.XPath.XDocument": "4.3.0",
+ "System.Xml.XmlDocument": "4.3.0"
+ }
+ },
+ "Microsoft.CodeAnalysis.CSharp": {
+ "type": "Transitive",
+ "resolved": "2.10.0",
+ "contentHash": "bTr6j4V7G4ZPhRDUdowdtbEvXsQA4w1TYfOtXiYdv8TF7STl9ShOKtlSVzAusmeEWsZksJm9D1VSxt6XIyNB0w==",
+ "dependencies": {
+ "Microsoft.CodeAnalysis.Common": "[2.10.0]"
+ }
+ },
+ "Microsoft.Diagnostics.NETCore.Client": {
+ "type": "Transitive",
+ "resolved": "0.2.61701",
+ "contentHash": "/whUqXLkTiUvG+vfSFd77DHHsLZW2HztZt+ACOpuvGyLKoGGN86M8cR1aYfRW6fxXF3SVGMKMswcL485SQEDuQ=="
+ },
+ "Microsoft.Diagnostics.Runtime": {
+ "type": "Transitive",
+ "resolved": "1.1.126102",
+ "contentHash": "2lyoyld8bd/zSq5HJPkyXVtsSdfS30qr75V96S4nEJ/nUiUp0WfGjxnTcZXBLCqzwE0DLUR0lUcNpMp0gEtuzA=="
+ },
+ "Microsoft.Diagnostics.Tracing.TraceEvent": {
+ "type": "Transitive",
+ "resolved": "2.0.61",
+ "contentHash": "czZJRJZEZbGyBauIXYfWIfVV6Nx88L55RARKmEb7ja+nmb1yI+LiROgnD1N0Fyh/RnzvUUD/J0YYMkAEBT1Z6w==",
+ "dependencies": {
+ "System.Runtime.CompilerServices.Unsafe": "4.5.2"
+ }
+ },
+ "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.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.Registry": {
+ "type": "Transitive",
+ "resolved": "4.5.0",
+ "contentHash": "+FWlwd//+Tt56316p00hVePBCouXyEzT86Jb3+AuRotTND0IYn0OO3obs1gnQEs/txEnt+rF2JBGLItTG+Be6A==",
+ "dependencies": {
+ "System.Security.AccessControl": "4.5.0",
+ "System.Security.Principal.Windows": "4.5.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"
+ }
+ },
+ "Perfolizer": {
+ "type": "Transitive",
+ "resolved": "0.2.1",
+ "contentHash": "Dt4aCxCT8NPtWBKA8k+FsN/RezOQ2C6omNGm5o/qmYRiIwlQYF93UgFmeF1ezVNsztTnkg7P5P63AE+uNkLfrw==",
+ "dependencies": {
+ "System.Memory": "4.5.3"
+ }
+ },
+ "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"
+ }
+ },
+ "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.NativeAssets.macOS": {
+ "type": "Transitive",
+ "resolved": "2.88.0-preview.178",
+ "contentHash": "+Hs3ku4buimzBHuc8FoyjOcE6eU5r98zcG7WH/s+doYQ1bFIjk+dKfqthgZ2o0NRAv8D3esq9rWrZTj12q+m1w=="
+ },
+ "SkiaSharp.NativeAssets.Win32": {
+ "type": "Transitive",
+ "resolved": "2.88.0-preview.178",
+ "contentHash": "9og9GCkdZc/NYrmbsRzohmIBRlS1oFegJiBMsoG93qYjhh2o6q5QBYxd61zw5Mgeytl3qj4YM+6BNIF4tcF+6w=="
+ },
+ "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.CodeDom": {
+ "type": "Transitive",
+ "resolved": "4.5.0",
+ "contentHash": "gqpR1EeXOuzNQWL7rOzmtdIz3CaXVjSQCiaGOs2ivjPwynKSJYm39X81fdlp7WuojZs/Z5t1k5ni7HtKQurhjw=="
+ },
+ "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.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.FileVersionInfo": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "omCF64wzQ3Q2CeIqkD6lmmxeMZtGHUmzgFMPjfVaOsyqpR66p/JaZzManMw1s33osoAb5gqpncsjie67+yUPHQ==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.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.Reflection.Metadata": "1.4.1",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0"
+ }
+ },
+ "System.Diagnostics.StackTrace": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "BiHg0vgtd35/DM9jvtaC1eKRpWZxr0gcQd643ABG7GnvSlf5pOkY2uyd42mMOJoOmKvnpNj0F4tuoS1pacTwYw==",
+ "dependencies": {
+ "System.IO.FileSystem": "4.3.0",
+ "System.Reflection": "4.3.0",
+ "System.Reflection.Metadata": "1.4.1",
+ "System.Runtime": "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.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.Management": {
+ "type": "Transitive",
+ "resolved": "4.5.0",
+ "contentHash": "Z6ac0qPGr3yJtwZEX1SRkhwWa0Kf5NJxx7smLboYsGrApQFECNFdqhGy252T4lrZ5Nwzhd9VQiaifndR3bfHdg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "2.0.0",
+ "Microsoft.Win32.Registry": "4.5.0",
+ "System.CodeDom": "4.5.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.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.3.0",
+ "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==",
+ "dependencies": {
+ "System.IO": "4.3.0",
+ "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.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.5.2",
+ "contentHash": "wprSFgext8cwqymChhrBLu62LMg/1u92bU+VOwyfBimSPVFXtsNqEWC92Pf9ofzJFlk4IHmJA75EDJn1b2goAQ=="
+ },
+ "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.3.0",
+ "contentHash": "IRiEFUa5b/Gs5Egg8oqBVoywhtOeaO2KOx3j0RfcYY/raxqBuEK7NXRDgOwtYM8qbi+7S4RPXUbNt+ZxyY0/NQ==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "System.Collections": "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.Runtime.Handles": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Threading": "4.3.0"
+ }
+ },
+ "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.2",
+ "contentHash": "BG/TNxDFv0svAzx8OiMXDlsHfGw623BZ8tCXw4YLhDFDvDhNUEV58jKYMGRnkbJNm7c3JNNJDiN7JBMzxRBR2w=="
+ },
+ "System.Threading.Tasks.Parallel": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "cbjBNZHf/vQCfcdhzx7knsiygoCKgxL8mZOeocXZn5gWhCdzHIq6bYNKWX0LAJCWYP7bds4yBK8p06YkP0oa0g==",
+ "dependencies": {
+ "System.Collections.Concurrent": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Diagnostics.Tracing": "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.Threading.Thread": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==",
+ "dependencies": {
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "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"
+ }
+ },
+ "System.Xml.XPath": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "v1JQ5SETnQusqmS3RwStF7vwQ3L02imIzl++sewmt23VGygix04pEH+FCj1yWb+z4GDzKiljr1W7Wfvrx0YwgA==",
+ "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.Threading": "4.3.0",
+ "System.Xml.ReaderWriter": "4.3.0"
+ }
+ },
+ "System.Xml.XPath.XDocument": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "jw9oHHEIVW53mHY9PgrQa98Xo2IZ0ZjrpdOTmtvk+Rvg4tq7dydmxdNqUvJ5YwjDqhn75mBXWttWjiKhWP53LQ==",
+ "dependencies": {
+ "System.Diagnostics.Debug": "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.Threading": "4.3.0",
+ "System.Xml.ReaderWriter": "4.3.0",
+ "System.Xml.XDocument": "4.3.0",
+ "System.Xml.XPath": "4.3.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"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Artemis.Core/Models/Profile/Conditions/EventCondition.cs b/src/Artemis.Core/Models/Profile/Conditions/EventCondition.cs
index cd4d99794..ecf83c4d1 100644
--- a/src/Artemis.Core/Models/Profile/Conditions/EventCondition.cs
+++ b/src/Artemis.Core/Models/Profile/Conditions/EventCondition.cs
@@ -195,6 +195,9 @@ namespace Artemis.Core
_entity.EventPath = EventPath?.Entity;
}
+ ///
+ public INodeScript NodeScript => Script;
+
///
public void LoadNodeScript()
{
diff --git a/src/Artemis.Core/Models/Profile/Conditions/ICondition.cs b/src/Artemis.Core/Models/Profile/Conditions/ICondition.cs
index e62d21617..2f4df80f7 100644
--- a/src/Artemis.Core/Models/Profile/Conditions/ICondition.cs
+++ b/src/Artemis.Core/Models/Profile/Conditions/ICondition.cs
@@ -1,51 +1,55 @@
using System;
using Artemis.Storage.Entities.Profile.Abstract;
-namespace Artemis.Core
+namespace Artemis.Core;
+
+///
+/// Represents a condition applied to a
+///
+public interface ICondition : IDisposable, IStorageModel
{
///
- /// Represents a condition applied to a
+ /// Gets the entity used to store this condition
///
- public interface ICondition : IDisposable, IStorageModel
- {
- ///
- /// Gets the entity used to store this condition
- ///
- public IConditionEntity Entity { get; }
-
- ///
- /// Gets the profile element this condition applies to
- ///
- public ProfileElement ProfileElement { get; }
-
- ///
- /// Gets a boolean indicating whether the condition is currently met
- ///
-
- bool IsMet { get; }
-
- ///
- /// Updates the condition
- ///
- void Update();
-
- ///
- /// Applies the display condition to the provided timeline
- ///
- ///
- ///
- /// The timeline to apply the display condition to
- void ApplyToTimeline(bool isMet, bool wasMet, Timeline timeline);
- }
+ public IConditionEntity Entity { get; }
///
- /// Represents a condition applied to a using a
+ /// Gets the profile element this condition applies to
///
- public interface INodeScriptCondition : ICondition
- {
- ///
- /// Loads the node script this node script condition uses
- ///
- void LoadNodeScript();
- }
+ public ProfileElement ProfileElement { get; }
+
+ ///
+ /// Gets a boolean indicating whether the condition is currently met
+ ///
+
+ bool IsMet { get; }
+
+ ///
+ /// Updates the condition
+ ///
+ void Update();
+
+ ///
+ /// Applies the display condition to the provided timeline
+ ///
+ ///
+ ///
+ /// The timeline to apply the display condition to
+ void ApplyToTimeline(bool isMet, bool wasMet, Timeline timeline);
+}
+
+///
+/// Represents a condition applied to a using a
+///
+public interface INodeScriptCondition : ICondition
+{
+ ///
+ /// Gets the node script of this node script condition
+ ///
+ INodeScript? NodeScript { get; }
+
+ ///
+ /// Loads the node script this node script condition uses
+ ///
+ void LoadNodeScript();
}
\ No newline at end of file
diff --git a/src/Artemis.Core/Models/Profile/Conditions/StaticCondition.cs b/src/Artemis.Core/Models/Profile/Conditions/StaticCondition.cs
index 2419d1387..028745bef 100644
--- a/src/Artemis.Core/Models/Profile/Conditions/StaticCondition.cs
+++ b/src/Artemis.Core/Models/Profile/Conditions/StaticCondition.cs
@@ -91,6 +91,9 @@ namespace Artemis.Core
_entity.Script = Script.Entity;
}
+ ///
+ public INodeScript? NodeScript => Script;
+
///
public void LoadNodeScript()
{
diff --git a/src/Artemis.Core/Models/Profile/DataBindings/DataBinding.cs b/src/Artemis.Core/Models/Profile/DataBindings/DataBinding.cs
index daeb72650..b94b2a125 100644
--- a/src/Artemis.Core/Models/Profile/DataBindings/DataBinding.cs
+++ b/src/Artemis.Core/Models/Profile/DataBindings/DataBinding.cs
@@ -39,10 +39,8 @@ namespace Artemis.Core
/// Gets the layer property this data binding targets
///
public LayerProperty LayerProperty { get; }
-
- ///
- /// Gets the script used to populate the data binding
- ///
+
+ ///
public INodeScript Script => _script;
///
@@ -126,7 +124,7 @@ namespace Artemis.Core
}
///
- /// Invokes the event
+ /// Invokes the event
///
protected virtual void OnDataBindingPropertiesCleared()
{
diff --git a/src/Artemis.Core/Models/Profile/DataBindings/DataBindingProperty.cs b/src/Artemis.Core/Models/Profile/DataBindings/DataBindingProperty.cs
index 6c67300a2..7c09381fd 100644
--- a/src/Artemis.Core/Models/Profile/DataBindings/DataBindingProperty.cs
+++ b/src/Artemis.Core/Models/Profile/DataBindings/DataBindingProperty.cs
@@ -11,7 +11,7 @@ namespace Artemis.Core
Setter = setter ?? throw new ArgumentNullException(nameof(setter));
DisplayName = displayName ?? throw new ArgumentNullException(nameof(displayName));
}
-
+
///
/// Gets the function to call to get the value of the property
///
@@ -37,10 +37,27 @@ namespace Artemis.Core
///
public void SetValue(object? value)
{
- if (value is TProperty match)
- Setter(match);
- else
- throw new ArgumentException("Value must match the type of the data binding registration", nameof(value));
+ // Numeric has a bunch of conversion, this seems the cheapest way to use them :)
+ switch (value)
+ {
+ case TProperty match:
+ Setter(match);
+ break;
+ case Numeric numeric when Setter is Action floatSetter:
+ floatSetter(numeric);
+ break;
+ case Numeric numeric when Setter is Action intSetter:
+ intSetter(numeric);
+ break;
+ case Numeric numeric when Setter is Action doubleSetter:
+ doubleSetter(numeric);
+ break;
+ case Numeric numeric when Setter is Action byteSetter:
+ byteSetter(numeric);
+ break;
+ default:
+ throw new ArgumentException("Value must match the type of the data binding registration", nameof(value));
+ }
}
}
}
\ No newline at end of file
diff --git a/src/Artemis.Core/Models/Profile/DataBindings/IDataBinding.cs b/src/Artemis.Core/Models/Profile/DataBindings/IDataBinding.cs
index e706a3701..8c56aa298 100644
--- a/src/Artemis.Core/Models/Profile/DataBindings/IDataBinding.cs
+++ b/src/Artemis.Core/Models/Profile/DataBindings/IDataBinding.cs
@@ -15,6 +15,11 @@ namespace Artemis.Core
///
ILayerProperty BaseLayerProperty { get; }
+ ///
+ /// Gets the script used to populate the data binding
+ ///
+ INodeScript Script { get; }
+
///
/// Gets a list of sub-properties this data binding applies to
///
diff --git a/src/Artemis.Core/Models/Profile/RenderProfileElement.cs b/src/Artemis.Core/Models/Profile/RenderProfileElement.cs
index 3c7322f97..619f10fba 100644
--- a/src/Artemis.Core/Models/Profile/RenderProfileElement.cs
+++ b/src/Artemis.Core/Models/Profile/RenderProfileElement.cs
@@ -363,7 +363,7 @@ namespace Artemis.Core
private bool _displayConditionMet;
///
- /// Gets the display condition used to determine whether this element is active or not
+ /// Gets or sets the display condition used to determine whether this element is active or not
///
public ICondition? DisplayCondition
{
diff --git a/src/Artemis.Core/VisualScripting/Internal/DataBindingExitNode.cs b/src/Artemis.Core/VisualScripting/Internal/DataBindingExitNode.cs
index fc237d402..224e61e0f 100644
--- a/src/Artemis.Core/VisualScripting/Internal/DataBindingExitNode.cs
+++ b/src/Artemis.Core/VisualScripting/Internal/DataBindingExitNode.cs
@@ -28,11 +28,11 @@ namespace Artemis.Core.Internal
{
if (inputPin.ConnectedTo.Any())
_propertyValues[property] = inputPin.Value!;
- else
+ else
_propertyValues.Remove(property);
}
}
-
+
public void ApplyToDataBinding()
{
foreach (var (property, pendingValue) in _propertyValues)
@@ -53,9 +53,14 @@ namespace Artemis.Core.Internal
ClearInputPins();
foreach (IDataBindingProperty property in DataBinding.Properties)
- _propertyPins.Add(property, CreateInputPin(property.ValueType, property.DisplayName));
+ {
+ _propertyPins.Add(property, Numeric.IsTypeCompatible(property.ValueType)
+ ? CreateInputPin(typeof(Numeric), property.DisplayName)
+ : CreateInputPin(property.ValueType, property.DisplayName)
+ );
+ }
}
-
+
#region Event handlers
private void DataBindingOnDataBindingPropertyRegistered(object? sender, DataBindingEventArgs e)
@@ -67,7 +72,7 @@ namespace Artemis.Core.Internal
{
ClearInputPins();
}
-
+
#endregion
}
}
\ No newline at end of file
diff --git a/src/Artemis.UI.Linux/ApplicationStateManager.cs b/src/Artemis.UI.Linux/ApplicationStateManager.cs
index 681063b91..40edb358a 100644
--- a/src/Artemis.UI.Linux/ApplicationStateManager.cs
+++ b/src/Artemis.UI.Linux/ApplicationStateManager.cs
@@ -7,7 +7,7 @@ using System.Net.Http;
using System.Threading;
using Artemis.Core;
using Artemis.Core.Services;
-using Artemis.UI.Shared.Services.Interfaces;
+using Artemis.UI.Shared.Services;
using Avalonia;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Threading;
diff --git a/src/Artemis.UI.Shared/Controls/DataModelPicker/DataModelPicker.cs b/src/Artemis.UI.Shared/Controls/DataModelPicker/DataModelPicker.cs
index 644388738..520a54a12 100644
--- a/src/Artemis.UI.Shared/Controls/DataModelPicker/DataModelPicker.cs
+++ b/src/Artemis.UI.Shared/Controls/DataModelPicker/DataModelPicker.cs
@@ -8,7 +8,7 @@ using Artemis.Core.Modules;
using Artemis.UI.Shared.DataModelVisualization.Shared;
using Artemis.UI.Shared.Events;
using Artemis.UI.Shared.Extensions;
-using Artemis.UI.Shared.Services.Interfaces;
+using Artemis.UI.Shared.Services;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.Primitives;
diff --git a/src/Artemis.UI.Shared/DataModelVisualization/DataModelVisualizationRegistration.cs b/src/Artemis.UI.Shared/DataModelVisualization/DataModelVisualizationRegistration.cs
index e867a2995..b67b4fb26 100644
--- a/src/Artemis.UI.Shared/DataModelVisualization/DataModelVisualizationRegistration.cs
+++ b/src/Artemis.UI.Shared/DataModelVisualization/DataModelVisualizationRegistration.cs
@@ -2,7 +2,6 @@
using System.Collections.Generic;
using Artemis.Core;
using Artemis.UI.Shared.Services;
-using Artemis.UI.Shared.Services.Interfaces;
namespace Artemis.UI.Shared.DataModelVisualization
{
diff --git a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelEventViewModel.cs b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelEventViewModel.cs
index c6b3b1478..93a3382c7 100644
--- a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelEventViewModel.cs
+++ b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelEventViewModel.cs
@@ -3,7 +3,6 @@ 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.DataModelVisualization.Shared
diff --git a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListItemViewModel.cs b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListItemViewModel.cs
index 1697e164f..112dad4ed 100644
--- a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListItemViewModel.cs
+++ b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListItemViewModel.cs
@@ -1,6 +1,5 @@
using System;
using Artemis.UI.Shared.Services;
-using Artemis.UI.Shared.Services.Interfaces;
using ReactiveUI;
namespace Artemis.UI.Shared.DataModelVisualization.Shared
diff --git a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListViewModel.cs b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListViewModel.cs
index 9ec4838d9..8a66b042c 100644
--- a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListViewModel.cs
+++ b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListViewModel.cs
@@ -4,7 +4,6 @@ using System.Collections.ObjectModel;
using Artemis.Core;
using Artemis.Core.Modules;
using Artemis.UI.Shared.Services;
-using Artemis.UI.Shared.Services.Interfaces;
using ReactiveUI;
namespace Artemis.UI.Shared.DataModelVisualization.Shared
diff --git a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelPropertiesViewModel.cs b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelPropertiesViewModel.cs
index e162f0599..7cc7b4502 100644
--- a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelPropertiesViewModel.cs
+++ b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelPropertiesViewModel.cs
@@ -2,7 +2,6 @@
using Artemis.Core;
using Artemis.Core.Modules;
using Artemis.UI.Shared.Services;
-using Artemis.UI.Shared.Services.Interfaces;
using ReactiveUI;
namespace Artemis.UI.Shared.DataModelVisualization.Shared
diff --git a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelPropertyViewModel.cs b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelPropertyViewModel.cs
index f6215d7af..004ac7083 100644
--- a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelPropertyViewModel.cs
+++ b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelPropertyViewModel.cs
@@ -2,7 +2,6 @@
using Artemis.Core;
using Artemis.Core.Modules;
using Artemis.UI.Shared.Services;
-using Artemis.UI.Shared.Services.Interfaces;
using ReactiveUI;
namespace Artemis.UI.Shared.DataModelVisualization.Shared
diff --git a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelVisualizationViewModel.cs b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelVisualizationViewModel.cs
index 9a212bae1..941f2728c 100644
--- a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelVisualizationViewModel.cs
+++ b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelVisualizationViewModel.cs
@@ -6,7 +6,7 @@ using System.Reflection;
using System.Text;
using Artemis.Core;
using Artemis.Core.Modules;
-using Artemis.UI.Shared.Services.Interfaces;
+using Artemis.UI.Shared.Services;
using ReactiveUI;
namespace Artemis.UI.Shared.DataModelVisualization.Shared;
diff --git a/src/Artemis.UI.Shared/DefaultTypes/DataModel/Display/SKColorDataModelDisplayView.axaml b/src/Artemis.UI.Shared/DefaultTypes/DataModel/Display/SKColorDataModelDisplayView.axaml
new file mode 100644
index 000000000..21ecddbff
--- /dev/null
+++ b/src/Artemis.UI.Shared/DefaultTypes/DataModel/Display/SKColorDataModelDisplayView.axaml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Artemis.UI.Shared/DefaultTypes/DataModel/Display/SKColorDataModelDisplayView.axaml.cs b/src/Artemis.UI.Shared/DefaultTypes/DataModel/Display/SKColorDataModelDisplayView.axaml.cs
new file mode 100644
index 000000000..09dd86420
--- /dev/null
+++ b/src/Artemis.UI.Shared/DefaultTypes/DataModel/Display/SKColorDataModelDisplayView.axaml.cs
@@ -0,0 +1,19 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Markup.Xaml;
+
+namespace Artemis.UI.Shared.DefaultTypes.DataModel.Display
+{
+ public partial class SKColorDataModelDisplayView : UserControl
+ {
+ public SKColorDataModelDisplayView()
+ {
+ InitializeComponent();
+ }
+
+ private void InitializeComponent()
+ {
+ AvaloniaXamlLoader.Load(this);
+ }
+ }
+}
diff --git a/src/Artemis.UI.Shared/DefaultTypes/DataModel/Display/SKColorDataModelDisplayViewModel.cs b/src/Artemis.UI.Shared/DefaultTypes/DataModel/Display/SKColorDataModelDisplayViewModel.cs
new file mode 100644
index 000000000..fa42bfd2e
--- /dev/null
+++ b/src/Artemis.UI.Shared/DefaultTypes/DataModel/Display/SKColorDataModelDisplayViewModel.cs
@@ -0,0 +1,11 @@
+using Artemis.UI.Shared.DataModelVisualization;
+using SkiaSharp;
+
+namespace Artemis.UI.Shared.DefaultTypes.DataModel.Display;
+
+///
+/// Represents a data model display view model used to display values.
+///
+public class SKColorDataModelDisplayViewModel : DataModelDisplayViewModel
+{
+}
\ 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 b3469aa43..e05e5d21b 100644
--- a/src/Artemis.UI.Shared/Ninject/SharedUIModule.cs
+++ b/src/Artemis.UI.Shared/Ninject/SharedUIModule.cs
@@ -1,5 +1,5 @@
using System;
-using Artemis.UI.Shared.Services.Interfaces;
+using Artemis.UI.Shared.Services;
using Ninject.Extensions.Conventions;
using Ninject.Modules;
diff --git a/src/Artemis.UI.Shared/Plugins/ScriptingProviders/ScriptEditorViewModel.cs b/src/Artemis.UI.Shared/Plugins/ScriptingProviders/ScriptEditorViewModel.cs
index 416d2614a..d40058b02 100644
--- a/src/Artemis.UI.Shared/Plugins/ScriptingProviders/ScriptEditorViewModel.cs
+++ b/src/Artemis.UI.Shared/Plugins/ScriptingProviders/ScriptEditorViewModel.cs
@@ -1,5 +1,4 @@
using Artemis.Core.ScriptingProviders;
-using ReactiveUI;
namespace Artemis.UI.Shared.ScriptingProviders
{
diff --git a/src/Artemis.UI.Shared/Services/DataModelUIService.cs b/src/Artemis.UI.Shared/Services/DataModelUIService.cs
index e0136d83f..0279be692 100644
--- a/src/Artemis.UI.Shared/Services/DataModelUIService.cs
+++ b/src/Artemis.UI.Shared/Services/DataModelUIService.cs
@@ -8,7 +8,6 @@ using Artemis.Core.Services;
using Artemis.UI.Shared.DataModelVisualization;
using Artemis.UI.Shared.DataModelVisualization.Shared;
using Artemis.UI.Shared.DefaultTypes.DataModel.Display;
-using Artemis.UI.Shared.Services.Interfaces;
using Ninject;
using Ninject.Parameters;
diff --git a/src/Artemis.UI.Shared/Services/GradientPickerService.cs b/src/Artemis.UI.Shared/Services/GradientPickerService.cs
index fd5836535..f5bf94942 100644
--- a/src/Artemis.UI.Shared/Services/GradientPickerService.cs
+++ b/src/Artemis.UI.Shared/Services/GradientPickerService.cs
@@ -1,6 +1,4 @@
-using Artemis.UI.Shared.Services.Interfaces;
-
-namespace Artemis.UI.Shared.Services;
+namespace Artemis.UI.Shared.Services;
public class GradientPickerService : IGradientPickerService
{
diff --git a/src/Artemis.UI.Shared/Services/Interfaces/IArtemisSharedUIService.cs b/src/Artemis.UI.Shared/Services/Interfaces/IArtemisSharedUIService.cs
index 77567167f..6a0c8df38 100644
--- a/src/Artemis.UI.Shared/Services/Interfaces/IArtemisSharedUIService.cs
+++ b/src/Artemis.UI.Shared/Services/Interfaces/IArtemisSharedUIService.cs
@@ -1,4 +1,4 @@
-namespace Artemis.UI.Shared.Services.Interfaces
+namespace Artemis.UI.Shared.Services
{
///
/// Represents a service provided by the Artemis Shared UI library
diff --git a/src/Artemis.UI.Shared/Services/Interfaces/IDataModelUIService.cs b/src/Artemis.UI.Shared/Services/Interfaces/IDataModelUIService.cs
index 57e9b6214..01c47d840 100644
--- a/src/Artemis.UI.Shared/Services/Interfaces/IDataModelUIService.cs
+++ b/src/Artemis.UI.Shared/Services/Interfaces/IDataModelUIService.cs
@@ -5,7 +5,7 @@ using Artemis.Core.Modules;
using Artemis.UI.Shared.DataModelVisualization;
using Artemis.UI.Shared.DataModelVisualization.Shared;
-namespace Artemis.UI.Shared.Services.Interfaces
+namespace Artemis.UI.Shared.Services
{
///
/// A service for UI related data model tasks
diff --git a/src/Artemis.UI.Shared/Services/Interfaces/INotificationService.cs b/src/Artemis.UI.Shared/Services/Interfaces/INotificationService.cs
index 3ad5418dd..999c5df52 100644
--- a/src/Artemis.UI.Shared/Services/Interfaces/INotificationService.cs
+++ b/src/Artemis.UI.Shared/Services/Interfaces/INotificationService.cs
@@ -1,6 +1,6 @@
using Artemis.UI.Shared.Services.Builders;
-namespace Artemis.UI.Shared.Services.Interfaces
+namespace Artemis.UI.Shared.Services
{
///
/// A service that can be used to create notifications in either the application or on the desktop.
diff --git a/src/Artemis.UI.Shared/Services/Interfaces/IWindowService.cs b/src/Artemis.UI.Shared/Services/Interfaces/IWindowService.cs
index 97af484ee..06efe5882 100644
--- a/src/Artemis.UI.Shared/Services/Interfaces/IWindowService.cs
+++ b/src/Artemis.UI.Shared/Services/Interfaces/IWindowService.cs
@@ -3,7 +3,7 @@ using System.Threading.Tasks;
using Artemis.UI.Shared.Services.Builders;
using Avalonia.Controls;
-namespace Artemis.UI.Shared.Services.Interfaces
+namespace Artemis.UI.Shared.Services
{
///
/// A service that can be used to show windows and dialogs.
diff --git a/src/Artemis.UI.Shared/Services/MainWindow/IMainWindowService.cs b/src/Artemis.UI.Shared/Services/MainWindow/IMainWindowService.cs
index 0ab536c14..d97fd7bad 100644
--- a/src/Artemis.UI.Shared/Services/MainWindow/IMainWindowService.cs
+++ b/src/Artemis.UI.Shared/Services/MainWindow/IMainWindowService.cs
@@ -1,5 +1,4 @@
using System;
-using Artemis.UI.Shared.Services.Interfaces;
namespace Artemis.UI.Shared.Services.MainWindow
{
diff --git a/src/Artemis.UI.Shared/Services/NodeEditor/INodeEditorService.cs b/src/Artemis.UI.Shared/Services/NodeEditor/INodeEditorService.cs
index c3fdf4864..c75302de6 100644
--- a/src/Artemis.UI.Shared/Services/NodeEditor/INodeEditorService.cs
+++ b/src/Artemis.UI.Shared/Services/NodeEditor/INodeEditorService.cs
@@ -1,6 +1,5 @@
using System;
using Artemis.Core;
-using Artemis.UI.Shared.Services.Interfaces;
using Artemis.UI.Shared.Services.ProfileEditor;
namespace Artemis.UI.Shared.Services.NodeEditor;
diff --git a/src/Artemis.UI.Shared/Services/NodeEditor/NodeEditorService.cs b/src/Artemis.UI.Shared/Services/NodeEditor/NodeEditorService.cs
index 5f717b0e3..1cbf3e3e2 100644
--- a/src/Artemis.UI.Shared/Services/NodeEditor/NodeEditorService.cs
+++ b/src/Artemis.UI.Shared/Services/NodeEditor/NodeEditorService.cs
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using Artemis.Core;
-using Artemis.UI.Shared.Services.Interfaces;
using Artemis.UI.Shared.Services.NodeEditor.Commands;
namespace Artemis.UI.Shared.Services.NodeEditor;
diff --git a/src/Artemis.UI.Shared/Services/NotificationService.cs b/src/Artemis.UI.Shared/Services/NotificationService.cs
index ed9408593..6004a5e0e 100644
--- a/src/Artemis.UI.Shared/Services/NotificationService.cs
+++ b/src/Artemis.UI.Shared/Services/NotificationService.cs
@@ -1,5 +1,4 @@
using Artemis.UI.Shared.Services.Builders;
-using Artemis.UI.Shared.Services.Interfaces;
using Avalonia.Controls;
namespace Artemis.UI.Shared.Services
diff --git a/src/Artemis.UI.Shared/Services/ProfileEditor/Commands/ChangeConditionType.cs b/src/Artemis.UI.Shared/Services/ProfileEditor/Commands/ChangeConditionType.cs
new file mode 100644
index 000000000..e69a29f12
--- /dev/null
+++ b/src/Artemis.UI.Shared/Services/ProfileEditor/Commands/ChangeConditionType.cs
@@ -0,0 +1,53 @@
+using System;
+using Artemis.Core;
+
+namespace Artemis.UI.Shared.Services.ProfileEditor.Commands;
+
+///
+/// Represents a profile editor command that can be used to change the condition type of a profile element.
+///
+public class ChangeConditionType : IProfileEditorCommand, IDisposable
+{
+ private readonly RenderProfileElement _profileElement;
+ private readonly ICondition? _condition;
+ private readonly ICondition? _oldCondition;
+ private bool _executed;
+
+ ///
+ /// Creates a new instance of the class.
+ ///
+ /// The profile element whose condition type to change.
+ /// The new condition type.
+ public ChangeConditionType(RenderProfileElement profileElement, ICondition? condition)
+ {
+ _profileElement = profileElement;
+ _condition = condition;
+ _oldCondition = _profileElement.DisplayCondition;
+ }
+
+ ///
+ public string DisplayName => "Change element display condition type";
+
+ ///
+ public void Execute()
+ {
+ _profileElement.DisplayCondition = _condition;
+ _executed = true;
+ }
+
+ ///
+ public void Undo()
+ {
+ _profileElement.DisplayCondition = _oldCondition;
+ _executed = false;
+ }
+
+ ///
+ public void Dispose()
+ {
+ if (_executed)
+ _oldCondition?.Dispose();
+ else
+ _condition?.Dispose();
+ }
+}
\ No newline at end of file
diff --git a/src/Artemis.UI.Shared/Services/ProfileEditor/Commands/ChangeDataBindingEnabled.cs b/src/Artemis.UI.Shared/Services/ProfileEditor/Commands/ChangeDataBindingEnabled.cs
new file mode 100644
index 000000000..91bfdaabf
--- /dev/null
+++ b/src/Artemis.UI.Shared/Services/ProfileEditor/Commands/ChangeDataBindingEnabled.cs
@@ -0,0 +1,40 @@
+using Artemis.Core;
+
+namespace Artemis.UI.Shared.Services.ProfileEditor.Commands;
+
+///
+/// Represents a profile editor command that can be used to enable or disable data bindings on a layer property.
+///
+public class ChangeDataBindingEnabled : IProfileEditorCommand
+{
+ private readonly bool _enabled;
+ private readonly ILayerProperty _layerProperty;
+ private readonly bool _originalEnabled;
+
+ ///
+ /// Creates a new instance of the class.
+ ///
+ /// The layer property to enable or disable data bindings on.
+ /// Whether to enable or disable data bindings.
+ public ChangeDataBindingEnabled(ILayerProperty layerProperty, bool enabled)
+ {
+ _layerProperty = layerProperty;
+ _enabled = enabled;
+ _originalEnabled = _layerProperty.BaseDataBinding.IsEnabled;
+ }
+
+ ///
+ public string DisplayName => _enabled ? "Enable data binding" : "Disable data binding";
+
+ ///
+ public void Execute()
+ {
+ _layerProperty.BaseDataBinding.IsEnabled = _enabled;
+ }
+
+ ///
+ public void Undo()
+ {
+ _layerProperty.BaseDataBinding.IsEnabled = _originalEnabled;
+ }
+}
\ No newline at end of file
diff --git a/src/Artemis.UI.Shared/Services/ProfileEditor/IProfileEditorService.cs b/src/Artemis.UI.Shared/Services/ProfileEditor/IProfileEditorService.cs
index 7165d1800..4749d4bc3 100644
--- a/src/Artemis.UI.Shared/Services/ProfileEditor/IProfileEditorService.cs
+++ b/src/Artemis.UI.Shared/Services/ProfileEditor/IProfileEditorService.cs
@@ -2,7 +2,6 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Artemis.Core;
-using Artemis.UI.Shared.Services.Interfaces;
using DynamicData;
namespace Artemis.UI.Shared.Services.ProfileEditor;
@@ -22,6 +21,11 @@ public interface IProfileEditorService : IArtemisSharedUIService
///
IObservable ProfileElement { get; }
+ ///
+ /// Gets an observable of the currently selected layer property.
+ ///
+ IObservable LayerProperty { get; }
+
///
/// Gets an observable of the current editor history.
///
@@ -65,6 +69,12 @@ public interface IProfileEditorService : IArtemisSharedUIService
/// The profile element to select.
void ChangeCurrentProfileElement(RenderProfileElement? renderProfileElement);
+ ///
+ /// Change the selected layer property.
+ ///
+ /// The layer property to select.
+ void ChangeCurrentLayerProperty(ILayerProperty? layerProperty);
+
///
/// Changes the current profile preview playback time.
///
diff --git a/src/Artemis.UI.Shared/Services/ProfileEditor/ProfileEditorService.cs b/src/Artemis.UI.Shared/Services/ProfileEditor/ProfileEditorService.cs
index b5b8a61ef..a00c8b674 100644
--- a/src/Artemis.UI.Shared/Services/ProfileEditor/ProfileEditorService.cs
+++ b/src/Artemis.UI.Shared/Services/ProfileEditor/ProfileEditorService.cs
@@ -1,16 +1,13 @@
using System;
using System.Collections.Generic;
-using System.Diagnostics;
using System.Linq;
using System.Reactive.Linq;
using System.Reactive.Subjects;
using System.Threading.Tasks;
using Artemis.Core;
using Artemis.Core.Services;
-using Artemis.UI.Shared.Services.Interfaces;
using Artemis.UI.Shared.Services.ProfileEditor.Commands;
using DynamicData;
-using DynamicData.Binding;
using ReactiveUI;
using Serilog;
@@ -18,6 +15,7 @@ namespace Artemis.UI.Shared.Services.ProfileEditor;
internal class ProfileEditorService : IProfileEditorService
{
+ private readonly BehaviorSubject _layerPropertySubject = new(null);
private readonly ILogger _logger;
private readonly IModuleService _moduleService;
private readonly BehaviorSubject _pixelsPerSecondSubject = new(120);
@@ -41,6 +39,7 @@ internal class ProfileEditorService : IProfileEditorService
ProfileConfiguration = _profileConfigurationSubject.AsObservable();
ProfileElement = _profileElementSubject.AsObservable();
+ LayerProperty = _layerPropertySubject.AsObservable();
History = Observable.Defer(() => Observable.Return(GetHistory(_profileConfigurationSubject.Value))).Concat(ProfileConfiguration.Select(GetHistory));
Time = _timeSubject.AsObservable();
Playing = _playingSubject.AsObservable();
@@ -55,24 +54,15 @@ internal class ProfileEditorService : IProfileEditorService
// Disable all others if the changed one is selected and exclusive
if (changed.IsSelected && changed.IsExclusive)
- {
Tools.Edit(list =>
{
foreach (IToolViewModel toolViewModel in list.Where(t => t.IsExclusive && t != changed))
toolViewModel.IsSelected = false;
});
- }
});
}
public IObservable SuspendedEditing { get; }
- public IObservable ProfileConfiguration { get; }
- public IObservable ProfileElement { get; }
- public IObservable History { get; }
- public IObservable Time { get; }
- public IObservable Playing { get; }
- public IObservable PixelsPerSecond { get; }
- public SourceList Tools { get; }
private ProfileEditorHistory? GetHistory(ProfileConfiguration? profileConfiguration)
{
@@ -114,6 +104,15 @@ internal class ProfileEditorService : IProfileEditorService
}
}
+ public IObservable ProfileConfiguration { get; }
+ public IObservable ProfileElement { get; }
+ public IObservable LayerProperty { get; }
+ public IObservable History { get; }
+ public IObservable Time { get; }
+ public IObservable Playing { get; }
+ public IObservable PixelsPerSecond { get; }
+ public SourceList Tools { get; }
+
public IObservable> ConnectToKeyframes()
{
return _selectedKeyframes.Connect();
@@ -167,6 +166,13 @@ internal class ProfileEditorService : IProfileEditorService
{
_selectedKeyframes.Clear();
_profileElementSubject.OnNext(renderProfileElement);
+ ChangeCurrentLayerProperty(null);
+ }
+
+ ///
+ public void ChangeCurrentLayerProperty(ILayerProperty? layerProperty)
+ {
+ _layerPropertySubject.OnNext(layerProperty);
}
public void ChangeTime(TimeSpan time)
diff --git a/src/Artemis.UI.Shared/Services/PropertyInput/IPropertyInputService.cs b/src/Artemis.UI.Shared/Services/PropertyInput/IPropertyInputService.cs
index 74d6ae76a..fc965b2ed 100644
--- a/src/Artemis.UI.Shared/Services/PropertyInput/IPropertyInputService.cs
+++ b/src/Artemis.UI.Shared/Services/PropertyInput/IPropertyInputService.cs
@@ -1,7 +1,6 @@
using System;
using System.Collections.ObjectModel;
using Artemis.Core;
-using Artemis.UI.Shared.Services.Interfaces;
namespace Artemis.UI.Shared.Services.PropertyInput;
diff --git a/src/Artemis.UI.Shared/Services/Window/ExceptionDialogViewModel.cs b/src/Artemis.UI.Shared/Services/Window/ExceptionDialogViewModel.cs
index 7445077d8..73895cc6e 100644
--- a/src/Artemis.UI.Shared/Services/Window/ExceptionDialogViewModel.cs
+++ b/src/Artemis.UI.Shared/Services/Window/ExceptionDialogViewModel.cs
@@ -1,7 +1,6 @@
using System;
using System.Threading.Tasks;
using Artemis.UI.Shared.Services.Builders;
-using Artemis.UI.Shared.Services.Interfaces;
using Avalonia;
using Avalonia.Layout;
diff --git a/src/Artemis.UI.Shared/Services/Window/WindowService.cs b/src/Artemis.UI.Shared/Services/Window/WindowService.cs
index 7479b4b16..7621d84c0 100644
--- a/src/Artemis.UI.Shared/Services/Window/WindowService.cs
+++ b/src/Artemis.UI.Shared/Services/Window/WindowService.cs
@@ -2,7 +2,6 @@
using System.Linq;
using System.Threading.Tasks;
using Artemis.UI.Shared.Services.Builders;
-using Artemis.UI.Shared.Services.Interfaces;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.ApplicationLifetimes;
diff --git a/src/Artemis.UI.Shared/Styles/Button.axaml b/src/Artemis.UI.Shared/Styles/Button.axaml
index 51a728924..3fbe77b7b 100644
--- a/src/Artemis.UI.Shared/Styles/Button.axaml
+++ b/src/Artemis.UI.Shared/Styles/Button.axaml
@@ -39,6 +39,11 @@
+
+ ToggleButton.window-button
+
+
+
@@ -100,4 +105,28 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Artemis.UI.Shared/Styles/Controls/DataModelPickerButton.axaml b/src/Artemis.UI.Shared/Styles/Controls/DataModelPickerButton.axaml
index 5aa2e0c25..23e117502 100644
--- a/src/Artemis.UI.Shared/Styles/Controls/DataModelPickerButton.axaml
+++ b/src/Artemis.UI.Shared/Styles/Controls/DataModelPickerButton.axaml
@@ -32,6 +32,8 @@
BorderBrush="{TemplateBinding BorderBrush}"
VerticalAlignment="{TemplateBinding VerticalAlignment}"
HorizontalAlignment="{TemplateBinding HorizontalAlignment}"
+ Width="{TemplateBinding Width}"
+ Height="{TemplateBinding Height}"
HorizontalContentAlignment="Stretch">
GetObservable(this IDataBinding dataBinding)
+ {
+ return Observable.FromEventPattern(x => dataBinding.DataBindingEnabled += x, x => dataBinding.DataBindingEnabled -= x)
+ .Merge(Observable.FromEventPattern(x => dataBinding.DataBindingDisabled += x, x => dataBinding.DataBindingDisabled -= x))
+ .Select(e => e.EventArgs.DataBinding)
+ .StartWith(dataBinding);
+ }
+}
\ No newline at end of file
diff --git a/src/Artemis.UI/Ninject/Factories/IVMFactory.cs b/src/Artemis.UI/Ninject/Factories/IVMFactory.cs
index a5ce59884..d9af870e0 100644
--- a/src/Artemis.UI/Ninject/Factories/IVMFactory.cs
+++ b/src/Artemis.UI/Ninject/Factories/IVMFactory.cs
@@ -7,6 +7,7 @@ using Artemis.UI.Screens.Plugins;
using Artemis.UI.Screens.ProfileEditor;
using Artemis.UI.Screens.ProfileEditor.ProfileTree;
using Artemis.UI.Screens.ProfileEditor.Properties;
+using Artemis.UI.Screens.ProfileEditor.Properties.DataBinding;
using Artemis.UI.Screens.ProfileEditor.Properties.Timeline;
using Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Segments;
using Artemis.UI.Screens.ProfileEditor.Properties.Tree;
@@ -84,6 +85,11 @@ namespace Artemis.UI.Ninject.Factories
TimelineGroupViewModel TimelineGroupViewModel(PropertyGroupViewModel propertyGroupViewModel);
}
+ public interface IDataBindingVmFactory : IVmFactory
+ {
+ DataBindingViewModel DataBindingViewModel();
+ }
+
public interface IPropertyVmFactory
{
ITreePropertyViewModel TreePropertyViewModel(ILayerProperty layerProperty, PropertyViewModel propertyViewModel);
diff --git a/src/Artemis.UI/Screens/Debugger/Tabs/DataModel/DataModelDebugViewModel.cs b/src/Artemis.UI/Screens/Debugger/Tabs/DataModel/DataModelDebugViewModel.cs
index 874e5c75e..b64aaedc9 100644
--- a/src/Artemis.UI/Screens/Debugger/Tabs/DataModel/DataModelDebugViewModel.cs
+++ b/src/Artemis.UI/Screens/Debugger/Tabs/DataModel/DataModelDebugViewModel.cs
@@ -9,7 +9,7 @@ using Artemis.Core.Modules;
using Artemis.Core.Services;
using Artemis.UI.Shared;
using Artemis.UI.Shared.DataModelVisualization.Shared;
-using Artemis.UI.Shared.Services.Interfaces;
+using Artemis.UI.Shared.Services;
using Avalonia.Threading;
using DynamicData;
using ReactiveUI;
diff --git a/src/Artemis.UI/Screens/Device/DeviceDetectInputViewModel.cs b/src/Artemis.UI/Screens/Device/DeviceDetectInputViewModel.cs
index b08d51459..1eade3222 100644
--- a/src/Artemis.UI/Screens/Device/DeviceDetectInputViewModel.cs
+++ b/src/Artemis.UI/Screens/Device/DeviceDetectInputViewModel.cs
@@ -5,8 +5,8 @@ using System.Reactive.Linq;
using Artemis.Core;
using Artemis.Core.Services;
using Artemis.UI.Shared;
+using Artemis.UI.Shared.Services;
using Artemis.UI.Shared.Services.Builders;
-using Artemis.UI.Shared.Services.Interfaces;
using ReactiveUI;
using RGB.NET.Core;
diff --git a/src/Artemis.UI/Screens/Device/DeviceSettingsViewModel.cs b/src/Artemis.UI/Screens/Device/DeviceSettingsViewModel.cs
index 00d04d167..34d4c882c 100644
--- a/src/Artemis.UI/Screens/Device/DeviceSettingsViewModel.cs
+++ b/src/Artemis.UI/Screens/Device/DeviceSettingsViewModel.cs
@@ -5,7 +5,7 @@ using Artemis.Core.Services;
using Artemis.UI.Ninject.Factories;
using Artemis.UI.Screens.Settings;
using Artemis.UI.Shared;
-using Artemis.UI.Shared.Services.Interfaces;
+using Artemis.UI.Shared.Services;
using Avalonia.Threading;
using Humanizer;
using ReactiveUI;
diff --git a/src/Artemis.UI/Screens/Device/Tabs/DeviceInfoTabViewModel.cs b/src/Artemis.UI/Screens/Device/Tabs/DeviceInfoTabViewModel.cs
index f56517716..b5bdba7b5 100644
--- a/src/Artemis.UI/Screens/Device/Tabs/DeviceInfoTabViewModel.cs
+++ b/src/Artemis.UI/Screens/Device/Tabs/DeviceInfoTabViewModel.cs
@@ -1,7 +1,7 @@
using System.Threading.Tasks;
using Artemis.Core;
using Artemis.UI.Shared;
-using Artemis.UI.Shared.Services.Interfaces;
+using Artemis.UI.Shared.Services;
using Avalonia;
using RGB.NET.Core;
diff --git a/src/Artemis.UI/Screens/Device/Tabs/DevicePropertiesTabViewModel.cs b/src/Artemis.UI/Screens/Device/Tabs/DevicePropertiesTabViewModel.cs
index aefb65d4f..ceeb37852 100644
--- a/src/Artemis.UI/Screens/Device/Tabs/DevicePropertiesTabViewModel.cs
+++ b/src/Artemis.UI/Screens/Device/Tabs/DevicePropertiesTabViewModel.cs
@@ -6,8 +6,8 @@ using System.Threading.Tasks;
using Artemis.Core;
using Artemis.Core.Services;
using Artemis.UI.Shared;
+using Artemis.UI.Shared.Services;
using Artemis.UI.Shared.Services.Builders;
-using Artemis.UI.Shared.Services.Interfaces;
using ReactiveUI;
using SkiaSharp;
diff --git a/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesInstallDialogViewModel.cs b/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesInstallDialogViewModel.cs
index c5240786f..0d404ba1b 100644
--- a/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesInstallDialogViewModel.cs
+++ b/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesInstallDialogViewModel.cs
@@ -8,7 +8,7 @@ using System.Threading.Tasks;
using Artemis.Core;
using Artemis.UI.Ninject.Factories;
using Artemis.UI.Shared;
-using Artemis.UI.Shared.Services.Interfaces;
+using Artemis.UI.Shared.Services;
using ReactiveUI;
namespace Artemis.UI.Screens.Plugins
diff --git a/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesUninstallDialogViewModel.cs b/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesUninstallDialogViewModel.cs
index 16323dac4..43ee77a74 100644
--- a/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesUninstallDialogViewModel.cs
+++ b/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesUninstallDialogViewModel.cs
@@ -9,7 +9,7 @@ using Artemis.Core;
using Artemis.Core.Services;
using Artemis.UI.Ninject.Factories;
using Artemis.UI.Shared;
-using Artemis.UI.Shared.Services.Interfaces;
+using Artemis.UI.Shared.Services;
using ReactiveUI;
namespace Artemis.UI.Screens.Plugins
diff --git a/src/Artemis.UI/Screens/Plugins/PluginFeatureViewModel.cs b/src/Artemis.UI/Screens/Plugins/PluginFeatureViewModel.cs
index 4e5a72da3..4708b2ef9 100644
--- a/src/Artemis.UI/Screens/Plugins/PluginFeatureViewModel.cs
+++ b/src/Artemis.UI/Screens/Plugins/PluginFeatureViewModel.cs
@@ -6,8 +6,8 @@ using System.Threading.Tasks;
using Artemis.Core;
using Artemis.Core.Services;
using Artemis.UI.Shared;
+using Artemis.UI.Shared.Services;
using Artemis.UI.Shared.Services.Builders;
-using Artemis.UI.Shared.Services.Interfaces;
using Avalonia;
using Avalonia.Threading;
using ReactiveUI;
diff --git a/src/Artemis.UI/Screens/Plugins/PluginSettingsViewModel.cs b/src/Artemis.UI/Screens/Plugins/PluginSettingsViewModel.cs
index 6898bc122..f9fdaead6 100644
--- a/src/Artemis.UI/Screens/Plugins/PluginSettingsViewModel.cs
+++ b/src/Artemis.UI/Screens/Plugins/PluginSettingsViewModel.cs
@@ -11,7 +11,7 @@ using Artemis.Core.Services;
using Artemis.UI.Exceptions;
using Artemis.UI.Ninject.Factories;
using Artemis.UI.Shared;
-using Artemis.UI.Shared.Services.Interfaces;
+using Artemis.UI.Shared.Services;
using Avalonia.Threading;
using Ninject;
using ReactiveUI;
diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypeViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypeViewModel.cs
new file mode 100644
index 000000000..5faaf0773
--- /dev/null
+++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypeViewModel.cs
@@ -0,0 +1,19 @@
+using System;
+using Artemis.UI.Shared;
+
+namespace Artemis.UI.Screens.ProfileEditor.DisplayCondition
+{
+ public class ConditionTypeViewModel : ViewModelBase
+ {
+ public ConditionTypeViewModel(string name, string description, Type? conditionType)
+ {
+ Name = name;
+ Description = description;
+ ConditionType = conditionType;
+ }
+
+ public string Name { get; }
+ public string Description { get; }
+ public Type? ConditionType { get; }
+ }
+}
\ No newline at end of file
diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/DisplayConditionScriptView.axaml b/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/DisplayConditionScriptView.axaml
index 50fd86945..eb186053f 100644
--- a/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/DisplayConditionScriptView.axaml
+++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/DisplayConditionScriptView.axaml
@@ -4,28 +4,104 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:displayCondition="clr-namespace:Artemis.UI.Screens.ProfileEditor.DisplayCondition"
xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia"
- mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
+ xmlns:dataModelPicker="clr-namespace:Artemis.UI.Shared.Controls.DataModelPicker;assembly=Artemis.UI.Shared"
+ mc:Ignorable="d" d:DesignWidth="200" d:DesignHeight="650"
x:Class="Artemis.UI.Screens.ProfileEditor.DisplayCondition.DisplayConditionScriptView"
x:DataType="displayCondition:DisplayConditionScriptViewModel">
-
-
-
-
-
-
- Enable display conditions
-
-
-
+
+
\ No newline at end of file
diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/DisplayConditionScriptViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/DisplayConditionScriptViewModel.cs
index dc541873a..98d94ee2a 100644
--- a/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/DisplayConditionScriptViewModel.cs
+++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/DisplayConditionScriptViewModel.cs
@@ -1,11 +1,13 @@
using System;
+using System.Collections.ObjectModel;
+using System.Linq;
using System.Reactive.Linq;
using System.Threading.Tasks;
using Artemis.Core;
using Artemis.UI.Ninject.Factories;
using Artemis.UI.Screens.VisualScripting;
using Artemis.UI.Shared;
-using Artemis.UI.Shared.Services.Interfaces;
+using Artemis.UI.Shared.Services;
using Artemis.UI.Shared.Services.ProfileEditor;
using Artemis.UI.Shared.Services.ProfileEditor.Commands;
using Avalonia.Controls.Mixins;
@@ -16,40 +18,77 @@ namespace Artemis.UI.Screens.ProfileEditor.DisplayCondition;
public class DisplayConditionScriptViewModel : ActivatableViewModelBase
{
private readonly IProfileEditorService _profileEditorService;
+ private readonly ObservableAsPropertyHelper _showEventOptions;
+ private readonly ObservableAsPropertyHelper _showStaticOptions;
private readonly IWindowService _windowService;
private ObservableAsPropertyHelper? _nodeScriptViewModel;
private RenderProfileElement? _profileElement;
+ private ObservableAsPropertyHelper? _selectedConditionTypeViewModel;
public DisplayConditionScriptViewModel(IProfileEditorService profileEditorService, INodeVmFactory nodeVmFactory, IWindowService windowService)
{
_profileEditorService = profileEditorService;
_windowService = windowService;
+
+ ConditionTypeViewModels = new ObservableCollection
+ {
+ new("None", "The element is always active.", null),
+ new("Regular", "The element is activated when the provided visual script ends in true.", typeof(StaticCondition)),
+ new("Event", "The element is activated when the selected event fires.\r\n" +
+ "Events that contain data can conditionally trigger the layer using a visual script.", typeof(EventCondition))
+ };
+
this.WhenActivated(d =>
{
profileEditorService.ProfileElement.Subscribe(p => _profileElement = p).DisposeWith(d);
+
_nodeScriptViewModel = profileEditorService.ProfileElement
.Select(p => p?.WhenAnyValue(element => element.DisplayCondition) ?? Observable.Never())
.Switch()
- .Select(c => c is StaticCondition staticCondition ? nodeVmFactory.NodeScriptViewModel(staticCondition.Script, true) : null)
+ .Select(c => c is INodeScriptCondition {NodeScript: NodeScript nodeScript} ? nodeVmFactory.NodeScriptViewModel(nodeScript, true) : null)
.ToProperty(this, vm => vm.NodeScriptViewModel)
.DisposeWith(d);
+ _selectedConditionTypeViewModel = profileEditorService.ProfileElement
+ .Select(p => p?.WhenAnyValue(element => element.DisplayCondition) ?? Observable.Never())
+ .Switch()
+ .Select(c => c != null ? ConditionTypeViewModels.FirstOrDefault(vm => vm.ConditionType == c.GetType()) : null)
+ .ToProperty(this, vm => vm.SelectedConditionTypeViewModel)
+ .DisposeWith(d);
});
+
+ _showStaticOptions = this.WhenAnyValue(vm => vm.SelectedConditionTypeViewModel)
+ .Select(c => c != null && c.ConditionType == typeof(StaticCondition))
+ .ToProperty(this, vm => vm.ShowStaticOptions);
+ _showEventOptions = this.WhenAnyValue(vm => vm.SelectedConditionTypeViewModel)
+ .Select(c => c != null && c.ConditionType == typeof(EventCondition))
+ .ToProperty(this, vm => vm.ShowEventOptions);
}
public NodeScriptViewModel? NodeScriptViewModel => _nodeScriptViewModel?.Value;
+ public ObservableCollection ConditionTypeViewModels { get; }
- public async Task EnableConditions()
+ public ConditionTypeViewModel? SelectedConditionTypeViewModel
{
- bool confirmed = await _windowService.ShowConfirmContentDialog(
- "Display conditions",
- "Do you want to enable display conditions for this element? \r\n" +
- "Using display conditions you can dynamically hide or show layers and folders depending on certain parameters."
- );
+ get => _selectedConditionTypeViewModel?.Value;
+ set
+ {
+ if (_profileElement == null)
+ return;
- if (confirmed && _profileElement != null)
- _profileEditorService.ExecuteCommand(new ChangeElementDisplayCondition(_profileElement, new StaticCondition(_profileElement)));
+ ICondition? condition = null;
+ if (value?.ConditionType == typeof(StaticCondition))
+ condition = new StaticCondition(_profileElement);
+ else if (value?.ConditionType == typeof(EventCondition))
+ condition = new EventCondition(_profileElement);
+
+ _profileEditorService.ExecuteCommand(new ChangeConditionType(_profileElement, condition));
+ }
}
+ public bool ShowStaticOptions => _showStaticOptions.Value;
+ public bool ShowEventOptions => _showEventOptions.Value;
+
+
public async Task OpenEditor()
{
if (_profileElement?.DisplayCondition is StaticCondition staticCondition)
diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/FolderTreeItemViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/FolderTreeItemViewModel.cs
index e8e3f3558..18afa7d46 100644
--- a/src/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/FolderTreeItemViewModel.cs
+++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/FolderTreeItemViewModel.cs
@@ -1,7 +1,7 @@
using Artemis.Core;
using Artemis.Core.Services;
using Artemis.UI.Ninject.Factories;
-using Artemis.UI.Shared.Services.Interfaces;
+using Artemis.UI.Shared.Services;
using Artemis.UI.Shared.Services.ProfileEditor;
namespace Artemis.UI.Screens.ProfileEditor.ProfileTree
diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/LayerTreeItemViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/LayerTreeItemViewModel.cs
index 918339c72..343ce47df 100644
--- a/src/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/LayerTreeItemViewModel.cs
+++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/LayerTreeItemViewModel.cs
@@ -1,7 +1,7 @@
using Artemis.Core;
using Artemis.Core.Services;
using Artemis.UI.Ninject.Factories;
-using Artemis.UI.Shared.Services.Interfaces;
+using Artemis.UI.Shared.Services;
using Artemis.UI.Shared.Services.ProfileEditor;
namespace Artemis.UI.Screens.ProfileEditor.ProfileTree
diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/ProfileTreeViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/ProfileTreeViewModel.cs
index 0326d7775..fc19a05ed 100644
--- a/src/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/ProfileTreeViewModel.cs
+++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/ProfileTreeViewModel.cs
@@ -6,7 +6,7 @@ using System.Reactive.Disposables;
using Artemis.Core;
using Artemis.Core.Services;
using Artemis.UI.Ninject.Factories;
-using Artemis.UI.Shared.Services.Interfaces;
+using Artemis.UI.Shared.Services;
using Artemis.UI.Shared.Services.ProfileEditor;
using ReactiveUI;
diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/TreeItemViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/TreeItemViewModel.cs
index e4ae36067..31913585c 100644
--- a/src/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/TreeItemViewModel.cs
+++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/TreeItemViewModel.cs
@@ -10,7 +10,7 @@ using Artemis.Core;
using Artemis.Core.Services;
using Artemis.UI.Ninject.Factories;
using Artemis.UI.Shared;
-using Artemis.UI.Shared.Services.Interfaces;
+using Artemis.UI.Shared.Services;
using Artemis.UI.Shared.Services.ProfileEditor;
using Artemis.UI.Shared.Services.ProfileEditor.Commands;
using ReactiveUI;
diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/DataBinding/DataBindingView.axaml b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/DataBinding/DataBindingView.axaml
new file mode 100644
index 000000000..aaa28b4f8
--- /dev/null
+++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/DataBinding/DataBindingView.axaml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ To use data bindings enable them in with the toggle above.
+
+ When you enable data bindings you can no longer use keyframes or normal values for this property.
+
+
+ Learn more
+
+
+
+
\ No newline at end of file
diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/DataBinding/DataBindingView.axaml.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/DataBinding/DataBindingView.axaml.cs
new file mode 100644
index 000000000..a3d257b4b
--- /dev/null
+++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/DataBinding/DataBindingView.axaml.cs
@@ -0,0 +1,18 @@
+using Avalonia.Markup.Xaml;
+using Avalonia.ReactiveUI;
+
+namespace Artemis.UI.Screens.ProfileEditor.Properties.DataBinding
+{
+ public partial class DataBindingView : ReactiveUserControl
+ {
+ public DataBindingView()
+ {
+ InitializeComponent();
+ }
+
+ private void InitializeComponent()
+ {
+ AvaloniaXamlLoader.Load(this);
+ }
+ }
+}
diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/DataBinding/DataBindingViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/DataBinding/DataBindingViewModel.cs
new file mode 100644
index 000000000..17bacc216
--- /dev/null
+++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/DataBinding/DataBindingViewModel.cs
@@ -0,0 +1,65 @@
+using System.Reactive.Linq;
+using System.Threading.Tasks;
+using Artemis.Core;
+using Artemis.UI.Extensions;
+using Artemis.UI.Ninject.Factories;
+using Artemis.UI.Screens.VisualScripting;
+using Artemis.UI.Shared;
+using Artemis.UI.Shared.Services;
+using Artemis.UI.Shared.Services.ProfileEditor;
+using Artemis.UI.Shared.Services.ProfileEditor.Commands;
+using Avalonia.Controls.Mixins;
+using ReactiveUI;
+
+namespace Artemis.UI.Screens.ProfileEditor.Properties.DataBinding;
+
+public class DataBindingViewModel : ActivatableViewModelBase
+{
+ private readonly IProfileEditorService _profileEditorService;
+ private readonly IWindowService _windowService;
+ private ObservableAsPropertyHelper? _dataBindingEnabled;
+ private ObservableAsPropertyHelper? _layerProperty;
+ private ObservableAsPropertyHelper? _nodeScriptViewModel;
+
+ public DataBindingViewModel(IProfileEditorService profileEditorService, INodeVmFactory nodeVmFactory, IWindowService windowService)
+ {
+ _profileEditorService = profileEditorService;
+ _windowService = windowService;
+
+ this.WhenActivated(d =>
+ {
+ _layerProperty = profileEditorService.LayerProperty.ToProperty(this, vm => vm.LayerProperty).DisposeWith(d);
+ _nodeScriptViewModel = profileEditorService.LayerProperty
+ .Select(p => p != null ? p.BaseDataBinding.GetObservable() : Observable.Never())
+ .Switch()
+ .Select(b => b.IsEnabled ? nodeVmFactory.NodeScriptViewModel((NodeScript) b.Script, false) : null)
+ .ToProperty(this, vm => vm.NodeScriptViewModel)
+ .DisposeWith(d);
+ _dataBindingEnabled = profileEditorService.LayerProperty
+ .Select(p => p != null ? p.BaseDataBinding.GetObservable() : Observable.Never())
+ .Switch()
+ .Select(b => b.IsEnabled)
+ .ToProperty(this, vm => vm.DataBindingEnabled)
+ .DisposeWith(d);
+ });
+ }
+
+ public ILayerProperty? LayerProperty => _layerProperty?.Value;
+ public NodeScriptViewModel? NodeScriptViewModel => _nodeScriptViewModel?.Value;
+
+ public bool DataBindingEnabled
+ {
+ get => _dataBindingEnabled?.Value ?? false;
+ set
+ {
+ if (LayerProperty != null)
+ _profileEditorService.ExecuteCommand(new ChangeDataBindingEnabled(LayerProperty, value));
+ }
+ }
+
+ public async Task OpenEditor()
+ {
+ if (LayerProperty != null && LayerProperty.BaseDataBinding.IsEnabled)
+ await _windowService.ShowDialogAsync(("nodeScript", LayerProperty.BaseDataBinding.Script));
+ }
+}
\ No newline at end of file
diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/PropertiesView.axaml b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/PropertiesView.axaml
index 1e2461687..8a7c99512 100644
--- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/PropertiesView.axaml
+++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/PropertiesView.axaml
@@ -44,8 +44,15 @@
Background="Transparent"
Margin="0 0 -5 0" />
-
-
+
+
+
+
-
-
-
-
\ No newline at end of file
diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/PropertiesViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/PropertiesViewModel.cs
index e2006f865..75f8b494d 100644
--- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/PropertiesViewModel.cs
+++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/PropertiesViewModel.cs
@@ -11,6 +11,7 @@ using Artemis.Core.LayerEffects;
using Artemis.Core.Services;
using Artemis.UI.Ninject.Factories;
using Artemis.UI.Screens.ProfileEditor.Playback;
+using Artemis.UI.Screens.ProfileEditor.Properties.DataBinding;
using Artemis.UI.Screens.ProfileEditor.Properties.Timeline;
using Artemis.UI.Shared;
using Artemis.UI.Shared.Services.ProfileEditor;
@@ -20,67 +21,85 @@ namespace Artemis.UI.Screens.ProfileEditor.Properties;
public class PropertiesViewModel : ActivatableViewModelBase
{
- private readonly Dictionary _cachedViewModels;
+ private readonly Dictionary _cachedPropertyViewModels;
+ private readonly IDataBindingVmFactory _dataBindingVmFactory;
private readonly ILayerPropertyVmFactory _layerPropertyVmFactory;
private readonly IProfileEditorService _profileEditorService;
private readonly ISettingsService _settingsService;
+ private DataBindingViewModel? _backgroundDataBindingViewModel;
+ private DataBindingViewModel? _dataBindingViewModel;
+ private ObservableAsPropertyHelper? _layerProperty;
private ObservableAsPropertyHelper? _pixelsPerSecond;
private ObservableAsPropertyHelper? _profileElement;
///
- public PropertiesViewModel(IProfileEditorService profileEditorService, ISettingsService settingsService, ILayerPropertyVmFactory layerPropertyVmFactory, PlaybackViewModel playbackViewModel)
+ public PropertiesViewModel(IProfileEditorService profileEditorService,
+ ISettingsService settingsService,
+ ILayerPropertyVmFactory layerPropertyVmFactory,
+ IDataBindingVmFactory dataBindingVmFactory,
+ PlaybackViewModel playbackViewModel)
{
_profileEditorService = profileEditorService;
_settingsService = settingsService;
_layerPropertyVmFactory = layerPropertyVmFactory;
- _cachedViewModels = new Dictionary();
+ _dataBindingVmFactory = dataBindingVmFactory;
+ _cachedPropertyViewModels = new Dictionary();
+
PropertyGroupViewModels = new ObservableCollection();
PlaybackViewModel = playbackViewModel;
TimelineViewModel = layerPropertyVmFactory.TimelineViewModel(PropertyGroupViewModels);
+ // React to service profile element changes as long as the VM is active
+ this.WhenActivated(d =>
+ {
+ _profileElement = profileEditorService.ProfileElement.ToProperty(this, vm => vm.ProfileElement).DisposeWith(d);
+ _pixelsPerSecond = profileEditorService.PixelsPerSecond.ToProperty(this, vm => vm.PixelsPerSecond).DisposeWith(d);
+ _layerProperty = profileEditorService.LayerProperty.ToProperty(this, vm => vm.LayerProperty).DisposeWith(d);
+ Disposable.Create(() =>
+ {
+ _settingsService.SaveAllSettings();
+ foreach ((LayerPropertyGroup _, PropertyGroupViewModel value) in _cachedPropertyViewModels)
+ value.Dispose();
+ _cachedPropertyViewModels.Clear();
+ }).DisposeWith(d);
+ });
+
// Subscribe to events of the latest selected profile element - borrowed from https://stackoverflow.com/a/63950940
this.WhenAnyValue(vm => vm.ProfileElement)
.Select(p => p is Layer l
? Observable.FromEventPattern(x => l.LayerBrushUpdated += x, x => l.LayerBrushUpdated -= x)
: Observable.Never>())
.Switch()
- .Subscribe(_ => UpdateGroups());
+ .Subscribe(_ => UpdatePropertyGroups());
this.WhenAnyValue(vm => vm.ProfileElement)
.Select(p => p != null
? Observable.FromEventPattern(x => p.LayerEffectsUpdated += x, x => p.LayerEffectsUpdated -= x)
: Observable.Never>())
.Switch()
- .Subscribe(_ => UpdateGroups());
- // React to service profile element changes as long as the VM is active
-
- this.WhenActivated(d =>
- {
- _profileElement = profileEditorService.ProfileElement.ToProperty(this, vm => vm.ProfileElement).DisposeWith(d);
- _pixelsPerSecond = profileEditorService.PixelsPerSecond.ToProperty(this, vm => vm.PixelsPerSecond).DisposeWith(d);
- Disposable.Create(() =>
- {
- _settingsService.SaveAllSettings();
- foreach ((LayerPropertyGroup _, PropertyGroupViewModel value) in _cachedViewModels)
- value.Dispose();
- _cachedViewModels.Clear();
-
- }).DisposeWith(d);
- });
- this.WhenAnyValue(vm => vm.ProfileElement).Subscribe(_ => UpdateGroups());
+ .Subscribe(_ => UpdatePropertyGroups());
+ this.WhenAnyValue(vm => vm.ProfileElement).Subscribe(_ => UpdatePropertyGroups());
+ this.WhenAnyValue(vm => vm.LayerProperty).Subscribe(_ => UpdateTimelineViewModel());
}
public ObservableCollection PropertyGroupViewModels { get; }
public PlaybackViewModel PlaybackViewModel { get; }
public TimelineViewModel TimelineViewModel { get; }
+ public DataBindingViewModel? DataBindingViewModel
+ {
+ get => _dataBindingViewModel;
+ set => RaiseAndSetIfChanged(ref _dataBindingViewModel, value);
+ }
+
public RenderProfileElement? ProfileElement => _profileElement?.Value;
public Layer? Layer => _profileElement?.Value as Layer;
+ public ILayerProperty? LayerProperty => _layerProperty?.Value;
public int PixelsPerSecond => _pixelsPerSecond?.Value ?? 0;
public IObservable Playing => _profileEditorService.Playing;
public PluginSetting PropertiesTreeWidth => _settingsService.GetSetting("ProfileEditor.PropertiesTreeWidth", 500.0);
-
- private void UpdateGroups()
+
+ private void UpdatePropertyGroups()
{
if (ProfileElement == null)
{
@@ -92,18 +111,20 @@ public class PropertiesViewModel : ActivatableViewModelBase
if (Layer != null)
{
// Add base VMs
- viewModels.Add(GetOrCreateViewModel(Layer.General, null, null));
- viewModels.Add(GetOrCreateViewModel(Layer.Transform, null, null));
+ viewModels.Add(GetOrCreatePropertyViewModel(Layer.General, null, null));
+ viewModels.Add(GetOrCreatePropertyViewModel(Layer.Transform, null, null));
// Add brush VM if the brush has properties
if (Layer.LayerBrush?.BaseProperties != null)
- viewModels.Add(GetOrCreateViewModel(Layer.LayerBrush.BaseProperties, Layer.LayerBrush, null));
+ viewModels.Add(GetOrCreatePropertyViewModel(Layer.LayerBrush.BaseProperties, Layer.LayerBrush, null));
}
// Add effect VMs
foreach (BaseLayerEffect layerEffect in ProfileElement.LayerEffects.OrderBy(e => e.Order))
+ {
if (layerEffect.BaseProperties != null)
- viewModels.Add(GetOrCreateViewModel(layerEffect.BaseProperties, null, layerEffect));
+ viewModels.Add(GetOrCreatePropertyViewModel(layerEffect.BaseProperties, null, layerEffect));
+ }
// Map the most recent collection of VMs to the current list of VMs, making as little changes to the collection as possible
for (int index = 0; index < viewModels.Count; index++)
@@ -119,9 +140,9 @@ public class PropertiesViewModel : ActivatableViewModelBase
PropertyGroupViewModels.RemoveAt(PropertyGroupViewModels.Count - 1);
}
- private PropertyGroupViewModel GetOrCreateViewModel(LayerPropertyGroup layerPropertyGroup, BaseLayerBrush? layerBrush, BaseLayerEffect? layerEffect)
+ private PropertyGroupViewModel GetOrCreatePropertyViewModel(LayerPropertyGroup layerPropertyGroup, BaseLayerBrush? layerBrush, BaseLayerEffect? layerEffect)
{
- if (_cachedViewModels.TryGetValue(layerPropertyGroup, out PropertyGroupViewModel? cachedVm))
+ if (_cachedPropertyViewModels.TryGetValue(layerPropertyGroup, out PropertyGroupViewModel? cachedVm))
return cachedVm;
PropertyGroupViewModel createdVm;
@@ -132,7 +153,20 @@ public class PropertiesViewModel : ActivatableViewModelBase
else
createdVm = _layerPropertyVmFactory.PropertyGroupViewModel(layerPropertyGroup);
- _cachedViewModels[layerPropertyGroup] = createdVm;
+ _cachedPropertyViewModels[layerPropertyGroup] = createdVm;
return createdVm;
}
+
+ private void UpdateTimelineViewModel()
+ {
+ if (LayerProperty == null)
+ {
+ DataBindingViewModel = null;
+ }
+ else
+ {
+ _backgroundDataBindingViewModel ??= _dataBindingVmFactory.DataBindingViewModel();
+ DataBindingViewModel = _backgroundDataBindingViewModel;
+ }
+ }
}
\ No newline at end of file
diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/ITreePropertyViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/ITreePropertyViewModel.cs
index 66027d37c..a4a6f8f3c 100644
--- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/ITreePropertyViewModel.cs
+++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/ITreePropertyViewModel.cs
@@ -1,4 +1,5 @@
-using Artemis.Core;
+using System.Reactive;
+using Artemis.Core;
using ReactiveUI;
namespace Artemis.UI.Screens.ProfileEditor.Properties.Tree;
@@ -6,6 +7,7 @@ namespace Artemis.UI.Screens.ProfileEditor.Properties.Tree;
public interface ITreePropertyViewModel : IReactiveObject
{
ILayerProperty BaseLayerProperty { get; }
- bool HasDataBinding { get; }
+ bool DataBindingEnabled { get; }
double GetDepth();
+ void ToggleCurrentLayerProperty();
}
\ No newline at end of file
diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreeGroupViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreeGroupViewModel.cs
index 04e33559d..48bd28fde 100644
--- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreeGroupViewModel.cs
+++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreeGroupViewModel.cs
@@ -12,7 +12,7 @@ using Artemis.UI.Screens.ProfileEditor.Properties.Windows;
using Artemis.UI.Shared;
using Artemis.UI.Shared.LayerBrushes;
using Artemis.UI.Shared.LayerEffects;
-using Artemis.UI.Shared.Services.Interfaces;
+using Artemis.UI.Shared.Services;
using Artemis.UI.Shared.Services.ProfileEditor;
using Ninject;
using Ninject.Parameters;
diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml
index 854bb6224..dc5def2ac 100644
--- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml
+++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml
@@ -5,8 +5,10 @@
xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia"
xmlns:converters="clr-namespace:Artemis.UI.Converters"
xmlns:sharedConverters="clr-namespace:Artemis.UI.Shared.Converters;assembly=Artemis.UI.Shared"
+ xmlns:tree="clr-namespace:Artemis.UI.Screens.ProfileEditor.Properties.Tree"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
- x:Class="Artemis.UI.Screens.ProfileEditor.Properties.Tree.TreePropertyView">
+ x:Class="Artemis.UI.Screens.ProfileEditor.Properties.Tree.TreePropertyView"
+ x:DataType="tree:ITreePropertyViewModel">
@@ -49,14 +51,17 @@
-
+ IsChecked="{CompiledBinding DataBindingEnabled, Mode=OneWay}"
+ Click="DataBindingToggleButton_OnClick">
diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml.cs
index dc16daa37..4e0354fcf 100644
--- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml.cs
+++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml.cs
@@ -3,6 +3,8 @@ using System.Reactive.Linq;
using Artemis.Core;
using Avalonia.Controls;
using Avalonia.Controls.Mixins;
+using Avalonia.Controls.Primitives;
+using Avalonia.Interactivity;
using Avalonia.Markup.Xaml;
using Avalonia.ReactiveUI;
using ReactiveUI;
@@ -13,18 +15,23 @@ public class TreePropertyView : ReactiveUserControl
{
public TreePropertyView()
{
+ InitializeComponent();
this.WhenActivated(d =>
{
- if (ViewModel != null)
- Observable.FromEventPattern(e => ViewModel.BaseLayerProperty.CurrentValueSet += e, e => ViewModel.BaseLayerProperty.CurrentValueSet -= e)
- .Subscribe(_ => this.BringIntoView())
- .DisposeWith(d);
+ Observable.FromEventPattern(e => ViewModel!.BaseLayerProperty.CurrentValueSet += e, e => ViewModel!.BaseLayerProperty.CurrentValueSet -= e)
+ .Subscribe(_ => this.BringIntoView())
+ .DisposeWith(d);
});
- InitializeComponent();
}
private void InitializeComponent()
{
AvaloniaXamlLoader.Load(this);
}
+
+ private void DataBindingToggleButton_OnClick(object? sender, RoutedEventArgs e)
+ {
+ ViewModel?.ToggleCurrentLayerProperty();
+ this.Find("DataBindingToggleButton").IsChecked = !this.Find("DataBindingToggleButton").IsChecked;
+ }
}
\ No newline at end of file
diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyViewModel.cs
index 1f95bd0dc..fe4dd8a60 100644
--- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyViewModel.cs
+++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyViewModel.cs
@@ -2,6 +2,7 @@
using System.Reactive;
using System.Reactive.Linq;
using Artemis.Core;
+using Artemis.UI.Extensions;
using Artemis.UI.Shared;
using Artemis.UI.Shared.Services.ProfileEditor;
using Artemis.UI.Shared.Services.ProfileEditor.Commands;
@@ -15,6 +16,8 @@ internal class TreePropertyViewModel : ActivatableViewModelBase, ITreePropert
{
private readonly IProfileEditorService _profileEditorService;
private TimeSpan _time;
+ private ObservableAsPropertyHelper? _isCurrentlySelected;
+ private ObservableAsPropertyHelper? _dataBindingEnabled;
public TreePropertyViewModel(LayerProperty layerProperty, PropertyViewModel propertyViewModel, IProfileEditorService profileEditorService, IPropertyInputService propertyInputService)
{
@@ -27,17 +30,17 @@ internal class TreePropertyViewModel : ActivatableViewModelBase, ITreePropert
this.WhenActivated(d =>
{
_profileEditorService.Time.Subscribe(t => _time = t).DisposeWith(d);
+ _isCurrentlySelected = _profileEditorService.LayerProperty.Select(l => l == LayerProperty).ToProperty(this, vm => vm.IsCurrentlySelected).DisposeWith(d);
+ _dataBindingEnabled = LayerProperty.BaseDataBinding.GetObservable().Select(b => b.IsEnabled).ToProperty(this, vm => vm.DataBindingEnabled).DisposeWith(d);
+
this.WhenAnyValue(vm => vm.LayerProperty.KeyframesEnabled).Subscribe(_ => this.RaisePropertyChanged(nameof(KeyframesEnabled))).DisposeWith(d);
});
ResetToDefault = ReactiveCommand.Create(ExecuteResetToDefault, Observable.Return(LayerProperty.DefaultValue != null));
}
- private void ExecuteResetToDefault()
- {
- _profileEditorService.ExecuteCommand(new ResetLayerProperty(LayerProperty));
- }
-
+ public bool IsCurrentlySelected => _isCurrentlySelected?.Value ?? false;
+ public bool DataBindingEnabled => _dataBindingEnabled?.Value ?? false;
public LayerProperty LayerProperty { get; }
public PropertyViewModel PropertyViewModel { get; }
public PropertyInputViewModel? PropertyInputViewModel { get; }
@@ -57,8 +60,12 @@ internal class TreePropertyViewModel : ActivatableViewModelBase, ITreePropert
_profileEditorService.ExecuteCommand(new ToggleLayerPropertyKeyframes(LayerProperty, value, _time));
}
+ private void ExecuteResetToDefault()
+ {
+ _profileEditorService.ExecuteCommand(new ResetLayerProperty(LayerProperty));
+ }
+
public ILayerProperty BaseLayerProperty => LayerProperty;
- public bool HasDataBinding => LayerProperty.HasDataBinding;
public double GetDepth()
{
@@ -72,5 +79,10 @@ internal class TreePropertyViewModel : ActivatableViewModelBase, ITreePropert
return depth;
}
-}
+ ///
+ public void ToggleCurrentLayerProperty()
+ {
+ _profileEditorService.ChangeCurrentLayerProperty(IsCurrentlySelected ? null : LayerProperty);
+ }
+}
\ No newline at end of file
diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Tools/SelectionAddToolViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Tools/SelectionAddToolViewModel.cs
index a58007aa5..38fab0468 100644
--- a/src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Tools/SelectionAddToolViewModel.cs
+++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Tools/SelectionAddToolViewModel.cs
@@ -25,6 +25,7 @@ public class SelectionAddToolViewModel : ToolViewModel
{
_profileEditorService = profileEditorService;
_rgbService = rgbService;
+ // Not disposed when deactivated but when really disposed
_isEnabled = profileEditorService.ProfileElement.Select(p => p is Layer).ToProperty(this, vm => vm.IsEnabled);
this.WhenActivated(d => profileEditorService.ProfileElement.Subscribe(p => _layer = p as Layer).DisposeWith(d));
diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Tools/SelectionRemoveToolViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Tools/SelectionRemoveToolViewModel.cs
index a36d9ce9c..7fde8511e 100644
--- a/src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Tools/SelectionRemoveToolViewModel.cs
+++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Tools/SelectionRemoveToolViewModel.cs
@@ -22,6 +22,7 @@ public class SelectionRemoveToolViewModel : ToolViewModel
public SelectionRemoveToolViewModel(IProfileEditorService profileEditorService)
{
_profileEditorService = profileEditorService;
+ // Not disposed when deactivated but when really disposed
_isEnabled = profileEditorService.ProfileElement.Select(p => p is Layer).ToProperty(this, vm => vm.IsEnabled);
this.WhenActivated(d => profileEditorService.ProfileElement.Subscribe(p => _layer = p as Layer).DisposeWith(d));
}
diff --git a/src/Artemis.UI/Screens/ProfileEditor/ProfileEditorViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/ProfileEditorViewModel.cs
index f886c6a2d..a90167de4 100644
--- a/src/Artemis.UI/Screens/ProfileEditor/ProfileEditorViewModel.cs
+++ b/src/Artemis.UI/Screens/ProfileEditor/ProfileEditorViewModel.cs
@@ -74,7 +74,6 @@ public class ProfileEditorViewModel : MainScreenViewModel
public PluginSetting ConditionsHeight => _settingsService.GetSetting("ProfileEditor.ConditionsHeight", 300.0);
public PluginSetting PropertiesHeight => _settingsService.GetSetting("ProfileEditor.PropertiesHeight", 300.0);
-
public void OpenUrl(string url)
{
Utilities.OpenUrl(url);
diff --git a/src/Artemis.UI/Screens/Root/RootViewModel.cs b/src/Artemis.UI/Screens/Root/RootViewModel.cs
index 0cdcc27b3..41a69ccb4 100644
--- a/src/Artemis.UI/Screens/Root/RootViewModel.cs
+++ b/src/Artemis.UI/Screens/Root/RootViewModel.cs
@@ -8,7 +8,7 @@ using Artemis.UI.Ninject.Factories;
using Artemis.UI.Screens.Sidebar;
using Artemis.UI.Services.Interfaces;
using Artemis.UI.Shared;
-using Artemis.UI.Shared.Services.Interfaces;
+using Artemis.UI.Shared.Services;
using Artemis.UI.Shared.Services.MainWindow;
using Avalonia;
using Avalonia.Controls;
diff --git a/src/Artemis.UI/Screens/Settings/Tabs/DevicesTabViewModel.cs b/src/Artemis.UI/Screens/Settings/Tabs/DevicesTabViewModel.cs
index d8a184e4c..c469a9582 100644
--- a/src/Artemis.UI/Screens/Settings/Tabs/DevicesTabViewModel.cs
+++ b/src/Artemis.UI/Screens/Settings/Tabs/DevicesTabViewModel.cs
@@ -9,7 +9,7 @@ using Artemis.Core.Services;
using Artemis.UI.Ninject.Factories;
using Artemis.UI.Screens.Device;
using Artemis.UI.Shared;
-using Artemis.UI.Shared.Services.Interfaces;
+using Artemis.UI.Shared.Services;
using Avalonia.Threading;
using DynamicData;
using ReactiveUI;
diff --git a/src/Artemis.UI/Screens/Settings/Tabs/PluginsTabViewModel.cs b/src/Artemis.UI/Screens/Settings/Tabs/PluginsTabViewModel.cs
index 39d3e3073..17ee523a3 100644
--- a/src/Artemis.UI/Screens/Settings/Tabs/PluginsTabViewModel.cs
+++ b/src/Artemis.UI/Screens/Settings/Tabs/PluginsTabViewModel.cs
@@ -11,8 +11,8 @@ using Artemis.UI.Extensions;
using Artemis.UI.Ninject.Factories;
using Artemis.UI.Screens.Plugins;
using Artemis.UI.Shared;
+using Artemis.UI.Shared.Services;
using Artemis.UI.Shared.Services.Builders;
-using Artemis.UI.Shared.Services.Interfaces;
using Avalonia.Threading;
using ReactiveUI;
diff --git a/src/Artemis.UI/Screens/Sidebar/Dialogs/ProfileConfigurationEditViewModel.cs b/src/Artemis.UI/Screens/Sidebar/Dialogs/ProfileConfigurationEditViewModel.cs
index 0657f256c..90e3186a0 100644
--- a/src/Artemis.UI/Screens/Sidebar/Dialogs/ProfileConfigurationEditViewModel.cs
+++ b/src/Artemis.UI/Screens/Sidebar/Dialogs/ProfileConfigurationEditViewModel.cs
@@ -7,7 +7,7 @@ using Artemis.Core;
using Artemis.Core.Modules;
using Artemis.Core.Services;
using Artemis.UI.Shared;
-using Artemis.UI.Shared.Services.Interfaces;
+using Artemis.UI.Shared.Services;
using Artemis.UI.Shared.Services.ProfileEditor;
using Avalonia.Media.Imaging;
using Avalonia.Svg.Skia;
diff --git a/src/Artemis.UI/Screens/Sidebar/SidebarCategoryViewModel.cs b/src/Artemis.UI/Screens/Sidebar/SidebarCategoryViewModel.cs
index c5f086f8a..715fbe791 100644
--- a/src/Artemis.UI/Screens/Sidebar/SidebarCategoryViewModel.cs
+++ b/src/Artemis.UI/Screens/Sidebar/SidebarCategoryViewModel.cs
@@ -7,8 +7,8 @@ using Artemis.Core;
using Artemis.Core.Services;
using Artemis.UI.Ninject.Factories;
using Artemis.UI.Shared;
+using Artemis.UI.Shared.Services;
using Artemis.UI.Shared.Services.Builders;
-using Artemis.UI.Shared.Services.Interfaces;
using Artemis.UI.Shared.Services.ProfileEditor;
using ReactiveUI;
diff --git a/src/Artemis.UI/Screens/Sidebar/SidebarProfileConfigurationViewModel.cs b/src/Artemis.UI/Screens/Sidebar/SidebarProfileConfigurationViewModel.cs
index 17e03dd5c..ccc8ea4dd 100644
--- a/src/Artemis.UI/Screens/Sidebar/SidebarProfileConfigurationViewModel.cs
+++ b/src/Artemis.UI/Screens/Sidebar/SidebarProfileConfigurationViewModel.cs
@@ -5,7 +5,7 @@ using System.Threading.Tasks;
using Artemis.Core;
using Artemis.Core.Services;
using Artemis.UI.Shared;
-using Artemis.UI.Shared.Services.Interfaces;
+using Artemis.UI.Shared.Services;
using ReactiveUI;
namespace Artemis.UI.Screens.Sidebar
diff --git a/src/Artemis.UI/Screens/Sidebar/SidebarViewModel.cs b/src/Artemis.UI/Screens/Sidebar/SidebarViewModel.cs
index 94c86b713..0fe80b668 100644
--- a/src/Artemis.UI/Screens/Sidebar/SidebarViewModel.cs
+++ b/src/Artemis.UI/Screens/Sidebar/SidebarViewModel.cs
@@ -12,8 +12,8 @@ using Artemis.UI.Screens.Settings;
using Artemis.UI.Screens.SurfaceEditor;
using Artemis.UI.Screens.Workshop;
using Artemis.UI.Shared;
+using Artemis.UI.Shared.Services;
using Artemis.UI.Shared.Services.Builders;
-using Artemis.UI.Shared.Services.Interfaces;
using Artemis.UI.Shared.Services.ProfileEditor;
using Material.Icons;
using Ninject;
diff --git a/src/Artemis.UI/Screens/SurfaceEditor/SurfaceDeviceViewModel.cs b/src/Artemis.UI/Screens/SurfaceEditor/SurfaceDeviceViewModel.cs
index ee6f506f4..bd122fb35 100644
--- a/src/Artemis.UI/Screens/SurfaceEditor/SurfaceDeviceViewModel.cs
+++ b/src/Artemis.UI/Screens/SurfaceEditor/SurfaceDeviceViewModel.cs
@@ -7,7 +7,7 @@ using Artemis.Core;
using Artemis.Core.Services;
using Artemis.UI.Ninject.Factories;
using Artemis.UI.Shared;
-using Artemis.UI.Shared.Services.Interfaces;
+using Artemis.UI.Shared.Services;
using Avalonia.Input;
using ReactiveUI;
using RGB.NET.Core;
diff --git a/src/Artemis.UI/Screens/VisualScripting/NodePickerView.axaml.cs b/src/Artemis.UI/Screens/VisualScripting/NodePickerView.axaml.cs
index 27e0f04f7..9ff6e7551 100644
--- a/src/Artemis.UI/Screens/VisualScripting/NodePickerView.axaml.cs
+++ b/src/Artemis.UI/Screens/VisualScripting/NodePickerView.axaml.cs
@@ -2,6 +2,7 @@ using System;
using System.Reactive.Linq;
using Avalonia.Controls;
using Avalonia.Controls.Mixins;
+using Avalonia.Controls.PanAndZoom;
using Avalonia.LogicalTree;
using Avalonia.Markup.Xaml;
using Avalonia.ReactiveUI;
@@ -16,7 +17,7 @@ public class NodePickerView : ReactiveUserControl
InitializeComponent();
this.WhenActivated(d =>
{
- ViewModel?.WhenAnyValue(vm => vm.IsVisible).Where(visible => !visible).Subscribe(_ => this.FindLogicalAncestorOfType()?.ContextFlyout?.Hide()).DisposeWith(d);
+ ViewModel?.WhenAnyValue(vm => vm.IsVisible).Where(visible => visible == false).Subscribe(_ => this.FindLogicalAncestorOfType()?.ContextFlyout?.Hide()).DisposeWith(d);
this.Get("SearchBox").SelectAll();
});
}
diff --git a/src/Artemis.UI/Screens/VisualScripting/NodeScriptView.axaml b/src/Artemis.UI/Screens/VisualScripting/NodeScriptView.axaml
index 49e98bf88..3bc3b6534 100644
--- a/src/Artemis.UI/Screens/VisualScripting/NodeScriptView.axaml
+++ b/src/Artemis.UI/Screens/VisualScripting/NodeScriptView.axaml
@@ -37,12 +37,12 @@
MaxZoomY="1"
EnableConstrains="True"
PointerReleased="ZoomBorder_OnPointerReleased">
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/src/Artemis.UI/Screens/VisualScripting/NodeScriptView.axaml.cs b/src/Artemis.UI/Screens/VisualScripting/NodeScriptView.axaml.cs
index 0651ed5a6..ed93397ef 100644
--- a/src/Artemis.UI/Screens/VisualScripting/NodeScriptView.axaml.cs
+++ b/src/Artemis.UI/Screens/VisualScripting/NodeScriptView.axaml.cs
@@ -25,10 +25,10 @@ namespace Artemis.UI.Screens.VisualScripting;
public class NodeScriptView : ReactiveUserControl
{
- private readonly Grid _grid;
private readonly ItemsControl _nodesContainer;
private readonly SelectionRectangle _selectionRectangle;
private readonly ZoomBorder _zoomBorder;
+ private readonly Grid _grid;
public NodeScriptView()
{
@@ -41,8 +41,8 @@ public class NodeScriptView : ReactiveUserControl
_zoomBorder.PropertyChanged += ZoomBorderOnPropertyChanged;
UpdateZoomBorderBackground();
- _grid.AddHandler(PointerReleasedEvent, CanvasOnPointerReleased, RoutingStrategies.Direct | RoutingStrategies.Tunnel | RoutingStrategies.Bubble, true);
-
+ _zoomBorder.AddHandler(PointerReleasedEvent, CanvasOnPointerReleased, RoutingStrategies.Direct | RoutingStrategies.Tunnel | RoutingStrategies.Bubble, true);
+ _zoomBorder.AddHandler(PointerWheelChangedEvent, ZoomOnPointerWheelChanged, RoutingStrategies.Direct | RoutingStrategies.Tunnel | RoutingStrategies.Bubble, true);
this.WhenActivated(d =>
{
ViewModel!.PickerPositionSubject.Subscribe(ShowPickerAt).DisposeWith(d);
@@ -56,6 +56,13 @@ public class NodeScriptView : ReactiveUserControl
});
}
+ private void ZoomOnPointerWheelChanged(object? sender, PointerWheelEventArgs e)
+ {
+ // If scroll events aren't handled here the ZoomBorder does some random panning when at the zoom limit
+ if (e.Delta.Y > 0 && _zoomBorder.ZoomX >= 1)
+ e.Handled = true;
+ }
+
protected override Size MeasureOverride(Size availableSize)
{
AutoFitIfPreview();
@@ -67,7 +74,7 @@ public class NodeScriptView : ReactiveUserControl
if (ViewModel == null)
return;
ViewModel.NodePickerViewModel.Position = point;
- _grid?.ContextFlyout?.ShowAt(_grid, true);
+ _zoomBorder?.ContextFlyout?.ShowAt(_zoomBorder, true);
}
private void AutoFitIfPreview()
diff --git a/src/Artemis.UI/Screens/Workshop/WorkshopViewModel.cs b/src/Artemis.UI/Screens/Workshop/WorkshopViewModel.cs
index 30633b07b..abfa3200f 100644
--- a/src/Artemis.UI/Screens/Workshop/WorkshopViewModel.cs
+++ b/src/Artemis.UI/Screens/Workshop/WorkshopViewModel.cs
@@ -6,8 +6,8 @@ using System.Reactive.Linq;
using Artemis.Core;
using Artemis.UI.Ninject.Factories;
using Artemis.UI.Screens.VisualScripting;
+using Artemis.UI.Shared.Services;
using Artemis.UI.Shared.Services.Builders;
-using Artemis.UI.Shared.Services.Interfaces;
using Artemis.VisualScripting.Nodes;
using Artemis.VisualScripting.Nodes.Operators;
using Avalonia.Input;
diff --git a/src/Artemis.UI/Services/DebugService.cs b/src/Artemis.UI/Services/DebugService.cs
index 7227b9da6..36afccfc5 100644
--- a/src/Artemis.UI/Services/DebugService.cs
+++ b/src/Artemis.UI/Services/DebugService.cs
@@ -1,6 +1,6 @@
using Artemis.UI.Screens.Debugger;
using Artemis.UI.Services.Interfaces;
-using Artemis.UI.Shared.Services.Interfaces;
+using Artemis.UI.Shared.Services;
namespace Artemis.UI.Services
{
diff --git a/src/Artemis.UI/Services/RegistrationService.cs b/src/Artemis.UI/Services/RegistrationService.cs
index a599d6361..038adc4ae 100644
--- a/src/Artemis.UI/Services/RegistrationService.cs
+++ b/src/Artemis.UI/Services/RegistrationService.cs
@@ -6,7 +6,9 @@ using Artemis.Core;
using Artemis.Core.Services;
using Artemis.UI.DefaultTypes.PropertyInput;
using Artemis.UI.Services.Interfaces;
+using Artemis.UI.Shared.DefaultTypes.DataModel.Display;
using Artemis.UI.Shared.Providers;
+using Artemis.UI.Shared.Services;
using Artemis.UI.Shared.Services.ProfileEditor;
using Artemis.UI.Shared.Services.PropertyInput;
using Artemis.VisualScripting.Nodes;
@@ -24,14 +26,22 @@ public class RegistrationService : IRegistrationService
private readonly IInputService _inputService;
private readonly IPropertyInputService _propertyInputService;
private readonly INodeService _nodeService;
+ private readonly IDataModelUIService _dataModelUIService;
private bool _registeredBuiltInPropertyEditors;
- public RegistrationService(IKernel kernel, IInputService inputService, IPropertyInputService propertyInputService, IProfileEditorService profileEditorService, INodeService nodeService, IEnumerable toolViewModels)
+ public RegistrationService(IKernel kernel,
+ IInputService inputService,
+ IPropertyInputService propertyInputService,
+ IProfileEditorService profileEditorService,
+ INodeService nodeService,
+ IDataModelUIService dataModelUIService,
+ IEnumerable toolViewModels)
{
_kernel = kernel;
_inputService = inputService;
_propertyInputService = propertyInputService;
_nodeService = nodeService;
+ _dataModelUIService = dataModelUIService;
profileEditorService.Tools.AddRange(toolViewModels);
CreateCursorResources();
@@ -50,6 +60,7 @@ public class RegistrationService : IRegistrationService
public void RegisterBuiltInDataModelDisplays()
{
+ _dataModelUIService.RegisterDataModelDisplay(Constants.CorePlugin);
}
public void RegisterBuiltInDataModelInputs()
diff --git a/src/Artemis.VisualScripting/Nodes/DataModel/DataModelEventNode.cs b/src/Artemis.VisualScripting/Nodes/DataModel/DataModelEventNode.cs
index 99d395bef..8c3f1bc45 100644
--- a/src/Artemis.VisualScripting/Nodes/DataModel/DataModelEventNode.cs
+++ b/src/Artemis.VisualScripting/Nodes/DataModel/DataModelEventNode.cs
@@ -6,7 +6,7 @@ using Artemis.VisualScripting.Nodes.DataModel.Screens;
namespace Artemis.VisualScripting.Nodes.DataModel;
-[Node("Data Model-Event", "Responds to a data model event trigger", "Data Model", OutputType = typeof(bool))]
+[Node("Data Model-Event", "Responds to a data model event trigger", "Data Model", OutputType = typeof(object))]
public class DataModelEventNode : Node, IDisposable
{
private int _currentIndex;
diff --git a/src/Artemis.VisualScripting/Nodes/DataModel/DataModelNode.cs b/src/Artemis.VisualScripting/Nodes/DataModel/DataModelNode.cs
index 41dfc9720..6a9a39c82 100644
--- a/src/Artemis.VisualScripting/Nodes/DataModel/DataModelNode.cs
+++ b/src/Artemis.VisualScripting/Nodes/DataModel/DataModelNode.cs
@@ -1,12 +1,11 @@
-using System.ComponentModel;
-using Artemis.Core;
+using Artemis.Core;
using Artemis.Storage.Entities.Profile;
using Artemis.VisualScripting.Nodes.DataModel.Screens;
using Avalonia.Threading;
namespace Artemis.VisualScripting.Nodes.DataModel;
-[Node("Data Model-Value", "Outputs a selectable data model value.", "Data Model")]
+[Node("Data Model-Value", "Outputs a selectable data model value.", "Data Model", OutputType = typeof(object))]
public class DataModelNode : Node, IDisposable
{
private DataModelPath? _dataModelPath;
@@ -19,7 +18,7 @@ public class DataModelNode : Node