From 66ea7183161f33d8d50f928e72f29ce469437210 Mon Sep 17 00:00:00 2001 From: Robert Date: Sun, 3 Apr 2022 22:21:56 +0200 Subject: [PATCH] Profile editor - Integrated visual scripting --- .../Artemis.Benchmarking.csproj | 18 + src/Artemis.Benchmarking/NumericConversion.cs | 40 + src/Artemis.Benchmarking/Program.cs | 3 + src/Artemis.Benchmarking/packages.lock.json | 1524 +++++++++++++++++ .../Profile/Conditions/EventCondition.cs | 3 + .../Models/Profile/Conditions/ICondition.cs | 86 +- .../Profile/Conditions/StaticCondition.cs | 3 + .../Profile/DataBindings/DataBinding.cs | 8 +- .../DataBindings/DataBindingProperty.cs | 27 +- .../Profile/DataBindings/IDataBinding.cs | 5 + .../Models/Profile/RenderProfileElement.cs | 2 +- .../Internal/DataBindingExitNode.cs | 15 +- .../ApplicationStateManager.cs | 2 +- .../DataModelPicker/DataModelPicker.cs | 2 +- .../DataModelVisualizationRegistration.cs | 1 - .../Shared/DataModelEventViewModel.cs | 1 - .../Shared/DataModelListItemViewModel.cs | 1 - .../Shared/DataModelListViewModel.cs | 1 - .../Shared/DataModelPropertiesViewModel.cs | 1 - .../Shared/DataModelPropertyViewModel.cs | 1 - .../Shared/DataModelVisualizationViewModel.cs | 2 +- .../Display/SKColorDataModelDisplayView.axaml | 31 + .../SKColorDataModelDisplayView.axaml.cs | 19 + .../SKColorDataModelDisplayViewModel.cs | 11 + .../Ninject/SharedUIModule.cs | 2 +- .../ScriptEditorViewModel.cs | 1 - .../Services/DataModelUIService.cs | 1 - .../Services/GradientPickerService.cs | 4 +- .../Interfaces/IArtemisSharedUIService.cs | 2 +- .../Interfaces/IDataModelUIService.cs | 2 +- .../Interfaces/INotificationService.cs | 2 +- .../Services/Interfaces/IWindowService.cs | 2 +- .../Services/MainWindow/IMainWindowService.cs | 1 - .../Services/NodeEditor/INodeEditorService.cs | 1 - .../Services/NodeEditor/NodeEditorService.cs | 1 - .../Services/NotificationService.cs | 1 - .../Commands/ChangeConditionType.cs | 53 + .../Commands/ChangeDataBindingEnabled.cs | 40 + .../ProfileEditor/IProfileEditorService.cs | 12 +- .../ProfileEditor/ProfileEditorService.cs | 30 +- .../PropertyInput/IPropertyInputService.cs | 1 - .../Window/ExceptionDialogViewModel.cs | 1 - .../Services/Window/WindowService.cs | 1 - src/Artemis.UI.Shared/Styles/Button.axaml | 29 + .../Controls/DataModelPickerButton.axaml | 2 + .../ApplicationStateManager.cs | 2 +- src/Artemis.UI/ArtemisBootstrapper.cs | 2 +- .../BrushPropertyInputViewModel.cs | 2 +- .../Extensions/DataBindingExtensions.cs | 16 + .../Ninject/Factories/IVMFactory.cs | 6 + .../Tabs/DataModel/DataModelDebugViewModel.cs | 2 +- .../Device/DeviceDetectInputViewModel.cs | 2 +- .../Screens/Device/DeviceSettingsViewModel.cs | 2 +- .../Device/Tabs/DeviceInfoTabViewModel.cs | 2 +- .../Tabs/DevicePropertiesTabViewModel.cs | 2 +- ...uginPrerequisitesInstallDialogViewModel.cs | 2 +- ...inPrerequisitesUninstallDialogViewModel.cs | 2 +- .../Screens/Plugins/PluginFeatureViewModel.cs | 2 +- .../Plugins/PluginSettingsViewModel.cs | 2 +- .../ConditionTypeViewModel.cs | 19 + .../DisplayConditionScriptView.axaml | 118 +- .../DisplayConditionScriptViewModel.cs | 59 +- .../ProfileTree/FolderTreeItemViewModel.cs | 2 +- .../ProfileTree/LayerTreeItemViewModel.cs | 2 +- .../ProfileTree/ProfileTreeViewModel.cs | 2 +- .../Panels/ProfileTree/TreeItemViewModel.cs | 2 +- .../DataBinding/DataBindingView.axaml | 52 + .../DataBinding/DataBindingView.axaml.cs | 18 + .../DataBinding/DataBindingViewModel.cs | 65 + .../Panels/Properties/PropertiesView.axaml | 15 +- .../Panels/Properties/PropertiesViewModel.cs | 94 +- .../Properties/Tree/ITreePropertyViewModel.cs | 6 +- .../Properties/Tree/TreeGroupViewModel.cs | 2 +- .../Properties/Tree/TreePropertyView.axaml | 11 +- .../Properties/Tree/TreePropertyView.axaml.cs | 17 +- .../Properties/Tree/TreePropertyViewModel.cs | 26 +- .../Tools/SelectionAddToolViewModel.cs | 1 + .../Tools/SelectionRemoveToolViewModel.cs | 1 + .../ProfileEditor/ProfileEditorViewModel.cs | 1 - src/Artemis.UI/Screens/Root/RootViewModel.cs | 2 +- .../Settings/Tabs/DevicesTabViewModel.cs | 2 +- .../Settings/Tabs/PluginsTabViewModel.cs | 2 +- .../ProfileConfigurationEditViewModel.cs | 2 +- .../Sidebar/SidebarCategoryViewModel.cs | 2 +- .../SidebarProfileConfigurationViewModel.cs | 2 +- .../Screens/Sidebar/SidebarViewModel.cs | 2 +- .../SurfaceEditor/SurfaceDeviceViewModel.cs | 2 +- .../VisualScripting/NodePickerView.axaml.cs | 3 +- .../VisualScripting/NodeScriptView.axaml | 12 +- .../VisualScripting/NodeScriptView.axaml.cs | 15 +- .../Screens/Workshop/WorkshopViewModel.cs | 2 +- src/Artemis.UI/Services/DebugService.cs | 2 +- .../Services/RegistrationService.cs | 13 +- .../Nodes/DataModel/DataModelEventNode.cs | 2 +- .../Nodes/DataModel/DataModelNode.cs | 29 +- src/Artemis.sln | 2 - 96 files changed, 2413 insertions(+), 238 deletions(-) create mode 100644 src/Artemis.Benchmarking/Artemis.Benchmarking.csproj create mode 100644 src/Artemis.Benchmarking/NumericConversion.cs create mode 100644 src/Artemis.Benchmarking/Program.cs create mode 100644 src/Artemis.Benchmarking/packages.lock.json create mode 100644 src/Artemis.UI.Shared/DefaultTypes/DataModel/Display/SKColorDataModelDisplayView.axaml create mode 100644 src/Artemis.UI.Shared/DefaultTypes/DataModel/Display/SKColorDataModelDisplayView.axaml.cs create mode 100644 src/Artemis.UI.Shared/DefaultTypes/DataModel/Display/SKColorDataModelDisplayViewModel.cs create mode 100644 src/Artemis.UI.Shared/Services/ProfileEditor/Commands/ChangeConditionType.cs create mode 100644 src/Artemis.UI.Shared/Services/ProfileEditor/Commands/ChangeDataBindingEnabled.cs create mode 100644 src/Artemis.UI/Extensions/DataBindingExtensions.cs create mode 100644 src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypeViewModel.cs create mode 100644 src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/DataBinding/DataBindingView.axaml create mode 100644 src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/DataBinding/DataBindingView.axaml.cs create mode 100644 src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/DataBinding/DataBindingViewModel.cs 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"> - - - - - - - - - + + \ 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